Showing preview only (4,154K chars total). Download the full file or copy to clipboard to get everything.
Repository: HeroTransitions/Hero
Branch: develop
Commit: d7a72e13b034
Files: 355
Total size: 3.9 MB
Directory structure:
gitextract_d9vexhun/
├── .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/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── Front.imagestacklayer/
│ │ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Middle.imagestacklayer/
│ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── App Icon - Small.imagestack/
│ │ │ │ │ ├── Back.imagestacklayer/
│ │ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── Front.imagestacklayer/
│ │ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Middle.imagestacklayer/
│ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Contents.json
│ │ │ │ ├── Top Shelf Image Wide.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Top Shelf Image.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ ├── AppleHomePage/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── iphone_alt_small_2x.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── macbookpro_portrait_small_2x.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── watch_alt_portrait_small_2x.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── CityGuide/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── cityGuide.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── montreal.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── toronto.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── vancouver.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Contents.json
│ │ │ ├── Foods/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── Unsplash0.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash0_cell.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash0_thumb.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash1.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash10.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash10_cell.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash10_thumb.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash1_cell.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash1_thumb.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash2.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash2_cell.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash2_thumb.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash3.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash3_cell.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash3_thumb.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash4.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash4_cell.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash4_thumb.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash5.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash5_cell.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash5_thumb.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash6.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash6_cell.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash6_thumb.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash7.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash7_cell.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash7_thumb.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash8.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash8_cell.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash8_thumb.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash9.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash9_cell.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Unsplash9_thumb.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── HeroLogo.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Menu/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── ic_audiotrack_48pt.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_chat_48pt.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_format_quote_48pt.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_gif_48pt.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_insert_photo_48pt.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_link_48pt.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_menu_36pt.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_menu_48pt.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_text_fields_48pt.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── ic_videocam_48pt.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── MusicPlayer/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── album1.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_fast_forward.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_fast_rewind.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_pause_white.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_play_arrow_white.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_repeat.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── ic_shuffle.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── bigbuckbunny.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── ic_bug_report_48pt.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── ic_close.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── ic_code.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── ic_input_48pt.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── ic_keyboard_arrow_down.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── ic_view_list.imageset/
│ │ │ │ └── Contents.json
│ │ │ └── ic_view_module.imageset/
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ └── LaunchScreen.storyboard
│ │ ├── Info.plist
│ │ └── UIKit+HeroExamples.swift
│ └── SwiftUIMatchExample.swift
├── Gemfile
├── 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
├── README.md
├── README.zh-cn.md
├── 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/
│ ├── 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
├── Classes.html
├── Enums/
│ ├── CascadeDirection.html
│ ├── HeroCoordinateSpace.html
│ ├── HeroDefaultAnimationType/
│ │ ├── Direction.html
│ │ └── Strategy.html
│ ├── HeroDefaultAnimationType.html
│ ├── HeroSnapshotType.html
│ ├── HeroTransitionState.html
│ ├── HeroViewOrderingStrategy.html
│ ├── ParseError.html
│ └── Token.html
├── Enums.html
├── Extensions/
│ ├── CAMediaTimingFunction.html
│ ├── CATransform3D.html
│ ├── HeroDebugView.html
│ ├── String.html
│ ├── UINavigationController.html
│ ├── UITabBarController.html
│ ├── UIView.html
│ └── UIViewController.html
├── Extensions.html
├── Functions.html
├── Protocols/
│ ├── HeroAnimator.html
│ ├── HeroCompatible.html
│ ├── HeroCustomSnapshotView.html
│ ├── HeroPreprocessor.html
│ ├── HeroProgressUpdateObserver.html
│ ├── HeroStringConvertible.html
│ ├── HeroTransitionDelegate.html
│ └── HeroViewControllerDelegate.html
├── Protocols.html
├── Structs/
│ ├── HeroConditionalContext.html
│ └── HeroTargetState.html
├── Structs.html
├── css/
│ ├── highlight.css
│ └── jazzy.css
├── docsets/
│ ├── Hero.docset/
│ │ └── Contents/
│ │ ├── Info.plist
│ │ └── Resources/
│ │ ├── Documents/
│ │ │ ├── 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
│ │ │ ├── Classes.html
│ │ │ ├── Enums/
│ │ │ │ ├── CascadeDirection.html
│ │ │ │ ├── HeroCoordinateSpace.html
│ │ │ │ ├── HeroDefaultAnimationType/
│ │ │ │ │ ├── Direction.html
│ │ │ │ │ └── Strategy.html
│ │ │ │ ├── HeroDefaultAnimationType.html
│ │ │ │ ├── HeroSnapshotType.html
│ │ │ │ ├── HeroTransitionState.html
│ │ │ │ ├── HeroViewOrderingStrategy.html
│ │ │ │ ├── ParseError.html
│ │ │ │ └── Token.html
│ │ │ ├── Enums.html
│ │ │ ├── Extensions/
│ │ │ │ ├── CAMediaTimingFunction.html
│ │ │ │ ├── CATransform3D.html
│ │ │ │ ├── HeroDebugView.html
│ │ │ │ ├── String.html
│ │ │ │ ├── UINavigationController.html
│ │ │ │ ├── UITabBarController.html
│ │ │ │ ├── UIView.html
│ │ │ │ └── UIViewController.html
│ │ │ ├── Extensions.html
│ │ │ ├── Functions.html
│ │ │ ├── Protocols/
│ │ │ │ ├── HeroAnimator.html
│ │ │ │ ├── HeroCompatible.html
│ │ │ │ ├── HeroCustomSnapshotView.html
│ │ │ │ ├── HeroPreprocessor.html
│ │ │ │ ├── HeroProgressUpdateObserver.html
│ │ │ │ ├── HeroStringConvertible.html
│ │ │ │ ├── HeroTransitionDelegate.html
│ │ │ │ └── HeroViewControllerDelegate.html
│ │ │ ├── Protocols.html
│ │ │ ├── Structs/
│ │ │ │ ├── HeroConditionalContext.html
│ │ │ │ └── HeroTargetState.html
│ │ │ ├── Structs.html
│ │ │ ├── css/
│ │ │ │ ├── highlight.css
│ │ │ │ └── jazzy.css
│ │ │ ├── index.html
│ │ │ ├── js/
│ │ │ │ ├── jazzy.js
│ │ │ │ ├── jazzy.search.js
│ │ │ │ └── typeahead.jquery.js
│ │ │ └── search.json
│ │ └── docSet.dsidx
│ └── Hero.tgz
├── index.html
├── js/
│ ├── jazzy.js
│ ├── jazzy.search.js
│ └── typeahead.jquery.js
├── search.json
└── undocumented.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .codecov.yml
================================================
# https://docs.codecov.io/docs/codecov-yaml
codecov:
require_ci_to_pass: yes
coverage:
precision: 2
round: down
range: "70...100"
ignore:
- docs
- Examples
- LegacyExamples
- Resources
- TvOSExamples
status:
patch:
default:
if_no_uploads: error
changes: true
project:
default:
target: auto
if_no_uploads: error
comment: false
================================================
FILE: .editorconfig
================================================
# http://editorconfig.org
root = true
[*]
indent_style = space
charset = utf-8
indent_size = 4
end_of_line = lf
trim_trailing_whitespace = true
insert_final_newline = true
[*.{md,markdown}]
trim_trailing_whitespace = false
[*.{c,h,m,mm}]
indent_size = 2
[*.js]
indent_size = 2
[*.{swift}]
indent_size = 4
[Makefile]
trim_trailing_whitespace = true
indent_style = tab
indent_size = 8
[*.{yaml|yml}]
indent_size = 2
================================================
FILE: .github/CODEOWNERS
================================================
# CODEOWNERS
# Lines starting with '#' are comments.
# Each line is a file pattern followed by one or more owners.
# https://help.github.com/en/articles/about-code-owners
# These owners will be the default owners for everything in the repo.
* @JoeMatt @lkzhao @SD10 @kuyazee
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: [JoeMatt, lkzhao, SD10, kuyazee] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: herotransitions # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
================================================
FILE: .github/auto_assign.yml
================================================
# Set to true to add reviewers to pull requests
addReviewers: true
# Set to true to add assignees to pull requests
addAssignees: false
# A list of reviewers to be added to pull requests (GitHub user name)
reviewers:
- JoeMatt
- lkzhao
- SD10
- kuyazee
# A number of reviewers added to the pull request
# Set 0 to add all the reviewers (default: 0)
numberOfReviewers: 0
# A list of assignees, overrides reviewers if set
# assignees:
# A number of assignees to add to the pull request
# Set to 0 to add all of the assignees.
# Uses numberOfReviewers if unset.
numberOfAssignees: 1
# A list of keywords to be skipped the process that add reviewers if pull requests include it
skipKeywords:
- wip
- WIP
================================================
FILE: .github/issue_template.md
================================================
<!--
ℹ We use Github issues for bug reports, feature requests, general support, and questions about the library.
Please fill out this template when filing an issue.
-->
## What did you do?
<!-- Please replace this with what you did. -->
## What did you expect to happen?
<!-- Please replace this with what you expected to happen. -->
## What happened instead?
<!-- Please replace this with of what happened instead. -->
## General Information
* Hero Version:
* iOS Version(s):
* Swift Version:
* Devices/Simulators:
* Reproducible in Examples? (Yes/No):
## Demo Project
<!-- Please link to or upload a project we can download that reproduces the issue. -->
================================================
FILE: .github/main.workflow
================================================
action "Danger" {
uses = "danger/danger"
# secrets = ["GITHUB_TOKEN"]
}
================================================
FILE: .github/stale.yml
================================================
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 180
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
# Issues with these labels will never be considered stale
exemptLabels:
- pinned
- security
- confirmed bug
- investigating
- bug?
- WIP
# Label to use when marking an issue as stale
staleLabel: stale
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: true
================================================
FILE: .github/workflows/build.yml
================================================
on:
push:
branches:
- master
name: Build
jobs:
test:
name: Build
runs-on: macOS-latest
strategy:
matrix:
destination: [
'platform=Any iOS Simulator',
'platform=Any tvOS Simulator',
'platform=macOS,arch=x86_64',
'platform=macOS,arch=arm64',
'platform=macCatalyst,arch=x86_64',
'platform=macCatalyst,arch=arm64',
]
steps:
- name: Checkout
uses: actions/checkout@master
- name: Build
run: |
pod install
set -o pipefail && \
xcodebuild clean build \
-workspace Hero.xcworkspace \
-scheme Hero \
-destination "${destination}" \
-parallelizeTargets -showBuildTimingSummary \
-enableCodeCoverage YES \
CODE_SIGN_IDENTITY="" \
CODE_SIGNING_REQUIRED=NO \
| xcpretty
env:
destination: ${{ matrix.destination }}
================================================
FILE: .github/workflows/rebase.yml
================================================
# Rebase PR branch when someone comments /rebase
on:
issue_comment:
types: [created]
name: Automatic Rebase
jobs:
rebase:
name: Rebase
if: contains(github.event.comment.body, '/rebase')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Automatic Rebase
uses: cirrus-actions/rebase@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .github/workflows/swiftlint.yml
================================================
name: Swift Lint
on:
pull_request:
paths:
- '.github/workflows/swiftlint.yml'
- '.swiftlint.yml'
- '**/*.swift'
jobs:
swift-lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: GitHub Action for SwiftLint
uses: norio-nomura/action-swiftlint@3.2.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DIFF_BASE: ${{ github.base_ref }}
================================================
FILE: .github/workflows/test.yml
================================================
# test.yml
# Unit Test
name: Unit Test
'on':
pull_request:
paths:
- '**.swift'
- '**.xcodeproj'
- '**.m'
- '**.h'
- '**.podspec'
- Podfile
- Podfile.lock
- '**/test.yml'
jobs:
swiftpm:
name: Test iOS (swiftpm)
runs-on: macOS-latest
env:
DEVELOPER_DIR: /Applications/Xcode_14.2.app/Contents/Developer
steps:
- name: Checkout
uses: actions/checkout@master
- name: iOS - Swift PM
run: |
pod install
set -o pipefail && swift test --parallel
XCode:
name: Test iOS
runs-on: macOS-latest
env:
DEVELOPER_DIR: /Applications/Xcode_14.2.app/Contents/Developer
strategy:
matrix:
run-config:
- scheme: Hero
platform: iOS
action: test
code-coverage: true
- scheme: Hero (tvOS)
platform: tvOS
action: build
code-coverage: false
steps:
- name: Checkout
uses: actions/checkout@master
- name: CocoaPods - ${{ matrix.run-config.destination }}
run: |
pod install
- name: Test - ${{ matrix.run-config.platform }}
uses: mxcl/xcodebuild@v2.0
with:
platform: ${{ matrix.run-config.platform }}
action: ${{ matrix.run-config.action }}
code-coverage: ${{ matrix.run-config.code-coverage }}
configuration: Debug
scheme: ${{ matrix.run-config.scheme }}
workspace: Hero.xcworkspace
- name: Upload Code Coverage
uses: codecov/codecov-action@v3
if: ${{ matrix.run-config.code-coverage }}
with:
token: ${{ secrets.CODECOV_TOKEN }}
================================================
FILE: .gitignore
================================================
.DS_Store
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
## Build generated
build/
DerivedData/
## Various settings
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata/
## Other
*.moved-aside
*.xcuserstate
## Obj-C/Swift specific
*.hmap
*.ipa
*.dSYM.zip
*.dSYM
## Playgrounds
timeline.xctimeline
playground.xcworkspace
# Swift Package Manager
#
# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
# Packages/
.build/
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
Pods/
# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts
Carthage/Build
# fastlane
#
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
# screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
# Gitbook
node_modules
_book
xcodebuild.log
.swiftpm
/.bundle
*.zip
================================================
FILE: .jazzy.yaml
================================================
# ---- About ----
module: Hero
module_version: 1.6.4
author: HeroTransitions
readme: README.md
copyright: 'See [license](https://github.com/HeroTransitions/Hero/blob/develop/LICENSE) for more details.'
# ---- URLs ----
author_url: https://herotransitions.github.io/Hero/
dash_url: https://herotransitions.github.io/Hero/docsets/Hero.xml
github_url: https://github.com/HeroTransitions/Hero/
github_file_prefix: https://github.com/HeroTransitions/Hero/tree/1.6.2/
# ---- Sources ----
podspec: Hero.podspec
# ---- Generation ----
clean: true
output: docs
min_acl: public
hide_documentation_coverage: false
skip_undocumented: false
objc: false
# swift_version: 5.1.0
# ---- Formatting ----
theme: fullwidth
================================================
FILE: .makefiles/bundler.mk
================================================
# Provides a dependecy, `bundle`, which runs bundle install when necessary.
# Override bundle install options by setting BUNDLE_INSTALL_OPTS.
BE := bundle exec
BUNDLE_INSTALL_OPTS ?=
Gemfile.lock: Gemfile FORCE | _program_bundle
@bundle check > /dev/null 2>&1 && \
( $(call _log,rubygems up-to-date) ) || \
( $(call _log,installing rubygems); \
bundle install $(BUNDLE_INSTALL_OPTS) )
#> installs rubygems
bundle:: Gemfile.lock
.PHONY: bundle
================================================
FILE: .makefiles/docker-compose.mk
================================================
DOCKER_COMPOSE_PULL ?= yes
DOCKER_COMPOSE_DAEMON ?= yes
DOCKER_COMPOSE_FILE ?= docker-compose.yml
DOCKER_COMPOSE_UP_FLAGS += $(if $(filter yes,$(DOCKER_COMPOSE_DAEMON)),-d)
DOCKER_COMPOSE_BUILD_FLAGS += $(if $(filter yes,$(DOCKER_COMPOSE_PULL)),--pull)
DOCKER_COMPOSE_CLEAN_FLAGS ?= --rmi all --volumes --remove-orphans
.docker-compose-build-complete:
@[ -f .gitignore -a -z "$$(grep '$@' .gitignore 2> /dev/null)" ] && \
( $(call _warn,WARNING: $@ not found in .gitignore) ) || true
$(call log,building from $(DOCKER_COMPOSE_FILE))
docker-compose -f $(DOCKER_COMPOSE_FILE) build $(DOCKER_COMPOSE_BUILD_FLAGS)
@touch $@
#> build docker images (force rebuild with -B)
build:: .docker-compose-build-complete | _program_docker-compose
.PHONY: build
#> run docker-compose up
up:: build | _program_docker-compose
$(call log,starting docker services in $(DOCKER_COMPOSE_FILE))
docker-compose -f $(DOCKER_COMPOSE_FILE) up $(DOCKER_COMPOSE_UP_FLAGS)
.PHONY: up
#> run docker-compose down
down:: | _program_docker-compose
$(call log,stopping docker services in $(DOCKER_COMPOSE_FILE))
docker-compose -f $(DOCKER_COMPOSE_FILE) down
.PHONY: down
#> remove docker-compose artifacts
clean:: | _program_docker-compose
$(call log,cleaning up docker artifacts)
docker-compose -f $(DOCKER_COMPOSE_FILE) down $(DOCKER_COMPOSE_CLEAN_FLAGS)
rm -f .docker-compose-build-complete
.PHONY: clean
================================================
FILE: .makefiles/help.awk
================================================
# Awk program for automatically generating help text from those ludicrous makefiles.
# See help.mk for details.
function len(a, i, k) {
for (i in a) k++
return k
}
function join(a, sep) {
result = ""
if (sep == "")
sep = SUBSEP
for (item in a)
result = result sep a[item]
return result
}
function unjoin(a, text, sep) {
if (sep == "")
sep = SUBSEP
split(substr(text, 2), a, sep)
}
function append(a, item) {
a[len(a) + 1] = item
}
function extend(a, b) {
for (item in b)
append(a, b[item])
}
/^#> / {
comments[++comments_counter] = substr($0, 4)
}
/^[^: \t]*:[^;]*;?/ {
split($0, recipe_firstline, ":")
target = recipe_firstline[1]
width = length(target)
max_width = (max_width > width) ? max_width : width
if ( substr(lastline, 1, 2) == "#>" ) {
target_docs[target] = join(comments, "#")
delete comments
}
}
!/^#>/ {
if (len(comments) > 0) {
extend(global_docs, comments)
append(global_docs, "")
delete comments
}
}
{ lastline = $0 }
END {
for (doc in global_docs)
print global_docs[doc]
printf "Targets:\n"
for (target in target_docs) {
unjoin(help, target_docs[target], "#")
printf " %-" max_width "s %s\n", target, help[1]
for (i = 2; i <= len(help); i++)
printf " %-" max_width "s %s\n", "", help[i]
}
}
================================================
FILE: .makefiles/ios.mk
================================================
SHELL := /bin/bash
.PHONY: help update pull bootstrap
RUBY := $(shell command -v ruby 2>/dev/null)
CARTHAGE := $(shell command -v carthage 2>/dev/null)
PODS := $(shell command -v pod 2>/dev/null)
HOMEBREW := $(shell command -v brew 2>/dev/null)
ROME := $(shell command -v rome 2>/dev/null)
BUNDLER := $(shell command -v bundle 2>/dev/null)
CARTING := $(shell command -v carting 2>/dev/null)
SWIFTGEN := $(shell command -v swiftgen 2>/dev/null)
SWIFTLINT := $(shell command -v swiftlint 2>/dev/null)
PLATFORM := 'iOS,tvOS,macOS,watchOS'
WORKSPACE := '$(shell ls -d *.xc* | head -1)'
default: help
# Add the following 'help' target to your Makefile
# And add help text after each target name starting with '\#\#'
# A category can be added with @category
# COLORS
GREEN := $(shell tput -Txterm setaf 2)
YELLOW := $(shell tput -Txterm setaf 3)
WHITE := $(shell tput -Txterm setaf 7)
RESET := $(shell tput -Txterm sgr0)
#>----- Helper functions ------
# Helper target for declaring an external executable as a recipe dependency.
# For example,
# `my_target: | _program_awk`
# will fail before running the target named `my_target` if the command `awk` is
# not found on the system path.
_program_%: FORCE
@_=$(or $(shell which $* 2> /dev/null),$(error `$*` command not found. Please install `$*` and try again))
# Helper target for declaring required environment variables.
#
# For example,
# `my_target`: | _var_PARAMETER`
#
# will fail before running `my_target` if the variable `PARAMETER` is not declared.
_var_%: FORCE
@_=$(or $($*),$(error `$*` is a required parameter))
_tag: | _var_VERSION
make --no-print-directory -B README.md
git commit -am "Tagging release $(VERSION)"
git tag -a $(VERSION) $(if $(NOTES),-m '$(NOTES)',-m $(VERSION))
.PHONY: _tag
_push: | _var_VERSION
git push origin $(VERSION)
git push origin master
.PHONY: _push
#> Install dependencies.
setup: \
pre_setup \
check_for_ruby \
check_for_homebrew \
update_homebrew \
install_carthage \
install_bundler_gem \
install_ruby_gems \
install_carthage_dependencies
#> Install extra tools (carting, swiftlint, swift-gen...)
install_extras:
pre_setup \
check_for_ruby \
check_for_homebrew \
update_homebrew \
install_carthage \
install_swift_lint \
install_carting \
install_rome \
install_swiftgen
pull_request: \
test \
codecov_upload \
danger
pre_setup:
$(info iOS project setup ...)
check_for_ruby:
$(info Checking for Ruby ...)
ifeq ($(RUBY),)
$(error Ruby is not installed)
endif
check_for_homebrew:
$(info Checking for Homebrew ...)
ifeq ($(HOMEBREW),)
$(error Homebrew is not installed)
endif
update_homebrew:
$(info Update Homebrew ...)
brew update
install_swift_lint:
$(info Install swiftlint ...)
ifneq ($(SWIFTLINT),)
brew install swiftlint
else
$(info Already have, skipping.)
endif
install_bundler_gem:
$(info Checking and install bundler ...)
ifeq ($(BUNDLER),)
gem install bundler -v '~> 1.17'
else
gem update bundler '~> 1.17'
endif
install_ruby_gems:
$(info Install Ruby Gems ...)
bundle check || bundle install
install_carthage:
$(info Install Carthage ...)
ifneq ($(CARTHAGE),)
brew install carthage
else
$(info Already have, skipping.)
endif
install_carting:
$(info Install Carting ...)
ifneq ($(CARTING),)
brew install artemnovichkov/projects/carting
else
$(info Already have, skipping.)
endif
install_swiftgen:
$(info Install Swift-Gen (https://github.com/SwiftGen/SwiftGen) ...)
ifneq ($(SWIFTGEN),)
brew install swiftgen
else
$(info Already have, skipping.)
endif
gitpull:
$(info Pulling new commits ...)
git pull
#> -- QA Task Runners --
codecov_upload:
curl -s https://codecov.io/bash | bash
#> Danger a GitHub PR Locally. Useage `make danger_pr PR={PR#} autocorrect
danger_pr:
bundle exec danger pr "$(GITHUB_URL:/=)/pull/$(PULL)"
danger:
bundle exec danger
#> SwiftLint autocorrect
autocorrect:
bundle exec swiftlint autocorrect --config .swiftlint.yml
## -- Testing --
#> Run test on all targets
test:
xcodebuild test -scheme $(TEST_SCHEME) -workspace $(WORKSPACE) -destination 'platform=iOS Simulator,OS=14.4,name=iPhone 12' -parallelizeTargets -showBuildTimingSummary -enableThreadSanitizer YES CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO ONLY_ACTIVE_ARCH=YES | tee xcodebuild.log | xcpretty
#> -- Building --
#> Make a .zip package of frameworks
package:
carthage build --no-skip-current --platform $(PLATFORM) --use-xcframeworks --cache-builds
carthage archive $(MODULE_NAME)
#> tag and release to github
release: | _var_VERSION
@if ! git diff --quiet HEAD; then \
( $(call _error,refusing to release with uncommitted changes) ; exit 1 ); \
fi
test
package
make --no-print-directory _tag VERSION=$(VERSION)
make --no-print-directory _push VERSION=$(VERSION)
#> Open the workspace
open:
open $(WORKSPACE)
#> Setup the project, git-hooks etc
init:
git config core.hooksPath .githooks
================================================
FILE: .makefiles/ludicrous.mk
================================================
# The "main" utility functions and helpers useful for the common case. Most
# ludicrous makefiles require this file, so it's sensible to `include` it first.
INCLUDES_DIR := $(dir $(realpath $(lastword $(MAKEFILE_LIST))))
LUDICROUS_BRANCH := master
LUDICROUS_DOWNLOAD_URL := https://raw.githubusercontent.com/martinwalsh/ludicrous-makefiles/$(LUDICROUS_BRANCH)/includes
# Generates help text from specialized comments (lines prefixed with a `#>`).
# Free-standing comments are included in the prologue of the help text, while
# those immediately preceding a recipe will be displayed along with their
# respective target names
#
# Targets: help
# Requires: awk
# Side effects:
# * .DEFAULT_GOAL is set to to the `help` target from this file
#
HELP_PROGRAM := $(INCLUDES_DIR)/help.awk
# COLORS
GREEN := $(shell tput -Txterm setaf 2)
YELLOW := $(shell tput -Txterm setaf 3)
WHITE := $(shell tput -Txterm setaf 7)
RESET := $(shell tput -Txterm sgr0)
#> displays this message
# help: _HELP_F := $(firstword $(MAKEFILE_LIST))
# help: | _program_awk
# @awk -f $(HELP_PROGRAM) $(wordlist 2,$(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) $(_HELP_F) # always prefer help from the top-level makefile
TARGET_MAX_CHAR_NUM=20
#> Show help
help:
@echo ''
@echo 'Usage:'
@echo ' ${YELLOW}make${RESET} ${GREEN}<target>${RESET}'
@echo ''
@echo 'Targets:'
@awk '/^[a-zA-Z\-\0-9]+:/ { \
helpMessage = match(lastLine, /^#> (.*)/); \
if (helpMessage) { \
helpCommand = substr($$1, 0, index($$1, ":")-1); \
helpMessage = substr(lastLine, RSTART + 3, RLENGTH); \
printf " ${YELLOW}%-$(TARGET_MAX_CHAR_NUM)s${RESET} ${GREEN}%s${RESET}\n", helpCommand, helpMessage; \
} \
} \
{ lastLine = $$0 }' \
$(MAKEFILE_LIST)
.PHONY: help
.DEFAULT_GOAL := help
# Helper target for declaring an external executable as a recipe dependency.
# For example,
# `my_target: | _program_awk`
# will fail before running the target named `my_target` if the command `awk` is
# not found on the system path.
_program_%: FORCE
@_=$(or $(shell which $* 2> /dev/null),$(error `$*` command not found. Please install `$*` and try again))
# Helper target for declaring required environment variables.
#
# For example,
# `my_target`: | _var_PARAMETER`
#
# will fail before running `my_target` if the variable `PARAMETER` is not declared.
_var_%: FORCE
@_=$(or $($*),$(error `$*` is a required parameter))
# The defult build dir, if we have only one it'll be easier to cleanup
BUILD_DIR =: build
$(BUILD_DIR):
mkdir -p $@
# text manipulation helpers
_awk_case = $(shell echo | awk '{ print $(1)("$(2)") }')
lc = $(call _awk_case,tolower,$(1))
uc = $(call _awk_case,toupper,$(1))
# Useful for forcing targets to build when .PHONY doesn't help
FORCE:
.PHONY: FORCE
# Provides two callables, `log` and `_log`, to facilitate consistent
# user-defined output, formatted using tput when available.
#
# Override TPUT_PREFIX to alter the formatting.
TPUT := $(shell which tput 2> /dev/null)
TPUT_PREFIX := $(TPUT) bold
TPUT_SUFFIX := $(TPUT) sgr0
TPUT_RED := $(TPUT) setaf 1
TPUT_GREEN := $(TPUT) setaf 2
TPUT_YELLOW := $(TPUT) setaf 3
LOG_PREFIX ?= ===>
ifeq (,$(and $(TPUT),$(TERM)))
define _log
echo "$(if $(LOG_PREFIX),$(LOG_PREFIX) )$(1)"
endef
define _warn
echo "$(if $(LOG_PREFIX),$(LOG_PREFIX) )$(1)"
endef
define _error
echo "$(if $(LOG_PREFIX),$(LOG_PREFIX) )$(1)"
endef
else
define _log
$(TPUT_PREFIX); echo "$(if $(LOG_PREFIX),$(LOG_PREFIX) )$(1)"; $(TPUT_SUFFIX)
endef
define _warn
$(TPUT_PREFIX); $(TPUT_YELLOW); echo "$(if $(LOG_PREFIX),$(LOG_PREFIX) )$(1)"; $(TPUT_SUFFIX)
endef
define _error
$(TPUT_PREFIX); $(TPUT_RED); echo "$(if $(LOG_PREFIX),$(LOG_PREFIX) )$(1)"; $(TPUT_SUFFIX)
endef
endif
define log
@$(_log)
endef
# Removes build artifacts, implement with your own `clean::` target to remove additional artifacts.
# See https://www.gnu.org/software/make/manual/make.html#Double_002dColon for more information.
#> removes build artifacts
clean::
@:
.PHONY: clean
# Provides callables `download` and `download_to`.
# * `download`: fetches a url `$(1)` piping it to a command specified in `$(2)`.
# Usage: `$(call download,$(URL),tar -xf - -C /tmp/dest)`
#
# * `download_to`: fetches a url `$(1)` and writes it to a local path specified in `$(2)`.
# Usage: `$(call download_to,$(URL),/tmp/dest)`
#
# Requires: curl
#
# Additional command line parameters may be passed to curl via CURL_OPTS.
# For example, `CURL_OPTS += -s`.
#
CURL_OPTS ?= --location --silent
ifneq ($(shell which curl 2> /dev/null),)
DOWNLOADER = curl $(CURL_OPTS)
DOWNLOAD_FLAGS :=
DOWNLOAD_TO_FLAGS := --write-out "%{http_code}" -o
else
NO_DOWNLOADER_FOUND := Unable to locate a suitable download utility (curl)
endif
define download
$(if $(NO_DOWNLOADER_FOUND),$(error $(NO_DOWNLOADER_FOUND)),$(DOWNLOADER) $(DOWNLOAD_FLAGS) "$(1)" | $(2))
endef
define download_to
$(if $(NO_DOWNLOADER_FOUND),$(error $(NO_DOWNLOADER_FOUND)),$(DOWNLOADER) $(DOWNLOAD_TO_FLAGS) $(2) "$(1)")
endef
# Provides variables useful for determining the operating system we're running
# on.
#
# OS_NAME will reflect the name of the operating system: Darwin, Linux or Windows
# OS_CPU will be either x86 (32bit) or amd64 (64bit)
# OS_ARCH will be either i686 (32bit) or x86_64 (64bit)
#
ifeq (Windows_NT,$(OS))
OS_NAME := Windows
OS_CPU := $(call _lower,$(PROCESSOR_ARCHITECTURE))
OS_ARCH := $(if $(findstring amd64,$(OS_CPU)),x86_64,i686)
else
OS_NAME := $(shell uname -s)
OS_ARCH := $(shell uname -m)
OS_CPU := $(if $(findstring 64,$(OS_ARCH)),amd64,x86)
endif
# Install ludicrous plugins by include directive
PLUGIN_TARGETS := $(abspath $(INCLUDES_DIR)/%.mk) $(subst $(CURDIR)/,,$(abspath $(INCLUDES_DIR)/%.mk))
ifneq (B,$(findstring B,$(MAKEFLAGS)))
$(PLUGIN_TARGETS):
@[ ! -f $@ ] && \
( \
$(call _log,downloading ludicrous plugin to $@); \
STATUS="$$($(call download_to,$(LUDICROUS_DOWNLOAD_URL)/$(notdir $@),$@))"; \
if [ $$STATUS -ne 200 ]; then $(call _error,ludicrous plugin $(notdir $@) not found.); exit 1; fi \
)
else
$(PLUGIN_TARGETS):
@:
endif
================================================
FILE: .makefiles/virtualenv.mk
================================================
# Provides a dependecy, `virtualenv`, which creates a local virtualenv for use
# during development of a python project.
PYTHON_VERSION ?=
VIRTUALENV_DIR ?= .env
PIP_INDEX_URL ?=
PIP_REQUIREMENTS ?= requirements.txt
PYTHON := python$(PYTHON_VERSION)
PIP := $(VIRTUALENV_DIR)/bin/pip
PIP_INDEX_FLAG := $(if $(PIP_INDEX_URL),--index-url $(PIP_INDEX_URL))
$(VIRTUALENV_DIR): | _program_$(PYTHON) _program_virtualenv
${call log,creating virtualenv at $(VIRTUALENV_DIR)}
virtualenv --python=$(PYTHON) $(VIRTUALENV_DIR)
$(PIP): $(PIP_REQUIREMENTS) | $(VIRTUALENV_DIR)
${call log,install python dependencies from $(PIP_REQUIREMENTS)}
$(PIP) install $(PIP_INDEX_FLAG) --upgrade pip setuptools
$(PIP) install $(PIP_INDEX_FLAG) --upgrade -r $(PIP_REQUIREMENTS)
@touch $(PIP)
#> installs python dependencies
virtualenv:: $(PIP)
.PHONY: virtualenv
clean::
rm -rf $(VIRTUALENV_DIR)
.PHONY: clean
================================================
FILE: .swiftlint.yml
================================================
disabled_rules: # rule identifiers to exclude from running
- missing_docs
- unused_closure_parameter
- identifier_name
- weak_delegate
- cyclomatic_complexity
- function_body_length
- todo
- large_tuple
opt_in_rules: # some rules are only opt-in
- empty_count
# Find all the available rules by running:
# swiftlint rules
included: # paths to include during linting. `--path` is ignored if present.
- Sources
excluded: # paths to ignore during linting. Takes precedence over `included`.
- Carthage
- Pods
# configurable rules can be customized from this configuration file
# binary rules can set their severity level
force_cast: warning # implicitly
force_try:
severity: warning # explicitly
# rules that have both warning and error levels, can set just the warning level
# implicitly
line_length: 500
# they can set both implicitly with an array
type_body_length:
- 300 # warning
- 400 # error
# or they can set both explicitly
file_length:
warning: 600
error: 1200
# naming rules can set warnings/errors for min_length and max_length
# additionally they can set excluded names
type_name:
min_length: 3 # only warning
max_length: # warning and error
warning: 40
error: 50
excluded: # excluded via string
- T
- t
identifier_name:
min_length: # only min_length
error: 3 # only error
excluded: # excluded via string array
- id
- vc
- to
- a
- b
- t
- x
- y
- z
- p
- xy
- dx
- dy
- gr
================================================
FILE: .travis.yml
================================================
language:
- swift
osx_image: xcode11.0
script:
- xcodebuild -scheme HeroExamples -workspace Hero.xcworkspace -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone X,OS=13.0' build test
after_success:
- bash <(curl -s https://codecov.io/bash)
================================================
FILE: CHANGELOG.md
================================================
# CHANGELOG
The changelog for `Hero`. Also see the [releases](https://github.com/HeroTransitions/Hero/releases) on GitHub.
--------------------------------------
## [1.6.4](https://github.com/HeroTransitions/Hero/releases/tag/1.6.4)
- Fix XCode 16
## [1.6.3](https://github.com/HeroTransitions/Hero/releases/tag/1.6.3)
- 1ac98e7 Adaption for visionOS.
- 5e05761 Merge pull request #771 from HeroTransitions/feature/CICDFix
- c9a98cf CI/CI build and test, matrix platforms fix?
- 2f8096d build.yml test.yml update github runner env
- 45aed92 Readme add api docs link
- a7d2682 README.md update ios/xcode version badges
- 211df4b README.md Add unit test and swift pm action badges
- bff4221 swiftlint fix
- a47dce4 Merge pull request #749 from tadija/feature/xcode14-warnings
- fd2ba86 Fix lint warnings
- 5c053a6 Fix build warnings with Xcode 14.0
## [1.6.2](https://github.com/HeroTransitions/Hero/releases/tag/1.6.2)
### Fixed
- [#717](https://github.com/HeroTransitions/Hero/issues/717)
- [#734](https://github.com/HeroTransitions/Hero/issues/734)
- [#735](https://github.com/HeroTransitions/Hero/issues/735)
- [#736](https://github.com/HeroTransitions/Hero/issues/736)
- [#739](https://github.com/HeroTransitions/Hero/issues/739)
- [#740](https://github.com/HeroTransitions/Hero/issues/740) Fix build warings in XCode 13.4.1 c30a7a867d3bc420e90ad276d9bf12287628ce87
- [#742](https://github.com/HeroTransitions/Hero/issues/742) Add `anchorPoint` support for transitioning a76e9f6dbeefb530743994634d37235e59401911
## [1.6.1](https://github.com/HeroTransitions/Hero/releases/tag/1.6.1)
### Added
- git ignore .zip files
### Changed
- closes #703 Move CI depends to Mint
### Fixed
- Update README.md remove dead link closes #708
- Update the link to material design's motion duration easing links.
- fixes #704 SPM missing imports
## [1.6.0](https://github.com/HeroTransitions/Hero/releases/tag/1.6.0)
### Added
- #695 - Swift 5 support
- #628 - Swift Package Manager Support
- #623 - Swift UI support and example
- #681 - Application extension target support
- #595 - Add Accio supported badge
- #619 - XCode 11/12 support in example
- CI/CD improvements
### Changed
- #648 - Updated iOS version support
- #576 - Usage guide updates
### Fixed
- #698 - Warnings fix
- #585 - replaceViewControllers now calls the completion
- #559 - Resuming property animator from current fraction
- #465 - fix keyboard transition
## [1.5.0](https://github.com/HeroTransitions/Hero/releases/tag/1.5.0)
### Added
- Use custom snapshot for views that implement `HeroCustomSnapshotView`.
[#541](https://github.com/HeroTransitions/Hero/pull/541) by [@ManueGE](https://github.com/ManueGE)
### Changed
- Added support for right to left languages.
[#520](https://github.com/HeroTransitions/Hero/pull/520) by [@ManueGE](https://github.com/ManueGE)
- The hidden state of subviews are now taken into account in optimized snapshot type for `UIImageView`.
[#521](https://github.com/HeroTransitions/Hero/pull/521) by [@ManueGE](https://github.com/ManueGE)
## [1.4.0](https://github.com/HeroTransitions/Hero/releases/tag/1.4.0)
### Added
- Added support for Swift 4.2.
[#534](https://github.com/HeroTransitions/Hero/pull/534) by [@rennarda](https://github.com/rennarda)
## [1.3.1](https://github.com/HeroTransitions/Hero/releases/tag/1.3.1)
### Fixed
- Fixed the retain cycle caused by strong references to `previousNavigationDelegate` and `previousTabBarDelegate`.
[#516](https://github.com/HeroTransitions/Hero/pull/516) by [@mkieselmann](https://github.com/mkieselmann)
## [1.3.0](https://github.com/HeroTransitions/Hero/releases/tag/1.3.0)
### Added
- Adds an optional completion block parameter to the `dismissViewController` and `replaceViewController` methods.
[#456](https://github.com/HeroTransitions/Hero/pull/456) by [@kartikthapar](https://github.com/kartikthapar)
### Changed
- Allows previous `UINavigationController` delegate to handle delegate events.
[#430](https://github.com/HeroTransitions/Hero/pull/430) by [@bradphilips](https://github.com/bradphilips)
### Fixed
- Fixed shadows being cutoff by snapshots.
[#440](https://github.com/HeroTransitions/Hero/pull/440) by [@2blane](https://github.com/2blane)
- Fixed animation flickering on CALayer animation.
[f4dab9](https://github.com/HeroTransitions/Hero/commit/f4dab9ed2ab88ae065605199d5aca7706b07c2ad) by [@lkzhao](https://github.com/lkzhao)
================================================
FILE: DEVELOP.md
================================================
# Develop.md
## Releases
1. Make release brach `git-flow release start x.x.x`
2. Search find/replace current version in XCode project
3. Update `CHANGELOG.md`
4. Run swift lint autocorrect `make autocorrect`
5. Change version in `jazzy.yml`
6. Run `make jazzy`
7. Commit changes.
8. Create GitHub release
9. Create CocoaPods release
1. ` pod lib lint`
10. Finish release
1. `git-flow release finish x.x.x`
2. `git push --tags`
11. Public CocoaPod release
1. `pod trunk push`
================================================
FILE: Dangerfile
================================================
# frozen_string_literal: true
# Dangerfile
# To test locally, use the following
# `export DANGER_GITHUB_API_TOKEN=...YourToken...`
# `bundle exec danger pr https://github.com/HeroTransitions/Hero/pull/1618` Or some other pull #
# import remote Dangerfile; example, https://github.com/loadsmart/dangerfile/blob/master/Dangerfile
# danger.import_dangerfile(github: 'loadsmart/dangerfile', :path => 'Dangerfile')
require 'git_diff_parser'
# ------------------------------------------------------------------------------
# Additional pull request data
# ------------------------------------------------------------------------------
pr_number = github.pr_json['number']
pr_url = github.pr_json['_links']['html']['href']
# Sometimes it's a README fix, or something like that - which isn't relevant for
# including in a project's CHANGELOG for example
declared_trivial = github.pr_title.include? '#trivial'
has_changelog_changes = git.modified_files.include?('CHANGELOG.md')
has_ruby_changes = !git.modified_files.include?('Gemfile')
has_podfile_changes = !git.modified_files.include?('Podfile')
has_library_changes = !git.modified_files.grep(%r{Sources/*/*.swift}).empty?
has_app_changes = !git.modified_files.grep(%r{Examples/*/*.swift}).empty?
has_test_changes = !git.modified_files.grep(%r{Tests/*/*.swift}).empty?
has_danger_changes = !git.modified_files.grep(%r{Dangerfile|script/oss-check}).empty?
has_pod_lock_changes = !git.modified_files.grep(/Podfile.lock|Manifest.lock/).empty?
modified_xcode_project = !git.modified_files.grep(/.*\.xcodeproj/).empty?
added_swift_library_files = !git.added_files.grep(/Sources.*\.swift/).empty?
deleted_swift_library_files = !git.deleted_files.grep(/Sources.*\.swift/).empty?
## Warnings
# Warn when there is a big PR
warn('Big PR') if git.lines_of_code > 500
# Warn when Danger changes
warn('Dangerfile changes') if has_danger_changes
# Warn when Ruby changes
warn('Ruby Gem changes') if has_ruby_changes
# Warn when Pod changes
warn('Cocoapods Changes') if has_podfile_changes
# Warn when Podfile changes but no lockfile
warn('Podfile changes but lockfile unchanged. Did you forget to run `pod install`?') if has_podfile_changes && !has_pod_lock_changes
warn 'PR is classed as Work in Progress' if github.pr_title.include? 'WIP'
warn 'PR is classed as Hold' if github.pr_labels.include? 'ON HOLD'
# NOTE WHEN A PR CANNOT BE MANUALLY MERGED, WHICH GOES AWAY WHEN YOU CAN
can_merge = github.pr_json['mergeable']
warn('This PR cannot be merged yet.', sticky: false) unless can_merge
requires_proj_update = added_swift_library_files || deleted_swift_library_files
failure 'Added or removed library files require the Xcode project to be updated.' if requires_proj_update && !modified_xcode_project
# ------------------------------------------------------------------------------
# Have you updated CHANGELOG.md?
# ------------------------------------------------------------------------------
if !has_changelog_changes && has_library_changes
markdown <<-MARKDOWN
Here's an example of a CHANGELOG.md entry (place it immediately under the `* Your contribution here!` line):
```markdown
* [##{pr_number}](#{pr_url}): #{github.pr_title} - [@#{github.pr_author}](https://github.com/#{github.pr_author})
```
MARKDOWN
warn('Please update CHANGELOG.md with a description of your changes. '\
'If this PR is not a user-facing change (e.g. just refactoring), '\
'you can disregard this.', sticky: false)
end
## Messages
# - > +
message('Good job on cleaning the code!') if git.deletions > git.insertions
## Failures
# Mainly to encourage writing up some reasoning about the PR, rather than
# just leaving a title
failure 'Please provide a summary in the Pull Request description' if github.pr_body.length < 5
# ONLY ACCEPT PRS TO THE DEVELOP BRANCH
failure 'Please re-submit this PR to develop, we may have already fixed your issue.' if github.branch_for_base != 'develop'
# Ensure a clean commits history
failure 'Please rebase to get rid of the merge commits in this PR' if git.commits.any? { |c| c.message =~ /^Merge branch '#{github.branch_for_base}'/ }
# Adds labels
# Hold
on_hold_label = 'On Hold'
if github.pr_title.include? 'HOLD'
auto_label.set(github.pr_json['number'], on_hold_label, 'ff8a04')
else
auto_label.remove(on_hold_label)
end
# Check if PR is mergeable
merge_conflict_label = 'Merge Conflicts'
if github.pr_json['mergeable']
auto_label.remove(merge_conflict_label)
else
auto_label.set(github.pr_json['number'], merge_conflict_label, 'e0f76f')
end
### Everything here only happens if has code changes to Hero library/app code or this file.
return unless has_library_changes || has_danger_changes || has_app_changes
# Non-trivial amounts of app changes without tests
if git.lines_of_code > 50 && has_library_changes && !has_test_changes
warn 'This PR may need tests.'
end
if git.lines_of_code > 50 && has_library_changes && !has_app_changes
warn 'This PR may need example app additions.'
end
# Run SwiftLint and comment on lines with violations
swiftlint.config_file = '.swiftlint.yml'
swiftlint.binary_path = 'Pods/SwiftLint/swiftlint'
# Only lint files from this PR
diff = GitDiffParser::Patches.parse(github.pr_diff)
dir = "#{Dir.pwd}/"
swiftlint.lint_files(inline_mode: true) do |violation|
diff_filename = violation['file'].gsub(dir, '')
file_patch = diff.find_patch_by_file(diff_filename)
!file_patch.nil? && file_patch.changed_lines.any? { |line| line.number == violation['line'] }
end
# Codecov
xcov.report()
================================================
FILE: Examples/AppStoreCardExample.swift
================================================
import UIKit
import Hero
import CollectionKit
/*:
# App Store Transition
This is a much more advanced transition mimicking the iOS 11 App Store.
It is intended to demostrate Hero's ability in creating an advance transition.
It does not look 100% like the app store and the article page currently doesn't scroll.
There are a few advance technique that is used in this example:
1. Interactive transition
When dismissing, a pan gesture recognizer is used to adjust the progress of the transition.
When user lift its finger, we determine whether or not we should cancel or finish the
transition by how far the user have moved and how fast the user is moving.
See `@objc func handlePan(gr: UIPanGestureRecognizer)` down below for detail.
2. The `.useNoSnapshot` modifier
Whenever this modifier is used on a view, Hero won't create snapshot for that view during
the transition. Instead, hero will grab the view from its superview, insert it into the
transition container view, and use it directly during the transition.
A few things to point out when using `.useNoSnapshot`:
1. It improves the performance a lot! since snapshot takes a long time to create.
2. It doesn't work with auto layout.
This is because Hero will remove the view from its original view hierarchy.
Therefore, breaking all the constraints.
3. Becareful of when to layout the cell. Do not set the `frame` of the cell when Hero is
using it for transition. Otherwise it will create weird effect during the transition.
If you are using `layoutSubviews` to layout a child view with `.useNoSnapshot`, first check
whether or not the child view is still your child by verifying `childView.superview == self`
before actually setting the frame of the child view. This way, you won't accidentally
modify the child view's frame during the transition. The child view's superview
will not be the original superview during a transiton, but when it finishes, Hero
will insert the view back to its original view hierarchy.
3. Setting `hero.modalAnimationType` to `.none`
without this, a fade animation will be applied to the destination root view.
Since we use a visual effect view as our background and applied `.fade` hero modifier manually,
we don't need the builtin fade animation anymore. Also when dismissing,
we don't want the background view to fade in, instead, we want it to be opaque through
out the transition.
*/
class CardView: UIView {
let titleLabel = UILabel()
let subtitleLabel = UILabel()
let imageView = UIImageView(image: #imageLiteral(resourceName: "Unsplash6"))
let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .light))
required init?(coder aDecoder: NSCoder) { fatalError() }
override init(frame: CGRect) {
super.init(frame: frame)
clipsToBounds = true
titleLabel.font = UIFont.boldSystemFont(ofSize: 32)
subtitleLabel.font = UIFont.systemFont(ofSize: 17)
imageView.contentMode = .scaleAspectFill
addSubview(imageView)
addSubview(visualEffectView)
addSubview(titleLabel)
addSubview(subtitleLabel)
}
override func layoutSubviews() {
super.layoutSubviews()
imageView.frame = bounds
visualEffectView.frame = CGRect(x: 0, y: 0, width: bounds.width, height: 90)
titleLabel.frame = CGRect(x: 20, y: 20, width: bounds.width - 40, height: 30)
subtitleLabel.frame = CGRect(x: 20, y: 50, width: bounds.width - 40, height: 30)
}
}
class RoundedCardWrapperView: UIView {
let cardView = CardView()
var isTouched: Bool = false {
didSet {
var transform = CGAffineTransform.identity
if isTouched { transform = transform.scaledBy(x: 0.96, y: 0.96) }
UIView.animate(withDuration: 0.3, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: [], animations: {
self.transform = transform
}, completion: nil)
}
}
required init?(coder aDecoder: NSCoder) { fatalError() }
override init(frame: CGRect) {
super.init(frame: frame)
cardView.layer.cornerRadius = 16
layer.shadowColor = UIColor.black.cgColor
layer.shadowRadius = 12
layer.shadowOpacity = 0.15
layer.shadowOffset = CGSize(width: 0, height: 8)
addSubview(cardView)
}
override func layoutSubviews() {
super.layoutSubviews()
if cardView.superview == self {
// this is necessary because we used `.useNoSnapshot` modifier on cardView.
// we don't want cardView to be resized when Hero is using it for transition
cardView.frame = bounds
}
layer.shadowPath = UIBezierPath(roundedRect: bounds, cornerRadius: layer.cornerRadius).cgPath
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
isTouched = true
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesEnded(touches, with: event)
isTouched = false
}
override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesCancelled(touches, with: event)
isTouched = false
}
}
class AppStoreViewController1: ExampleBaseViewController {
let collectionView = CollectionView()
override func viewDidLoad() {
super.viewDidLoad()
collectionView.delaysContentTouches = false
view.insertSubview(collectionView, belowSubview: dismissButton)
setupCollection()
}
func setupCollection() {
let dataSource = ArrayDataSource<Int>(data: Array(0..<10))
let viewSource = ClosureViewSource { (view: RoundedCardWrapperView, data: Int, index) in
view.cardView.titleLabel.text = "Hero"
view.cardView.subtitleLabel.text = "App Store Card Transition"
view.cardView.imageView.image = UIImage(named: "Unsplash\(data)")
}
let sizeSource = { (i: Int, data: Int, size: CGSize) -> CGSize in
return CGSize(width: size.width, height: size.width + 20)
}
let provider = BasicProvider<Int, RoundedCardWrapperView>(
dataSource: dataSource,
viewSource: viewSource,
sizeSource: sizeSource,
layout: FlowLayout(spacing: 30).inset(by: UIEdgeInsets(top: 100, left: 20, bottom: 30, right: 20))
)
provider.tapHandler = { (context) in
self.cellTapped(cell: context.view, data: context.data)
}
collectionView.provider = provider
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
collectionView.frame = view.bounds
}
func cellTapped(cell: RoundedCardWrapperView, data: Int) {
// MARK: Hero configuration
let cardHeroId = "card\(data)"
cell.cardView.hero.modifiers = [.useNoSnapshot, .spring(stiffness: 250, damping: 25)]
cell.cardView.hero.id = cardHeroId
let vc = AppStoreViewController2()
vc.hero.isEnabled = true
vc.hero.modalAnimationType = .none
vc.cardView.hero.id = cardHeroId
vc.cardView.hero.modifiers = [.useNoSnapshot, .spring(stiffness: 250, damping: 25)]
vc.cardView.imageView.image = UIImage(named: "Unsplash\(data)")
vc.contentCard.hero.modifiers = [.source(heroID: cardHeroId), .spring(stiffness: 250, damping: 25)]
vc.contentView.hero.modifiers = [.useNoSnapshot, .forceAnimate, .spring(stiffness: 250, damping: 25)]
vc.visualEffectView.hero.modifiers = [.fade, .useNoSnapshot]
present(vc, animated: true, completion: nil)
}
}
class AppStoreViewController2: ExampleBaseViewController {
let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .light))
let contentCard = UIView()
let cardView = CardView()
let contentView = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .clear
view.addSubview(visualEffectView)
cardView.titleLabel.text = "Hero 2"
cardView.subtitleLabel.text = "App Store Card Transition"
contentView.numberOfLines = 0
contentView.text = """
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent neque est, hendrerit vitae nibh ultrices, accumsan elementum ante. Phasellus fringilla sapien non lorem consectetur, in ullamcorper tortor condimentum. Nulla tincidunt iaculis maximus. Sed ut urna urna. Nulla at sem vel neque scelerisque imperdiet. Donec ornare luctus dapibus. Donec aliquet ante augue, at pellentesque ipsum mollis eget. Cras vulputate mauris ac eleifend sollicitudin. Vivamus ut posuere odio. Suspendisse vulputate sem vel felis vehicula iaculis. Fusce sagittis, eros quis consequat tincidunt, arcu nunc ornare nulla, non egestas dolor ex at ipsum. Cras et massa sit amet quam imperdiet viverra. Mauris vitae finibus nibh, ac vulputate sapien.
"""
if #available(iOS 13.0, tvOS 13, *) {
contentCard.backgroundColor = .systemBackground
} else {
contentCard.backgroundColor = .white
}
contentCard.clipsToBounds = true
contentCard.addSubview(contentView)
contentCard.addSubview(cardView)
view.addSubview(contentCard)
// add a pan gesture recognizer for the interactive dismiss transition
view.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(handlePan(gr:))))
}
@objc func handlePan(gr: UIPanGestureRecognizer) {
let translation = gr.translation(in: view)
switch gr.state {
case .began:
dismiss(animated: true, completion: nil)
case .changed:
Hero.shared.update(translation.y / view.bounds.height)
default:
let velocity = gr.velocity(in: view)
if ((translation.y + velocity.y) / view.bounds.height) > 0.5 {
Hero.shared.finish()
} else {
Hero.shared.cancel()
}
}
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let bounds = view.bounds
visualEffectView.frame = bounds
contentCard.frame = bounds
cardView.frame = CGRect(x: 0, y: 0, width: bounds.width, height: bounds.width)
contentView.frame = CGRect(x: 20, y: bounds.width + 20, width: bounds.width - 40, height: bounds.height - bounds.width - 20)
}
}
================================================
FILE: Examples/BuiltInTransitionExample.swift
================================================
import UIKit
import Hero
/*:
# Builtin transitions
Hero has a few basic transition builtin.
These can be used by setting `hero.modalAnimationType` to any ViewController that you want to present.
These can be:
```
.none
.push(direction: Direction)
.pull(direction: Direction)
.cover(direction: Direction)
.uncover(direction: Direction)
.slide(direction: Direction)
.zoomSlide(direction: Direction)
.pageIn(direction: Direction)
.pageOut(direction: Direction)
.fade
.zoom
.zoomOut
```
There are also three special ones
* `.auto` is the default animation type. It uses the following animations depending on the presentation style:
`.none` if source root view or destination root view have existing animations (defined via heroID or heroModifiers).
`.push` & `.pull` if animating within a UINavigationController.
`.slide` if animating within a UITabbarController.
`.fade` if presenting modally.
`.none` if presenting modally with modalPresentationStyle == .overFullScreen.
* `.autoReverse(presenting: HeroDefaultAnimationType)` runs the given animation when presenting and runs
the reverse animation when dismising.
When not using .autoReverse, present and dismiss animation will be in the same direction.
* `.selectBy(presenting: HeroDefaultAnimationType, dismissing: HeroDefaultAnimationType)`
runs the given `presenting` animation during present and runs the `dismissing` animation during dismiss
*/
class BuiltInTransitionExampleViewController1: ExampleBaseViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor(hexString: "FC3A5E")!
}
@objc override func onTap() {
let vc2 = BuiltInTransitionExampleViewController2()
// this enables Hero
vc2.hero.isEnabled = true
// this configures the built in animation
// vc2.hero.modalAnimationType = .zoom
// vc2.hero.modalAnimationType = .pageIn(direction: .left)
// vc2.hero.modalAnimationType = .pull(direction: .left)
// vc2.hero.modalAnimationType = .autoReverse(presenting: .pageIn(direction: .left))
vc2.hero.modalAnimationType = .selectBy(presenting: .pull(direction: .left), dismissing: .slide(direction: .down))
// lastly, present the view controller like normal
present(vc2, animated: true, completion: nil)
}
}
class BuiltInTransitionExampleViewController2: ExampleBaseViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor(hexString: "555555")!
}
}
================================================
FILE: Examples/ExampleBaseViewController.swift
================================================
//
// ExampleBaseViewController.swift
// HeroExamples
//
// Created by Luke Zhao on 2018-04-15.
// Copyright © 2018 Luke Zhao. All rights reserved.
//
import UIKit
// basically a view controller with a back button and a tap gesture configured
class ExampleBaseViewController: UIViewController {
let dismissButton = UIButton(type: .system)
override func viewDidLoad() {
super.viewDidLoad()
if #available(iOS 13.0, tvOS 13, *) {
view.backgroundColor = .systemBackground
} else {
view.backgroundColor = .white
}
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(onTap)))
dismissButton.setTitle("Back", for: .normal)
dismissButton.addTarget(self, action: #selector(back), for: .touchUpInside)
dismissButton.hero.id = "back button"
view.addSubview(dismissButton)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
dismissButton.sizeToFit()
dismissButton.center = CGPoint(x: 30, y: 30)
}
@objc func back() {
dismiss(animated: true, completion: nil)
}
@objc func onTap() {
back() // default action is back on tap
}
}
================================================
FILE: Examples/MainViewController.swift
================================================
import UIKit
import CollectionKit
class MainViewController: UIViewController {
typealias SourceData = (makeViewController: ()->(UIViewController), exampleTitle:String)
let collectionView = CollectionView()
override func viewDidLoad() {
super.viewDidLoad()
if #available(iOS 13.0, tvOS 13, *) {
view.backgroundColor = UIColor.systemBackground
} else {
view.backgroundColor = .white
}
view.addSubview(collectionView)
setupcollection()
}
func setupcollection() {
let dataSource = ArrayDataSource<SourceData>(data: [
({ BuiltInTransitionExampleViewController1() }, "Built In Animations"),
({ MatchExampleViewController1() }, "Match Animation"),
({ MatchInCollectionExampleViewController1() }, "Match Cell in Collection"),
({ AppStoreViewController1() }, "App Store Transition"),
])
if #available(iOS 13.0, *) {
dataSource.data.insert(({ SwiftUIMatchExampleViewController() }, "Match SwiftUI"), at: 2)
}
let viewSource = ClosureViewSource { (label: UILabel, data: SourceData, index) in
label.text = "\(index + 1). \(data.exampleTitle)"
label.textAlignment = .center
if #available(iOS 13.0, tvOS 13, *) {
label.textColor = .label
label.backgroundColor = .systemBackground
} else {
label.textColor = .darkText
label.backgroundColor = .white
}
label.layer.borderColor = UIColor.gray.cgColor
label.layer.borderWidth = 0.5
label.layer.cornerRadius = 8
}
let sizeSource = { (i: Int, data: SourceData, size: CGSize) -> CGSize in
return CGSize(width: size.width, height: 64)
}
let examplesProvider = BasicProvider<SourceData, UILabel>(
dataSource: dataSource,
viewSource: viewSource,
sizeSource: sizeSource,
layout: FlowLayout(lineSpacing: 10))
{ (context) in
let vc = context.data.makeViewController()
vc.modalPresentationStyle = .fullScreen
self.present(vc, animated: true, completion: nil)
}
// TODO: Migrate the example to CollectionKit 2.2.0
let imageView = UIImageView(image: #imageLiteral(resourceName: "HeroLogo"))
imageView.contentMode = .scaleAspectFit
let imageProvider = SimpleViewProvider(views: [imageView], sizeStrategy: (.fill, .fit))
collectionView.provider = ComposedProvider(
layout: FlowLayout(lineSpacing: 10).inset(by: UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20)),
sections: [imageProvider, examplesProvider]
)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
collectionView.frame = view.bounds
}
}
================================================
FILE: Examples/MatchExample.swift
================================================
import UIKit
/*:
# Matching View
Use `hero.id` to match views from one view controller to another view controller.
Views that have the same hero.id will be automatically transitioned by Hero from its
source state to its destination state.
Use `hero.modifiers` to add extra animations or adjust how Hero handles the transition
for that specific view.
Check out `HeroModifiers.swift` for list of modifiers available.
*/
class MatchExampleViewController1: ExampleBaseViewController {
let redView = UIView()
let blackView = UIView()
override func viewDidLoad() {
super.viewDidLoad()
redView.backgroundColor = UIColor(hexString: "FC3A5E")!
redView.hero.id = "ironMan"
redView.cornerRadius = 8
view.addSubview(redView)
blackView.backgroundColor = UIColor(hexString: "555555")!
blackView.hero.id = "batMan"
blackView.cornerRadius = 8
view.addSubview(blackView)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
redView.frame.size = CGSize(width: 200, height: 200)
blackView.frame.size = CGSize(width: 200, height: 80)
redView.center = CGPoint(x: view.bounds.midX, y: view.bounds.midY + 50)
blackView.center = CGPoint(x: view.bounds.midX, y: view.bounds.midY - 90)
}
@objc override func onTap() {
let vc2 = MatchExampleViewController2()
vc2.hero.isEnabled = true
present(vc2, animated: true, completion: nil)
}
}
class MatchExampleViewController2: ExampleBaseViewController {
let redView = UIView()
let blackView = UIView()
let backgroundView = UIView()
override func viewDidLoad() {
super.viewDidLoad()
redView.backgroundColor = UIColor(hexString: "FC3A5E")!
redView.hero.id = "ironMan"
view.insertSubview(redView, belowSubview: dismissButton)
blackView.backgroundColor = UIColor(hexString: "555555")!
blackView.hero.id = "batMan"
blackView.cornerRadius = 8
view.addSubview(blackView)
if #available(iOS 13.0, tvOS 13, *) {
backgroundView.backgroundColor = .systemBackground
} else {
backgroundView.backgroundColor = .white
}
backgroundView.cornerRadius = 8
// .useGlobalCoordinateSpace modifier is needed here otherwise it will be covered by redView during transition.
// see http://lkzhao.com/2018/03/02/hero-useglobalcoordinatespace-explained.html for detail
backgroundView.hero.modifiers = [.translate(y: 500), .useGlobalCoordinateSpace]
view.addSubview(backgroundView)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
redView.frame = view.bounds
blackView.frame.size = CGSize(width: 250, height: 60)
blackView.center = CGPoint(x: view.bounds.midX, y: 130)
backgroundView.frame = CGRect(x: (view.bounds.width - 250) / 2, y: 180, width: 250, height: view.bounds.height - 320)
}
}
================================================
FILE: Examples/MatchInCollectionExample.swift
================================================
import UIKit
import CollectionKit
class MatchInCollectionExampleViewController1: ExampleBaseViewController {
let collectionView = CollectionView()
override func viewDidLoad() {
super.viewDidLoad()
view.insertSubview(collectionView, belowSubview: dismissButton)
setupCollection()
}
func setupCollection() {
let dataSource = ArrayDataSource<Int>(data: Array(0..<30))
let viewSource = ClosureViewSource { (view: UILabel, data: Int, index: Int) in
let color = UIColor(hue: CGFloat(data) / 30, saturation: 0.68,
brightness: 0.98, alpha: 1)
view.backgroundColor = color
view.textColor = .white
view.textAlignment = .center
view.layer.cornerRadius = 4
view.layer.masksToBounds = true
view.text = "\(data)"
}
let sizeSource = { (i: Int, data: Int, size: CGSize) -> CGSize in
let width: CGFloat = (size.width - 20) / 3
return CGSize(width: width, height: width)
}
let provider = BasicProvider<Int, UILabel>(
dataSource: dataSource,
viewSource: viewSource,
sizeSource: sizeSource,
layout: FlowLayout(spacing: 10).inset(by: UIEdgeInsets(top: 100, left: 10, bottom: 10, right: 10))
)
provider.tapHandler = { (context) in
self.cellTapped(cell: context.view, data: context.data)
}
collectionView.provider = provider
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
collectionView.frame = view.bounds
}
func cellTapped(cell: UIView, data: Int) {
// MARK: Hero configuration
// here we are using the data as the hero.id, we have to make sure that this id is
// unique for each cell. a random hero.id will also work.
let heroId = "cell\(data)"
cell.hero.id = heroId
let vc = MatchInCollectionExampleViewController2()
vc.hero.isEnabled = true
// copy over the backgroundColor and hero.id over to the next view
// controller. In a real app, we would be passing some data correspoding to the cell
// being tapped. then configure the next view controller according to the data.
// and make sure that views that need to be transitioned have the same hero.id
vc.contentView.backgroundColor = cell.backgroundColor
vc.contentView.hero.id = heroId
present(vc, animated: true, completion: nil)
}
}
class MatchInCollectionExampleViewController2: ExampleBaseViewController {
let contentView = UIView()
override func viewDidLoad() {
super.viewDidLoad()
contentView.cornerRadius = 8
view.addSubview(contentView)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
contentView.frame = CGRect(x: (view.bounds.width - 250) / 2, y: 140, width: 250, height: view.bounds.height - 280)
}
}
================================================
FILE: Examples/Resources/AppDelegate.swift
================================================
// The MIT License (MIT)
//
// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import Hero
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
window = UIWindow(frame: UIScreen.main.bounds)
window!.rootViewController = MainViewController()
window!.makeKeyAndVisible()
return true
}
func applicationWillResignActive(_ application: UIApplication) {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
}
func applicationDidEnterBackground(_ application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
func applicationWillEnterForeground(_ application: UIApplication) {
// Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
}
func applicationDidBecomeActive(_ application: UIApplication) {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
}
#if !(swift(>=4.2))
import CoreMedia
extension UIApplication {
typealias LaunchOptionsKey = UIApplicationLaunchOptionsKey
}
func CMTimeMakeWithSeconds(_ seconds: Float64, preferredTimescale: Int32) -> CMTime {
return CMTimeMakeWithSeconds(seconds, preferredTimescale)
}
extension CMTime {
static let zero = kCMTimeZero
}
#endif
================================================
FILE: Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "tv",
"filename" : "Back@large.png",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json
================================================
{
"layers" : [
{
"filename" : "Front.imagestacklayer"
},
{
"filename" : "Middle.imagestacklayer"
},
{
"filename" : "Back.imagestacklayer"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "tv",
"filename" : "Front@large.png",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "tv",
"filename" : "Middle@large.png",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "tv",
"filename" : "Back.png",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json
================================================
{
"layers" : [
{
"filename" : "Front.imagestacklayer"
},
{
"filename" : "Middle.imagestacklayer"
},
{
"filename" : "Back.imagestacklayer"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "tv",
"filename" : "Front.png",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "tv",
"filename" : "Middle.png",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json
================================================
{
"assets" : [
{
"size" : "1280x768",
"idiom" : "tv",
"filename" : "App Icon - Large.imagestack",
"role" : "primary-app-icon"
},
{
"size" : "400x240",
"idiom" : "tv",
"filename" : "App Icon - Small.imagestack",
"role" : "primary-app-icon"
},
{
"size" : "2320x720",
"idiom" : "tv",
"filename" : "Top Shelf Image Wide.imageset",
"role" : "top-shelf-image-wide"
},
{
"size" : "1920x720",
"idiom" : "tv",
"filename" : "Top Shelf Image.imageset",
"role" : "top-shelf-image"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "tv",
"filename" : "Top Shelf Image Wide.png",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "tv",
"filename" : "Top Shelf Image.png",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-20@2x.png",
"scale" : "2x"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-20@3x.png",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-29@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-29@3x.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-40@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-40@3x.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-60@3x.png",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-20.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-20@2x-1.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-29.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-29@2x-1.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-40.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-40@2x-1.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-76.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-83.5@2x.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-1024.png",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/AppleHomePage/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/AppleHomePage/iphone_alt_small_2x.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "iphone_alt_small_2x.jpg",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/AppleHomePage/macbookpro_portrait_small_2x.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "macbookpro_portrait_small_2x.jpg",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/AppleHomePage/watch_alt_portrait_small_2x.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "watch_alt_portrait_small_2x.jpg",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/CityGuide/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/CityGuide/cityGuide.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "316f8e75.jpeg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/CityGuide/montreal.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "photo-1419041082630-1e98debd0a6a.jpeg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/CityGuide/toronto.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "photo-1437147921639-ef00e030265a.jpeg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/CityGuide/vancouver.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "316f8e75.jpeg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash0.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash0.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash0_cell.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash0_cell.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash0_thumb.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash0_thumb.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash1.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash1.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash10.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash10.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash10_cell.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash10_cell.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash10_thumb.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash10_thumb.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash1_cell.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash1_cell.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash1_thumb.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash1_thumb.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash2.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash2.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash2_cell.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash2_cell.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash2_thumb.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash2_thumb.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash3.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash3.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash3_cell.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash3_cell.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash3_thumb.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash3_thumb.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash4.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash4.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash4_cell.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash4_cell.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash4_thumb.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash4_thumb.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash5.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash5.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash5_cell.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash5_cell.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash5_thumb.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash5_thumb.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash6.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash6.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash6_cell.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash6_cell.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash6_thumb.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash6_thumb.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash7.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash7.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash7_cell.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash7_cell.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash7_thumb.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash7_thumb.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash8.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash8.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash8_cell.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash8_cell.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash8_thumb.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash8_thumb.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash9.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash9.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash9_cell.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash9_cell.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Foods/Unsplash9_thumb.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "Unsplash9_thumb.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/HeroLogo.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "HeroLogo.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "HeroLogo@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "HeroLogo@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Menu/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Menu/ic_audiotrack_48pt.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_audiotrack_48pt.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_audiotrack_48pt_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_audiotrack_48pt_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Menu/ic_chat_48pt.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_chat_48pt.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_chat_48pt_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_chat_48pt_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Menu/ic_format_quote_48pt.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_format_quote_48pt.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_format_quote_48pt_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_format_quote_48pt_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Menu/ic_gif_48pt.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_gif_48pt.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_gif_48pt_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_gif_48pt_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Menu/ic_insert_photo_48pt.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_insert_photo_48pt.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_insert_photo_48pt_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_insert_photo_48pt_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Menu/ic_link_48pt.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_link_48pt.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_link_48pt_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_link_48pt_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Menu/ic_menu_36pt.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_menu_36pt.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_menu_36pt_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_menu_36pt_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Menu/ic_menu_48pt.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_menu_48pt.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_menu_48pt_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_menu_48pt_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Menu/ic_text_fields_48pt.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_text_fields_48pt.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_text_fields_48pt_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_text_fields_48pt_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/Menu/ic_videocam_48pt.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_videocam_48pt.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_videocam_48pt_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_videocam_48pt_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/MusicPlayer/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/MusicPlayer/album1.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "computergraphics-album-covers-2014-3.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/MusicPlayer/ic_fast_forward.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_fast_forward.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_fast_forward_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_fast_forward_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/MusicPlayer/ic_fast_rewind.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_fast_rewind.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_fast_rewind_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_fast_rewind_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/MusicPlayer/ic_pause_white.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_pause_white.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_pause_white_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_pause_white_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/MusicPlayer/ic_play_arrow_white.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_play_arrow_white.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_play_arrow_white_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_play_arrow_white_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/MusicPlayer/ic_repeat.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_repeat.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_repeat_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_repeat_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/MusicPlayer/ic_shuffle.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_shuffle.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_shuffle_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_shuffle_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/bigbuckbunny.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "poster.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/ic_bug_report_48pt.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_bug_report_48pt.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_bug_report_48pt_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_bug_report_48pt_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/ic_close.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_close.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_close_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_close_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/ic_code.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_code.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_code_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_code_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/ic_input_48pt.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_input_48pt.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_input_48pt_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_input_48pt_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/ic_keyboard_arrow_down.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_keyboard_arrow_down.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_keyboard_arrow_down_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_keyboard_arrow_down_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/ic_view_list.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_view_list.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_view_list_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_view_list_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Assets.xcassets/ic_view_module.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "ic_view_module.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "ic_view_module_2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "ic_view_module_3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Examples/Resources/Base.lproj/LaunchScreen.storyboard
================================================
<?xml version="1.0" encoding="UTF-8"?>
<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">
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15404"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<viewLayoutGuide key="safeArea" id="ahU-2K-RQA"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
</document>
================================================
FILE: Examples/Resources/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(MARKETING_VERSION)</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UIRequiresFullScreen</key>
<true/>
<key>UIStatusBarHidden</key>
<true/>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
</dict>
</plist>
================================================
FILE: Examples/Resources/UIKit+HeroExamples.swift
================================================
// The MIT License (MIT)
//
// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
public extension UIView {
@IBInspectable var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
set {
layer.cornerRadius = newValue
}
}
@IBInspectable var shadowRadius: CGFloat {
get {
return layer.shadowRadius
}
set {
layer.shadowRadius = newValue
}
}
@IBInspectable var shadowOpacity: Float {
get {
return layer.shadowOpacity
}
set {
layer.shadowOpacity = newValue
}
}
@IBInspectable var shadowColor: UIColor? {
get {
return layer.shadowColor != nil ? UIColor(cgColor: layer.shadowColor!) : nil
}
set {
layer.shadowColor = newValue?.cgColor
}
}
@IBInspectable var shadowOffset: CGSize {
get {
return layer.shadowOffset
}
set {
layer.shadowOffset = newValue
}
}
@IBInspectable var zPosition: CGFloat {
get {
return layer.zPosition
}
set {
layer.zPosition = newValue
}
}
}
func viewController(forStoryboardName: String) -> UIViewController {
return UIStoryboard(name: forStoryboardName, bundle: nil).instantiateInitialViewController()!
}
class TemplateImageView: UIImageView {
@IBInspectable var templateImage: UIImage? {
didSet {
image = templateImage?.withRenderingMode(.alwaysTemplate)
}
}
}
================================================
FILE: Examples/SwiftUIMatchExample.swift
================================================
#if canImport(SwiftUI)
import UIKit
import SwiftUI
import Hero
@available(iOS 13.0, *)
class SwiftUIMatchExampleViewController: UIHostingController<ImagesTableView> {
required init() {
super.init(rootView: ImagesTableView())
rootView.dismiss = self.dismiss
rootView.onTapRow = { image in
let destinationViewController = UIHostingController(rootView: ImageViewWrapper(name: image.name, heroID: image.name)
.onTapGesture { [weak self] in
self?.presentedViewController?.dismiss(animated: true, completion: nil)
})
destinationViewController.isHeroEnabled = true
self.present(destinationViewController, animated: true, completion: nil)
}
}
@objc required dynamic init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func dismiss(){
self.dismiss(animated: true, completion: nil)
}
}
struct ImageInfo: Identifiable {
let id: Int
let name: String
}
@available(iOS 13.0, *)
struct ImagesTableView: View {
var dismiss: (() -> Void)?
var onTapRow: ((ImageInfo)->())?
@State var images = (0...9).map{ ImageInfo(id: $0, name: "Unsplash\($0)") }
var body: some View {
VStack {
HStack{
Button(action: {
self.dismiss?()
}) {
Text("Back")
}.padding(.leading)
Spacer()
}
List(images) { image in
HStack {
ImageViewWrapper(name: "\(image.name)_cell", heroID: image.name)
Spacer()
Text("Image number \(image.id)").padding()
}.onTapGesture {
self.onTapRow?(image)
}
}
}
}
}
@available(iOS 13.0, *)
struct ImageViewWrapper: View, UIViewRepresentable {
let name: String
let heroID: String?
func makeUIView(context: UIViewRepresentableContext<ImageViewWrapper>) -> UIImageView {
UIImageView(frame: .zero)
}
func updateUIView(_ uiView: UIImageView, context: UIViewRepresentableContext<ImageViewWrapper>) {
uiView.image = UIImage(named: name)
uiView.hero.id = heroID
}
}
//MARK: - Previews (Will only work when target of HeroExamples is set to iOS 13 +)
#if DEBUG
@available(iOS 13.0, *)
struct ImagesTableView_Previews: PreviewProvider {
static var previews: some View {
ImagesTableView(onTapRow: nil)
}
}
@available(iOS 13.0, *)
struct ImageViewWrapper_Previews: PreviewProvider {
static var previews: some View {
ImageViewWrapper(name: "Unsplash0", heroID: nil)
}
}
#endif
#endif
================================================
FILE: Gemfile
================================================
# frozen_string_literal: true
source 'https://rubygems.org'
#ruby '~> 2.5.1'
gem 'cocoapods', '~> 1.10'
gem 'cocoapods-check'
gem 'cocoapods-generate'
gem 'cocoapods-githooks' # Sync .git-hooks across team members at `pod install` time
gem 'cocoapods-packager' # Generate a framework or static library from a podspec. https://github.com/CocoaPods/cocoapods-packager
gem 'cocoapods-repo-update' # Fixes issues with CI not updating specs
# Temporary workaround for bug in binary file diffing
# https://github.com/danger/danger/issues/1055
# https://github.com/ruby-git/ruby-git/pull/405
gem 'git', git: 'https://github.com/jcouball/ruby-git.git'
gem 'fastlane'
gem 'xcode-install'
group :documentation do
# gem 'jazzy', '~> 0.11'
end
group :test do
gem 'git_diff_parser'
gem 'xcpretty'
gem 'danger'
gem 'danger-auto_label'
gem 'danger-swiftlint'
# Danger plugin to validate the code coverage of the files changed
# - Gem: danger-xcov
# - URL: https://github.com/nakiostudio/danger-xcov
gem 'danger-xcov'
end
plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
eval_gemfile(plugins_path) if File.exist?(plugins_path)
================================================
FILE: Hero.podspec
================================================
# frozen_string_literal: true
Pod::Spec.new do |s|
s.name = 'Hero'
s.version = '1.6.4'
s.summary = 'Elegant transition library for iOS'
s.description = <<-DESC
Hero is a library for building iOS view controller transitions.
It provides a declarative layer on top of the UIKit's cumbersome transition APIs.
Making custom transitions an easy task for developers.
DESC
s.homepage = 'https://github.com/HeroTransitions/Hero'
s.screenshots = 'https://github.com/HeroTransitions/Hero/blob/master/Resources/Hero.png?raw=true'
s.documentation_url = 'https://herotransitions.github.io/Hero/'
s.screenshots = ['https://git.io/JeRkv', 'https://git.io/JeRke', 'https://git.io/JeRkf', 'https://git.io/JeRkJ']
s.license = { :type => 'MIT' }
s.author = {
'Luke' => 'lzhaoyilun@gmail.com',
'Joe Mattiello' => 'git@joemattiello.com'
}
s.source = { git: 'https://github.com/HeroTransitions/Hero.git', tag: s.version.to_s }
s.cocoapods_version = '>= 1.4.0'
s.ios.deployment_target = '10.0'
s.tvos.deployment_target = '10.0'
s.ios.frameworks = 'UIKit', 'Foundation', 'QuartzCore', 'CoreGraphics', 'CoreMedia'
s.tvos.frameworks = 'UIKit', 'Foundation', 'QuartzCore', 'CoreGraphics', 'CoreMedia'
s.swift_version = '5.0'
s.requires_arc = true
s.source_files = 'Sources/**/*.swift'
end
================================================
FILE: Hero.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
1F0287FA2173F3C80008FA3B /* SwiftSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0287F92173F3C80008FA3B /* SwiftSupport.swift */; };
1F0287FB2173F3C80008FA3B /* SwiftSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F0287F92173F3C80008FA3B /* SwiftSupport.swift */; };
2D1F7FC71E49DD02004D944B /* HeroTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B511E2C0CBD00AC1959 /* HeroTransition.swift */; };
2D1F7FC81E49DD04004D944B /* HeroContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B521E2C0CBD00AC1959 /* HeroContext.swift */; };
2D1F7FC91E49DD08004D944B /* HeroModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B551E2C0CBD00AC1959 /* HeroModifier.swift */; };
2D1F7FCA1E49DD08004D944B /* HeroPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B561E2C0CBD00AC1959 /* HeroPlugin.swift */; };
2D1F7FCB1E49DD08004D944B /* HeroTargetState.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B571E2C0CBD00AC1959 /* HeroTargetState.swift */; };
2D1F7FCC1E49DD08004D944B /* HeroTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B581E2C0CBD00AC1959 /* HeroTypes.swift */; };
2D1F7FCD1E49DD13004D944B /* BasePreprocessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3298CD91E304851005B06BB /* BasePreprocessor.swift */; };
2D1F7FCE1E49DD13004D944B /* CascadePreprocessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B3D1E2C0C7E00AC1959 /* CascadePreprocessor.swift */; };
2D1F7FCF1E49DD13004D944B /* IgnoreSubviewModifiersPreprocessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B3E1E2C0C7E00AC1959 /* IgnoreSubviewModifiersPreprocessor.swift */; };
2D1F7FD01E49DD13004D944B /* MatchPreprocessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B3F1E2C0C7E00AC1959 /* MatchPreprocessor.swift */; };
2D1F7FD11E49DD13004D944B /* SourcePreprocessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B401E2C0C7E00AC1959 /* SourcePreprocessor.swift */; };
2D1F7FD21E49DD18004D944B /* Array+HeroModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B451E2C0C9300AC1959 /* Array+HeroModifier.swift */; };
2D1F7FD31E49DD18004D944B /* CALayer+Hero.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B461E2C0C9300AC1959 /* CALayer+Hero.swift */; };
2D1F7FD41E49DD18004D944B /* CAMediaTimingFunction+Hero.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B471E2C0C9300AC1959 /* CAMediaTimingFunction+Hero.swift */; };
2D1F7FD51E49DD18004D944B /* CG+Hero.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B481E2C0C9300AC1959 /* CG+Hero.swift */; };
2D1F7FD61E49DD18004D944B /* DispatchQueue+Hero.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B491E2C0C9300AC1959 /* DispatchQueue+Hero.swift */; };
2D1F7FD71E49DD18004D944B /* UIKit+Hero.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B4A1E2C0C9300AC1959 /* UIKit+Hero.swift */; };
2D1F7FD81E49DD1D004D944B /* HeroDefaultAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B531E2C0CBD00AC1959 /* HeroDefaultAnimator.swift */; };
2D1F7FD91E49DD1D004D944B /* HeroCoreAnimationViewContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B541E2C0CBD00AC1959 /* HeroCoreAnimationViewContext.swift */; };
2D1F7FDA1E49DD21004D944B /* HeroDebugPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B611E2C0CD000AC1959 /* HeroDebugPlugin.swift */; };
2D1F7FDB1E49DD21004D944B /* HeroDebugView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B621E2C0CD100AC1959 /* HeroDebugView.swift */; };
2D1F7FDC1E49DD3C004D944B /* Hero.h in Headers */ = {isa = PBXBuildFile; fileRef = A306D3B41E1C7A2E00B6C23A /* Hero.h */; settings = {ATTRIBUTES = (Public, ); }; };
2D1F7FE51E49DD90004D944B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D1F7FE41E49DD90004D944B /* AppDelegate.swift */; };
2D1F7FE71E49DD90004D944B /* TVImageGalleryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D1F7FE61E49DD90004D944B /* TVImageGalleryViewController.swift */; };
2D1F7FEA1E49DD90004D944B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2D1F7FE81E49DD90004D944B /* Main.storyboard */; };
2D1F7FF21E49E043004D944B /* Hero.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D1F7FBF1E49DCB5004D944B /* Hero.framework */; };
4D307DF420E3C6DC00DD9F65 /* HeroModifier+Advanced.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D307DF320E3C6DC00DD9F65 /* HeroModifier+Advanced.swift */; };
4D307DF520E3C6DC00DD9F65 /* HeroModifier+Advanced.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D307DF320E3C6DC00DD9F65 /* HeroModifier+Advanced.swift */; };
5C5442AA2004092500E1E326 /* HeroCompatible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C69728F2002CDBD001A5051 /* HeroCompatible.swift */; };
5C6972902002CDBD001A5051 /* HeroCompatible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C69728F2002CDBD001A5051 /* HeroCompatible.swift */; };
62EFDDAC236F4FC200F3E85E /* SwiftUIMatchExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62EFDDAB236F4FC200F3E85E /* SwiftUIMatchExample.swift */; };
83043017B73BC66DBB920D5C /* Pods_HeroExamples.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EEE340F89FF0A49DD23A5A6E /* Pods_HeroExamples.framework */; };
A306D3B61E1C7A2E00B6C23A /* Hero.h in Headers */ = {isa = PBXBuildFile; fileRef = A306D3B41E1C7A2E00B6C23A /* Hero.h */; settings = {ATTRIBUTES = (Public, ); }; };
A306D3B91E1C7A2E00B6C23A /* Hero.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A306D3B21E1C7A2E00B6C23A /* Hero.framework */; };
A306D3BB1E1C7A2E00B6C23A /* Hero.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A306D3B21E1C7A2E00B6C23A /* Hero.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
A3298CDA1E304851005B06BB /* BasePreprocessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3298CD91E304851005B06BB /* BasePreprocessor.swift */; };
A32D2CF21E4A7DC3008D35FF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A33E60AB1DE761C90065CBD8 /* Assets.xcassets */; };
A32D2CFC1E4A80DC008D35FF /* UIKit+HeroExamples.swift in Sources */ = {isa = PBXBuildFile; fileRef = A33E60B61DE7621C0065CBD8 /* UIKit+HeroExamples.swift */; };
A32D2D021E4A8153008D35FF /* Basic.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A32D2D001E4A8153008D35FF /* Basic.storyboard */; };
A32D2D031E4A8153008D35FF /* ImageGallery.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A32D2D011E4A8153008D35FF /* ImageGallery.storyboard */; };
A32D2D051E4A81D5008D35FF /* ImageViewer.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A32D2D041E4A81D5008D35FF /* ImageViewer.storyboard */; };
A32D2D131E501C4F008D35FF /* HeroModifier+HeroStringConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = A32D2D121E501C4F008D35FF /* HeroModifier+HeroStringConvertible.swift */; };
A32D2D141E501C4F008D35FF /* HeroModifier+HeroStringConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = A32D2D121E501C4F008D35FF /* HeroModifier+HeroStringConvertible.swift */; };
A33E60A51DE761C90065CBD8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A33E60A41DE761C90065CBD8 /* AppDelegate.swift */; };
A33E60AC1DE761C90065CBD8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A33E60AB1DE761C90065CBD8 /* Assets.xcassets */; };
A33E60AF1DE761C90065CBD8 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A33E60AD1DE761C90065CBD8 /* LaunchScreen.storyboard */; };
A33E60BD1DE7621C0065CBD8 /* UIKit+HeroExamples.swift in Sources */ = {isa = PBXBuildFile; fileRef = A33E60B61DE7621C0065CBD8 /* UIKit+HeroExamples.swift */; };
A355CEC8D787CF71B0D7CBDA /* Pods_HeroTvOSExamples.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FD2306FDA4E15ADA91EFED44 /* Pods_HeroTvOSExamples.framework */; };
A37D7B411E2C0C7E00AC1959 /* CascadePreprocessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B3D1E2C0C7E00AC1959 /* CascadePreprocessor.swift */; };
A37D7B421E2C0C7E00AC1959 /* IgnoreSubviewModifiersPreprocessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B3E1E2C0C7E00AC1959 /* IgnoreSubviewModifiersPreprocessor.swift */; };
A37D7B431E2C0C7E00AC1959 /* MatchPreprocessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B3F1E2C0C7E00AC1959 /* MatchPreprocessor.swift */; };
A37D7B441E2C0C7E00AC1959 /* SourcePreprocessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B401E2C0C7E00AC1959 /* SourcePreprocessor.swift */; };
A37D7B4B1E2C0C9300AC1959 /* Array+HeroModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B451E2C0C9300AC1959 /* Array+HeroModifier.swift */; };
A37D7B4C1E2C0C9300AC1959 /* CALayer+Hero.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B461E2C0C9300AC1959 /* CALayer+Hero.swift */; };
A37D7B4D1E2C0C9300AC1959 /* CAMediaTimingFunction+Hero.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B471E2C0C9300AC1959 /* CAMediaTimingFunction+Hero.swift */; };
A37D7B4E1E2C0C9300AC1959 /* CG+Hero.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B481E2C0C9300AC1959 /* CG+Hero.swift */; };
A37D7B4F1E2C0C9300AC1959 /* DispatchQueue+Hero.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B491E2C0C9300AC1959 /* DispatchQueue+Hero.swift */; };
A37D7B501E2C0C9300AC1959 /* UIKit+Hero.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B4A1E2C0C9300AC1959 /* UIKit+Hero.swift */; };
A37D7B591E2C0CBD00AC1959 /* HeroTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B511E2C0CBD00AC1959 /* HeroTransition.swift */; };
A37D7B5A1E2C0CBD00AC1959 /* HeroContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B521E2C0CBD00AC1959 /* HeroContext.swift */; };
A37D7B5B1E2C0CBD00AC1959 /* HeroDefaultAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B531E2C0CBD00AC1959 /* HeroDefaultAnimator.swift */; };
A37D7B5C1E2C0CBD00AC1959 /* HeroCoreAnimationViewContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B541E2C0CBD00AC1959 /* HeroCoreAnimationViewContext.swift */; };
A37D7B5D1E2C0CBD00AC1959 /* HeroModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B551E2C0CBD00AC1959 /* HeroModifier.swift */; };
A37D7B5E1E2C0CBD00AC1959 /* HeroPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B561E2C0CBD00AC1959 /* HeroPlugin.swift */; };
A37D7B5F1E2C0CBD00AC1959 /* HeroTargetState.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B571E2C0CBD00AC1959 /* HeroTargetState.swift */; };
A37D7B601E2C0CBD00AC1959 /* HeroTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B581E2C0CBD00AC1959 /* HeroTypes.swift */; };
A37D7B631E2C0CD100AC1959 /* HeroDebugPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B611E2C0CD000AC1959 /* HeroDebugPlugin.swift */; };
A37D7B641E2C0CD100AC1959 /* HeroDebugView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A37D7B621E2C0CD100AC1959 /* HeroDebugView.swift */; };
A3B8C5672083376100E112F6 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3B8C5662083376100E112F6 /* MainViewController.swift */; };
A3D060C020833B0800E48927 /* BuiltInTransitionExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3D060BF20833B0700E48927 /* BuiltInTransitionExample.swift */; };
A3D060C220833B4E00E48927 /* ExampleBaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3D060C120833B4E00E48927 /* ExampleBaseViewController.swift */; };
A3D060C420833D0400E48927 /* MatchExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3D060C320833D0400E48927 /* MatchExample.swift */; };
A3D060C6208348CB00E48927 /* MatchInCollectionExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3D060C5208348CB00E48927 /* MatchInCollectionExample.swift */; };
A3D060C820834FF100E48927 /* AppStoreCardExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3D060C720834FF100E48927 /* AppStoreCardExample.swift */; };
AF1E1B541E66822C00ECE039 /* HeroTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF1E1B531E66822C00ECE039 /* HeroTests.swift */; };
AF6D934A1E65168D00FCD55E /* HeroStringConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF6D93491E65168D00FCD55E /* HeroStringConvertible.swift */; };
AF6D934B1E65168D00FCD55E /* HeroStringConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF6D93491E65168D00FCD55E /* HeroStringConvertible.swift */; };
AFA306CA1E6B446C00CAF719 /* Lexer.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFA306C61E6B446C00CAF719 /* Lexer.swift */; };
AFA306CB1E6B446C00CAF719 /* Lexer.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFA306C61E6B446C00CAF719 /* Lexer.swift */; };
AFA306CC1E6B446C00CAF719 /* Nodes.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFA306C71E6B446C00CAF719 /* Nodes.swift */; };
AFA306CD1E6B446C00CAF719 /* Nodes.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFA306C71E6B446C00CAF719 /* Nodes.swift */; };
AFA306CE1E6B446C00CAF719 /* Parser.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFA306C81E6B446C00CAF719 /* Parser.swift */; };
AFA306CF1E6B446C00CAF719 /* Parser.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFA306C81E6B446C00CAF719 /* Parser.swift */; };
AFA306D01E6B446C00CAF719 /* Regex.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFA306C91E6B446C00CAF719 /* Regex.swift */; };
AFA306D11E6B446C00CAF719 /* Regex.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFA306C91E6B446C00CAF719 /* Regex.swift */; };
B101B2CB1E56140A007E7112 /* UIView+Hero.swift in Sources */ = {isa = PBXBuildFile; fileRef = B101B2C91E561408007E7112 /* UIView+Hero.swift */; };
B101B2CC1E56140B007E7112 /* UIView+Hero.swift in Sources */ = {isa = PBXBuildFile; fileRef = B101B2C91E561408007E7112 /* UIView+Hero.swift */; };
B101B2CE1E561421007E7112 /* UIViewController+Hero.swift in Sources */ = {isa = PBXBuildFile; fileRef = B101B2CD1E561421007E7112 /* UIViewController+Hero.swift */; };
B101B2CF1E561421007E7112 /* UIViewController+Hero.swift in Sources */ = {isa = PBXBuildFile; fileRef = B101B2CD1E561421007E7112 /* UIViewController+Hero.swift */; };
B1193AB61E525CD8005B1C87 /* HeroViewPropertyViewContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1193AB51E525CD8005B1C87 /* HeroViewPropertyViewContext.swift */; };
B1193AB71E525CD8005B1C87 /* HeroViewPropertyViewContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1193AB51E525CD8005B1C87 /* HeroViewPropertyViewContext.swift */; };
B1193AB91E525D12005B1C87 /* HeroAnimatorViewContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1193AB81E525D12005B1C87 /* HeroAnimatorViewContext.swift */; };
B1193ABA1E525D12005B1C87 /* HeroAnimatorViewContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1193AB81E525D12005B1C87 /* HeroAnimatorViewContext.swift */; };
B16197E01EF451C500A540D2 /* HeroTransition+Interactive.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16197DF1EF451C400A540D2 /* HeroTransition+Interactive.swift */; };
B16197E11EF451C500A540D2 /* HeroTransition+Interactive.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16197DF1EF451C400A540D2 /* HeroTransition+Interactive.swift */; };
B16B75311EF45A110018DBEF /* HeroTransitionState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16B75301EF45A110018DBEF /* HeroTransitionState.swift */; };
B16B75321EF45A110018DBEF /* HeroTransitionState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16B75301EF45A110018DBEF /* HeroTransitionState.swift */; };
B16B75341EF461090018DBEF /* HeroProgressRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16B75331EF461090018DBEF /* HeroProgressRunner.swift */; };
B16B75351EF461090018DBEF /* HeroProgressRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16B75331EF461090018DBEF /* HeroProgressRunner.swift */; };
B16ECD031E4FC0B300EAE0E0 /* DefaultAnimationPreprocessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16ECD021E4FC0B300EAE0E0 /* DefaultAnimationPreprocessor.swift */; };
B16ECD041E4FC0B300EAE0E0 /* DefaultAnimationPreprocessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16ECD021E4FC0B300EAE0E0 /* DefaultAnimationPreprocessor.swift */; };
B17D88861EF5A51C0048D3E8 /* HeroTransition+UITabBarControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B17D88851EF5A51C0048D3E8 /* HeroTransition+UITabBarControllerDelegate.swift */; };
B17D88871EF5A51C0048D3E8 /* HeroTransition+UITabBarControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B17D88851EF5A51C0048D3E8 /* HeroTransition+UITabBarControllerDelegate.swift */; };
B17D88891EF5A5330048D3E8 /* HeroTransition+UINavigationControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B17D88881EF5A5330048D3E8 /* HeroTransition+UINavigationControllerDelegate.swift */; };
B17D888A1EF5A5330048D3E8 /* HeroTransition+UINavigationControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B17D88881EF5A5330048D3E8 /* HeroTransition+UINavigationControllerDelegate.swift */; };
B17D888C1EF5A5500048D3E8 /* HeroTransition+UIViewControllerTransitioningDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B17D888B1EF5A5500048D3E8 /* HeroTransition+UIViewControllerTransitioningDelegate.swift */; };
B17D888D1EF5A5500048D3E8 /* HeroTransition+UIViewControllerTransitioningDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B17D888B1EF5A5500048D3E8 /* HeroTransition+UIViewControllerTransitioningDelegate.swift */; };
B1D816DF1EF5A5DF007B9776 /* HeroViewControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D816DE1EF5A5DF007B9776 /* HeroViewControllerDelegate.swift */; };
B1D816E01EF5A5DF007B9776 /* HeroViewControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D816DE1EF5A5DF007B9776 /* HeroViewControllerDelegate.swift */; };
B1D816E21EF5A630007B9776 /* HeroTransition+CustomTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D816E11EF5A630007B9776 /* HeroTransition+CustomTransition.swift */; };
B1D816E31EF5A630007B9776 /* HeroTransition+CustomTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D816E11EF5A630007B9776 /* HeroTransition+CustomTransition.swift */; };
B1D816E51EF5A6AE007B9776 /* HeroTransition+Start.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D816E41EF5A6AE007B9776 /* HeroTransition+Start.swift */; };
B1D816E61EF5A6AE007B9776 /* HeroTransition+Start.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D816E41EF5A6AE007B9776 /* HeroTransition+Start.swift */; };
B1D816E81EF5A6FE007B9776 /* HeroTransition+Complete.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D816E71EF5A6FE007B9776 /* HeroTransition+Complete.swift */; };
B1D816E91EF5A6FE007B9776 /* HeroTransition+Complete.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D816E71EF5A6FE007B9776 /* HeroTransition+Complete.swift */; };
B1D816EB1EF5A720007B9776 /* HeroTransition+Animate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D816EA1EF5A720007B9776 /* HeroTransition+Animate.swift */; };
B1D816EC1EF5A720007B9776 /* HeroTransition+Animate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D816EA1EF5A720007B9776 /* HeroTransition+Animate.swift */; };
B1D834041F02E7C0009E1E36 /* ConditionalPreprocessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D834031F02E7C0009E1E36 /* ConditionalPreprocessor.swift */; };
B1D834051F02E7C0009E1E36 /* ConditionalPreprocessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D834031F02E7C0009E1E36 /* ConditionalPreprocessor.swift */; };
B35264CE2454FEF300D33861 /* Locale+Hero.swift in Sources */ = {isa = PBXBuildFile; fileRef = B35264CD2454FEF300D33861 /* Locale+Hero.swift */; };
B35264CF2454FEF300D33861 /* Locale+Hero.swift in Sources */ = {isa = PBXBuildFile; fileRef = B35264CD2454FEF300D33861 /* Locale+Hero.swift */; };
B383074925D1041A00B7A0D8 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B383074825D1041A00B7A0D8 /* SwiftUI.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
B383074B25D1042C00B7A0D8 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B383074A25D1042C00B7A0D8 /* SwiftUI.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
DBA05BB41A704A4A17967918 /* Pods_HeroTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 841FFA357ACB279D3F74CDEE /* Pods_HeroTests.framework */; };
F482F0BE235D7808002E97ED /* UIColor+HexString.swift in Sources */ = {isa = PBXBuildFile; fileRef = F482F0BD235D7808002E97ED /* UIColor+HexString.swift */; };
F482F0BF235D7808002E97ED /* UIColor+HexString.swift in Sources */ = {isa = PBXBuildFile; fileRef = F482F0BD235D7808002E97ED /* UIColor+HexString.swift */; };
F482F0C0235D7A3A002E97ED /* ImageGalleryCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3499D9E1DF2024E0049B541 /* ImageGalleryCollectionViewController.swift */; };
F482F0C1235D7A51002E97ED /* ImageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A304BF831DF2717900A03345 /* ImageViewController.swift */; };
F482F0C2235D7A5B002E97ED /* ImageCells.swift in Sources */ = {isa = PBXBuildFile; fileRef = A304BF891DF647FC00A03345 /* ImageCells.swift */; };
F482F0C3235D7A65002E97ED /* ImageLibrary.swift in Sources */ = {isa = PBXBuildFile; fileRef = A313499A1E1E2AED00EB5139 /* ImageLibrary.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
2D1F7FF31E49E05A004D944B /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A33E60991DE761C90065CBD8 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 2D1F7FBE1E49DCB5004D944B;
remoteInfo = "Hero (tvOS)";
};
A306D3B71E1C7A2E00B6C23A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A33E60991DE761C90065CBD8 /* Project object */;
proxyType = 1;
remoteGlobalIDString = A306D3B11E1C7A2E00B6C23A;
remoteInfo = Hero;
};
AF1E1B561E66822C00ECE039 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A33E60991DE761C90065CBD8 /* Project object */;
proxyType = 1;
remoteGlobalIDString = A33E60A01DE761C90065CBD8;
remoteInfo = HeroExamples;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
A306D3BA1E1C7A2E00B6C23A /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
A306D3BB1E1C7A2E00B6C23A /* Hero.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
1F0287F92173F3C80008FA3B /* SwiftSupport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftSupport.swift; sourceTree = "<group>"; };
2D1F7FBF1E49DCB5004D944B /* Hero.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Hero.framework; sourceTree = BUILT_PRODUCTS_DIR; };
2D1F7FE21E49DD90004D944B /* HeroTvOSExamples.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HeroTvOSExamples.app; sourceTree = BUILT_PRODUCTS_DIR; };
2D1F7FE41E49DD90004D944B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
2D1F7FE61E49DD90004D944B /* TVImageGalleryViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TVImageGalleryViewController.swift; sourceTree = "<group>"; };
2D1F7FE91E49DD90004D944B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
2D1F7FED1E49DD90004D944B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
4D307DF320E3C6DC00DD9F65 /* HeroModifier+Advanced.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "HeroModifier+Advanced.swift"; sourceTree = "<group>"; };
5C69728F2002CDBD001A5051 /* HeroCompatible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeroCompatible.swift; sourceTree = "<group>"; };
5CD4F09A588E81DA75C2BE38 /* Pods-HeroExamples.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HeroExamples.debug.xcconfig"; path = "Pods/Target Support Files/Pods-HeroExamples/Pods-HeroExamples.debug.xcconfig"; sourceTree = "<group>"; };
5CEC69C9A9A60129002FD931 /* Pods-HeroTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HeroTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-HeroTests/Pods-HeroTests.release.xcconfig"; sourceTree = "<group>"; };
62EFDDAB236F4FC200F3E85E /* SwiftUIMatchExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUIMatchExample.swift; sourceTree = "<group>"; };
841FFA357ACB279D3F74CDEE /* Pods_HeroTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_HeroTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
86C87C73D89E75C8443B5071 /* Pods-HeroTvOSExamples.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HeroTvOSExamples.debug.xcconfig"; path = "Pods/Target Support Files/Pods-HeroTvOSExamples/Pods-HeroTvOSExamples.debug.xcconfig"; sourceTree = "<group>"; };
A304BF831DF2717900A03345 /* ImageViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageViewController.swift; sourceTree = "<group>"; };
A304BF891DF647FC00A03345 /* ImageCells.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageCells.swift; sourceTree = "<group>"; };
A306D3B21E1C7A2E00B6C23A /* Hero.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Hero.framework; sourceTree = BUILT_PRODUCTS_DIR; };
A306D3B41E1C7A2E00B6C23A /* Hero.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Hero.h; sourceTree = "<group>"; };
A306D3B51E1C7A2E00B6C23A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
A313499A1E1E2AED00EB5139 /* ImageLibrary.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageLibrary.swift; sourceTree = "<group>"; };
A3298CD91E304851005B06BB /* BasePreprocessor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BasePreprocessor.swift; sourceTree = "<group>"; };
A32D2D001E4A8153008D35FF /* Basic.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Basic.storyboard; sourceTree = "<group>"; };
A32D2D011E4A8153008D35FF /* ImageGallery.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = ImageGallery.storyboard; sourceTree = "<group>"; };
A32D2D041E4A81D5008D35FF /* ImageViewer.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = ImageViewer.storyboard; sourceTree = "<group>"; };
A32D2D0C1E4D545B008D35FF /* MenuViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MenuViewController.swift; sourceTree = "<group>"; };
A32D2D0F1E4E14DD008D35FF /* BuiltInTransitions.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = BuiltInTransitions.storyboard; sourceTree = "<group>"; };
A32D2D121E501C4F008D35FF /* HeroModifier+HeroStringConvertible.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "HeroModifier+HeroStringConvertible.swift"; sourceTree = "<group>"; };
A33E60A11DE761C90065CBD8 /* HeroExamples.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HeroExamples.app; sourceTree = BUILT_PRODUCTS_DIR; };
A33E60A41DE761C90065CBD8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
A33E60A91DE761C90065CBD8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
A33E60AB1DE761C90065CBD8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
A33E60AE1DE761C90065CBD8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
A33E60B01DE761C90065CBD8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
A33E60B61DE7621C0065CBD8 /* UIKit+HeroExamples.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIKit+HeroExamples.swift"; sourceTree = "<group>"; };
A33E60B91DE7621C0065CBD8 /* City.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = City.swift; sourceTree = "<group>"; };
A33E60BA1DE7621C0065CBD8 /* CityGuideCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CityGuideCell.swift; sourceTree = "<group>"; };
A33E60BB1DE7621C0065CBD8 /* CityGuideViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CityGuideViewController.swift; sourceTree = "<group>"; };
A33E60BC1DE7621C0065CBD8 /* CityViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CityViewController.swift; sourceTree = "<group>"; };
A3499D9E1DF2024E0049B541 /* ImageGalleryCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageGalleryCollectionViewController.swift; sourceTree = "<group>"; };
A35949171E1A2BE60095F407 /* LegacyExampleViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LegacyExampleViewController.swift; sourceTree = "<group>"; };
A37D7B3D1E2C0C7E00AC1959 /* CascadePreprocessor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CascadePreprocessor.swift; sourceTree = "<group>"; };
A37D7B3E1E2C0C7E00AC1959 /* IgnoreSubviewModifiersPreprocessor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IgnoreSubviewModifiersPreprocessor.swift; sourceTree = "<group>"; };
A37D7B3F1E2C0C7E00AC1959 /* MatchPreprocessor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatchPreprocessor.swift; sourceTree = "<group>"; };
A37D7B401E2C0C7E00AC1959 /* SourcePreprocessor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SourcePreprocessor.swift; sourceTree = "<group>"; };
A37D7B451E2C0C9300AC1959 /* Array+HeroModifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Array+HeroModifier.swift"; sourceTree = "<group>"; };
A37D7B461E2C0C9300AC1959 /* CALayer+Hero.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CALayer+Hero.swift"; sourceTree = "<group>"; };
A37D7B471E2C0C9300AC1959 /* CAMediaTimingFunction+Hero.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CAMediaTimingFunction+Hero.swift"; sourceTree = "<group>"; };
A37D7B481E2C0C9300AC1959 /* CG+Hero.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CG+Hero.swift"; sourceTree = "<group>"; };
A37D7B491E2C0C9300AC1959 /* DispatchQueue+Hero.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DispatchQueue+Hero.swift"; sourceTree = "<group>"; };
A37D7B4A1E2C0C9300AC1959 /* UIKit+Hero.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIKit+Hero.swift"; sourceTree = "<group>"; };
A37D7B511E2C0CBD00AC1959 /* HeroTransition.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeroTransition.swift; sourceTree = "<group>"; };
A37D7B521E2C0CBD00AC1959 /* HeroContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeroContext.swift; sourceTree = "<group>"; };
A37D7B531E2C0CBD00AC1959 /* HeroDefaultAnimator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeroDefaultAnimator.swift; sourceTree = "<group>"; };
A37D7B541E2C0CBD00AC1959 /* HeroCoreAnimationViewContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeroCoreAnimationViewContext.swift; sourceTree = "<group>"; };
A37D7B551E2C0CBD00AC1959 /* HeroModifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeroModifier.swift; sourceTree = "<group>"; };
A37D7B561E2C0CBD00AC1959 /* HeroPlugin.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeroPlugin.swift; sourceTree = "<group>"; };
A37D7B571E2C0CBD00AC1959 /* HeroTargetState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeroTargetState.swift; sourceTree = "<group>"; };
A37D7B581E2C0CBD00AC1959 /* HeroTypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeroTypes.swift; sourceTree = "<group>"; };
A37D7B611E2C0CD000AC1959 /* HeroDebugPlugin.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeroDebugPlugin.swift; sourceTree = "<group>"; };
A37D7B621E2C0CD100AC1959 /* HeroDebugView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeroDebugView.swift; sourceTree = "<group>"; };
A3B8C5662083376100E112F6 /* MainViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = "<group>"; };
A3D060BF20833B0700E48927 /* BuiltInTransitionExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuiltInTransitionExample.swift; sourceTree = "<group>"; };
A3D060C120833B4E00E48927 /* ExampleBaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExampleBaseViewController.swift; sourceTree = "<group>"; };
A3D060C320833D0400E48927 /* MatchExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MatchExample.swift; sourceTree = "<group>"; };
A3D060C5208348CB00E48927 /* MatchInCollectionExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MatchInCollectionExample.swift; sourceTree = "<group>"; };
A3D060C720834FF100E48927 /* AppStoreCardExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStoreCardExample.swift; sourceTree = "<group>"; };
A41D45F75C2C4244CC105281 /* Pods-HeroTvOSExamples.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HeroTvOSExamples.release.xcconfig"; path = "Pods/Target Support Files/Pods-HeroTvOSExamples/Pods-HeroTvOSExamples.release.xcconfig"; sourceTree = "<group>"; };
AF1E1B511E66822C00ECE039 /* HeroTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HeroTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
AF1E1B531E66822C00ECE039 /* HeroTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeroTests.swift; sourceTree = "<group>"; };
AF1E1B551E66822C00ECE039 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
AF6D93491E65168D00FCD55E /* HeroStringConvertible.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeroStringConvertible.swift; sourceTree = "<group>"; };
AFA306C61E6B446C00CAF719 /* Lexer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Lexer.swift; sourceTree = "<group>"; };
AFA306C71E6B446C00CAF719 /* Nodes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Nodes.swift; sourceTree = "<group>"; };
AFA306C81E6B446C00CAF719 /* Parser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Parser.swift; sourceTree = "<group>"; };
AFA306C91E6B446C00CAF719 /* Regex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Regex.swift; sourceTree = "<group>"; };
B101B2C91E561408007E7112 /* UIView+Hero.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIView+Hero.swift"; sourceTree = "<group>"; };
B101B2CD1E561421007E7112 /* UIViewController+Hero.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIViewController+Hero.swift"; sourceTree = "<group>"; };
B114B68F1E412A0B0009CEDE /* AppleProductViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppleProductViewController.swift; sourceTree = "<group>"; };
B1193AB51E525CD8005B1C87 /* HeroViewPropertyViewContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeroViewPropertyViewContext.swift; sourceTree = "<group>"; wrapsLines = 1; };
B1193AB81E525D12005B1C87 /* HeroAnimatorViewContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeroAnimatorViewContext.swift; sourceTree = "<group>"; };
B1275D961E4C0D850099A0E9 /* PluginViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PluginViewController.swift; sourceTree = "<group>"; };
B147F2631FAEA8F0006475A3 /* FirstViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FirstViewController.swift; sourceTree = "<group>"; };
B147F2641FAEA8F0006475A3 /* Navigation.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Navigation.storyboard; sourceTree = "<group>"; };
B16197DF1EF451C400A540D2 /* HeroTransition+Interactive.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "HeroTransition+Interactive.swift"; sourceTree = "<group>"; };
B16A219F1E4E3907007B8B4C /* AnimationSelectTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnimationSelectTableViewController.swift; sourceTree = "<group>"; };
B16B75301EF45A110018DBEF /* HeroTransitionState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeroTransitionState.swift; sourceTree = "<group>"; };
B16B75331EF461090018DBEF /* HeroProgressRunner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeroProgressRunner.swift; sourceTree = "<group>"; };
B16ECD021E4FC0B300EAE0E0 /* DefaultAnimationPreprocessor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultAnimationPreprocessor.swift; sourceTree = "<group>"; };
B17D88851EF5A51C0048D3E8 /* HeroTransition+UITabBarControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "HeroTransition+UITabBarControllerDelegate.swift"; sourceTree = "<group>"; };
B17D88881EF5A5330048D3E8 /* HeroTransition+UINavigationControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "HeroTransition+UINavigationControllerDelegate.swift"; sourceTree = "<group>"; };
B17D888B1EF5A5500048D3E8 /* HeroTransition+UIViewControllerTransitioningDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "HeroTransition+UIViewControllerTransitioningDelegate.swift"; sourceTree = "<group>"; };
B185A4E51DFA6E0C00C3B85D /* ListTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListTableViewController.swift; sourceTree = "<group>"; };
B185A4E71DFA6FE200C3B85D /* GridCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GridCollectionViewController.swift; sourceTree = "<group>"; };
B19F76981E46C38E002DBC58 /* AppleHomePage.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = AppleHomePage.storyboard; sourceTree = "<group>"; };
B19F769A1E46C3A2002DBC58 /* Basic.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Basic.storyboard; sourceTree = "<group>"; };
B19F769B1E46C3A2002DBC58 /* Menu.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Menu.storyboard; sourceTree = "<group>"; };
B19F769C1E46C3A2002DBC58 /* MusicPlayer.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = MusicPlayer.storyboard; sourceTree = "<group>"; };
B19F76A01E46C3C2002DBC58 /* CityGuide.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = CityGuide.storyboard; sourceTree = "<group>"; };
B19F76A21E46C3CB002DBC58 /* ListToGrid.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = ListToGrid.storyboard; sourceTree = "<group>"; };
B19F76A41E46C3D7002DBC58 /* ImageGallery.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = ImageGallery.storyboard; sourceTree = "<group>"; };
B19F76A51E46C3D7002DBC58 /* ImageViewer.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = ImageViewer.storyboard; sourceTree = "<group>"; };
B19F76AF1E46C449002DBC58 /* VideoPlayer.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = VideoPlayer.storyboard; sourceTree = "<group>"; };
B19F76B01E46C449002DBC58 /* VideoPlayerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoPlayerViewController.swift; sourceTree = "<group>"; };
B1D816DE1EF5A5DF007B9776 /* HeroViewControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeroViewControllerDelegate.swift; sourceTree = "<group>"; };
B1D816E11EF5A630007B9776 /* HeroTransition+CustomTransition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "HeroTransition+CustomTransition.swift"; sourceTree = "<group>"; };
B1D816E41EF5A6AE007B9776 /* HeroTransition+Start.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "HeroTransition+Start.swift"; sourceTree = "<group>"; };
B1D816E71EF5A6FE007B9776 /* HeroTransition+Complete.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "HeroTransition+Complete.swift"; sourceTree = "<group>"; };
B1D816EA1EF5A720007B9776 /* HeroTransition+Animate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "HeroTransition+Animate.swift"; sourceTree = "<group>"; };
B1D834031F02E7C0009E1E36 /* ConditionalPreprocessor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConditionalPreprocessor.swift; sourceTree = "<group>"; };
B35264CD2454FEF300D33861 /* Locale+Hero.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Locale+Hero.swift"; sourceTree = "<group>"; };
B383074825D1041A00B7A0D8 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; };
B383074A25D1042C00B7A0D8 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS14.3.sdk/System/Library/Frameworks/SwiftUI.framework; sourceTree = DEVELOPER_DIR; };
C377744CBFF1E24426E80F55 /* Pods-HeroExamples.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HeroExamples.release.xcconfig"; path = "Pods/Target Support Files/Pods-HeroExamples/Pods-HeroExamples.release.xcconfig"; sourceTree = "<group>"; };
C51A6465EC2CB38D82F28B93 /* Pods-HeroTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HeroTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-HeroTests/Pods-HeroTests.debug.xcconfig"; sourceTree = "<group>"; };
EEE340F89FF0A49DD23A5A6E /* Pods_HeroExamples.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_HeroExamples.framework; sourceTree = BUILT_PRODUCTS_DIR; };
F482F0BD235D7808002E97ED /* UIColor+HexString.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+HexString.swift"; sourceTree = "<group>"; };
F482F0C5235D7C4C002E97ED /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Main.strings; sourceTree = "<group>"; };
FD2306FDA4E15ADA91EFED44 /* Pods_HeroTvOSExamples.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_HeroTvOSExamples.framework; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
2D1F7FBB1E49DCB5004D944B /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
2D1F7FDF1E49DD90004D944B /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
2D1F7FF21E49E043004D944B /* Hero.framework in Frameworks */,
B383074B25D1042C00B7A0D8 /* SwiftUI.framework in Frameworks */,
A355CEC8D787CF71B0D7CBDA /* Pods_HeroTvOSExamples.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
A306D3AE1E1C7A2E00B6C23A /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
A33E609E1DE761C90065CBD8 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
A306D3B91E1C7A2E00B6C23A /* Hero.framework in Frameworks */,
B383074925D1041A00B7A0D8 /* SwiftUI.framework in Frameworks */,
83043017B73BC66DBB920D5C /* Pods_HeroExamples.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
AF1E1B4E1E66822C00ECE039 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
DBA05BB41A704A4A17967918 /* Pods_HeroTests.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
0ED3C727BC790F37EE7BD698 /* Frameworks */ = {
isa = PBXGroup;
children = (
B383074825D1041A00B7A0D8 /* SwiftUI.framework */,
B383074A25D1042C00B7A0D8 /* SwiftUI.framework */,
EEE340F89FF0A49DD23A5A6E /* Pods_HeroExamples.framework */,
FD2306FDA4E15ADA91EFED44 /* Pods_HeroTvOSExamples.framework */,
841FFA357ACB279D3F74CDEE /* Pods_HeroTests.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
29FF2D9C1E21ACF400EA4E65 /* Extensions */ = {
isa = PBXGroup;
children = (
A37D7B451E2C0C9300AC1959 /* Array+HeroModifier.swift */,
A37D7B461E2C0C9300AC1959 /* CALayer+Hero.swift */,
A37D7B471E2C0C9300AC1959 /* CAMediaTimingFunction+Hero.swift */,
A37D7B481E2C0C9300AC1959 /* CG+Hero.swift */,
A37D7B491E2C0C9300AC1959 /* DispatchQueue+Hero.swift */,
B35264CD2454FEF300D33861 /* Locale+Hero.swift */,
A37D7B4A1E2C0C9300AC1959 /* UIKit+Hero.swift */,
B101B2C91E561408007E7112 /* UIView+Hero.swift */,
B101B2CD1E561421007E7112 /* UIViewController+Hero.swift */,
F482F0BD235D7808002E97ED /* UIColor+HexString.swift */,
);
path = Extensions;
sourceTree = "<group>";
};
29FF2D9D1E21AD8900EA4E65 /* Preprocessors */ = {
isa = PBXGroup;
children = (
A3298CD91E304851005B06BB /* BasePreprocessor.swift */,
A37D7B3D1E2C0C7E00AC1959 /* CascadePreprocessor.swift */,
B16ECD021E4FC0B300EAE0E0 /* DefaultAnimationPreprocessor.swift */,
A37D7B3E1E2C0C7E00AC1959 /* IgnoreSubviewModifiersPreprocessor.swift */,
B1D834031F02E7C0009E1E36 /* ConditionalPreprocessor.swift */,
A37D7B3F1E2C0C7E00AC1959 /* MatchPreprocessor.swift */,
A37D7B401E2C0C7E00AC1959 /* SourcePreprocessor.swift */,
);
path = Preprocessors;
sourceTree = "<group>";
};
29FF2D9E1E21AD9E00EA4E65 /* Debug Plugin */ = {
isa = PBXGroup;
children = (
A37D7B611E2C0CD000AC1959 /* HeroDebugPlugin.swift */,
A37D7B621E2C0CD100AC1959 /* HeroDebugView.swift */,
);
path = "Debug Plugin";
sourceTree = "<group>";
};
29FF2D9F1E21ADB300EA4E65 /* Animator */ = {
isa = PBXGroup;
children = (
B1193AB81E525D12005B1C87 /* HeroAnimatorViewContext.swift */,
A37D7B541E2C0CBD00AC1959 /* HeroCoreAnimationViewContext.swift */,
A37D7B531E2C0CBD00AC1959 /* HeroDefaultAnimator.swift */,
B1193AB51E525CD8005B1C87 /* HeroViewPropertyViewContext.swift */,
);
path = Animator;
sourceTree = "<group>";
};
2D1F7FE31E49DD90004D944B /* TvOSExamples */ = {
isa = PBXGroup;
children = (
2D1F7FE41E49DD90004D944B /* AppDelegate.swift */,
A32D2D001E4A8153008D35FF /* Basic.storyboard */,
A32D2D011E4A8153008D35FF /* ImageGallery.storyboard */,
A32D2D041E4A81D5008D35FF /* ImageViewer.storyboard */,
2D1F7FED1E49DD90004D944B /* Info.plist */,
2D1F7FE81E49DD90004D944B /* Main.storyboard */,
2D1F7FE61E49DD90004D944B /* TVImageGalleryViewController.swift */,
);
path = TvOSExamples;
sourceTree = "<group>";
};
46383DC6A22A87056E5B40EC /* Pods */ = {
isa = PBXGroup;
children = (
5CD4F09A588E81DA75C2BE38 /* Pods-HeroExamples.debug.xcconfig */,
C377744CBFF1E24426E80F55 /* Pods-HeroExamples.release.xcconfig */,
86C87C73D89E75C8443B5071 /* Pods-HeroTvOSExamples.debug.xcconfig */,
A41D45F75C2C4244CC105281 /* Pods-HeroTvOSExamples.release.xcconfig */,
C51A6465EC2CB38D82F28B93 /* Pods-HeroTests.debug.xcconfig */,
5CEC69C9A9A60129002FD931 /* Pods-HeroTests.release.xcconfig */,
);
name = Pods;
sourceTree = "<group>";
};
A306D3B31E1C7A2E00B6C23A /* Sources */ = {
isa = PBXGroup;
children = (
29FF2D9F1E21ADB300EA4E65 /* Animator */,
29FF2D9E1E21AD9E00EA4E65 /* Debug Plugin */,
29FF2D9C1E21ACF400EA4E65 /* Extensions */,
AFA306D21E6B447200CAF719 /* Parser */,
29FF2D9D1E21AD8900EA4E65 /* Preprocessors */,
B11769D81EF8626C00A1373A /* Transition */,
A306D3B41E1C7A2E00B6C23A /* Hero.h */,
5C69728F2002CDBD001A5051 /* HeroCompatible.swift */,
A37D7B521E2C0CBD00AC1959 /* HeroContext.swift */,
A32D2D121E501C4F008D35FF /* HeroModifier+HeroStringConvertible.swift */,
A37D7B551E2C0CBD00AC1959 /* HeroModifier.swift */,
4D307DF320E3C6DC00DD9F65 /* HeroModifier+Advanced.swift */,
A37D7B561E2C0CBD00AC1959 /* HeroPlugin.swift */,
A37D7B571E2C0CBD00AC1959 /* HeroTargetState.swift */,
A37D7B581E2C0CBD00AC1959 /* HeroTypes.swift */,
B1D816DE1EF5A5DF007B9776 /* HeroViewControllerDelegate.swift */,
1F0287F92173F3C80008FA3B /* SwiftSupport.swift */,
A306D3B51E1C7A2E00B6C23A /* Info.plist */,
);
path = Sources;
sourceTree = "<group>";
};
A32D2D0E1E4D5463008D35FF /* Menu */ = {
isa = PBXGroup;
children = (
B19F769B1E46C3A2002DBC58 /* Menu.storyboard */,
A32D2D0C1E4D545B008D35FF /* MenuViewController.swift */,
);
path = Menu;
sourceTree = "<group>";
};
A32D2D111E4E9899008D35FF /* BuiltInTransition */ = {
isa = PBXGroup;
children = (
B16A219F1E4E3907007B8B4C /* AnimationSelectTableViewController.swift */,
A32D2D0F1E4E14DD008D35FF /* BuiltInTransitions.storyboard */,
);
path = BuiltInTransition;
sourceTree = "<group>";
};
A33E60981DE761C90065CBD8 = {
isa = PBXGroup;
children = (
A306D3B31E1C7A2E00B6C23A /* Sources */,
A3B8C5682083376C00E112F6 /* Examples */,
A33E60A31DE761C90065CBD8 /* LegacyExamples */,
0ED3C727BC790F37EE7BD698 /* Frameworks */,
46383DC6A22A87056E5B40EC /* Pods */,
A33E60A21DE761C90065CBD8 /* Products */,
AF1E1B521E66822C00ECE039 /* Tests */,
2D1F7FE31E49DD90004D944B /* TvOSExamples */,
);
indentWidth = 2;
sourceTree = "<group>";
tabWidth = 2;
};
A33E60A21DE761C90065CBD8 /* Products */ = {
isa = PBXGroup;
children = (
A33E60A11DE761C90065CBD8 /* HeroExamples.app */,
A306D3B21E1C7A2E00B6C23A /* Hero.framework */,
2D1F7FBF1E49DCB5004D944B /* Hero.framework */,
2D1F7FE21E49DD90004D944B /* HeroTvOSExamples.app */,
AF1E1B511E66822C00ECE039 /* HeroTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
A33E60A31DE761C90065CBD8 /* LegacyExamples */ = {
isa = PBXGroup;
children = (
A33E60B71DE7621C0065CBD8 /* Examples */,
A35949171E1A2BE60095F407 /* LegacyExampleViewController.swift */,
A33E60A81DE761C90065CBD8 /* Main.storyboard */,
B1275D961E4C0D850099A0E9 /* PluginViewController.swift */,
);
path = LegacyExamples;
sourceTree = "<group>";
};
A33E60B71DE7621C0065CBD8 /* Examples */ = {
isa = PBXGroup;
children = (
B114B6931E412A1B0009CEDE /* AppleHomePage */,
A32D2D111E4E9899008D35FF /* BuiltInTransition */,
A33E60B81DE7621C0065CBD8 /* CityGuide */,
A3499D9D1DF202350049B541 /* ImageGallery */,
B185A4E91DFA6FE700C3B85D /* ListToGrid */,
A32D2D0E1E4D5463008D35FF /* Menu */,
B19F76AE1E46C449002DBC58 /* VideoPlayer */,
B147F2621FAEA8F0006475A3 /* Navigation */,
B19F769A1E46C3A2002DBC58 /* Basic.storyboard */,
B19F769C1E46C3A2002DBC58 /* MusicPlayer.storyboard */,
);
path = Examples;
sourceTree = "<group>";
};
A33E60B81DE7621C0065CBD8 /* CityGuide */ = {
isa = PBXGroup;
children = (
A33E60B91DE7621C0065CBD8 /* City.swift */,
B19F76A01E46C3C2002DBC58 /* CityGuide.storyboard */,
A33E60BA1DE7621C0065CBD8 /* CityGuideCell.swift */,
A33E60BB1DE7621C0065CBD8 /* CityGuideViewController.swift */,
A33E60BC1DE7621C0065CBD8 /* CityViewController.swift */,
);
path = CityGuide;
sourceTree = "<group>";
};
A33E60C21DE76CEF0065CBD8 /* Resources */ = {
isa = PBXGroup;
children = (
A33E60A41DE761C90065CBD8 /* AppDelegate.swift */,
A33E60AB1DE761C90065CBD8 /* Assets.xcassets */,
A33E60B01DE761C90065CBD8 /* Info.plist */,
A33E60AD1DE761C90065CBD8 /* LaunchScreen.storyboard */,
A33E60B61DE7621C0065CBD8 /* UIKit+HeroExamples.swift */,
);
path = Resources;
sourceTree = "<group>";
};
A3499D9D1DF202350049B541 /* ImageGallery */ = {
isa = PBXGroup;
children = (
A304BF891DF647FC00A03345 /* ImageCells.swift */,
B19F76A41E46C3D7002DBC58 /* ImageGallery.storyboard */,
A3499D9E1DF2024E0049B541 /* ImageGalleryCollectionViewController.swift */,
A313499A1E1E2AED00EB5139 /* ImageLibrary.swift */,
A304BF831DF2717900A03345 /* ImageViewController.swift */,
B19F76A51E46C3D7002DBC58 /* ImageViewer.storyboard */,
);
path = ImageGallery;
sourceTree = "<group>";
};
A3B8C5682083376C00E112F6 /* Examples */ = {
isa = PBXGroup;
children = (
A3B8C5662083376100E112F6 /* MainViewController.swift */,
A3D060C120833B4E00E48927 /* ExampleBaseViewController.swift */,
A3D060BF20833B0700E48927 /* BuiltInTransitionExample.swift */,
A3D060C320833D0400E48927 /* MatchExample.swift */,
62EFDDAB236F4FC200F3E85E /* SwiftUIMatchExample.swift */,
A3D060C5208348CB00E48927 /* MatchInCollectionExample.swift */,
A3D060C720834FF100E48927 /* AppStoreCardExample.swift */,
A33E60C21DE76CEF0065CBD8 /* Resources */,
);
path = Examples;
sourceTree = "<group>";
};
AF1E1B521E66822C00ECE039 /* Tests */ = {
isa = PBXGroup;
children = (
AF1E1B531E66822C00ECE039 /* HeroTests.swift */,
AF1E1B551E66822C00ECE039 /* Info.plist */,
);
path = Tests;
sourceTree = "<group>";
};
AFA306D21E6B447200CAF719 /* Parser */ = {
isa = PBXGroup;
children = (
AF6D93491E65168D00FCD55E /* HeroStringConvertible.swift */,
AFA306C61E6B446C00CAF719 /* Lexer.swift */,
AFA306C71E6B446C00CAF719 /* Nodes.swift */,
AFA306C81E6B446C00CAF719 /* Parser.swift */,
AFA306C91E6B446C00CAF719 /* Regex.swift */,
);
path = Parser;
sourceTree = "<group>";
};
B114B6931E412A1B0009CEDE /* AppleHomePage */ = {
isa = PBXGroup;
children = (
B19F76981E46C38E002DBC58 /* AppleHomePage.storyboard */,
B114B68F1E412A0B0009CEDE /* AppleProductViewController.swift */,
);
path = AppleHomePage;
sourceTree = "<group>";
};
B11769D81EF8626C00A1373A /* Transition */ = {
isa = PBXGroup;
children = (
B16B75331EF461090018DBEF /* HeroProgressRunner.swift */,
B1D816E41EF5A6AE007B9776 /* HeroTransition+Start.swift */,
B1D816EA1EF5A720007B9776 /* HeroTransition+Animate.swift */,
B1D816E71EF5A6FE007B9776 /* HeroTransition+Complete.swift */,
B1D816E11EF5A630007B9776 /* HeroTransition+CustomTransition.swift */,
B16197DF1EF451C400A540D2 /* HeroTransition+Interactive.swift */,
B17D88881EF5A5330048D3E8 /* HeroTransition+UINavigationControllerDelegate.swift */,
B17D88851EF5A51C0048D3E8 /* HeroTransition+UITabBarControllerDelegate.swift */,
B17D888B1EF5A5500048D3E8 /* HeroTransition+UIViewControllerTransitioningDelegate.swift */,
A37D7B511E2C0CBD00AC1959 /* HeroTransition.swift */,
B16B75301EF45A110018DBEF /* HeroTransitionState.swift */,
);
path = Transition;
sourceTree = "<group>";
};
B147F2621FAEA8F0006475A3 /* Navigation */ = {
isa = PBXGroup;
children = (
B147F2631FAEA8F0006475A3 /* FirstViewController.swift */,
B147F2641FAEA8F0006475A3 /* Navigation.storyboard */,
);
path = Navigation;
sourceTree = "<group>";
};
B185A4E91DFA6FE700C3B85D /* ListToGrid */ = {
isa = PBXGroup;
children = (
B185A4E71DFA6FE200C3B85D /* GridCollectionViewController.swift */,
B185A4E51DFA6E0C00C3B85D /* ListTableViewController.swift */,
B19F76A21E46C3CB002DBC58 /* ListToGrid.storyboard */,
);
path = ListToGrid;
sourceTree = "<group>";
};
B19F76AE1E46C449002DBC58 /* VideoPlayer */ = {
isa = PBXGroup;
children = (
B19F76AF1E46C449002DBC58 /* VideoPlayer.storyboard */,
B19F76B01E46C449002DBC58 /* VideoPlayerViewController.swift */,
);
path = VideoPlayer;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
2D1F7FBC1E49DCB5004D944B /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
2D1F7FDC1E49DD3C004D944B /* Hero.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
A306D3AF1E1C7A2E00B6C23A /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
A306D3B61E1C7A2E00B6C23A /* Hero.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
2D1F7FBE1E49DCB5004D944B /* Hero (tvOS) */ = {
isa = PBXNativeTarget;
buildConfigurationList = 2D1F7FC61E49DCB5004D944B /* Build configuration list for PBXNativeTarget "Hero (tvOS)" */;
buildPhases = (
2D1F7FBA1E49DCB5004D944B /* Sources */,
2D1F7FBB1E49DCB5004D944B /* Frameworks */,
2D1F7FBC1E49DCB5004D944B /* Headers */,
2D1F7FBD1E49DCB5004D944B /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = "Hero (tvOS)";
productName = "Hero (tvOS)";
productReference = 2D1F7FBF1E49DCB5004D944B /* Hero.framework */;
productType = "com.apple.product-type.framework";
};
2D1F7FE11E49DD90004D944B /* HeroTvOSExamples */ = {
isa = PBXNativeTarget;
buildConfigurationList = 2D1F7FEE1E49DD90004D944B /* Build configuration list for PBXNativeTarget "HeroTvOSExamples" */;
buildPhases = (
89DC76B30A0BF7FD724C24D3 /* [CP] Check Pods Manifest.lock */,
2D1F7FDE1E49DD90004D944B /* Sources */,
2D1F7FDF1E49DD90004D944B /* Frameworks */,
2D1F7FE01E49DD90004D944B /* Resources */,
);
buildRules = (
);
dependencies = (
2D1F7FF41E49E05A004D944B /* PBXTargetDependency */,
);
name = HeroTvOSExamples;
productName = HeroTvOSExamples;
productReference = 2D1F7FE21E49DD90004D944B /* HeroTvOSExamples.app */;
productType = "com.apple.product-type.application";
};
A306D3B11E1C7A2E00B6C23A /* Hero (iOS) */ = {
isa = PBXNativeTarget;
buildConfigurationList = A306D3BE1E1C7A2E00B6C23A /* Build configuration list for PBXNativeTarget "Hero (iOS)" */;
buildPhases = (
A306D3AD1E1C7A2E00B6C23A /* Sources */,
A306D3AE1E1C7A2E00B6C23A /* Frameworks */,
A306D3AF1E1C7A2E00B6C23A /* Headers */,
A306D3B01E1C7A2E00B6C23A /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = "Hero (iOS)";
productName = Hero;
productReference = A306D3B21E1C7A2E00B6C23A /* Hero.framework */;
productType = "com.apple.product-type.framework";
};
A33E60A01DE761C90065CBD8 /* HeroExamples */ = {
isa = PBXNativeTarget;
buildConfigurationList = A33E60B31DE761C90065CBD8 /* Build configuration list for PBXNativeTarget "HeroExamples" */;
buildPhases = (
AB630E15554685FDB346A796 /* [CP] Check Pods Manifest.lock */,
A0BDF7221E2FCC5A0028778F /* Swiftlint */,
A33E609D1DE761C90065CBD8 /* Sources */,
A33E609E1DE761C90065CBD8 /* Frameworks */,
A33E609F1DE761C90065CBD8 /* Resources */,
23B031AF37B3297143AE7376 /* [CP] Embed Pods Frameworks */,
A306D3BA1E1C7A2E00B6C23A /* Embed Frameworks */,
);
buildRules = (
);
dependencies = (
A306D3B81E1C7A2E00B6C23A /* PBXTargetDependency */,
);
name = HeroExamples;
productName = HeroExamples;
productReference = A33E60A11DE761C90065CBD8 /* HeroExamples.app */;
productType = "com.apple.product-type.application";
};
AF1E1B501E66822C00ECE039 /* HeroTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = AF1E1B581E66822C00ECE039 /* Build configuration list for PBXNativeTarget "HeroTests" */;
buildPhases = (
3673D17D1C42FCAD03311A99 /* [CP] Check Pods Manifest.lock */,
AF1E1B4D1E66822C00ECE039 /* Sources */,
AF1E1B4E1E66822C00ECE039 /* Frameworks */,
AF1E1B4F1E66822C00ECE039 /* Resources */,
);
buildRules = (
);
dependencies = (
AF1E1B571E66822C00ECE039 /* PBXTargetDependency */,
);
name = HeroTests;
productName = HeroTests;
productReference = AF1E1B511E66822C00ECE039 /* HeroTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
A33E60991DE761C90065CBD8 /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
LastSwiftUpdateCheck = 0820;
LastUpgradeCheck = 1240;
ORGANIZATIONNAME = "Hero Transitions";
TargetAttributes = {
2D1F7FBE1E49DCB5004D944B = {
CreatedOnToolsVersion = 8.2;
LastSwiftMigration = 1240;
ProvisioningStyle = Automatic;
};
2D1F7FE11E49DD90004D944B = {
CreatedOnToolsVersion = 8.2;
LastSwiftMigration = 1240;
ProvisioningStyle = Automatic;
};
A306D3B11E1C7A2E00B6C23A = {
CreatedOnToolsVersion = 8.2.1;
LastSwiftMigration = 1120;
ProvisioningStyle = Automatic;
};
A33E60A01DE761C90065CBD8 = {
CreatedOnToolsVersion = 8.0;
LastSwiftMigration = 1120;
ProvisioningStyle = Automatic;
};
AF1E1B501E66822C00ECE039 = {
CreatedOnToolsVersion = 8.2;
LastSwiftMigration = 1120;
ProvisioningStyle = Automatic;
TestTargetID = A33E60A01DE761C90065CBD8;
};
};
};
buildConfigurationList = A33E609C1DE761C90065CBD8 /* Build configuration list for PBXProject "Hero" */;
compatibilityVersion = "Xcode 11.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = A33E60981DE761C90065CBD8;
productRefGroup = A33E60A21DE761C90065CBD8 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
A306D3B11E1C7A2E00B6C23A /* Hero (iOS) */,
2D1F7FBE1E49DCB5004D944B /* Hero (tvOS) */,
A33E60A01DE761C90065CBD8 /* HeroExamples */,
2D1F7FE11E49DD90004D944B /* HeroTvOSExamples */,
AF1E1B501E66822C00ECE039 /* HeroTests */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
2D1F7FBD1E49DCB5004D944B /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
2D1F7FE01E49DD90004D944B /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
A32D2CF21E4A7DC3008D35FF /* Assets.xcassets in Resources */,
A32D2D051E4A81D5008D35FF /* ImageViewer.storyboard in Resources */,
A32D2D031E4A8153008D35FF /* ImageGallery.storyboard in Resources */,
A32D2D021E4A8153008D35FF /* Basic.storyboard in Resources */,
2D1F7FEA1E49DD90004D944B /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
A306D3B01E1C7A2E00B6C23A /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
A33E609F1DE761C90065CBD8 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
A33E60AF1DE761C90065CBD8 /* LaunchScreen.storyboard in Resources */,
A33E60AC1DE761C90065CBD8 /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
AF1E1B4F1E66822C00ECE039 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
23B031AF37B3297143AE7376 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-HeroExamples/Pods-HeroExamples-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-HeroExamples/Pods-HeroExamples-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HeroExamples/Pods-HeroExamples-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
3673D17D1C42FCAD03311A99 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-HeroTests-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
89DC76B30A0BF7FD724C24D3 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-HeroTvOSExamples-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
A0BDF7221E2FCC5A0028778F /* Swiftlint */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = Swiftlint;
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "if which swiftlint >/dev/null; then\nswiftlint\nelse\necho \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi";
};
AB630E15554685FDB346A796 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-HeroExamples-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
2D1F7FBA1E49DCB5004D944B /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B1193AB71E525CD8005B1C87 /* HeroViewPropertyViewContext.swift in Sources */,
2D1F7FD01E49DD13004D944B /* MatchPreprocessor.swift in Sources */,
2D1F7FD61E49DD18004D944B /* DispatchQueue+Hero.swift in Sources */,
2D1F7FCB1E49DD08004D944B /* HeroTargetState.swift in Sources */,
B17D888D1EF5A5500048D3E8 /* HeroTransition+UIViewControllerTransitioningDelegate.swift in Sources */,
B35264CF2454FEF300D33861 /* Locale+Hero.swift in Sources */,
B1D816E01EF5A5DF007B9776 /* HeroViewControllerDelegate.swift in Sources */,
B1193ABA1E525D12005B1C87 /* HeroAnimatorViewContext.swift in Sources */,
2D1F7FCA1E49DD08004D944B /* HeroPlugin.swift in Sources */,
2D1F7FDA1E49DD21004D944B /* HeroDebugPlugin.swift in Sources */,
B17D888A1EF5A5330048D3E8 /* HeroTransition+UINavigationControllerDelegate.swift in Sources */,
4D307DF520E3C6DC00DD9F65 /* HeroModifier+Advanced.swift in Sources */,
2D1F7FDB1E49DD21004D944B /* HeroDebugView.swift in Sources */,
B1D834051F02E7C0009E1E36 /* ConditionalPreprocessor.swift in Sources */,
B16197E11EF451C500A540D2 /* HeroTransition+Interactive.swift in Sources */,
2D1F7FC91E49DD08004D944B /* HeroModifier.swift in Sources */,
B16B75351EF461090018DBEF /* HeroProgressRunner.swift in Sources */,
2D1F7FD71E49DD18004D944B /* UIKit+Hero.swift in Sources */,
B1D816E91EF5A6FE007B9776 /* HeroTransition+Complete.swift in Sources */,
AF6D934B1E65168D00FCD55E /* HeroStringConvertible.swift in Sources */,
2D1F7FD81E49DD1D004D944B /* HeroDefaultAnimator.swift in Sources */,
2D1F7FCC1E49DD08004D944B /* HeroTypes.swift in Sources */,
B101B2CC1E56140B007E7112 /* UIView+Hero.swift in Sources */,
A32D2D141E501C4F008D35FF /* HeroModifier+HeroStringConvertible.swift in Sources */,
B101B2CF1E561421007E7112 /* UIViewController+Hero.swift in Sources */,
2D1F7FCD1E49DD13004D944B /* BasePreprocessor.swift in Sources */,
2D1F7FD41E49DD18004D944B /* CAMediaTimingFunction+Hero.swift in Sources */,
B16B75321EF45A110018DBEF /* HeroTransitionState.swift in Sources */,
2D1F7FD21E49DD18004D944B /* Array+HeroModifier.swift in Sources */,
2D1F7FD51E49DD18004D944B /* CG+Hero.swift in Sources */,
2D1F7FD91E49DD1D004D944B /* HeroCoreAnimationViewContext.swift in Sources */,
AFA306D11E6B446C00CAF719 /* Regex.swift in Sources */,
B1D816E31EF5A630007B9776 /* HeroTransition+CustomTransition.swift in Sources */,
AFA306CF1E6B446C00CAF719 /* Parser.swift in Sources */,
1F0287FB2173F3C80008FA3B /* SwiftSupport.swift in Sources */,
2D1F7FD31E49DD18004D944B /* CALayer+Hero.swift in Sources */,
2D1F7FC71E49DD02004D944B /* HeroTransition.swift in Sources */,
2D1F7FC81E49DD04004D944B /* HeroContext.swift in Sources */,
B16ECD041E4FC0B300EAE0E0 /* DefaultAnimationPreprocessor.swift in Sources */,
5C5442AA2004092500E1E
gitextract_d9vexhun/
├── .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/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── Front.imagestacklayer/
│ │ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Middle.imagestacklayer/
│ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── App Icon - Small.imagestack/
│ │ │ │ │ ├── Back.imagestacklayer/
│ │ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── Front.imagestacklayer/
│ │ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Middle.imagestacklayer/
│ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Contents.json
│ │ │ │ ├── Top Shelf Image Wide.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Top Shelf Image.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ ├── AppleHomePage/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── iphone_alt_small_2x.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── macbookpro_portrait_small_2x.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── watch_alt_portrait_small_2x.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── CityGuide/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── cityGuide.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── montreal.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── toronto.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── vancouver.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Contents.json
│ │ │ ├── Foods/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── Unsplash0.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash0_cell.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash0_thumb.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash1.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash10.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash10_cell.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash10_thumb.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash1_cell.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash1_thumb.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash2.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash2_cell.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash2_thumb.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash3.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash3_cell.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash3_thumb.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash4.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash4_cell.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash4_thumb.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash5.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash5_cell.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash5_thumb.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash6.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash6_cell.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash6_thumb.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash7.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash7_cell.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash7_thumb.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash8.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash8_cell.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash8_thumb.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash9.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Unsplash9_cell.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Unsplash9_thumb.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── HeroLogo.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Menu/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── ic_audiotrack_48pt.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_chat_48pt.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_format_quote_48pt.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_gif_48pt.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_insert_photo_48pt.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_link_48pt.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_menu_36pt.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_menu_48pt.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_text_fields_48pt.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── ic_videocam_48pt.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── MusicPlayer/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── album1.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_fast_forward.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_fast_rewind.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_pause_white.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_play_arrow_white.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ic_repeat.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── ic_shuffle.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── bigbuckbunny.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── ic_bug_report_48pt.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── ic_close.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── ic_code.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── ic_input_48pt.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── ic_keyboard_arrow_down.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── ic_view_list.imageset/
│ │ │ │ └── Contents.json
│ │ │ └── ic_view_module.imageset/
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ └── LaunchScreen.storyboard
│ │ ├── Info.plist
│ │ └── UIKit+HeroExamples.swift
│ └── SwiftUIMatchExample.swift
├── Gemfile
├── 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
├── README.md
├── README.zh-cn.md
├── 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/
│ ├── 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
├── Classes.html
├── Enums/
│ ├── CascadeDirection.html
│ ├── HeroCoordinateSpace.html
│ ├── HeroDefaultAnimationType/
│ │ ├── Direction.html
│ │ └── Strategy.html
│ ├── HeroDefaultAnimationType.html
│ ├── HeroSnapshotType.html
│ ├── HeroTransitionState.html
│ ├── HeroViewOrderingStrategy.html
│ ├── ParseError.html
│ └── Token.html
├── Enums.html
├── Extensions/
│ ├── CAMediaTimingFunction.html
│ ├── CATransform3D.html
│ ├── HeroDebugView.html
│ ├── String.html
│ ├── UINavigationController.html
│ ├── UITabBarController.html
│ ├── UIView.html
│ └── UIViewController.html
├── Extensions.html
├── Functions.html
├── Protocols/
│ ├── HeroAnimator.html
│ ├── HeroCompatible.html
│ ├── HeroCustomSnapshotView.html
│ ├── HeroPreprocessor.html
│ ├── HeroProgressUpdateObserver.html
│ ├── HeroStringConvertible.html
│ ├── HeroTransitionDelegate.html
│ └── HeroViewControllerDelegate.html
├── Protocols.html
├── Structs/
│ ├── HeroConditionalContext.html
│ └── HeroTargetState.html
├── Structs.html
├── css/
│ ├── highlight.css
│ └── jazzy.css
├── docsets/
│ ├── Hero.docset/
│ │ └── Contents/
│ │ ├── Info.plist
│ │ └── Resources/
│ │ ├── Documents/
│ │ │ ├── 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
│ │ │ ├── Classes.html
│ │ │ ├── Enums/
│ │ │ │ ├── CascadeDirection.html
│ │ │ │ ├── HeroCoordinateSpace.html
│ │ │ │ ├── HeroDefaultAnimationType/
│ │ │ │ │ ├── Direction.html
│ │ │ │ │ └── Strategy.html
│ │ │ │ ├── HeroDefaultAnimationType.html
│ │ │ │ ├── HeroSnapshotType.html
│ │ │ │ ├── HeroTransitionState.html
│ │ │ │ ├── HeroViewOrderingStrategy.html
│ │ │ │ ├── ParseError.html
│ │ │ │ └── Token.html
│ │ │ ├── Enums.html
│ │ │ ├── Extensions/
│ │ │ │ ├── CAMediaTimingFunction.html
│ │ │ │ ├── CATransform3D.html
│ │ │ │ ├── HeroDebugView.html
│ │ │ │ ├── String.html
│ │ │ │ ├── UINavigationController.html
│ │ │ │ ├── UITabBarController.html
│ │ │ │ ├── UIView.html
│ │ │ │ └── UIViewController.html
│ │ │ ├── Extensions.html
│ │ │ ├── Functions.html
│ │ │ ├── Protocols/
│ │ │ │ ├── HeroAnimator.html
│ │ │ │ ├── HeroCompatible.html
│ │ │ │ ├── HeroCustomSnapshotView.html
│ │ │ │ ├── HeroPreprocessor.html
│ │ │ │ ├── HeroProgressUpdateObserver.html
│ │ │ │ ├── HeroStringConvertible.html
│ │ │ │ ├── HeroTransitionDelegate.html
│ │ │ │ └── HeroViewControllerDelegate.html
│ │ │ ├── Protocols.html
│ │ │ ├── Structs/
│ │ │ │ ├── HeroConditionalContext.html
│ │ │ │ └── HeroTargetState.html
│ │ │ ├── Structs.html
│ │ │ ├── css/
│ │ │ │ ├── highlight.css
│ │ │ │ └── jazzy.css
│ │ │ ├── index.html
│ │ │ ├── js/
│ │ │ │ ├── jazzy.js
│ │ │ │ ├── jazzy.search.js
│ │ │ │ └── typeahead.jquery.js
│ │ │ └── search.json
│ │ └── docSet.dsidx
│ └── Hero.tgz
├── index.html
├── js/
│ ├── jazzy.js
│ ├── jazzy.search.js
│ └── typeahead.jquery.js
├── search.json
└── undocumented.json
SYMBOL INDEX (100 symbols across 6 files)
FILE: docs/docsets/Hero.docset/Contents/Resources/Documents/js/jazzy.js
function toggleItem (line 15) | function toggleItem($link, $content) {
function itemLinkToContent (line 21) | function itemLinkToContent($link) {
function openCurrentItemIfClosed (line 26) | function openCurrentItemIfClosed() {
FILE: docs/docsets/Hero.docset/Contents/Resources/Documents/js/jazzy.search.js
function displayTemplate (line 10) | function displayTemplate(result) {
function suggestionTemplate (line 14) | function suggestionTemplate(result) {
FILE: docs/docsets/Hero.docset/Contents/Resources/Documents/js/typeahead.jquery.js
function reverseArgs (line 55) | function reverseArgs(index, value) {
function template (line 100) | function template() {
function _p8 (line 153) | function _p8(s) {
function build (line 178) | function build(o) {
function buildHtml (line 197) | function buildHtml(c) {
function buildSelectors (line 203) | function buildSelectors(classes) {
function buildCss (line 210) | function buildCss() {
function EventBus (line 267) | function EventBus(o) {
function on (line 304) | function on(method, types, cb, context) {
function onAsync (line 321) | function onAsync(types, cb, context) {
function onSync (line 324) | function onSync(types, cb, context) {
function off (line 327) | function off(types) {
function trigger (line 338) | function trigger(types) {
function getFlush (line 352) | function getFlush(callbacks, context, args) {
function getNextTick (line 362) | function getNextTick() {
function bindContext (line 379) | function bindContext(fn, context) {
function hightlightTextNode (line 433) | function hightlightTextNode(textNode) {
function traverse (line 445) | function traverse(el, hightlightTextNode) {
function accent_replacer (line 457) | function accent_replacer(chr) {
function getRegex (line 460) | function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensiti...
function Input (line 485) | function Input(o, www) {
function buildOverflowHelper (line 684) | function buildOverflowHelper($input) {
function areQueriesEquivalent (line 701) | function areQueriesEquivalent(a, b) {
function withModifier (line 704) | function withModifier($e) {
function Dataset (line 717) | function Dataset(o, www) {
function sync (line 858) | function sync(suggestions) {
function async (line 870) | function async(suggestions) {
function getDisplayFn (line 895) | function getDisplayFn(display) {
function getTemplates (line 902) | function getTemplates(templates, displayFn) {
function isValidName (line 918) | function isValidName(str) {
function Menu (line 924) | function Menu(o, www) {
function updateDataset (line 1046) | function updateDataset(dataset) {
function clearDataset (line 1054) | function clearDataset(dataset) {
function destroyDataset (line 1062) | function destroyDataset(dataset) {
function Status (line 1071) | function Status(options) {
function DefaultMenu (line 1121) | function DefaultMenu() {
function Typeahead (line 1164) | function Typeahead(o, www) {
function c (line 1447) | function c(ctx) {
function attach (line 1473) | function attach() {
function ttEach (line 1632) | function ttEach($els, fn) {
function buildHintFromInput (line 1638) | function buildHintFromInput($input, www) {
function prepInput (line 1647) | function prepInput($input, www) {
function getBackgroundStyles (line 1662) | function getBackgroundStyles($el) {
function revert (line 1674) | function revert($input) {
function $elOrNull (line 1687) | function $elOrNull(obj) {
FILE: docs/js/jazzy.js
function toggleItem (line 15) | function toggleItem($link, $content) {
function itemLinkToContent (line 21) | function itemLinkToContent($link) {
function openCurrentItemIfClosed (line 26) | function openCurrentItemIfClosed() {
FILE: docs/js/jazzy.search.js
function displayTemplate (line 10) | function displayTemplate(result) {
function suggestionTemplate (line 14) | function suggestionTemplate(result) {
FILE: docs/js/typeahead.jquery.js
function reverseArgs (line 55) | function reverseArgs(index, value) {
function template (line 100) | function template() {
function _p8 (line 153) | function _p8(s) {
function build (line 178) | function build(o) {
function buildHtml (line 197) | function buildHtml(c) {
function buildSelectors (line 203) | function buildSelectors(classes) {
function buildCss (line 210) | function buildCss() {
function EventBus (line 267) | function EventBus(o) {
function on (line 304) | function on(method, types, cb, context) {
function onAsync (line 321) | function onAsync(types, cb, context) {
function onSync (line 324) | function onSync(types, cb, context) {
function off (line 327) | function off(types) {
function trigger (line 338) | function trigger(types) {
function getFlush (line 352) | function getFlush(callbacks, context, args) {
function getNextTick (line 362) | function getNextTick() {
function bindContext (line 379) | function bindContext(fn, context) {
function hightlightTextNode (line 433) | function hightlightTextNode(textNode) {
function traverse (line 445) | function traverse(el, hightlightTextNode) {
function accent_replacer (line 457) | function accent_replacer(chr) {
function getRegex (line 460) | function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensiti...
function Input (line 485) | function Input(o, www) {
function buildOverflowHelper (line 684) | function buildOverflowHelper($input) {
function areQueriesEquivalent (line 701) | function areQueriesEquivalent(a, b) {
function withModifier (line 704) | function withModifier($e) {
function Dataset (line 717) | function Dataset(o, www) {
function sync (line 858) | function sync(suggestions) {
function async (line 870) | function async(suggestions) {
function getDisplayFn (line 895) | function getDisplayFn(display) {
function getTemplates (line 902) | function getTemplates(templates, displayFn) {
function isValidName (line 918) | function isValidName(str) {
function Menu (line 924) | function Menu(o, www) {
function updateDataset (line 1046) | function updateDataset(dataset) {
function clearDataset (line 1054) | function clearDataset(dataset) {
function destroyDataset (line 1062) | function destroyDataset(dataset) {
function Status (line 1071) | function Status(options) {
function DefaultMenu (line 1121) | function DefaultMenu() {
function Typeahead (line 1164) | function Typeahead(o, www) {
function c (line 1447) | function c(ctx) {
function attach (line 1473) | function attach() {
function ttEach (line 1632) | function ttEach($els, fn) {
function buildHintFromInput (line 1638) | function buildHintFromInput($input, www) {
function prepInput (line 1647) | function prepInput($input, www) {
function getBackgroundStyles (line 1662) | function getBackgroundStyles($el) {
function revert (line 1674) | function revert($input) {
function $elOrNull (line 1687) | function $elOrNull(obj) {
Condensed preview — 355 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,337K chars).
[
{
"path": ".codecov.yml",
"chars": 409,
"preview": "# https://docs.codecov.io/docs/codecov-yaml\n\ncodecov:\n require_ci_to_pass: yes\n\ncoverage:\n precision: 2\n round: down\n"
},
{
"path": ".editorconfig",
"chars": 421,
"preview": "# http://editorconfig.org\nroot = true\n\n[*]\nindent_style = space\ncharset = utf-8\nindent_size = 4\nend_of_line = lf\ntrim_tr"
},
{
"path": ".github/CODEOWNERS",
"chars": 282,
"preview": "# CODEOWNERS\n# Lines starting with '#' are comments.\n# Each line is a file pattern followed by one or more owners.\n# htt"
},
{
"path": ".github/FUNDING.yml",
"chars": 760,
"preview": "# These are supported funding model platforms\n\ngithub: [JoeMatt, lkzhao, SD10, kuyazee] # Replace with up to 4 GitHub Sp"
},
{
"path": ".github/auto_assign.yml",
"chars": 719,
"preview": "# Set to true to add reviewers to pull requests\naddReviewers: true\n\n# Set to true to add assignees to pull requests\naddA"
},
{
"path": ".github/issue_template.md",
"chars": 677,
"preview": "<!--\nℹ We use Github issues for bug reports, feature requests, general support, and questions about the library.\n\nPlease"
},
{
"path": ".github/main.workflow",
"chars": 76,
"preview": "action \"Danger\" {\n uses = \"danger/danger\"\n # secrets = [\"GITHUB_TOKEN\"]\n}\n"
},
{
"path": ".github/stale.yml",
"chars": 736,
"preview": "# Number of days of inactivity before an issue becomes stale\ndaysUntilStale: 180\n# Number of days of inactivity before a"
},
{
"path": ".github/workflows/build.yml",
"chars": 988,
"preview": "on:\n push:\n branches:\n - master\nname: Build\njobs:\n test:\n name: Build\n runs-on: macOS-latest\n strateg"
},
{
"path": ".github/workflows/rebase.yml",
"chars": 417,
"preview": "# Rebase PR branch when someone comments /rebase\non:\n issue_comment:\n types: [created]\nname: Automatic Rebase\njobs:\n"
},
{
"path": ".github/workflows/swiftlint.yml",
"chars": 432,
"preview": "name: Swift Lint\n\non:\n pull_request:\n paths:\n - '.github/workflows/swiftlint.yml'\n - '.swiftlint.yml'\n "
},
{
"path": ".github/workflows/test.yml",
"chars": 1722,
"preview": "# test.yml\n# Unit Test\nname: Unit Test\n'on':\n pull_request:\n paths:\n - '**.swift'\n - '**.xcodeproj'\n "
},
{
"path": ".gitignore",
"chars": 1496,
"preview": ".DS_Store\n# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.g"
},
{
"path": ".jazzy.yaml",
"chars": 707,
"preview": "# ---- About ----\nmodule: Hero\nmodule_version: 1.6.4\nauthor: HeroTransitions\nreadme: README.md\ncopyright: 'See [license]"
},
{
"path": ".makefiles/bundler.mk",
"chars": 455,
"preview": "# Provides a dependecy, `bundle`, which runs bundle install when necessary.\n# Override bundle install options by setting"
},
{
"path": ".makefiles/docker-compose.mk",
"chars": 1391,
"preview": "DOCKER_COMPOSE_PULL ?= yes\nDOCKER_COMPOSE_DAEMON ?= yes\nDOCKER_COMPOSE_FILE ?= docker-compose.yml\n\nDOCKER_COMPOSE_UP_FLA"
},
{
"path": ".makefiles/help.awk",
"chars": 1337,
"preview": "# Awk program for automatically generating help text from those ludicrous makefiles.\n# See help.mk for details.\nfunction"
},
{
"path": ".makefiles/ios.mk",
"chars": 4908,
"preview": "SHELL := /bin/bash\n.PHONY: help update pull bootstrap\n\nRUBY := $(shell command -v ruby 2>/dev/null)\nCARTHAGE := $(shell "
},
{
"path": ".makefiles/ludicrous.mk",
"chars": 6057,
"preview": "# The \"main\" utility functions and helpers useful for the common case. Most\n# ludicrous makefiles require this file, so "
},
{
"path": ".makefiles/virtualenv.mk",
"chars": 905,
"preview": "# Provides a dependecy, `virtualenv`, which creates a local virtualenv for use\n# during development of a python project."
},
{
"path": ".swiftlint.yml",
"chars": 1509,
"preview": "disabled_rules: # rule identifiers to exclude from running\n - missing_docs\n - unused_closure_parameter\n - identifier_"
},
{
"path": ".travis.yml",
"chars": 266,
"preview": "language:\n - swift\nosx_image: xcode11.0\nscript:\n - xcodebuild -scheme HeroExamples -workspace Hero.xcworkspace -sdk "
},
{
"path": "CHANGELOG.md",
"chars": 4418,
"preview": "# CHANGELOG\n\nThe changelog for `Hero`. Also see the [releases](https://github.com/HeroTransitions/Hero/releases) on GitH"
},
{
"path": "DEVELOP.md",
"chars": 496,
"preview": "# Develop.md\n\n## Releases\n\n1. Make release brach `git-flow release start x.x.x`\n2. Search find/replace current version i"
},
{
"path": "Dangerfile",
"chars": 5541,
"preview": "# frozen_string_literal: true\n\n# Dangerfile\n# To test locally, use the following\n# `export DANGER_GITHUB_API_TOKEN=...Yo"
},
{
"path": "Examples/AppStoreCardExample.swift",
"chars": 10081,
"preview": "import UIKit\nimport Hero\nimport CollectionKit\n\n/*:\n \n # App Store Transition\n \n This is a much more advanced transition "
},
{
"path": "Examples/BuiltInTransitionExample.swift",
"chars": 2522,
"preview": "import UIKit\nimport Hero\n\n/*:\n\n # Builtin transitions\n\n Hero has a few basic transition builtin.\n These can be used by s"
},
{
"path": "Examples/ExampleBaseViewController.swift",
"chars": 1159,
"preview": "//\n// ExampleBaseViewController.swift\n// HeroExamples\n//\n// Created by Luke Zhao on 2018-04-15.\n// Copyright © 2018 "
},
{
"path": "Examples/MainViewController.swift",
"chars": 2709,
"preview": "import UIKit\nimport CollectionKit\n\nclass MainViewController: UIViewController {\n \n typealias SourceData = (makeViewCon"
},
{
"path": "Examples/MatchExample.swift",
"chars": 2840,
"preview": "import UIKit\n\n/*:\n\n # Matching View\n\n Use `hero.id` to match views from one view controller to another view controller.\n"
},
{
"path": "Examples/MatchInCollectionExample.swift",
"chars": 2842,
"preview": "import UIKit\nimport CollectionKit\n\nclass MatchInCollectionExampleViewController1: ExampleBaseViewController {\n let coll"
},
{
"path": "Examples/Resources/AppDelegate.swift",
"chars": 3607,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json",
"chars": 230,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"tv\",\n \"filename\" : \"Back@large.png\",\n \"scale\" : \"1x\"\n },\n {\n "
},
{
"path": "Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json",
"chars": 62,
"preview": "{\n \"info\" : {\n \"version\" : 1,\n \"author\" : \"xcode\"\n }\n}"
},
{
"path": "Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json",
"chars": 249,
"preview": "{\n \"layers\" : [\n {\n \"filename\" : \"Front.imagestacklayer\"\n },\n {\n \"filename\" : \"Middle.imagestacklaye"
},
{
"path": "Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json",
"chars": 231,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"tv\",\n \"filename\" : \"Front@large.png\",\n \"scale\" : \"1x\"\n },\n {\n "
},
{
"path": "Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json",
"chars": 62,
"preview": "{\n \"info\" : {\n \"version\" : 1,\n \"author\" : \"xcode\"\n }\n}"
},
{
"path": "Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json",
"chars": 232,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"tv\",\n \"filename\" : \"Middle@large.png\",\n \"scale\" : \"1x\"\n },\n {\n "
},
{
"path": "Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json",
"chars": 62,
"preview": "{\n \"info\" : {\n \"version\" : 1,\n \"author\" : \"xcode\"\n }\n}"
},
{
"path": "Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json",
"chars": 224,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"tv\",\n \"filename\" : \"Back.png\",\n \"scale\" : \"1x\"\n },\n {\n \"idi"
},
{
"path": "Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json",
"chars": 62,
"preview": "{\n \"info\" : {\n \"version\" : 1,\n \"author\" : \"xcode\"\n }\n}"
},
{
"path": "Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json",
"chars": 249,
"preview": "{\n \"layers\" : [\n {\n \"filename\" : \"Front.imagestacklayer\"\n },\n {\n \"filename\" : \"Middle.imagestacklaye"
},
{
"path": "Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json",
"chars": 225,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"tv\",\n \"filename\" : \"Front.png\",\n \"scale\" : \"1x\"\n },\n {\n \"id"
},
{
"path": "Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json",
"chars": 62,
"preview": "{\n \"info\" : {\n \"version\" : 1,\n \"author\" : \"xcode\"\n }\n}"
},
{
"path": "Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json",
"chars": 226,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"tv\",\n \"filename\" : \"Middle.png\",\n \"scale\" : \"1x\"\n },\n {\n \"i"
},
{
"path": "Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json",
"chars": 62,
"preview": "{\n \"info\" : {\n \"version\" : 1,\n \"author\" : \"xcode\"\n }\n}"
},
{
"path": "Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json",
"chars": 666,
"preview": "{\n \"assets\" : [\n {\n \"size\" : \"1280x768\",\n \"idiom\" : \"tv\",\n \"filename\" : \"App Icon - Large.imagestack\""
},
{
"path": "Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json",
"chars": 240,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"tv\",\n \"filename\" : \"Top Shelf Image Wide.png\",\n \"scale\" : \"1x\"\n },\n"
},
{
"path": "Examples/Resources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json",
"chars": 235,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"tv\",\n \"filename\" : \"Top Shelf Image.png\",\n \"scale\" : \"1x\"\n },\n {"
},
{
"path": "Examples/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 2251,
"preview": "{\n \"images\" : [\n {\n \"size\" : \"20x20\",\n \"idiom\" : \"iphone\",\n \"filename\" : \"Icon-20@2x.png\",\n \"sca"
},
{
"path": "Examples/Resources/Assets.xcassets/AppleHomePage/Contents.json",
"chars": 62,
"preview": "{\n \"info\" : {\n \"version\" : 1,\n \"author\" : \"xcode\"\n }\n}"
},
{
"path": "Examples/Resources/Assets.xcassets/AppleHomePage/iphone_alt_small_2x.imageset/Contents.json",
"chars": 316,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\"\n },\n {\n \"idiom\" : \"universal\",\n "
},
{
"path": "Examples/Resources/Assets.xcassets/AppleHomePage/macbookpro_portrait_small_2x.imageset/Contents.json",
"chars": 325,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\"\n },\n {\n \"idiom\" : \"universal\",\n "
},
{
"path": "Examples/Resources/Assets.xcassets/AppleHomePage/watch_alt_portrait_small_2x.imageset/Contents.json",
"chars": 324,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\"\n },\n {\n \"idiom\" : \"universal\",\n "
},
{
"path": "Examples/Resources/Assets.xcassets/CityGuide/Contents.json",
"chars": 62,
"preview": "{\n \"info\" : {\n \"version\" : 1,\n \"author\" : \"xcode\"\n }\n}"
},
{
"path": "Examples/Resources/Assets.xcassets/CityGuide/cityGuide.imageset/Contents.json",
"chars": 306,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"316f8e75.jpeg\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "Examples/Resources/Assets.xcassets/CityGuide/montreal.imageset/Contents.json",
"chars": 330,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"photo-1419041082630-1e98debd0a6a.jpeg\",\n \"s"
},
{
"path": "Examples/Resources/Assets.xcassets/CityGuide/toronto.imageset/Contents.json",
"chars": 330,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"photo-1437147921639-ef00e030265a.jpeg\",\n \"s"
},
{
"path": "Examples/Resources/Assets.xcassets/CityGuide/vancouver.imageset/Contents.json",
"chars": 306,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"316f8e75.jpeg\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "Examples/Resources/Assets.xcassets/Contents.json",
"chars": 62,
"preview": "{\n \"info\" : {\n \"version\" : 1,\n \"author\" : \"xcode\"\n }\n}"
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Contents.json",
"chars": 62,
"preview": "{\n \"info\" : {\n \"version\" : 1,\n \"author\" : \"xcode\"\n }\n}"
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash0.imageset/Contents.json",
"chars": 306,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash0.png\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash0_cell.imageset/Contents.json",
"chars": 311,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash0_cell.png\",\n \"scale\" : \"1x\"\n },"
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash0_thumb.imageset/Contents.json",
"chars": 312,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash0_thumb.png\",\n \"scale\" : \"1x\"\n }"
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash1.imageset/Contents.json",
"chars": 306,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash1.png\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash10.imageset/Contents.json",
"chars": 307,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash10.jpg\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash10_cell.imageset/Contents.json",
"chars": 312,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash10_cell.jpg\",\n \"scale\" : \"1x\"\n }"
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash10_thumb.imageset/Contents.json",
"chars": 313,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash10_thumb.jpg\",\n \"scale\" : \"1x\"\n "
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash1_cell.imageset/Contents.json",
"chars": 311,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash1_cell.png\",\n \"scale\" : \"1x\"\n },"
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash1_thumb.imageset/Contents.json",
"chars": 312,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash1_thumb.png\",\n \"scale\" : \"1x\"\n }"
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash2.imageset/Contents.json",
"chars": 306,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash2.png\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash2_cell.imageset/Contents.json",
"chars": 311,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash2_cell.png\",\n \"scale\" : \"1x\"\n },"
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash2_thumb.imageset/Contents.json",
"chars": 312,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash2_thumb.png\",\n \"scale\" : \"1x\"\n }"
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash3.imageset/Contents.json",
"chars": 306,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash3.png\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash3_cell.imageset/Contents.json",
"chars": 311,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash3_cell.png\",\n \"scale\" : \"1x\"\n },"
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash3_thumb.imageset/Contents.json",
"chars": 312,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash3_thumb.png\",\n \"scale\" : \"1x\"\n }"
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash4.imageset/Contents.json",
"chars": 306,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash4.png\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash4_cell.imageset/Contents.json",
"chars": 311,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash4_cell.png\",\n \"scale\" : \"1x\"\n },"
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash4_thumb.imageset/Contents.json",
"chars": 312,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash4_thumb.png\",\n \"scale\" : \"1x\"\n }"
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash5.imageset/Contents.json",
"chars": 306,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash5.png\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash5_cell.imageset/Contents.json",
"chars": 311,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash5_cell.png\",\n \"scale\" : \"1x\"\n },"
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash5_thumb.imageset/Contents.json",
"chars": 312,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash5_thumb.png\",\n \"scale\" : \"1x\"\n }"
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash6.imageset/Contents.json",
"chars": 306,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash6.png\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash6_cell.imageset/Contents.json",
"chars": 311,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash6_cell.png\",\n \"scale\" : \"1x\"\n },"
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash6_thumb.imageset/Contents.json",
"chars": 312,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash6_thumb.png\",\n \"scale\" : \"1x\"\n }"
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash7.imageset/Contents.json",
"chars": 306,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash7.png\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash7_cell.imageset/Contents.json",
"chars": 311,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash7_cell.png\",\n \"scale\" : \"1x\"\n },"
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash7_thumb.imageset/Contents.json",
"chars": 312,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash7_thumb.png\",\n \"scale\" : \"1x\"\n }"
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash8.imageset/Contents.json",
"chars": 306,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash8.png\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash8_cell.imageset/Contents.json",
"chars": 311,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash8_cell.png\",\n \"scale\" : \"1x\"\n },"
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash8_thumb.imageset/Contents.json",
"chars": 312,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash8_thumb.png\",\n \"scale\" : \"1x\"\n }"
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash9.imageset/Contents.json",
"chars": 306,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash9.png\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash9_cell.imageset/Contents.json",
"chars": 311,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash9_cell.png\",\n \"scale\" : \"1x\"\n },"
},
{
"path": "Examples/Resources/Assets.xcassets/Foods/Unsplash9_thumb.imageset/Contents.json",
"chars": 312,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"Unsplash9_thumb.png\",\n \"scale\" : \"1x\"\n }"
},
{
"path": "Examples/Resources/Assets.xcassets/HeroLogo.imageset/Contents.json",
"chars": 381,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"HeroLogo.png\",\n \"scale\" : \"1x\"\n },\n {"
},
{
"path": "Examples/Resources/Assets.xcassets/Menu/Contents.json",
"chars": 62,
"preview": "{\n \"info\" : {\n \"version\" : 1,\n \"author\" : \"xcode\"\n }\n}"
},
{
"path": "Examples/Resources/Assets.xcassets/Menu/ic_audiotrack_48pt.imageset/Contents.json",
"chars": 411,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"ic_audiotrack_48pt.png\",\n \"scale\" : \"1x\"\n "
},
{
"path": "Examples/Resources/Assets.xcassets/Menu/ic_chat_48pt.imageset/Contents.json",
"chars": 393,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"ic_chat_48pt.png\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "Examples/Resources/Assets.xcassets/Menu/ic_format_quote_48pt.imageset/Contents.json",
"chars": 417,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"ic_format_quote_48pt.png\",\n \"scale\" : \"1x\"\n"
},
{
"path": "Examples/Resources/Assets.xcassets/Menu/ic_gif_48pt.imageset/Contents.json",
"chars": 390,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"ic_gif_48pt.png\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "Examples/Resources/Assets.xcassets/Menu/ic_insert_photo_48pt.imageset/Contents.json",
"chars": 417,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"ic_insert_photo_48pt.png\",\n \"scale\" : \"1x\"\n"
},
{
"path": "Examples/Resources/Assets.xcassets/Menu/ic_link_48pt.imageset/Contents.json",
"chars": 393,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"ic_link_48pt.png\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "Examples/Resources/Assets.xcassets/Menu/ic_menu_36pt.imageset/Contents.json",
"chars": 462,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"ic_menu_36pt.png\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "Examples/Resources/Assets.xcassets/Menu/ic_menu_48pt.imageset/Contents.json",
"chars": 462,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"ic_menu_48pt.png\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "Examples/Resources/Assets.xcassets/Menu/ic_text_fields_48pt.imageset/Contents.json",
"chars": 414,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"ic_text_fields_48pt.png\",\n \"scale\" : \"1x\"\n "
},
{
"path": "Examples/Resources/Assets.xcassets/Menu/ic_videocam_48pt.imageset/Contents.json",
"chars": 405,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"ic_videocam_48pt.png\",\n \"scale\" : \"1x\"\n "
},
{
"path": "Examples/Resources/Assets.xcassets/MusicPlayer/Contents.json",
"chars": 62,
"preview": "{\n \"info\" : {\n \"version\" : 1,\n \"author\" : \"xcode\"\n }\n}"
},
{
"path": "Examples/Resources/Assets.xcassets/MusicPlayer/album1.imageset/Contents.json",
"chars": 333,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"computergraphics-album-covers-2014-3.jpg\",\n "
},
{
"path": "Examples/Resources/Assets.xcassets/MusicPlayer/ic_fast_forward.imageset/Contents.json",
"chars": 402,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"ic_fast_forward.png\",\n \"scale\" : \"1x\"\n }"
},
{
"path": "Examples/Resources/Assets.xcassets/MusicPlayer/ic_fast_rewind.imageset/Contents.json",
"chars": 399,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"ic_fast_rewind.png\",\n \"scale\" : \"1x\"\n },"
},
{
"path": "Examples/Resources/Assets.xcassets/MusicPlayer/ic_pause_white.imageset/Contents.json",
"chars": 399,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"ic_pause_white.png\",\n \"scale\" : \"1x\"\n },"
},
{
"path": "Examples/Resources/Assets.xcassets/MusicPlayer/ic_play_arrow_white.imageset/Contents.json",
"chars": 414,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"ic_play_arrow_white.png\",\n \"scale\" : \"1x\"\n "
},
{
"path": "Examples/Resources/Assets.xcassets/MusicPlayer/ic_repeat.imageset/Contents.json",
"chars": 384,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"ic_repeat.png\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "Examples/Resources/Assets.xcassets/MusicPlayer/ic_shuffle.imageset/Contents.json",
"chars": 387,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"ic_shuffle.png\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "Examples/Resources/Assets.xcassets/bigbuckbunny.imageset/Contents.json",
"chars": 303,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"poster.jpg\",\n \"scale\" : \"1x\"\n },\n {\n "
},
{
"path": "Examples/Resources/Assets.xcassets/ic_bug_report_48pt.imageset/Contents.json",
"chars": 411,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"ic_bug_report_48pt.png\",\n \"scale\" : \"1x\"\n "
},
{
"path": "Examples/Resources/Assets.xcassets/ic_close.imageset/Contents.json",
"chars": 381,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"ic_close.png\",\n \"scale\" : \"1x\"\n },\n {"
},
{
"path": "Examples/Resources/Assets.xcassets/ic_code.imageset/Contents.json",
"chars": 378,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"ic_code.png\",\n \"scale\" : \"1x\"\n },\n {\n"
},
{
"path": "Examples/Resources/Assets.xcassets/ic_input_48pt.imageset/Contents.json",
"chars": 396,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"ic_input_48pt.png\",\n \"scale\" : \"1x\"\n },\n"
},
{
"path": "Examples/Resources/Assets.xcassets/ic_keyboard_arrow_down.imageset/Contents.json",
"chars": 423,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"ic_keyboard_arrow_down.png\",\n \"scale\" : \"1x"
},
{
"path": "Examples/Resources/Assets.xcassets/ic_view_list.imageset/Contents.json",
"chars": 393,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"ic_view_list.png\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "Examples/Resources/Assets.xcassets/ic_view_module.imageset/Contents.json",
"chars": 399,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"ic_view_module.png\",\n \"scale\" : \"1x\"\n },"
},
{
"path": "Examples/Resources/Base.lproj/LaunchScreen.storyboard",
"chars": 1746,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "Examples/Resources/Info.plist",
"chars": 1257,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Examples/Resources/UIKit+HeroExamples.swift",
"chars": 2488,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "Examples/SwiftUIMatchExample.swift",
"chars": 2539,
"preview": "#if canImport(SwiftUI)\n\nimport UIKit\nimport SwiftUI\nimport Hero\n\n@available(iOS 13.0, *)\nclass SwiftUIMatchExampleViewCo"
},
{
"path": "Gemfile",
"chars": 1192,
"preview": "# frozen_string_literal: true\n\nsource 'https://rubygems.org'\n#ruby '~> 2.5.1'\n\ngem 'cocoapods', '~> 1.10'\ngem 'cocoapods"
},
{
"path": "Hero.podspec",
"chars": 1484,
"preview": "# frozen_string_literal: true\n\nPod::Spec.new do |s|\n s.name = 'Hero'\n s.version = '1.6.4'\n s.s"
},
{
"path": "Hero.xcodeproj/project.pbxproj",
"chars": 98723,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "Hero.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 157,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:HeroExamples.xc"
},
{
"path": "Hero.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Hero.xcodeproj/xcshareddata/xcschemes/Hero (tvOS).xcscheme",
"chars": 2738,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1240\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "Hero.xcodeproj/xcshareddata/xcschemes/Hero.xcscheme",
"chars": 3156,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1240\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "Hero.xcodeproj/xcshareddata/xcschemes/HeroExamples.xcscheme",
"chars": 3282,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1120\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "Hero.xcworkspace/contents.xcworkspacedata",
"chars": 222,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"group:Hero.xcodeproj"
},
{
"path": "Hero.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Hero.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
"chars": 279,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "LICENSE",
"chars": 1092,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Luke Zhao <me@lkzhao.com>\n\nPermission is hereby granted, free of charge, to an"
},
{
"path": "LegacyExamples/Base.lproj/Main.storyboard",
"chars": 94358,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "LegacyExamples/Examples/AppleHomePage/AppleHomePage.storyboard",
"chars": 27095,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "LegacyExamples/Examples/AppleHomePage/AppleProductViewController.swift",
"chars": 4543,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "LegacyExamples/Examples/Basic.storyboard",
"chars": 35045,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "LegacyExamples/Examples/BuiltInTransition/AnimationSelectTableViewController.swift",
"chars": 4164,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "LegacyExamples/Examples/BuiltInTransition/BuiltInTransitions.storyboard",
"chars": 12145,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "LegacyExamples/Examples/CityGuide/City.swift",
"chars": 2905,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "LegacyExamples/Examples/CityGuide/CityGuide.storyboard",
"chars": 33514,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "LegacyExamples/Examples/CityGuide/CityGuideCell.swift",
"chars": 1681,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "LegacyExamples/Examples/CityGuide/CityGuideViewController.swift",
"chars": 2116,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "LegacyExamples/Examples/CityGuide/CityViewController.swift",
"chars": 2298,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "LegacyExamples/Examples/ImageGallery/ImageCells.swift",
"chars": 4945,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "LegacyExamples/Examples/ImageGallery/ImageGallery.storyboard",
"chars": 9549,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "LegacyExamples/Examples/ImageGallery/ImageGalleryCollectionViewController.swift",
"chars": 5178,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "LegacyExamples/Examples/ImageGallery/ImageLibrary.swift",
"chars": 418,
"preview": "//\n// ImageLibrary.swift\n// HeroExamples\n//\n// Created by YiLun Zhao on 2017-01-04.\n// Copyright © 2017 Luke Zhao. A"
},
{
"path": "LegacyExamples/Examples/ImageGallery/ImageViewController.swift",
"chars": 4208,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "LegacyExamples/Examples/ImageGallery/ImageViewer.storyboard",
"chars": 3869,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "LegacyExamples/Examples/ListToGrid/GridCollectionViewController.swift",
"chars": 4713,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "LegacyExamples/Examples/ListToGrid/ListTableViewController.swift",
"chars": 4275,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "LegacyExamples/Examples/ListToGrid/ListToGrid.storyboard",
"chars": 16160,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "LegacyExamples/Examples/Menu/Menu.storyboard",
"chars": 32050,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "LegacyExamples/Examples/Menu/MenuViewController.swift",
"chars": 1065,
"preview": "//\n// MenuViewController.swift\n// HeroExamples\n//\n// Created by YiLun Zhao on 2017-02-09.\n// Copyright © 2017 Luke Z"
},
{
"path": "LegacyExamples/Examples/MusicPlayer.storyboard",
"chars": 32737,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "LegacyExamples/Examples/Navigation/FirstViewController.swift",
"chars": 476,
"preview": "//\n// FirstViewController.swift\n// HeroExamples\n//\n// Created by Luke Zhao on 2017-11-04.\n// Copyright © 2017 Luke Z"
},
{
"path": "LegacyExamples/Examples/Navigation/Navigation.storyboard",
"chars": 11427,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "LegacyExamples/Examples/VideoPlayer/VideoPlayer.storyboard",
"chars": 4523,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "LegacyExamples/Examples/VideoPlayer/VideoPlayerViewController.swift",
"chars": 3030,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "LegacyExamples/LegacyExampleViewController.swift",
"chars": 2211,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "LegacyExamples/PluginViewController.swift",
"chars": 1521,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "LegacyExamples/en.lproj/Main.strings",
"chars": 436,
"preview": "\n/* Class = \"UILabel\"; text = \"Built-in\"; ObjectID = \"IIL-pF-BfF\"; */\n\"IIL-pF-BfF.text\" = \"Built-in\";\n\n/* Class = \"UITab"
},
{
"path": "Makefile",
"chars": 845,
"preview": "GITHUB_URL := https://github.com/HeroTransitions/Hero/\n\ninclude .makefiles/ludicrous.mk\ninclude .makefiles/bundler.mk\nin"
},
{
"path": "Mintfile",
"chars": 110,
"preview": "# yonaskolb/xcodegen\nrealm/SwiftLint # Linting Tool\ndanger/swift.git\nnicklockwood/SwiftFormat\n# orta/Komondor\n"
},
{
"path": "Package.md",
"chars": 744,
"preview": "# Package: **Hero**\n\n## Products\n\nList of products in this package:\n\n| Product | Type | Targets |\n| ------- | ---- | ---"
},
{
"path": "Package.swift",
"chars": 1059,
"preview": "// swift-tools-version:5.0\n// The swift-tools-version declares the minimum version of Swift required to build this packa"
},
{
"path": "PackageModules.dot",
"chars": 582,
"preview": "digraph ModuleDependencyGraph {\n rankdir = LR\n graph [fontname=\"Helvetica-light\", style = filled, color = \"#eaeaea"
},
{
"path": "Podfile",
"chars": 257,
"preview": "\n\ntarget 'HeroExamples' do\n platform :ios, '10.0'\n use_frameworks!\n pod 'CollectionKit', :inhibit_warnings => true\n\n "
},
{
"path": "README.md",
"chars": 8377,
"preview": "<img src=\"https://cdn.rawgit.com/lkzhao/Hero/427d5f2/Resources/Hero.svg\" width=\"388\"/>\n\n**Hero** is a library for buildi"
},
{
"path": "README.zh-cn.md",
"chars": 3597,
"preview": "<img src=\"https://cdn.rawgit.com/lkzhao/Hero/bff6d87907006d1847ed0b7121e9fb4ac4d68320/Resources/Hero.svg\" width=\"388\"/>\n"
},
{
"path": "Sources/Animator/HeroAnimatorViewContext.swift",
"chars": 2287,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "Sources/Animator/HeroCoreAnimationViewContext.swift",
"chars": 16931,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "Sources/Animator/HeroDefaultAnimator.swift",
"chars": 5534,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "Sources/Animator/HeroViewPropertyViewContext.swift",
"chars": 3464,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "Sources/Debug Plugin/HeroDebugPlugin.swift",
"chars": 6384,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "Sources/Debug Plugin/HeroDebugView.swift",
"chars": 6936,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "Sources/Extensions/Array+HeroModifier.swift",
"chars": 2022,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "Sources/Extensions/CALayer+Hero.swift",
"chars": 2091,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "Sources/Extensions/CAMediaTimingFunction+Hero.swift",
"chars": 2527,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "Sources/Extensions/CG+Hero.swift",
"chars": 4980,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "Sources/Extensions/DispatchQueue+Hero.swift",
"chars": 1388,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "Sources/Extensions/Locale+Hero.swift",
"chars": 599,
"preview": "//\n// Locale+Hero.swift\n// Hero\n//\n// Created by Joseph Mattiello on 4/25/20.\n// Copyright © 2020 Luke Zhao. All rig"
},
{
"path": "Sources/Extensions/UIColor+HexString.swift",
"chars": 798,
"preview": "//\n// UIColor+HexString.swift\n// Hero\n//\n// Created by Joseph Mattiello on 10/21/19.\n// Copyright © 2019 Luke Zhao. "
},
{
"path": "Sources/Extensions/UIKit+Hero.swift",
"chars": 2392,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "Sources/Extensions/UIView+Hero.swift",
"chars": 7744,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "Sources/Extensions/UIViewController+Hero.swift",
"chars": 14712,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "Sources/Hero.h",
"chars": 458,
"preview": "//\n// Hero.h\n// Hero\n//\n// Created by YiLun Zhao on 2017-01-03.\n// Copyright © 2017 Luke Zhao. All rights reserved.\n"
},
{
"path": "Sources/HeroCompatible.swift",
"chars": 1575,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "Sources/HeroContext.swift",
"chars": 14150,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "Sources/HeroModifier+Advanced.swift",
"chars": 5215,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "Sources/HeroModifier+HeroStringConvertible.swift",
"chars": 5208,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "Sources/HeroModifier.swift",
"chars": 15654,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "Sources/HeroPlugin.swift",
"chars": 6067,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
},
{
"path": "Sources/HeroTargetState.swift",
"chars": 4104,
"preview": "// The MIT License (MIT)\n//\n// Copyright (c) 2016 Luke Zhao <me@lkzhao.com>\n//\n// Permission is hereby granted, free of "
}
]
// ... and 155 more files (download for full content)
About this extraction
This page contains the full source code of the HeroTransitions/Hero GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 355 files (3.9 MB), approximately 1.0M tokens, and a symbol index with 100 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.