[
  {
    "path": ".gitignore",
    "content": "\n# Created by https://www.toptal.com/developers/gitignore/api/xcode,swift,swiftpackagemanager,swiftpm\n# Edit at https://www.toptal.com/developers/gitignore?templates=xcode,swift,swiftpackagemanager,swiftpm\n\n*.DS_Store\n\n### Swift ###\n# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n## User settings\nxcuserdata/\n\n## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)\n*.xcscmblueprint\n*.xccheckout\n\n## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)\nbuild/\nDerivedData/\n*.moved-aside\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\n\n## Obj-C/Swift specific\n*.hmap\n\n## App packaging\n*.ipa\n*.dSYM.zip\n*.dSYM\n\n## Playgrounds\ntimeline.xctimeline\nplayground.xcworkspace\n\n# Swift Package Manager\n# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.\n# Packages/\n# Package.pins\n# Package.resolved\n# *.xcodeproj\n# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata\n# hence it is not needed unless you have added a package configuration file to your project\n# .swiftpm\n\n.build/\n\n# CocoaPods\n# We recommend against adding the Pods directory to your .gitignore. However\n# you should judge for yourself, the pros and cons are mentioned at:\n# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control\n# Pods/\n# Add this line if you want to avoid checking in source code from the Xcode workspace\n# *.xcworkspace\n\n# Carthage\n# Add this line if you want to avoid checking in source code from Carthage dependencies.\n# Carthage/Checkouts\n\nCarthage/Build/\n\n# Accio dependency management\nDependencies/\n.accio/\n\n# fastlane\n# It is recommended to not store the screenshots in the git repo.\n# Instead, use fastlane to re-generate the screenshots whenever they are needed.\n# For more information about the recommended setup visit:\n# https://docs.fastlane.tools/best-practices/source-control/#source-control\n\nfastlane/report.xml\nfastlane/Preview.html\nfastlane/screenshots/**/*.png\nfastlane/test_output\n\n# Code Injection\n# After new code Injection tools there's a generated folder /iOSInjectionProject\n# https://github.com/johnno1962/injectionforxcode\n\niOSInjectionProject/\n\n### SwiftPackageManager ###\nPackages\nxcuserdata\n#*.xcodeproj\n\n\n### SwiftPM ###\n\n\n### Xcode ###\n# Xcode\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n\n\n\n## Gcc Patch\n/*.gcno\n\n### Xcode Patch ###\n*.xcodeproj/*\n!*.xcodeproj/project.pbxproj\n!*.xcodeproj/xcshareddata/\n!*.xcworkspace/contents.xcworkspacedata\n**/xcshareddata/WorkspaceSettings.xcsettings\n\n# End of https://www.toptal.com/developers/gitignore/api/xcode,swift,swiftpackagemanager,swiftpm"
  },
  {
    "path": "Adaptive-Views/AdaptiveViews/AdaptiveViews/AdaptiveExampleView.swift",
    "content": "//\n\nimport SwiftUI\n\nstruct AdaptiveExampleView: View {\n  var body: some View {\n    AdaptiveView {\n      RoundedRectangle(cornerRadius: 40.0, style: .continuous)\n        .fill(\n          LinearGradient(\n            gradient: Gradient(colors: [Color(red: 224 / 255.0, green: 21 / 255.0, blue: 90 / 255.0, opacity: 1), .pink]),\n            startPoint: .topLeading, endPoint: .bottomTrailing\n          )\n        )\n        .frame(maxHeight: 400)\n\n      VStack {\n        Text(\"Title\")\n          .bold()\n          .font(.title)\n\n        Text(\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\")\n          .fixedSize(horizontal: false, vertical: true)\n      }\n    }\n    .padding()\n  }\n}\n\nstruct AdaptiveExampleView_Previews: PreviewProvider {\n  static var previews: some View {\n    Group {\n      AdaptiveExampleView()\n        .previewLayout(.fixed(width: 568, height: 420))\n      AdaptiveExampleView()\n        .previewLayout(.fixed(width: 320, height: 528))\n    }\n  }\n}\n"
  },
  {
    "path": "Adaptive-Views/AdaptiveViews/AdaptiveViews/AdaptiveView.swift",
    "content": "//\n\nimport SwiftUI\n\n// MARK: Size class\n\n// Run this on a plus size device in landscape or on an iPad to see the regular\n// size class.\n\n/*\nstruct AdaptiveView<Content: View>: View {\n  @Environment(\\.horizontalSizeClass) var horizontalSizeClass\n  var content: Content\n\n  public init(@ViewBuilder content: () -> Content) {\n    self.content = content()\n  }\n\n  var body: some View {\n    if horizontalSizeClass == .regular {\n      HStack {\n        content\n      }\n    } else {\n      VStack {\n        content\n      }\n    }\n  }\n}\n*/\n\n// MARK: Dynamic Type\n\n// Change the system dynamic type to switch between layouts.\n\n/*\nstruct AdaptiveView<Content: View>: View {\n  @Environment(\\.sizeCategory) var sizeCategory: ContentSizeCategory\n  var content: Content\n\n  public init(@ViewBuilder content: () -> Content) {\n    self.content = content()\n  }\n\n  var body: some View {\n    if sizeCategory.isAccessibilityCategory {\n      VStack {\n        content\n      }\n    } else {\n      HStack {\n        content\n      }\n    }\n  }\n}\n*/\n\n// MARK: Custom threshold\n\nstruct AdaptiveView<Content: View>: View {\n  @Environment(\\.sizeCategory) var sizeCategory: ContentSizeCategory\n\n  @State private var availableWidth: CGFloat = 0\n  var threshold: CGFloat\n  var content: Content\n\n  public init(threshold: CGFloat = 500, @ViewBuilder content: () -> Content) {\n    self.threshold = threshold\n    self.content = content()\n  }\n\n  var body: some View {\n    ZStack {\n      Color.clear\n        .frame(height: 1)\n        .readSize { size in\n          availableWidth = size.width\n        }\n\n      if availableWidth > threshold {\n        HStack {\n          content\n        }\n      } else {\n        VStack {\n          content\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Adaptive-Views/AdaptiveViews/AdaptiveViews/AdaptiveViewsApp.swift",
    "content": "//\n\nimport SwiftUI\n\n@main\nstruct AdaptiveViewsApp: App {\n    var body: some Scene {\n        WindowGroup {\n            ContentView()\n        }\n    }\n}\n"
  },
  {
    "path": "Adaptive-Views/AdaptiveViews/AdaptiveViews/Assets.xcassets/AccentColor.colorset/Contents.json",
    "content": "{\n  \"colors\" : [\n    {\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Adaptive-Views/AdaptiveViews/AdaptiveViews/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"60x60\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"60x60\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"76x76\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"76x76\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"83.5x83.5\"\n    },\n    {\n      \"idiom\" : \"ios-marketing\",\n      \"scale\" : \"1x\",\n      \"size\" : \"1024x1024\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Adaptive-Views/AdaptiveViews/AdaptiveViews/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Adaptive-Views/AdaptiveViews/AdaptiveViews/Assets.xcassets/apple.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"Apple.pdf\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}\n"
  },
  {
    "path": "Adaptive-Views/AdaptiveViews/AdaptiveViews/Assets.xcassets/google.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"Google.pdf\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}\n"
  },
  {
    "path": "Adaptive-Views/AdaptiveViews/AdaptiveViews/Assets.xcassets/twitter.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"Twitter.pdf\",\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}\n"
  },
  {
    "path": "Adaptive-Views/AdaptiveViews/AdaptiveViews/ContentView.swift",
    "content": "//\n\nimport SwiftUI\n\nstruct ContentView: View {\n  var body: some View {\n    NavigationView {\n      List {\n        NavigationLink(\"Image/Text\", destination: AdaptiveExampleView())\n        NavigationLink(\"Social Sign In\", destination: SocialSignInView())\n        NavigationLink(\"Experiment\", destination: ExperimentalView())\n      }\n      .navigationBarTitle(\"Adaptive View Examples\", displayMode: .inline)\n    }\n  }\n}\n"
  },
  {
    "path": "Adaptive-Views/AdaptiveViews/AdaptiveViews/ExperimentalView.swift",
    "content": "//\n\nimport SwiftUI\n\nstruct ExperimentalView: View {\n  @State var currentWidth: CGFloat = 0\n  @State var padding: CGFloat = 8\n  @State var threshold: CGFloat = 100\n\n  var body: some View {\n    VStack {\n      AdaptiveView(threshold: threshold) {\n        RoundedRectangle(cornerRadius: 40.0, style: .continuous)\n          .fill(\n            Color(red: 224 / 255.0, green: 21 / 255.0, blue: 90 / 255.0, opacity: 1)\n          )\n        RoundedRectangle(cornerRadius: 40.0, style: .continuous)\n          .fill(\n        Color.pink\n          )\n      }\n      .readSize { size in\n        currentWidth = size.width\n      }\n      .overlay(\n        Rectangle()\n          .stroke(lineWidth: 2)\n          .frame(width: threshold)\n      )\n      .padding(.horizontal, padding)\n\n      Text(\"Current width: \\(Int(currentWidth))\")\n      HStack {\n        Text(\"Threshold: \\(Int(threshold))\")\n        Slider(value: $threshold, in: 0...500, step: 1) { Text(\"\") }\n      }\n      HStack {\n        Text(\"Padding:\")\n        Slider(value: $padding, in: 0...500, step: 1) { Text(\"\") }\n      }\n    }\n    .padding()\n  }\n}\n"
  },
  {
    "path": "Adaptive-Views/AdaptiveViews/AdaptiveViews/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIApplicationSceneManifest</key>\n\t<dict>\n\t\t<key>UIApplicationSupportsMultipleScenes</key>\n\t\t<true/>\n\t</dict>\n\t<key>UIApplicationSupportsIndirectInputEvents</key>\n\t<true/>\n\t<key>UILaunchScreen</key>\n\t<dict/>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Adaptive-Views/AdaptiveViews/AdaptiveViews/SignInButton.swift",
    "content": "//\n\nimport SwiftUI\n\nextension Color {\n  static let appleTint = Color.black\n  static let googleTint = Color(red: 222 / 255.0, green: 82 / 255.0, blue: 70 / 255.0)\n  static let twitterTint = Color(red: 29 / 255.0, green: 161 / 255.0, blue: 242 / 255.0)\n}\n\nstruct SignInButton: View {\n\n  enum Mode {\n    case regular\n    case compact\n  }\n\n  var action: () -> Void\n  var tintColor: Color\n  var imageName: String\n  var mode: Mode\n\n  var body: some View {\n    Button(action: action) {\n      switch mode {\n      case .compact:\n        Circle()\n          .fill(tintColor)\n          .overlay(Image(imageName))\n          .frame(width: 44, height: 44)\n      case .regular:\n        HStack {\n          Text(\"Sign in with\")\n          Image(imageName)\n        }\n        .padding()\n        .background(\n          Capsule()\n            .fill(tintColor)\n        )\n      }\n    }\n    .foregroundColor(.white)\n  }\n}\n\nstruct SignInButton_Previews: PreviewProvider {\n  static var previews: some View {\n    Group {\n      SignInButton(action: {}, tintColor: .appleTint, imageName: \"apple\", mode: .regular)\n      SignInButton(action: {}, tintColor: .appleTint, imageName: \"apple\", mode: .compact)\n      SignInButton(action: {}, tintColor: .googleTint, imageName: \"google\", mode: .regular)\n      SignInButton(action: {}, tintColor: .googleTint, imageName: \"google\", mode: .compact)\n\n      SignInButton(action: {}, tintColor: .twitterTint, imageName: \"twitter\", mode: .regular)\n      SignInButton(action: {}, tintColor: .twitterTint, imageName: \"twitter\", mode: .compact)\n    }\n    .previewLayout(.sizeThatFits)\n  }\n}\n"
  },
  {
    "path": "Adaptive-Views/AdaptiveViews/AdaptiveViews/SocialSignInView.swift",
    "content": "//\n\nimport SwiftUI\n\nstruct SocialSignInView: View {\n  @State private var availableWidth: CGFloat = 0\n\n  private var buttonMode: SignInButton.Mode {\n    availableWidth > 500 ? .regular : .compact\n  }\n\n  var body: some View {\n    ZStack {\n      Color.clear\n        .frame(height: 1)\n        .readSize { size in\n          availableWidth = size.width\n        }\n\n      HStack {\n        SignInButton(action: {}, tintColor: .appleTint, imageName: \"apple\", mode: buttonMode)\n        SignInButton(action: {}, tintColor: .googleTint, imageName: \"google\", mode: buttonMode)\n        SignInButton(action: {}, tintColor: .twitterTint, imageName: \"twitter\", mode: buttonMode)\n      }\n    }\n  }\n}\n\nstruct SocialSignInView_Previews: PreviewProvider {\n  static var previews: some View {\n    Group {\n      SocialSignInView()\n        .previewLayout(.fixed(width: 568, height: 320))\n      SocialSignInView()\n        .previewLayout(.fixed(width: 320, height: 528))\n    }\n  }\n}\n"
  },
  {
    "path": "Adaptive-Views/AdaptiveViews/AdaptiveViews/View+ReadSize.swift",
    "content": "//\n\nimport SwiftUI\n\nextension View {\n  func readSize(onChange: @escaping (CGSize) -> Void) -> some View {\n    background(\n      GeometryReader { geometryProxy in\n        Color.clear\n          .preference(key: SizePreferenceKey.self, value: geometryProxy.size)\n      }\n    )\n    .onPreferenceChange(SizePreferenceKey.self, perform: onChange)\n  }\n}\n\nprivate struct SizePreferenceKey: PreferenceKey {\n  static var defaultValue: CGSize = .zero\n  static func reduce(value: inout CGSize, nextValue: () -> CGSize) {}\n}\n"
  },
  {
    "path": "Adaptive-Views/AdaptiveViews/AdaptiveViews.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t64B79F03253EBD9000168B88 /* AdaptiveViewsApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64B79F02253EBD9000168B88 /* AdaptiveViewsApp.swift */; };\n\t\t64B79F05253EBD9000168B88 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64B79F04253EBD9000168B88 /* ContentView.swift */; };\n\t\t64B79F16253EBDE600168B88 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 64B79F15253EBDE600168B88 /* Assets.xcassets */; };\n\t\t64B79F1E253EBDF100168B88 /* SocialSignInView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64B79F18253EBDF100168B88 /* SocialSignInView.swift */; };\n\t\t64B79F1F253EBDF100168B88 /* ExperimentalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64B79F19253EBDF100168B88 /* ExperimentalView.swift */; };\n\t\t64B79F20253EBDF100168B88 /* View+ReadSize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64B79F1A253EBDF100168B88 /* View+ReadSize.swift */; };\n\t\t64B79F21253EBDF100168B88 /* AdaptiveView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64B79F1B253EBDF100168B88 /* AdaptiveView.swift */; };\n\t\t64B79F22253EBDF100168B88 /* AdaptiveExampleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64B79F1C253EBDF100168B88 /* AdaptiveExampleView.swift */; };\n\t\t64B79F23253EBDF100168B88 /* SignInButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64B79F1D253EBDF100168B88 /* SignInButton.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t64B79EFF253EBD9000168B88 /* AdaptiveViews.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AdaptiveViews.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t64B79F02253EBD9000168B88 /* AdaptiveViewsApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdaptiveViewsApp.swift; sourceTree = \"<group>\"; };\n\t\t64B79F04253EBD9000168B88 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = \"<group>\"; };\n\t\t64B79F0B253EBD9100168B88 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t64B79F15253EBDE600168B88 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t64B79F18253EBDF100168B88 /* SocialSignInView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocialSignInView.swift; sourceTree = \"<group>\"; };\n\t\t64B79F19253EBDF100168B88 /* ExperimentalView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExperimentalView.swift; sourceTree = \"<group>\"; };\n\t\t64B79F1A253EBDF100168B88 /* View+ReadSize.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"View+ReadSize.swift\"; sourceTree = \"<group>\"; };\n\t\t64B79F1B253EBDF100168B88 /* AdaptiveView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdaptiveView.swift; sourceTree = \"<group>\"; };\n\t\t64B79F1C253EBDF100168B88 /* AdaptiveExampleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdaptiveExampleView.swift; sourceTree = \"<group>\"; };\n\t\t64B79F1D253EBDF100168B88 /* SignInButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignInButton.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t64B79EFC253EBD9000168B88 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t64B79EF6253EBD9000168B88 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64B79F01253EBD9000168B88 /* AdaptiveViews */,\n\t\t\t\t64B79F00253EBD9000168B88 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t64B79F00253EBD9000168B88 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64B79EFF253EBD9000168B88 /* AdaptiveViews.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t64B79F01253EBD9000168B88 /* AdaptiveViews */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64B79F02253EBD9000168B88 /* AdaptiveViewsApp.swift */,\n\t\t\t\t64B79F04253EBD9000168B88 /* ContentView.swift */,\n\t\t\t\t64B79F0B253EBD9100168B88 /* Info.plist */,\n\t\t\t\t64B79F15253EBDE600168B88 /* Assets.xcassets */,\n\t\t\t\t64B79F1C253EBDF100168B88 /* AdaptiveExampleView.swift */,\n\t\t\t\t64B79F1B253EBDF100168B88 /* AdaptiveView.swift */,\n\t\t\t\t64B79F19253EBDF100168B88 /* ExperimentalView.swift */,\n\t\t\t\t64B79F1D253EBDF100168B88 /* SignInButton.swift */,\n\t\t\t\t64B79F18253EBDF100168B88 /* SocialSignInView.swift */,\n\t\t\t\t64B79F1A253EBDF100168B88 /* View+ReadSize.swift */,\n\t\t\t);\n\t\t\tpath = AdaptiveViews;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t64B79EFE253EBD9000168B88 /* AdaptiveViews */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 64B79F0E253EBD9100168B88 /* Build configuration list for PBXNativeTarget \"AdaptiveViews\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t64B79EFB253EBD9000168B88 /* Sources */,\n\t\t\t\t64B79EFC253EBD9000168B88 /* Frameworks */,\n\t\t\t\t64B79EFD253EBD9000168B88 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = AdaptiveViews;\n\t\t\tproductName = AdaptiveViews;\n\t\t\tproductReference = 64B79EFF253EBD9000168B88 /* AdaptiveViews.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t64B79EF7253EBD9000168B88 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 1200;\n\t\t\t\tLastUpgradeCheck = 1200;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t64B79EFE253EBD9000168B88 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 12.0.1;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 64B79EFA253EBD9000168B88 /* Build configuration list for PBXProject \"AdaptiveViews\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 64B79EF6253EBD9000168B88;\n\t\t\tproductRefGroup = 64B79F00253EBD9000168B88 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t64B79EFE253EBD9000168B88 /* AdaptiveViews */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t64B79EFD253EBD9000168B88 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t64B79F16253EBDE600168B88 /* Assets.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t64B79EFB253EBD9000168B88 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t64B79F20253EBDF100168B88 /* View+ReadSize.swift in Sources */,\n\t\t\t\t64B79F23253EBDF100168B88 /* SignInButton.swift in Sources */,\n\t\t\t\t64B79F1E253EBDF100168B88 /* SocialSignInView.swift in Sources */,\n\t\t\t\t64B79F21253EBDF100168B88 /* AdaptiveView.swift in Sources */,\n\t\t\t\t64B79F05253EBD9000168B88 /* ContentView.swift in Sources */,\n\t\t\t\t64B79F1F253EBDF100168B88 /* ExperimentalView.swift in Sources */,\n\t\t\t\t64B79F22253EBDF100168B88 /* AdaptiveExampleView.swift in Sources */,\n\t\t\t\t64B79F03253EBD9000168B88 /* AdaptiveViewsApp.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t64B79F0C253EBD9100168B88 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t64B79F0D253EBD9100168B88 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t64B79F0F253EBD9100168B88 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tINFOPLIST_FILE = AdaptiveViews/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = blog.fivestars.AdaptiveViews;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t64B79F10253EBD9100168B88 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tINFOPLIST_FILE = AdaptiveViews/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = blog.fivestars.AdaptiveViews;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t64B79EFA253EBD9000168B88 /* Build configuration list for PBXProject \"AdaptiveViews\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t64B79F0C253EBD9100168B88 /* Debug */,\n\t\t\t\t64B79F0D253EBD9100168B88 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t64B79F0E253EBD9100168B88 /* Build configuration list for PBXNativeTarget \"AdaptiveViews\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t64B79F0F253EBD9100168B88 /* Debug */,\n\t\t\t\t64B79F10253EBD9100168B88 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 64B79EF7253EBD9000168B88 /* Project object */;\n}\n"
  },
  {
    "path": "Adaptive-Views/AdaptiveViews/AdaptiveViews.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Adaptive-Views/AdaptiveViews/AdaptiveViews.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Adaptive-Views/README.md",
    "content": "Final project from [Adaptive SwiftUI views][fs].\n\n![][gif]\n\n[fs]: https://fivestars.blog/swiftui/adaptive-swiftui-views.html\n\n[gif]: layouts.png\n"
  },
  {
    "path": "App-State-In-SwiftUI/AppState.swift",
    "content": "// Gist from https://fivestars.blog/swiftui/app-state.html\n\nimport SwiftUI\n\n@main\nstruct FiveStarsApp: App {\n  @StateObject var appStateContainer = AppStateContainer()\n\n  var body: some Scene {\n    WindowGroup {\n      ContentView()\n        .environmentObject(appStateContainer)\n        .environmentObject(appStateContainer.tabViewState)\n    }\n  }\n}\n\nenum Tab: Hashable {\n  case home\n  case settings\n}\n\nclass TabViewState: ObservableObject {\n  @Published var selectedTab: Tab = .home\n}\n\nclass AppStateContainer: ObservableObject {\n  var tabViewState = TabViewState()\n}\n\nstruct ContentView: View {\n  @EnvironmentObject var state: TabViewState\n\n  var body: some View {\n    TabView(selection: $state.selectedTab) {\n      HomeView()\n        .tabItem {\n          Label(\"Home\", systemImage: \"house.fill\")\n        }\n        .tag(Tab.home)\n\n      SettingsView()\n        .tabItem {\n          Label(\"Settings\", systemImage: \"gear\")\n        }\n        .tag(Tab.settings)\n    }\n  }\n}\n\nstruct HomeView: View {\n  @EnvironmentObject var container: AppStateContainer\n\n  var body: some View {\n    VStack {\n      Button(\"go to settings\") {\n        container.tabViewState.selectedTab = .settings\n      }\n      Text(\"Home\")\n    }\n  }\n}\n\nstruct SettingsView: View {\n  var body: some View {\n    Text(\"Settings\")\n  }\n}"
  },
  {
    "path": "App-State-In-SwiftUI/README.md",
    "content": "Code snippet from [App-wide state in SwiftUI][fs].\n\n[fs]: https://fivestars.blog/swiftui/app-state.html\n"
  },
  {
    "path": "Blending/README.md",
    "content": "Code snippet from [SwiftUI blending][fs].\n\n[fs]: https://www.fivestars.blog/articles/swiftui-blend-modes/\n"
  },
  {
    "path": "Blending/content.swift",
    "content": "import SwiftUI\n\nstruct ContentView: View {\n  let edge: Double = 600\n  let blendModes: [BlendMode] = [\n    .colorDodge, .lighten, .screen, .plusLighter, // Lighten\n    .colorBurn, .darken, .multiply, .plusDarker, // Darken\n    .overlay, .softLight, .hardLight, // Contrast\n    .hue, .saturation, .color, .luminosity, // Component\n    .sourceAtop, .destinationOver, .destinationOut, // Compositing\n    .difference, .exclusion, // Invert\n    .normal // Normal\n  ]\n\n  var body: some View {\n    List {\n      ForEach(blendModes, id: \\.self) { blendMode in\n        Section(\"\\(blendMode)\") {\n          Matrix(blendMode: blendMode)\n            .frame(width: edge, height: edge)\n            .padding()\n        }\n      }\n    }\n  }\n}\n\nstruct BlendingView<SourceView: View, DestinationView: View>: View {\n  let blendMode: BlendMode\n  let sourceView: SourceView\n  let destinationView: DestinationView\n\n  var body: some View {\n    ZStack {\n      destinationView\n      sourceView\n        .blendMode(blendMode)\n    }\n  }\n}\n\nstruct Rainbow: View {\n  let hueColors = stride(from: 0, to: 1, by: 0.01).map {\n    Color(hue: $0, saturation: 1, brightness: 1)\n  }\n\n  var body: some View {\n    LinearGradient(\n      gradient: Gradient(colors: self.hueColors),\n      startPoint: .leading,\n      endPoint: .trailing\n    )\n  }\n}\n\nstruct BlackToWhite: View {\n  var body: some View {\n    LinearGradient(\n      gradient: Gradient(colors: [.black, .white]),\n      startPoint: .top,\n      endPoint: .bottom\n    )\n  }\n}\n\nstruct BlackToTransparent: View {\n  var body: some View {\n    LinearGradient(\n      gradient: Gradient(colors: [.black, .black.opacity(0)]),\n      startPoint: .top,\n      endPoint: .bottom\n    )\n  }\n}\n\nstruct WhiteToTransparent: View {\n  var body: some View {\n    LinearGradient(\n      gradient: Gradient(colors: [.white, .white.opacity(0)]),\n      startPoint: .top,\n      endPoint: .bottom\n    )\n  }\n}\n\n\nstruct ContentView_Previews: PreviewProvider {\n  static var previews: some View {\n    ContentView()\n      .previewLayout(.fixed(width: 300, height: 1000))\n  }\n}\n\nstruct Matrix: View {\n  let blendMode: BlendMode\n\n  var body: some View {\n    VStack {\n      HStack {\n        Color.clear\n          .overlay(alignment: .trailing) {\n            Text(\"Destination →\")\n          }\n          .overlay(alignment: .bottom) {\n            Text(\"Source\\n↓\")\n              .multilineTextAlignment(.center)\n          }\n        Rainbow()\n        BlackToWhite()\n      }\n      MatrixRow(blendMode: blendMode, mainView: Rainbow())\n      MatrixRow(blendMode: blendMode, mainView: BlackToWhite())\n//      MatrixRow(blendMode: blendMode, mainView: BlackToTransparent())\n//      MatrixRow(blendMode: blendMode, mainView: WhiteToTransparent())\n    }\n  }\n}\n\nstruct MatrixRow<MainView: View>: View {\n  let blendMode: BlendMode\n  let mainView: MainView\n\n  var body: some View {\n    HStack {\n      mainView\n      BlendingView(blendMode: blendMode, sourceView: mainView, destinationView: Rainbow())\n      BlendingView(blendMode: blendMode, sourceView: mainView, destinationView: BlackToWhite())\n//      BlendingView(blendMode: blendMode, sourceView: mainView, destinationView: BlackToTransparent())\n//      BlendingView(blendMode: blendMode, sourceView: mainView, destinationView: WhiteToTransparent())\n    }\n  }\n}\n"
  },
  {
    "path": "Button-Styles/README.md",
    "content": "Code snippet from [Meet the new Button styling][fs].\n\n![][gif]\n\n[fs]: https://www.fivestars.blog/articles/button-styles-2/\n[gif]: gist.png\n"
  },
  {
    "path": "Button-Styles/content.swift",
    "content": "import SwiftUI\n\n/// Usage:\n/// Button(...) { \n///   ...\n/// }\n/// .buttonStyle(.fiveStars)\n\nextension ButtonStyle where Self == FiveStarsButtonStyle {\n  static func fiveStars(cornerRadius: Double = 8) -> Self {\n    FiveStarsButtonStyle(cornerRadius: cornerRadius)\n  }\n\n  static var fiveStars: FiveStarsButtonStyle {\n    fiveStars()\n  }\n}\n\nstruct FiveStarsButtonStyle: ButtonStyle {\n  @Environment(\\.controlSize) var controlSize: ControlSize\n  @Environment(\\.controlProminence) var controlProminence: Prominence\n  @Environment(\\.isEnabled) var isEnabled: Bool\n  @ScaledMetric var cornerRadius: Double\n\n  func makeBody(configuration: Configuration) -> some View {\n    configuration\n      .label\n      .frame(maxWidth: controlSize == .large ? .infinity : nil)\n      .padding(.horizontal, horizontalPadding)\n      .padding(.vertical, verticalPadding)\n      .foregroundColor(foregroundColor(for: configuration.role))\n      .background {\n        backgroundColor(for: configuration.role).cornerRadius(cornerRadius)\n        if let borderColor = borderColor(for: configuration.role) {\n          RoundedRectangle(cornerRadius: cornerRadius)\n            .strokeBorder(borderColor, lineWidth: 2)\n        }\n      }\n      .opacity(configuration.isPressed ? 0.5 : 1)\n  }\n\n  var horizontalPadding: Double {\n    switch controlSize {\n      case .mini:\n        return 8\n      case .small:\n        return 16\n      case .regular:\n        return 32\n      case .large:\n        return 0 // no need.\n      @unknown default:\n        return 0\n    }\n  }\n\n  var verticalPadding: Double {\n    switch controlSize {\n      case .mini:\n        return 2\n      case .small:\n        return 4\n      case .regular:\n        return 8\n      case .large:\n        return 16\n      @unknown default:\n        return 0\n    }\n  }\n\n  func foregroundColor(for role: ButtonRole?) -> Color? {\n    guard isEnabled else { return Color(uiColor: .secondaryLabel) }\n\n    switch (controlProminence, role) {\n      case (.standard, .destructive?):\n        return .red\n      case (.increased, .destructive?):\n        return .white\n      case (.increased, _):\n        return .black\n      case (_, _):\n        return nil\n    }\n  }\n\n  func backgroundColor(for role: ButtonRole?) -> Color? {\n    switch controlProminence {\n      case .standard:\n        break\n      case .increased:\n        return color(for: role)\n      @unknown default:\n        break\n    }\n    return nil\n  }\n\n  func color(for role: ButtonRole?) -> Color {\n    guard isEnabled else { return Color(uiColor: .secondarySystemFill) }\n\n    switch role {\n      case .cancel?, .destructive?:\n        return Color.red\n      default:\n        return Color.accentColor\n    }\n  }\n\n  func borderColor(for role: ButtonRole?) -> Color? {\n    switch controlProminence {\n      case .standard:\n        return color(for: role)\n      case .increased:\n        fallthrough\n      @unknown default:\n        return nil\n    }\n  }\n}\n\n// MARK: - Previews\n\nstruct Previews: PreviewProvider {\n    static var previews: some View {\n      HStack(spacing: 0) {\n        previewContent\n          .accentColor(Color(hue: 80 / 360.0, saturation: 0.98, brightness: 1))\n\n        previewContent\n\n        previewContent\n          .accentColor(Color(hue: 80 / 360.0, saturation: 0.98, brightness: 1))\n          .colorScheme(.dark)\n\n        previewContent\n          .colorScheme(.dark)\n      }\n      .buttonStyle(.fiveStars)\n      .navigationViewStyle(.stack)\n      .previewLayout(.fixed(width: 1280, height: 2600))\n    }\n\n  static var previewContent: some View {\n    NavigationView {\n      List {\n        Section(header: Text(\"Default role\")) {\n          buttons()\n        }\n\n        Section(header: Text(\"Cancel Role\")) {\n          buttons(role: .cancel)\n        }\n\n        Section(header: Text(\"Destructive Role\")) {\n          buttons(role: .destructive)\n        }\n\n        Section(header: Text(\"Increased Prominence\")) {\n          buttons()\n            .controlProminence(.increased)\n        }\n\n        Section(header: Text(\"Cancel Role + Increased prominence\")) {\n          buttons(role: .cancel)\n            .controlProminence(.increased)\n        }\n\n        Section(header: Text(\"Cancel Role + Increased prominence\")) {\n          buttons(role: .destructive)\n            .controlProminence(.increased)\n        }\n\n        Section(header: Text(\"Disabled\")) {\n          buttons()\n            .disabled(true)\n        }\n\n        Section(header: Text(\"Disabled + Increased prominence\")) {\n          buttons(role: .destructive)\n            .disabled(true)\n            .controlProminence(.increased)\n        }\n\n        Section(header: Text(\"Accessibility5\")) {\n          buttons()\n            .environment(\\.dynamicTypeSize, .accessibility5)\n        }\n      }\n      .listStyle(GroupedListStyle())\n      .navigationBarTitle(Text(\"Buttons\"))\n    }\n  }\n\n  @ViewBuilder\n  static func buttons(role: ButtonRole? = nil) -> some View {\n    Button(\"Mini\", role: role, action: action)\n      .controlSize(.mini)\n    Button(\"Small\", role: role, action: action)\n      .controlSize(.small)\n    Button(\"Regular\", role: role, action: action)\n      .controlSize(.regular)\n    Button(\"Large\", role: role, action: action)\n      .controlSize(.large)\n  }\n\n  static func action() -> Void {\n  }\n}\n"
  },
  {
    "path": "Composing-SwiftUI-Views/ComposingSwiftUIViews/ComposingSwiftUIViews/ComposingSwiftUIViewsApp.swift",
    "content": "//\n\nimport SwiftUI\n\n@main\nstruct ComposingSwiftUIViewsApp: App {\n  var body: some Scene {\n    WindowGroup {\n      ContentView()\n    }\n  }\n}\n"
  },
  {
    "path": "Composing-SwiftUI-Views/ComposingSwiftUIViews/ComposingSwiftUIViews/FSTextField.swift",
    "content": "//\n\nimport SwiftUI\n\nstruct FSTextField<TopContent: View>: View {\n  var placeholder: LocalizedStringKey = \"Placeholder\"\n  @Binding var text: String\n  var appearance: Appearance = .default\n  var topContent: TopContent\n\n  init(\n    placeholder: LocalizedStringKey = \"\",\n    text: Binding<String>,\n    appearance: Appearance = .default,\n    @ViewBuilder topContent: () -> TopContent\n  ) {\n    self.placeholder = placeholder\n    self._text = text\n    self.appearance = appearance\n    self.topContent = topContent()\n  }\n\n  enum Appearance {\n    case `default`\n    case error\n  }\n  \n  var body: some View {\n    VStack {\n      topContent\n      _FSTextField(\n        placeholder: placeholder,\n        text: $text,\n        borderColor: borderColor\n      )\n    }\n  }\n\n  var borderColor: Color {\n    switch appearance {\n    case .default:\n      return .green\n    case .error:\n      return .red\n    }\n  }\n}\n\n\nextension FSTextField where TopContent == EmptyView {\n  init(\n    placeholder: LocalizedStringKey = \"\",\n    text: Binding<String>,\n    appearance: Appearance = .default\n  ) {\n    self.placeholder = placeholder\n    self._text = text\n    self.appearance = appearance\n    self.topContent = EmptyView()\n  }\n}\n\nextension FSTextField {\n  init<TopTrailingContent: View>(\n    title: LocalizedStringKey,\n    placeholder: LocalizedStringKey = \"\",\n    text: Binding<String>,\n    appearance: Appearance = .default,\n    @ViewBuilder topTrailingContent: () -> TopTrailingContent\n  ) where TopContent == HStack<TupleView<(Text, Spacer, TopTrailingContent)>> {\n    self.placeholder = placeholder\n    self._text = text\n    self.appearance = appearance\n    self.topContent = {\n      HStack {\n        Text(title)\n          .bold()\n        Spacer()\n        topTrailingContent()\n      }\n    }()\n  }\n}\n\nextension FSTextField {\n  init(\n    title: LocalizedStringKey,\n    placeholder: LocalizedStringKey = \"\",\n    text: Binding<String>,\n    appearance: Appearance = .default\n  ) where TopContent == HStack<TupleView<(Text, Spacer, EmptyView)>> {\n    self.init(\n      title: title,\n      placeholder: placeholder,\n      text: text,\n      appearance: appearance,\n      topTrailingContent: EmptyView.init\n    )\n  }\n}\n\nstruct FSTextField_Previews: PreviewProvider {\n  static var previews: some View {\n    Group {\n      FSTextField(\n        placeholder: \"Placeholder\",\n        text: .constant(\"\")\n      ) {\n        Text(\"Title Centered\")\n          .bold()\n      }\n\n      FSTextField(\n        placeholder: \"Placeholder\",\n        text: .constant(\"\")\n      )\n\n      FSTextField(\n        title: \"Title\",\n        text: .constant(\"\"),\n        topTrailingContent: {\n        Text(\"Message\")\n          .font(.caption)\n      })\n    }\n    .padding()\n    .previewLayout(.sizeThatFits)\n  }\n}\n"
  },
  {
    "path": "Composing-SwiftUI-Views/ComposingSwiftUIViews/ComposingSwiftUIViews/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIApplicationSceneManifest</key>\n\t<dict>\n\t\t<key>UIApplicationSupportsMultipleScenes</key>\n\t\t<true/>\n\t</dict>\n\t<key>UIApplicationSupportsIndirectInputEvents</key>\n\t<true/>\n\t<key>UILaunchScreen</key>\n\t<dict/>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Composing-SwiftUI-Views/ComposingSwiftUIViews/ComposingSwiftUIViews/_FSTextField.swift",
    "content": "//\n\nimport SwiftUI\n\nstruct _FSTextField: View {\n  var placeholder: LocalizedStringKey = \"\"\n  @Binding var text: String\n  var borderColor: Color\n\n  var body: some View {\n    TextField(\n      placeholder,\n      text: $text\n    )\n    .padding(.horizontal, 8)\n    .padding(.vertical, 4)\n    .background(\n      RoundedRectangle(cornerRadius: 8, style: .continuous)\n        .strokeBorder(borderColor)\n    )\n  }\n}\n\nstruct _FSTextField_Previews: PreviewProvider {\n  static var previews: some View {\n    Group {\n      _FSTextField(placeholder: \"Placeholder\", text: .constant(\"\"), borderColor: .red)\n      _FSTextField(placeholder: \"Placeholder\", text: .constant(\"\"), borderColor: .green)\n    }\n    .padding()\n    .previewLayout(.sizeThatFits)\n  }\n}\n"
  },
  {
    "path": "Composing-SwiftUI-Views/ComposingSwiftUIViews/ComposingSwiftUIViews.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t647F0AA725358718009ED3F5 /* ComposingSwiftUIViewsApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 647F0AA625358718009ED3F5 /* ComposingSwiftUIViewsApp.swift */; };\n\t\t647F0ABC2535874F009ED3F5 /* FSTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 647F0AB92535874F009ED3F5 /* FSTextField.swift */; };\n\t\t647F0ABD2535874F009ED3F5 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 647F0ABA2535874F009ED3F5 /* ContentView.swift */; };\n\t\t647F0ABE2535874F009ED3F5 /* _FSTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 647F0ABB2535874F009ED3F5 /* _FSTextField.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t647F0AA325358718009ED3F5 /* ComposingSwiftUIViews.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ComposingSwiftUIViews.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t647F0AA625358718009ED3F5 /* ComposingSwiftUIViewsApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposingSwiftUIViewsApp.swift; sourceTree = \"<group>\"; };\n\t\t647F0AAF2535871A009ED3F5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t647F0AB92535874F009ED3F5 /* FSTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FSTextField.swift; sourceTree = \"<group>\"; };\n\t\t647F0ABA2535874F009ED3F5 /* ContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ContentView.swift; path = ../../../../../Desktop/playground/Playground/Playground/ContentView.swift; sourceTree = \"<group>\"; };\n\t\t647F0ABB2535874F009ED3F5 /* _FSTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = _FSTextField.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t647F0AA025358718009ED3F5 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t647F0A9A25358717009ED3F5 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t647F0AA525358718009ED3F5 /* ComposingSwiftUIViews */,\n\t\t\t\t647F0AA425358718009ED3F5 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t647F0AA425358718009ED3F5 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t647F0AA325358718009ED3F5 /* ComposingSwiftUIViews.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t647F0AA525358718009ED3F5 /* ComposingSwiftUIViews */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t647F0AA625358718009ED3F5 /* ComposingSwiftUIViewsApp.swift */,\n\t\t\t\t647F0ABA2535874F009ED3F5 /* ContentView.swift */,\n\t\t\t\t647F0AB92535874F009ED3F5 /* FSTextField.swift */,\n\t\t\t\t647F0ABB2535874F009ED3F5 /* _FSTextField.swift */,\n\t\t\t\t647F0AAF2535871A009ED3F5 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = ComposingSwiftUIViews;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t647F0AA225358718009ED3F5 /* ComposingSwiftUIViews */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 647F0AB22535871A009ED3F5 /* Build configuration list for PBXNativeTarget \"ComposingSwiftUIViews\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t647F0A9F25358718009ED3F5 /* Sources */,\n\t\t\t\t647F0AA025358718009ED3F5 /* Frameworks */,\n\t\t\t\t647F0AA125358718009ED3F5 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = ComposingSwiftUIViews;\n\t\t\tproductName = ComposingSwiftUIViews;\n\t\t\tproductReference = 647F0AA325358718009ED3F5 /* ComposingSwiftUIViews.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t647F0A9B25358717009ED3F5 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 1200;\n\t\t\t\tLastUpgradeCheck = 1200;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t647F0AA225358718009ED3F5 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 12.0.1;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 647F0A9E25358717009ED3F5 /* Build configuration list for PBXProject \"ComposingSwiftUIViews\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 647F0A9A25358717009ED3F5;\n\t\t\tproductRefGroup = 647F0AA425358718009ED3F5 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t647F0AA225358718009ED3F5 /* ComposingSwiftUIViews */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t647F0AA125358718009ED3F5 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t647F0A9F25358718009ED3F5 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t647F0AA725358718009ED3F5 /* ComposingSwiftUIViewsApp.swift in Sources */,\n\t\t\t\t647F0ABE2535874F009ED3F5 /* _FSTextField.swift in Sources */,\n\t\t\t\t647F0ABD2535874F009ED3F5 /* ContentView.swift in Sources */,\n\t\t\t\t647F0ABC2535874F009ED3F5 /* FSTextField.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t647F0AB02535871A009ED3F5 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t647F0AB12535871A009ED3F5 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t647F0AB32535871A009ED3F5 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tINFOPLIST_FILE = ComposingSwiftUIViews/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = blog.fivestars.ComposingSwiftUIViews;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t647F0AB42535871A009ED3F5 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tINFOPLIST_FILE = ComposingSwiftUIViews/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = blog.fivestars.ComposingSwiftUIViews;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t647F0A9E25358717009ED3F5 /* Build configuration list for PBXProject \"ComposingSwiftUIViews\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t647F0AB02535871A009ED3F5 /* Debug */,\n\t\t\t\t647F0AB12535871A009ED3F5 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t647F0AB22535871A009ED3F5 /* Build configuration list for PBXNativeTarget \"ComposingSwiftUIViews\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t647F0AB32535871A009ED3F5 /* Debug */,\n\t\t\t\t647F0AB42535871A009ED3F5 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 647F0A9B25358717009ED3F5 /* Project object */;\n}\n"
  },
  {
    "path": "Composing-SwiftUI-Views/ComposingSwiftUIViews/ComposingSwiftUIViews.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Composing-SwiftUI-Views/ComposingSwiftUIViews/ComposingSwiftUIViews.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Composing-SwiftUI-Views/README.md",
    "content": "Final project from [Composing SwiftUI views][fs].\n\n![][gif]\n\n[fs]: https://fivestars.blog/swiftui/design-system-composing-views.html\n\n[gif]: textFields.png\n"
  },
  {
    "path": "Content-Friendly-Layouts/Flexible/Assets.xcassets/AccentColor.colorset/Contents.json",
    "content": "{\n  \"colors\" : [\n    {\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Content-Friendly-Layouts/Flexible/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"60x60\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"60x60\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"76x76\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"76x76\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"83.5x83.5\"\n    },\n    {\n      \"idiom\" : \"ios-marketing\",\n      \"scale\" : \"1x\",\n      \"size\" : \"1024x1024\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Content-Friendly-Layouts/Flexible/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Content-Friendly-Layouts/Flexible/ContentView.swift",
    "content": "//\n\nimport SwiftUI\n\nclass ContentViewModel: ObservableObject {\n\n  @Published var originalItems = [\n    \"Here’s\", \"to\", \"the\", \"crazy\", \"ones\", \"the\", \"misfits\", \"the\", \"rebels\", \"the\", \"troublemakers\", \"the\", \"round\", \"pegs\", \"in\", \"the\", \"square\", \"holes\", \"the\", \"ones\", \"who\", \"see\", \"things\", \"differently\", \"they’re\", \"not\", \"fond\", \"of\", \"rules\", \"You\", \"can\", \"quote\", \"them\", \"disagree\", \"with\", \"them\", \"glorify\", \"or\", \"vilify\", \"them\", \"but\", \"the\", \"only\", \"thing\", \"you\", \"can’t\", \"do\", \"is\", \"ignore\", \"them\", \"because\", \"they\", \"change\", \"things\", \"they\", \"push\", \"the\", \"human\", \"race\", \"forward\", \"and\", \"while\", \"some\", \"may\", \"see\", \"them\", \"as\", \"the\", \"crazy\", \"ones\", \"we\", \"see\", \"genius\", \"because\", \"the\", \"ones\", \"who\", \"are\", \"crazy\", \"enough\", \"to\", \"think\", \"that\", \"they\", \"can\", \"change\", \"the\", \"world\", \"are\", \"the\", \"ones\", \"who\", \"do\"\n  ]\n\n  @Published var spacing: CGFloat = 8\n  @Published var wordCount: Int = 5\n\n  var words: [String] {\n    Array(originalItems.prefix(wordCount))\n  }\n}\n\nstruct ContentView: View {\n  @StateObject var model = ContentViewModel()\n\n  var body: some View {\n    VStack {\n      ReadjustingStackView(data: model.words, spacing: model.spacing) { item in\n        Text(verbatim: item)\n          .padding(8)\n          .background(\n            RoundedRectangle(cornerRadius: 8)\n              .fill(Color.gray.opacity(0.2))\n           )\n      }\n//      .border(Color.black)\n      .padding(.horizontal)\n    }\n    .frame(maxHeight: .infinity)\n    .overlay(Settings(model: model), alignment: .bottom)\n  }\n}\n\nstruct Settings: View {\n  @ObservedObject var model: ContentViewModel\n\n  var body: some View {\n    VStack {\n      Stepper(value: $model.wordCount, in: 0...model.originalItems.count) {\n        Text(\"\\(model.wordCount) words\")\n      }\n\n      HStack {\n        Text(\"Spacing\")\n        Slider(value: $model.spacing, in: 0...40) { Text(\"\") }\n      }\n\n      Button {\n        model.originalItems.shuffle()\n      } label: {\n        Text(\"Shuffle\")\n      }\n    }\n    .padding()\n    .background(Color(UIColor.systemBackground))\n    .clipShape(RoundedRectangle(cornerRadius: 20))\n    .overlay(\n         RoundedRectangle(cornerRadius: 20)\n             .stroke(Color.primary, lineWidth: 4)\n     )\n    .padding()\n  }\n}\n\nstruct ContentView_Previews: PreviewProvider {\n  static var previews: some View {\n    ContentView()\n  }\n}\n"
  },
  {
    "path": "Content-Friendly-Layouts/Flexible/FlexibleApp.swift",
    "content": "//\n\nimport SwiftUI\n\n@main\nstruct FlexibleApp: App {\n    var body: some Scene {\n        WindowGroup {\n            ContentView()\n        }\n    }\n}\n"
  },
  {
    "path": "Content-Friendly-Layouts/Flexible/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIApplicationSceneManifest</key>\n\t<dict>\n\t\t<key>UIApplicationSupportsMultipleScenes</key>\n\t\t<true/>\n\t</dict>\n\t<key>UIApplicationSupportsIndirectInputEvents</key>\n\t<true/>\n\t<key>UILaunchScreen</key>\n\t<dict/>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Content-Friendly-Layouts/Flexible/ReadjustingStackView.swift",
    "content": "//\n\nimport SwiftUI\n\n/// Facade of our view, its main responsibility is to get the available width\n/// and pass it down to the real implementation, `_ReadjustingStackView`.\nstruct ReadjustingStackView<Data: RandomAccessCollection, Content: View>: View where Data.Element: Hashable {\n  let data: Data\n  let spacing: CGFloat\n  let content: (Data.Element) -> Content\n  @State private var availableWidth: CGFloat = 0\n\n  var body: some View {\n    ZStack {\n      Color.clear\n        .frame(height: 1)\n        .readSize { size in\n          availableWidth = size.width\n        }\n\n      _ReadjustingStackView(\n        availableWidth: availableWidth,\n        data: data,\n        spacing: spacing,\n        content: content\n      )\n    }\n  }\n}\n"
  },
  {
    "path": "Content-Friendly-Layouts/Flexible/SizeReader.swift",
    "content": "//\n\nimport SwiftUI\n\nextension View {\n  func readSize(onChange: @escaping (CGSize) -> Void) -> some View {\n    background(\n      GeometryReader { geometryProxy in\n        Color.clear\n          .preference(key: SizePreferenceKey.self, value: geometryProxy.size)\n      }\n    )\n    .onPreferenceChange(SizePreferenceKey.self, perform: onChange)\n  }\n}\n\nprivate struct SizePreferenceKey: PreferenceKey {\n  static var defaultValue: CGSize = .zero\n  static func reduce(value: inout CGSize, nextValue: () -> CGSize) {}\n}\n"
  },
  {
    "path": "Content-Friendly-Layouts/Flexible/_ReadjustingStackView.swift",
    "content": "//\n\nimport SwiftUI\n\n/// This view is responsible to lay the given elements in either axis.\nstruct _ReadjustingStackView<Data: RandomAccessCollection, Content: View>: View where Data.Element: Hashable {\n  let availableWidth: CGFloat\n  let data: Data\n  let spacing: CGFloat\n  let content: (Data.Element) -> Content\n  @State var elementsSize: [Data.Element: CGSize] = [:]\n\n  var body : some View {\n    if isHorizontal() {\n      HStack(spacing: spacing) {\n        elementsViews\n      }\n    } else {\n      VStack(spacing: spacing) {\n        elementsViews\n      }\n    }\n  }\n\n  var elementsViews: some View {\n    ForEach(data, id: \\.self) { element in\n      content(element)\n        .fixedSize()\n        .readSize { size in\n          elementsSize[element] = size\n        }\n    }\n  }\n\n  func isHorizontal() -> Bool {\n    let desiredStackViewWidth = data.reduce(into: 0) { totalWidth, element in\n      let elementSize = elementsSize[element, default: CGSize(width: availableWidth, height: 1)]\n      totalWidth += elementSize.width\n    } + CGFloat(data.count - 1) * spacing\n\n    return availableWidth >= desiredStackViewWidth\n  }\n}\n"
  },
  {
    "path": "Content-Friendly-Layouts/Flexible.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t64DF03E524DFBD0000909495 /* FlexibleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64DF03E424DFBD0000909495 /* FlexibleApp.swift */; };\n\t\t64DF03E724DFBD0000909495 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64DF03E624DFBD0000909495 /* ContentView.swift */; };\n\t\t64DF03E924DFBD0200909495 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 64DF03E824DFBD0200909495 /* Assets.xcassets */; };\n\t\t64DF03F924DFBD8000909495 /* _ReadjustingStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64DF03F724DFBD7F00909495 /* _ReadjustingStackView.swift */; };\n\t\t64DF03FA24DFBD8000909495 /* ReadjustingStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64DF03F824DFBD7F00909495 /* ReadjustingStackView.swift */; };\n\t\t64DF03FC24E03FDE00909495 /* SizeReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64DF03FB24E03FDE00909495 /* SizeReader.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t64DF03E124DFBD0000909495 /* Flexible.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Flexible.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t64DF03E424DFBD0000909495 /* FlexibleApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlexibleApp.swift; sourceTree = \"<group>\"; };\n\t\t64DF03E624DFBD0000909495 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = \"<group>\"; };\n\t\t64DF03E824DFBD0200909495 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t64DF03ED24DFBD0200909495 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t64DF03F724DFBD7F00909495 /* _ReadjustingStackView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = _ReadjustingStackView.swift; sourceTree = \"<group>\"; };\n\t\t64DF03F824DFBD7F00909495 /* ReadjustingStackView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadjustingStackView.swift; sourceTree = \"<group>\"; };\n\t\t64DF03FB24E03FDE00909495 /* SizeReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SizeReader.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t64DF03DE24DFBD0000909495 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t64DF03D824DFBD0000909495 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64DF03E324DFBD0000909495 /* Flexible */,\n\t\t\t\t64DF03E224DFBD0000909495 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t64DF03E224DFBD0000909495 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64DF03E124DFBD0000909495 /* Flexible.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t64DF03E324DFBD0000909495 /* Flexible */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64DF03E424DFBD0000909495 /* FlexibleApp.swift */,\n\t\t\t\t64DF03E624DFBD0000909495 /* ContentView.swift */,\n\t\t\t\t64DF03F824DFBD7F00909495 /* ReadjustingStackView.swift */,\n\t\t\t\t64DF03F724DFBD7F00909495 /* _ReadjustingStackView.swift */,\n\t\t\t\t64DF03FB24E03FDE00909495 /* SizeReader.swift */,\n\t\t\t\t64DF03E824DFBD0200909495 /* Assets.xcassets */,\n\t\t\t\t64DF03ED24DFBD0200909495 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = Flexible;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t64DF03E024DFBD0000909495 /* Flexible */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 64DF03F024DFBD0200909495 /* Build configuration list for PBXNativeTarget \"Flexible\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t64DF03DD24DFBD0000909495 /* Sources */,\n\t\t\t\t64DF03DE24DFBD0000909495 /* Frameworks */,\n\t\t\t\t64DF03DF24DFBD0000909495 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Flexible;\n\t\t\tproductName = Flexible;\n\t\t\tproductReference = 64DF03E124DFBD0000909495 /* Flexible.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t64DF03D924DFBD0000909495 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 1200;\n\t\t\t\tLastUpgradeCheck = 1200;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t64DF03E024DFBD0000909495 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 12.0;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 64DF03DC24DFBD0000909495 /* Build configuration list for PBXProject \"Flexible\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 64DF03D824DFBD0000909495;\n\t\t\tproductRefGroup = 64DF03E224DFBD0000909495 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t64DF03E024DFBD0000909495 /* Flexible */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t64DF03DF24DFBD0000909495 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t64DF03E924DFBD0200909495 /* Assets.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t64DF03DD24DFBD0000909495 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t64DF03E724DFBD0000909495 /* ContentView.swift in Sources */,\n\t\t\t\t64DF03E524DFBD0000909495 /* FlexibleApp.swift in Sources */,\n\t\t\t\t64DF03FA24DFBD8000909495 /* ReadjustingStackView.swift in Sources */,\n\t\t\t\t64DF03F924DFBD8000909495 /* _ReadjustingStackView.swift in Sources */,\n\t\t\t\t64DF03FC24E03FDE00909495 /* SizeReader.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t64DF03EE24DFBD0200909495 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t64DF03EF24DFBD0200909495 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t64DF03F124DFBD0200909495 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tINFOPLIST_FILE = Flexible/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = blog.fivestars.Flexible;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t64DF03F224DFBD0200909495 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tINFOPLIST_FILE = Flexible/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = blog.fivestars.Flexible;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t64DF03DC24DFBD0000909495 /* Build configuration list for PBXProject \"Flexible\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t64DF03EE24DFBD0200909495 /* Debug */,\n\t\t\t\t64DF03EF24DFBD0200909495 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t64DF03F024DFBD0200909495 /* Build configuration list for PBXNativeTarget \"Flexible\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t64DF03F124DFBD0200909495 /* Debug */,\n\t\t\t\t64DF03F224DFBD0200909495 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 64DF03D924DFBD0000909495 /* Project object */;\n}\n"
  },
  {
    "path": "Content-Friendly-Layouts/Flexible.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Content-Friendly-Layouts/Flexible.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Content-Friendly-Layouts/README.md",
    "content": "Proof of concept from [Build content-friendly layouts][fs].\n\n![][gif]\n\n[fs]: https://fivestars.blog/ios/content-friendly-layouts.html\n[gif]: content-friendly.gif"
  },
  {
    "path": "Custom-SwiftUI-Styles/ContentView.swift",
    "content": "// Gist from http://fivestars.blog/swiftui/custom-view-styles.html\n\nimport SwiftUI\n\n// This gist shows you how to build your own style for your own SwiftUI views/\n// components.\n//\n// Here's the list of steps:\n// 1. Create view\n// 2. Create view style protocol\n// 3. Create style configuration\n// 4. Implement base view styles\n// 5. Define view default style\n// 6. Setup style environment (key + environment value + style eraser)\n// 7. Define `.xxxStyle(_:)` convenience view modifier\n// 8. Update view to take advantage of environment style\n\n// MARK: 1. Create view\n\n//struct Card<Content: View>: View {\n//  var content: () -> Content\n//\n//  var body: some View {\n//    content()\n//  }\n//}\n\n// MARK: 2. Create view style protocol\n\nprotocol CardStyle {\n  associatedtype Body: View\n  typealias Configuration = CardStyleConfiguration\n\n  func makeBody(configuration: Self.Configuration) -> Self.Body\n}\n\n// MARK: 3. Create style configuration\n\nstruct CardStyleConfiguration {\n  /// A type-erased content of a `Card`.\n  struct Label: View {\n    init<Content: View>(content: Content) {\n      body = AnyView(content)\n    }\n\n    var body: AnyView\n  }\n\n  let label: CardStyleConfiguration.Label\n}\n\n// MARK: 4. Implement base view styles\n\nstruct RoundedRectangleCardStyle: CardStyle {\n  func makeBody(configuration: Configuration) -> some View {\n    configuration.label\n      .font(.title)\n      .padding()\n      .background(RoundedRectangle(cornerRadius: 16).strokeBorder())\n  }\n}\n\nstruct CapsuleCardStyle: CardStyle {\n  var color: Color\n\n  func makeBody(configuration: Configuration) -> some View {\n    configuration.label\n      .font(.title)\n      .foregroundColor(.white)\n      .padding()\n      .background(\n        Capsule().fill(color)\n      )\n      .background(\n        Capsule().fill(color.opacity(0.4)).rotationEffect(.init(degrees: -8))\n      )\n      .background(\n        Capsule().fill(color.opacity(0.4)).rotationEffect(.init(degrees: 4))\n      )\n      .background(\n        Capsule().fill(color.opacity(0.4)).rotationEffect(.init(degrees: 8))\n      )\n      .background(\n        Capsule().fill(color.opacity(0.4)).rotationEffect(.init(degrees: -4))\n      )\n  }\n}\n\nstruct ShadowCardStyle: CardStyle {\n  func makeBody(configuration: Configuration) -> some View {\n    configuration.label\n      .font(.title)\n      .foregroundColor(.black)\n      .padding()\n      .background(Color.white.cornerRadius(16))\n      .shadow(color: Color.black.opacity(0.2), radius: 8, x: 0, y: 4)\n  }\n}\n\nstruct ColorfulCardStyle: CardStyle {\n  var color: Color\n\n  func makeBody(configuration: Configuration) -> some View {\n    configuration.label\n      .font(.title)\n      .foregroundColor(.white)\n      .shadow(color: Color.white.opacity(0.8), radius: 4, x: 0, y: 2)\n      .padding()\n      .background(\n        color.cornerRadius(16)\n      )\n      .shadow(color: color, radius: 8, x: 0, y: 4)\n  }\n}\n\n// MARK: 5. Define view default style\n\nstruct DefaultCardStyle: CardStyle {\n  func makeBody(configuration: Configuration) -> some View {\n    #if os(iOS)\n      return ShadowCardStyle().makeBody(configuration: configuration)\n    #else\n      return RoundedRectangleCardStyle().makeBody(configuration: configuration)\n    #endif\n  }\n}\n\n// MARK: 6. Setup style environment (key + environment value + style eraser)\n\nstruct AnyCardStyle: CardStyle {\n  private var _makeBody: (Configuration) -> AnyView\n\n  init<S: CardStyle>(style: S) {\n    _makeBody = { configuration in\n      AnyView(style.makeBody(configuration: configuration))\n    }\n  }\n\n  func makeBody(configuration: Configuration) -> some View {\n    _makeBody(configuration)\n  }\n}\n\nstruct CardStyleKey: EnvironmentKey {\n  static var defaultValue = AnyCardStyle(style: DefaultCardStyle())\n}\n\nextension EnvironmentValues {\n  var cardStyle: AnyCardStyle {\n    get { self[CardStyleKey.self] }\n    set { self[CardStyleKey.self] = newValue }\n  }\n}\n\n// MARK: 7. Define `.xxxStyle(_:)` convenience view modifier\n\nextension View {\n  func cardStyle<S: CardStyle>(_ style: S) -> some View {\n    environment(\\.cardStyle, AnyCardStyle(style: style))\n  }\n}\n\n// MARK: 8. Update view to take advantage of environment style\n\nstruct Card<Content: View>: View {\n  @Environment(\\.cardStyle) var style\n  var content: () -> Content\n\n  var body: some View {\n    style\n      .makeBody(\n        configuration: CardStyleConfiguration(\n          label: CardStyleConfiguration.Label(content: content())\n        )\n      )\n  }\n}\n\n// MARK: 9. Enjoy :)\n\nstruct ContentView: View {\n\n  var body: some View {\n    ScrollView {\n      LazyVStack {\n        // Default style\n        Section {\n          sectionContent\n        }\n\n        // RoundedRectangleCardStyle\n        Section {\n          sectionContent\n        }\n        .cardStyle(RoundedRectangleCardStyle())\n\n        // CapsuleCardStyle - green\n        Section {\n          sectionContent\n        }\n        .cardStyle(CapsuleCardStyle(color: .green))\n\n        // CapsuleCardStyle - blue\n        Section {\n          sectionContent\n        }\n        .cardStyle(CapsuleCardStyle(color: .blue))\n\n        // ColorfulCardStyle - purple\n        Section {\n          sectionContent\n        }\n        .cardStyle(ColorfulCardStyle(color: .purple))\n\n        // ColorfulCardStyle - pink\n        Section {\n          sectionContent\n        }\n        .cardStyle(ColorfulCardStyle(color: .pink))\n\n        // ColorfulCardStyle - red\n        Section {\n          sectionContent\n        }\n        .cardStyle(ColorfulCardStyle(color: .red))\n      }\n    }\n  }\n\n  var sectionContent: some View {\n    ScrollView(.horizontal) {\n      LazyHStack {\n        ForEach(1..<5) { _ in\n          Card {\n            Text(verbatim: \"Five Stars\")\n          }\n        }\n      }\n      .padding()\n    }\n  }\n}\n\nstruct ContentView_Preview: PreviewProvider {\n  static var previews: some View {\n    ContentView()\n      .padding()\n      .previewLayout(.sizeThatFits)\n  }\n}"
  },
  {
    "path": "Custom-SwiftUI-Styles/README.md",
    "content": "Code snippet from [Custom view styles][fs].\n\n![][image]\n\n[fs]: http://fivestars.blog/swiftui/custom-view-styles.html\n[image]: image.png\n"
  },
  {
    "path": "Displaying-Text-SwiftUI/DisplayingText/DisplayingText/Assets.xcassets/AccentColor.colorset/Contents.json",
    "content": "{\n  \"colors\" : [\n    {\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Displaying-Text-SwiftUI/DisplayingText/DisplayingText/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"60x60\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"60x60\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"76x76\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"76x76\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"83.5x83.5\"\n    },\n    {\n      \"idiom\" : \"ios-marketing\",\n      \"scale\" : \"1x\",\n      \"size\" : \"1024x1024\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Displaying-Text-SwiftUI/DisplayingText/DisplayingText/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Displaying-Text-SwiftUI/DisplayingText/DisplayingText/ContentView.swift",
    "content": "//\n\nimport SwiftUI\n\nstruct ContentView: View {\n  var backendString: String = \"some backend string\"\n\n  var body: some View {\n    let marketingText: Text =\n      Text(\"Please please \").italic() +\n      Text(\"tap me \") +\n      Text(\"NOW!\").underline().bold().font(.title)\n\n    let exampleText: Text =\n      Text(\"Default \") +\n      Text(\"italic \").italic() +\n      Text(\"Big \").font(.title) +\n      Text(\"Red \").foregroundColor(.red) +\n      Text(\"underline\").underline()\n\n    VStack {\n      FSButton(titleKey: \"my_localized_title\") {}\n      FSButton(backendString) {}\n      FSButton(marketingText) {}\n      FSButton(exampleText) {}\n    }\n    .padding()\n  }\n}\n\nstruct ContentView_Previews: PreviewProvider {\n  static var previews: some View {\n    ContentView()\n      .padding()\n      .previewLayout(.sizeThatFits)\n      .environment(\\.locale, .init(identifier: \"th\"))\n  }\n}\n"
  },
  {
    "path": "Displaying-Text-SwiftUI/DisplayingText/DisplayingText/DisplayingTextApp.swift",
    "content": "//\n\nimport SwiftUI\n\n@main\nstruct DisplayingTextApp: App {\n  var body: some Scene {\n    WindowGroup {\n      ContentView()\n    }\n  }\n}\n"
  },
  {
    "path": "Displaying-Text-SwiftUI/DisplayingText/DisplayingText/FSButton.swift",
    "content": "//\n\nimport SwiftUI\n\nstruct FSButton: View {\n  let title: Text\n  let action: () -> Void\n\n  init(_ title: Text, action: @escaping () -> Void) {\n    self.title = title\n    self.action = action\n  }\n\n  init<S: StringProtocol>(_ content: S, action: @escaping () -> Void) {\n    self.title = Text(content)\n    self.action = action\n  }\n\n  init(titleKey: LocalizedStringKey, tableName: String? = nil, bundle: Bundle? = nil, comment: StaticString? = nil, action: @escaping () -> Void) {\n    self.title = Text(titleKey, tableName: tableName, bundle: bundle, comment: comment)\n    self.action = action\n  }\n\n  var body: some View {\n    Button(action: action, label: { title.bold() })\n      .buttonStyle(FSButtonStyle())\n  }\n}\n\nprivate struct FSButtonStyle: ButtonStyle {\n  func makeBody(configuration: Configuration) -> some View {\n    HStack {\n      Spacer()\n      configuration.label\n        .foregroundColor(.white)\n      Spacer()\n    }\n    .padding()\n    .background(\n      RoundedRectangle(cornerRadius: 8, style: .continuous).fill(Color.green)\n    )\n    .opacity(configuration.isPressed ? 0.5 : 1)\n  }\n}\n"
  },
  {
    "path": "Displaying-Text-SwiftUI/DisplayingText/DisplayingText/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIApplicationSceneManifest</key>\n\t<dict>\n\t\t<key>UIApplicationSupportsMultipleScenes</key>\n\t\t<true/>\n\t</dict>\n\t<key>UIApplicationSupportsIndirectInputEvents</key>\n\t<true/>\n\t<key>UILaunchScreen</key>\n\t<dict/>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Displaying-Text-SwiftUI/DisplayingText/DisplayingText/en.lproj/Localizable.strings",
    "content": "\"my_localized_title\" = \"Button title\";\n"
  },
  {
    "path": "Displaying-Text-SwiftUI/DisplayingText/DisplayingText/th.lproj/Localizable.strings",
    "content": "\"my_localized_title\" = \"ชื่อปุ่ม\";\n"
  },
  {
    "path": "Displaying-Text-SwiftUI/DisplayingText/DisplayingText.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t64DF69EF254D7EF300099987 /* DisplayingTextApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64DF69EE254D7EF300099987 /* DisplayingTextApp.swift */; };\n\t\t64DF69F1254D7EF300099987 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64DF69F0254D7EF300099987 /* ContentView.swift */; };\n\t\t64DF69F3254D7EF400099987 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 64DF69F2254D7EF400099987 /* Assets.xcassets */; };\n\t\t64DF6A00254D7F1F00099987 /* FSButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64DF69FF254D7F1F00099987 /* FSButton.swift */; };\n\t\t64DF6A06254D7F9300099987 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 64DF6A08254D7F9300099987 /* Localizable.strings */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t64DF69EB254D7EF300099987 /* DisplayingText.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DisplayingText.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t64DF69EE254D7EF300099987 /* DisplayingTextApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisplayingTextApp.swift; sourceTree = \"<group>\"; };\n\t\t64DF69F0254D7EF300099987 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = \"<group>\"; };\n\t\t64DF69F2254D7EF400099987 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t64DF69F7254D7EF400099987 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t64DF69FF254D7F1F00099987 /* FSButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FSButton.swift; sourceTree = \"<group>\"; };\n\t\t64DF6A07254D7F9300099987 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = \"<group>\"; };\n\t\t64DF6A0A254D7F9400099987 /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/Localizable.strings; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t64DF69E8254D7EF300099987 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t64DF69E2254D7EF300099987 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64DF69ED254D7EF300099987 /* DisplayingText */,\n\t\t\t\t64DF69EC254D7EF300099987 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t64DF69EC254D7EF300099987 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64DF69EB254D7EF300099987 /* DisplayingText.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t64DF69ED254D7EF300099987 /* DisplayingText */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64DF69EE254D7EF300099987 /* DisplayingTextApp.swift */,\n\t\t\t\t64DF6A08254D7F9300099987 /* Localizable.strings */,\n\t\t\t\t64DF69F0254D7EF300099987 /* ContentView.swift */,\n\t\t\t\t64DF69FF254D7F1F00099987 /* FSButton.swift */,\n\t\t\t\t64DF69F2254D7EF400099987 /* Assets.xcassets */,\n\t\t\t\t64DF69F7254D7EF400099987 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = DisplayingText;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t64DF69EA254D7EF300099987 /* DisplayingText */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 64DF69FA254D7EF400099987 /* Build configuration list for PBXNativeTarget \"DisplayingText\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t64DF69E7254D7EF300099987 /* Sources */,\n\t\t\t\t64DF69E8254D7EF300099987 /* Frameworks */,\n\t\t\t\t64DF69E9254D7EF300099987 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = DisplayingText;\n\t\t\tproductName = DisplayingText;\n\t\t\tproductReference = 64DF69EB254D7EF300099987 /* DisplayingText.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t64DF69E3254D7EF300099987 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 1210;\n\t\t\t\tLastUpgradeCheck = 1210;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t64DF69EA254D7EF300099987 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 12.1;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 64DF69E6254D7EF300099987 /* Build configuration list for PBXProject \"DisplayingText\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t\tth,\n\t\t\t);\n\t\t\tmainGroup = 64DF69E2254D7EF300099987;\n\t\t\tproductRefGroup = 64DF69EC254D7EF300099987 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t64DF69EA254D7EF300099987 /* DisplayingText */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t64DF69E9254D7EF300099987 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t64DF69F3254D7EF400099987 /* Assets.xcassets in Resources */,\n\t\t\t\t64DF6A06254D7F9300099987 /* Localizable.strings in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t64DF69E7254D7EF300099987 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t64DF69F1254D7EF300099987 /* ContentView.swift in Sources */,\n\t\t\t\t64DF6A00254D7F1F00099987 /* FSButton.swift in Sources */,\n\t\t\t\t64DF69EF254D7EF300099987 /* DisplayingTextApp.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t64DF6A08254D7F9300099987 /* Localizable.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t64DF6A07254D7F9300099987 /* en */,\n\t\t\t\t64DF6A0A254D7F9400099987 /* th */,\n\t\t\t);\n\t\t\tname = Localizable.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t64DF69F8254D7EF400099987 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.1;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t64DF69F9254D7EF400099987 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.1;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t64DF69FB254D7EF400099987 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tINFOPLIST_FILE = DisplayingText/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = blog.fivestars.DisplayingText;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t64DF69FC254D7EF400099987 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tINFOPLIST_FILE = DisplayingText/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = blog.fivestars.DisplayingText;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t64DF69E6254D7EF300099987 /* Build configuration list for PBXProject \"DisplayingText\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t64DF69F8254D7EF400099987 /* Debug */,\n\t\t\t\t64DF69F9254D7EF400099987 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t64DF69FA254D7EF400099987 /* Build configuration list for PBXNativeTarget \"DisplayingText\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t64DF69FB254D7EF400099987 /* Debug */,\n\t\t\t\t64DF69FC254D7EF400099987 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 64DF69E3254D7EF300099987 /* Project object */;\n}\n"
  },
  {
    "path": "Displaying-Text-SwiftUI/DisplayingText/DisplayingText.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Displaying-Text-SwiftUI/DisplayingText/DisplayingText.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Displaying-Text-SwiftUI/README.md",
    "content": "Final project from [Displaying text in SwiftUI][fs].\n\n![][buttons]\n\n[fs]: https://fivestars.blog/swiftui/displaying-text-swiftui.html\n[buttons]: buttons.png\n"
  },
  {
    "path": "Flexible-SwiftUI/Flexible/Assets.xcassets/AccentColor.colorset/Contents.json",
    "content": "{\n  \"colors\" : [\n    {\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Flexible-SwiftUI/Flexible/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"60x60\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"60x60\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"76x76\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"76x76\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"83.5x83.5\"\n    },\n    {\n      \"idiom\" : \"ios-marketing\",\n      \"scale\" : \"1x\",\n      \"size\" : \"1024x1024\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Flexible-SwiftUI/Flexible/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Flexible-SwiftUI/Flexible/ContentView.swift",
    "content": "//\n\nimport SwiftUI\n\nclass ContentViewModel: ObservableObject {\n\n  @Published var originalItems = [\n    \"Here’s\", \"to\", \"the\", \"crazy\", \"ones\", \"the\", \"misfits\", \"the\", \"rebels\", \"the\", \"troublemakers\", \"the\", \"round\", \"pegs\", \"in\", \"the\", \"square\", \"holes\", \"the\", \"ones\", \"who\", \"see\", \"things\", \"differently\", \"they’re\", \"not\", \"fond\", \"of\", \"rules\", \"You\", \"can\", \"quote\", \"them\", \"disagree\", \"with\", \"them\", \"glorify\", \"or\", \"vilify\", \"them\", \"but\", \"the\", \"only\", \"thing\", \"you\", \"can’t\", \"do\", \"is\", \"ignore\", \"them\", \"because\", \"they\", \"change\", \"things\", \"they\", \"push\", \"the\", \"human\", \"race\", \"forward\", \"and\", \"while\", \"some\", \"may\", \"see\", \"them\", \"as\", \"the\", \"crazy\", \"ones\", \"we\", \"see\", \"genius\", \"because\", \"the\", \"ones\", \"who\", \"are\", \"crazy\", \"enough\", \"to\", \"think\", \"that\", \"they\", \"can\", \"change\", \"the\", \"world\", \"are\", \"the\", \"ones\", \"who\", \"do\"\n  ]\n\n  @Published var spacing: CGFloat = 8\n  @Published var padding: CGFloat = 8\n  @Published var wordCount: Int = 75\n  @Published var alignmentIndex = 0\n\n  var words: [String] {\n    Array(originalItems.prefix(wordCount))\n  }\n\n  let alignments: [HorizontalAlignment] = [.leading, .center, .trailing]\n\n  var alignment: HorizontalAlignment {\n    alignments[alignmentIndex]\n  }\n}\n\nstruct ContentView: View {\n  @StateObject var model = ContentViewModel()\n\n  var body: some View {\n    ScrollView {\n      FlexibleView(\n        data: model.words,\n        spacing: model.spacing,\n        alignment: model.alignment\n      ) { item in\n        Text(verbatim: item)\n          .padding(8)\n          .background(\n            RoundedRectangle(cornerRadius: 8)\n              .fill(Color.gray.opacity(0.2))\n           )\n      }\n      .padding(.horizontal, model.padding)\n    }\n    .overlay(Settings(model: model), alignment: .bottom)\n  }\n}\n\nstruct Settings: View {\n  @ObservedObject var model: ContentViewModel\n  let alignmentName: [String] = [\"leading\", \"center\", \"trailing\"]\n\n  var body: some View {\n    VStack {\n      Stepper(value: $model.wordCount, in: 0...model.originalItems.count) {\n        Text(\"\\(model.wordCount) words\")\n      }\n\n      HStack {\n        Text(\"Padding\")\n        Slider(value: $model.padding, in: 0...60) { Text(\"\") }\n      }\n\n      HStack {\n        Text(\"Spacing\")\n        Slider(value: $model.spacing, in: 0...40) { Text(\"\") }\n      }\n\n      HStack {\n        Text(\"Alignment\")\n        Picker(\"Choose alignment\", selection: $model.alignmentIndex) {\n          ForEach(0..<model.alignments.count) {\n            Text(alignmentName[$0])\n          }\n        }\n        .pickerStyle(SegmentedPickerStyle())\n      }\n\n      Button {\n        model.originalItems.shuffle()\n      } label: {\n        Text(\"Shuffle\")\n      }\n    }\n    .padding()\n    .background(Color(UIColor.systemBackground))\n    .clipShape(RoundedRectangle(cornerRadius: 20))\n    .overlay(\n         RoundedRectangle(cornerRadius: 20)\n             .stroke(Color.primary, lineWidth: 4)\n     )\n    .padding()\n  }\n}\n\nstruct ContentView_Previews: PreviewProvider {\n  static var previews: some View {\n    ContentView()\n  }\n}\n"
  },
  {
    "path": "Flexible-SwiftUI/Flexible/FlexibleApp.swift",
    "content": "//\n\nimport SwiftUI\n\n@main\nstruct FlexibleApp: App {\n    var body: some Scene {\n        WindowGroup {\n            ContentView()\n        }\n    }\n}\n"
  },
  {
    "path": "Flexible-SwiftUI/Flexible/FlexibleView.swift",
    "content": "//\n\nimport SwiftUI\n\n/// Facade of our view, its main responsibility is to get the available width\n/// and pass it down to the real implementation, `_FlexibleView`.\nstruct FlexibleView<Data: Collection, Content: View>: View where Data.Element: Hashable {\n  let data: Data\n  let spacing: CGFloat\n  let alignment: HorizontalAlignment\n  let content: (Data.Element) -> Content\n  // The initial width should not be `0`, otherwise all items will be layouted in one row,\n  // and the actual layout width may exceed the value we desired.\n  @State private var availableWidth: CGFloat = 10\n\n  var body: some View {\n    ZStack(alignment: Alignment(horizontal: alignment, vertical: .center)) {\n      Color.clear\n        .frame(height: 1)\n        .readSize { size in\n          availableWidth = size.width\n        }\n\n      _FlexibleView(\n        availableWidth: availableWidth,\n        data: data,\n        spacing: spacing,\n        alignment: alignment,\n        content: content\n      )\n    }\n  }\n}\n"
  },
  {
    "path": "Flexible-SwiftUI/Flexible/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIApplicationSceneManifest</key>\n\t<dict>\n\t\t<key>UIApplicationSupportsMultipleScenes</key>\n\t\t<true/>\n\t</dict>\n\t<key>UIApplicationSupportsIndirectInputEvents</key>\n\t<true/>\n\t<key>UILaunchScreen</key>\n\t<dict/>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Flexible-SwiftUI/Flexible/SizeReader.swift",
    "content": "//\n\nimport SwiftUI\n\nextension View {\n  func readSize(onChange: @escaping (CGSize) -> Void) -> some View {\n    background(\n      GeometryReader { geometryProxy in\n        Color.clear\n          .preference(key: SizePreferenceKey.self, value: geometryProxy.size)\n      }\n    )\n    .onPreferenceChange(SizePreferenceKey.self, perform: onChange)\n  }\n}\n\nprivate struct SizePreferenceKey: PreferenceKey {\n  static var defaultValue: CGSize = .zero\n  static func reduce(value: inout CGSize, nextValue: () -> CGSize) {}\n}\n"
  },
  {
    "path": "Flexible-SwiftUI/Flexible/_FlexibleView.swift",
    "content": "//\n\nimport SwiftUI\n\n/// This view is responsible to lay down the given elements and wrap them into\n/// multiple rows if needed.\nstruct _FlexibleView<Data: Collection, Content: View>: View where Data.Element: Hashable {\n  let availableWidth: CGFloat\n  let data: Data\n  let spacing: CGFloat\n  let alignment: HorizontalAlignment\n  let content: (Data.Element) -> Content\n  @State var elementsSize: [Data.Element: CGSize] = [:]\n\n  var body : some View {\n    VStack(alignment: alignment, spacing: spacing) {\n      ForEach(computeRows(), id: \\.self) { rowElements in\n        HStack(spacing: spacing) {\n          ForEach(rowElements, id: \\.self) { element in\n            content(element)\n              .fixedSize()\n              .readSize { size in\n                elementsSize[element] = size\n              }\n          }\n        }\n      }\n    }\n  }\n\n  func computeRows() -> [[Data.Element]] {\n    var rows: [[Data.Element]] = [[]]\n    var currentRow = 0\n    var remainingWidth = availableWidth\n\n    for element in data {\n      let elementSize = elementsSize[element, default: CGSize(width: availableWidth, height: 1)]\n\n      if remainingWidth - (elementSize.width + spacing) >= 0 {\n        rows[currentRow].append(element)\n      } else {\n        currentRow = currentRow + 1\n        rows.append([element])\n        remainingWidth = availableWidth\n      }\n\n      remainingWidth = remainingWidth - (elementSize.width + spacing)\n    }\n\n    return rows\n  }\n}\n"
  },
  {
    "path": "Flexible-SwiftUI/Flexible.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t64DF03E524DFBD0000909495 /* FlexibleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64DF03E424DFBD0000909495 /* FlexibleApp.swift */; };\n\t\t64DF03E724DFBD0000909495 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64DF03E624DFBD0000909495 /* ContentView.swift */; };\n\t\t64DF03E924DFBD0200909495 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 64DF03E824DFBD0200909495 /* Assets.xcassets */; };\n\t\t64DF03F924DFBD8000909495 /* _FlexibleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64DF03F724DFBD7F00909495 /* _FlexibleView.swift */; };\n\t\t64DF03FA24DFBD8000909495 /* FlexibleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64DF03F824DFBD7F00909495 /* FlexibleView.swift */; };\n\t\t64DF03FC24E03FDE00909495 /* SizeReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64DF03FB24E03FDE00909495 /* SizeReader.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t64DF03E124DFBD0000909495 /* Flexible.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Flexible.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t64DF03E424DFBD0000909495 /* FlexibleApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlexibleApp.swift; sourceTree = \"<group>\"; };\n\t\t64DF03E624DFBD0000909495 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = \"<group>\"; };\n\t\t64DF03E824DFBD0200909495 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t64DF03ED24DFBD0200909495 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t64DF03F724DFBD7F00909495 /* _FlexibleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = _FlexibleView.swift; sourceTree = \"<group>\"; };\n\t\t64DF03F824DFBD7F00909495 /* FlexibleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FlexibleView.swift; sourceTree = \"<group>\"; };\n\t\t64DF03FB24E03FDE00909495 /* SizeReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SizeReader.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t64DF03DE24DFBD0000909495 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t64DF03D824DFBD0000909495 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64DF03E324DFBD0000909495 /* Flexible */,\n\t\t\t\t64DF03E224DFBD0000909495 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t64DF03E224DFBD0000909495 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64DF03E124DFBD0000909495 /* Flexible.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t64DF03E324DFBD0000909495 /* Flexible */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64DF03E424DFBD0000909495 /* FlexibleApp.swift */,\n\t\t\t\t64DF03E624DFBD0000909495 /* ContentView.swift */,\n\t\t\t\t64DF03F824DFBD7F00909495 /* FlexibleView.swift */,\n\t\t\t\t64DF03F724DFBD7F00909495 /* _FlexibleView.swift */,\n\t\t\t\t64DF03FB24E03FDE00909495 /* SizeReader.swift */,\n\t\t\t\t64DF03E824DFBD0200909495 /* Assets.xcassets */,\n\t\t\t\t64DF03ED24DFBD0200909495 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = Flexible;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t64DF03E024DFBD0000909495 /* Flexible */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 64DF03F024DFBD0200909495 /* Build configuration list for PBXNativeTarget \"Flexible\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t64DF03DD24DFBD0000909495 /* Sources */,\n\t\t\t\t64DF03DE24DFBD0000909495 /* Frameworks */,\n\t\t\t\t64DF03DF24DFBD0000909495 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Flexible;\n\t\t\tproductName = Flexible;\n\t\t\tproductReference = 64DF03E124DFBD0000909495 /* Flexible.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t64DF03D924DFBD0000909495 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 1200;\n\t\t\t\tLastUpgradeCheck = 1200;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t64DF03E024DFBD0000909495 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 12.0;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 64DF03DC24DFBD0000909495 /* Build configuration list for PBXProject \"Flexible\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 64DF03D824DFBD0000909495;\n\t\t\tproductRefGroup = 64DF03E224DFBD0000909495 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t64DF03E024DFBD0000909495 /* Flexible */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t64DF03DF24DFBD0000909495 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t64DF03E924DFBD0200909495 /* Assets.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t64DF03DD24DFBD0000909495 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t64DF03E724DFBD0000909495 /* ContentView.swift in Sources */,\n\t\t\t\t64DF03E524DFBD0000909495 /* FlexibleApp.swift in Sources */,\n\t\t\t\t64DF03FA24DFBD8000909495 /* FlexibleView.swift in Sources */,\n\t\t\t\t64DF03F924DFBD8000909495 /* _FlexibleView.swift in Sources */,\n\t\t\t\t64DF03FC24E03FDE00909495 /* SizeReader.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t64DF03EE24DFBD0200909495 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t64DF03EF24DFBD0200909495 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t64DF03F124DFBD0200909495 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tINFOPLIST_FILE = Flexible/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = blog.fivestars.Flexible;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t64DF03F224DFBD0200909495 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tINFOPLIST_FILE = Flexible/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = blog.fivestars.Flexible;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t64DF03DC24DFBD0000909495 /* Build configuration list for PBXProject \"Flexible\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t64DF03EE24DFBD0200909495 /* Debug */,\n\t\t\t\t64DF03EF24DFBD0200909495 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t64DF03F024DFBD0200909495 /* Build configuration list for PBXNativeTarget \"Flexible\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t64DF03F124DFBD0200909495 /* Debug */,\n\t\t\t\t64DF03F224DFBD0200909495 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 64DF03D924DFBD0000909495 /* Project object */;\n}\n"
  },
  {
    "path": "Flexible-SwiftUI/Flexible.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Flexible-SwiftUI/Flexible.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Flexible-SwiftUI/README.md",
    "content": "Proof of concept from [Flexible SwiftUI][fs].\n\n![][gif]\n\n## Credits\n\nThis article and code is inspired by [Mauricio Meirelles][mmtw]'s [GridView][gv].\n\n[fs]: https://fivestars.blog/swiftui/flexible-swiftui.html\n[gif]: flexible.gif\n[mmtw]: https://twitter.com/MauricioM\n[gv]: https://github.com/mauriciomeirelles/GridView"
  },
  {
    "path": "Hashable-Bindings/ContentView.swift",
    "content": "import SwiftUI\n\nenum ContentViewGroup: Hashable {\n  case a\n  case b\n  case c\n}\n\nstruct ContentView: View {\n  @State var showingContent: ContentViewGroup?\n\n  var body: some View {\n    List {\n      DisclosureGroup(\n        \"Tap to show content A\",\n        tag: .a,\n        selection: $showingContent) {\n        Text(\"Content A\")\n      }\n\n      DisclosureGroup(\n        \"Tap to show content B\",\n        tag: .b,\n        selection: $showingContent) {\n        Text(\"Content B\")\n      }\n\n      DisclosureGroup(\n        \"Tap to show content C\",\n        tag: .c,\n        selection: $showingContent) {\n        Text(\"Content C\")\n      }\n    }\n  }\n}\n\nextension DisclosureGroup where Label == Text {\n  public init<V: Hashable, S: StringProtocol>(\n    _ label: S,\n    tag: V,\n    selection: Binding<V?>,\n    content: @escaping () -> Content) {\n    let boolBinding: Binding<Bool> = Binding(\n      get: { selection.wrappedValue == tag },\n      set: { newValue in\n        if newValue {\n          selection.wrappedValue = tag\n        } else {\n          selection.wrappedValue = nil\n        }\n      }\n    )\n\n    self.init(\n      label,\n      isExpanded: boolBinding,\n      content: content\n    )\n  }\n}\n"
  },
  {
    "path": "Hashable-Bindings/README.md",
    "content": "Code snippet from [Hashable SwiftUI bindings][fs].\n\n![][gif]\n\n[fs]: https://fivestars.blog/swiftui/hashable-bindings.html\n[gif]: hashable.gif\n"
  },
  {
    "path": "Hierarchy-List/ContentView-1.swift",
    "content": "// Original article here: https://www.fivestars.blog/code/swiftui-hierarchy-list.html\n\nimport SwiftUI\n\nstruct FileItem: Identifiable {\n  let name: String\n  var children: [FileItem]?\n\n  var id: String { name }\n\n  static let spmData: [FileItem] = [\n    FileItem(name: \".gitignore\"),\n    FileItem(name: \"Package.swift\"),\n    FileItem(name: \"README.md\"),\n    FileItem(name: \"Sources\", children: [\n      FileItem(name: \"fivestars\", children: [\n        FileItem(name: \"main.swift\")\n      ]),\n    ]),\n    FileItem(name: \"Tests\", children: [\n      FileItem(name: \"fivestarsTests\", children: [\n        FileItem(name: \"fivestarsTests.swift\"),\n        FileItem(name: \"XCTestManifests.swift\"),\n      ]),\n      FileItem(name: \"LinuxMain.swift\")\n    ])\n  ]\n}\n\nstruct ContentView: View {\n  let data: [FileItem] = .spmData\n\n  var body: some View {\n//    List(data, children: \\.children, rowContent: { Text($0.name) })\n    HierarchyList(data: data, children: \\.children, rowContent: { Text($0.name) })\n  }\n}\n\npublic struct HierarchyList<Data, RowContent>: View where Data: RandomAccessCollection, Data.Element: Identifiable, RowContent: View {\n  private let recursiveView: RecursiveView<Data, RowContent>\n\n  public init(data: Data, children: KeyPath<Data.Element, Data?>, rowContent: @escaping (Data.Element) -> RowContent) {\n    self.recursiveView = RecursiveView(data: data, children: children, rowContent: rowContent)\n  }\n\n  public var body: some View {\n    List {\n      recursiveView\n    }\n  }\n}\n\nprivate struct RecursiveView<Data, RowContent>: View where Data: RandomAccessCollection, Data.Element: Identifiable, RowContent: View {\n  let data: Data\n  let children: KeyPath<Data.Element, Data?>\n  let rowContent: (Data.Element) -> RowContent\n\n  var body: some View {\n    ForEach(data) { child in\n      if let subChildren = child[keyPath: children] {\n        DisclosureGroup(content: {\n          RecursiveView(data: subChildren, children: children, rowContent: rowContent)\n        }, label: {\n          rowContent(child)\n        })\n      } else {\n        rowContent(child)\n      }\n    }\n  }\n}"
  },
  {
    "path": "Hierarchy-List/ContentView-2.swift",
    "content": "// Original article here: https://www.fivestars.blog/code/swiftui-hierarchy-list.html\n\nimport SwiftUI\n\nstruct FileItem: Identifiable {\n  let name: String\n  var children: [FileItem]?\n\n  var id: String { name }\n\n  static let spmData: [FileItem] = [\n    FileItem(name: \".gitignore\"),\n    FileItem(name: \"Package.swift\"),\n    FileItem(name: \"README.md\"),\n    FileItem(name: \"Sources\", children: [\n      FileItem(name: \"fivestars\", children: [\n        FileItem(name: \"main.swift\")\n      ]),\n    ]),\n    FileItem(name: \"Tests\", children: [\n      FileItem(name: \"fivestarsTests\", children: [\n        FileItem(name: \"fivestarsTests.swift\"),\n        FileItem(name: \"XCTestManifests.swift\"),\n      ]),\n      FileItem(name: \"LinuxMain.swift\")\n    ])\n  ]\n}\n\nstruct ContentView: View {\n  var data: [FileItem] = .spmData\n\n  var body: some View {\n//    List(data, children: \\.children, rowContent: { Text($0.name) })\n    HierarchyList(data: data, children: \\.children, rowContent: { Text($0.name) })\n  }\n}\n\npublic struct HierarchyList<Data, RowContent>: View where Data: RandomAccessCollection, Data.Element: Identifiable, RowContent: View {\n  private let recursiveView: RecursiveView<Data, RowContent>\n\n  public init(data: Data, children: KeyPath<Data.Element, Data?>, rowContent: @escaping (Data.Element) -> RowContent) {\n    self.recursiveView = RecursiveView(data: data, children: children, rowContent: rowContent)\n  }\n\n  public var body: some View {\n    List {\n      recursiveView\n    }\n  }\n}\n\nprivate struct RecursiveView<Data, RowContent>: View where Data: RandomAccessCollection, Data.Element: Identifiable, RowContent: View {\n  let data: Data\n  let children: KeyPath<Data.Element, Data?>\n  let rowContent: (Data.Element) -> RowContent\n\n  var body: some View {\n    ForEach(data) { child in\n      if let subChildren = child[keyPath: children] {\n        FSDisclosureGroup(content: {\n          RecursiveView(data: subChildren, children: children, rowContent: rowContent)\n        }, label: {\n          rowContent(child)\n        })\n      } else {\n        rowContent(child)\n      }\n    }\n  }\n}\n\nstruct FSDisclosureGroup<Label, Content>: View where Label: View, Content: View {\n  @State var isExpanded: Bool = true\n  var content: () -> Content\n  var label: () -> Label\n\n  @ViewBuilder\n  var body: some View {\n    DisclosureGroup(isExpanded: $isExpanded, content: content, label: label)\n  }\n}"
  },
  {
    "path": "Hierarchy-List/ContentView-xcode-11.swift",
    "content": "// Original article here: https://www.fivestars.blog/code/swiftui-hierarchy-list.html\n\nimport SwiftUI\n\nstruct FileItem: Identifiable {\n  let name: String\n  var children: [FileItem]?\n\n  var id: String { name }\n\n  static let spmData: [FileItem] = [\n    FileItem(name: \".gitignore\"),\n    FileItem(name: \"Package.swift\"),\n    FileItem(name: \"README.md\"),\n    FileItem(name: \"Sources\", children: [\n      FileItem(name: \"fivestars\", children: [\n        FileItem(name: \"main.swift\")\n      ]),\n    ]),\n    FileItem(name: \"Tests\", children: [\n      FileItem(name: \"fivestarsTests\", children: [\n        FileItem(name: \"fivestarsTests.swift\"),\n        FileItem(name: \"XCTestManifests.swift\"),\n      ]),\n      FileItem(name: \"LinuxMain.swift\")\n    ])\n  ]\n}\n\nstruct ContentView: View {\n  let data: [FileItem] = FileItem.spmData\n\n  var body: some View {\n//    List(data, children: \\.children, rowContent: { Text($0.name) })\n    HierarchyList(data: data, children: \\.children, rowContent: { Text($0.name) })\n  }\n}\n\npublic struct HierarchyList<Data, RowContent>: View where Data: RandomAccessCollection, Data.Element: Identifiable, RowContent: View {\n  private let recursiveView: RecursiveView<Data, RowContent>\n\n  public init(data: Data, children: KeyPath<Data.Element, Data?>, rowContent: @escaping (Data.Element) -> RowContent) {\n    self.recursiveView = RecursiveView(data: data, children: children, rowContent: rowContent)\n  }\n\n  public var body: some View {\n    List {\n      recursiveView\n    }\n  }\n}\n\nprivate struct RecursiveView<Data, RowContent>: View where Data: RandomAccessCollection, Data.Element: Identifiable, RowContent: View {\n  let data: Data\n  let children: KeyPath<Data.Element, Data?>\n  let rowContent: (Data.Element) -> RowContent\n\n  var body: some View {\n    ForEach(data) { child in\n      if self.containsSub(child)  {\n        FSDisclosureGroup(content: {\n          RecursiveView(data: child[keyPath: self.children]!, children: self.children, rowContent: self.rowContent)\n          .padding(.leading)\n        }, label: {\n          self.rowContent(child)\n        })\n      } else {\n        self.rowContent(child)\n      }\n    }\n  }\n\n  func containsSub(_ element: Data.Element) -> Bool {\n    element[keyPath: children] != nil\n  }\n}\n\nstruct FSDisclosureGroup<Label, Content>: View where Label: View, Content: View {\n  @State var isExpanded: Bool = false\n  var content: () -> Content\n  var label: () -> Label\n\n  @ViewBuilder\n  var body: some View {\n    Button(action: { self.isExpanded.toggle() }, label: { label().foregroundColor(.blue) })\n    if isExpanded {\n      content()\n    }\n  }\n}\n"
  },
  {
    "path": "Hierarchy-List/README.md",
    "content": "Code snippet from [SwiftUI Hierarchy Lists][fs].\n\n![][gif]\n\n[fs]: https://fivestars.blog/articles/swiftui-hierarchy-list/\n[gif]: spm.gif\n"
  },
  {
    "path": "Identifiable-Navigation/IdentifiableNavigation/IdentifiableNavigation/ContentView.swift",
    "content": "//\n\nimport SwiftUI\n\nenum ContentViewNavigation: Identifiable {\n  case one\n  case two(number: Int)\n  case three(text: String)\n\n  // MARK: Identifiable\n\n  var id: Int {\n    switch self {\n    case .one:\n      return 1\n    case .two:\n      return 2\n    case .three:\n      return 3\n    }\n  }\n}\n\nstruct ContentView: View {\n  @State private var showingNavigation: ContentViewNavigation?\n\n  var body: some View {\n    NavigationView {\n      VStack {\n        Button(\"Go to navigation one\") {\n          showingNavigation = .one\n        }\n        Button(\"Go to navigation two\") {\n          showingNavigation = .two(number: Int.random(in: 1...5))\n        }\n        Button(\"Go to navigation three\") {\n          showingNavigation = .three(text: [\"five\", \"stars\"].randomElement()!)\n        }\n      }\n      .navigation(item: $showingNavigation, destination: presentNavigation)\n    }\n  }\n\n  @ViewBuilder\n  func presentNavigation(_ navigation: ContentViewNavigation) -> some View {\n    switch navigation {\n    case .one:\n      Text(verbatim: \"one\")\n    case .two(let number):\n      Text(\"two \\(number)\")\n    case .three(let text):\n      Text(\"three \\(text)\")\n    }\n  }\n}\n\nstruct ContentView_Previews: PreviewProvider {\n  static var previews: some View {\n    ContentView()\n  }\n}\n"
  },
  {
    "path": "Identifiable-Navigation/IdentifiableNavigation/IdentifiableNavigation/IdentifiableNavigationApp.swift",
    "content": "//\n\nimport SwiftUI\n\n@main\nstruct IdentifiableNavigationApp: App {\n  var body: some Scene {\n    WindowGroup {\n      ContentView()\n    }\n  }\n}\n"
  },
  {
    "path": "Identifiable-Navigation/IdentifiableNavigation/IdentifiableNavigation/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIApplicationSceneManifest</key>\n\t<dict>\n\t\t<key>UIApplicationSupportsMultipleScenes</key>\n\t\t<true/>\n\t</dict>\n\t<key>UIApplicationSupportsIndirectInputEvents</key>\n\t<true/>\n\t<key>UILaunchScreen</key>\n\t<dict/>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Identifiable-Navigation/IdentifiableNavigation/IdentifiableNavigation/NavigationLink+Identifiable.swift",
    "content": "//\n\nimport SwiftUI\n\n/// The extension from the article broke in Xcode 12.5 and no longer work\n/// properly.\n///\n/// This updated extension is uglier but works as expected.\nextension NavigationLink where Label == EmptyView, Destination == AnyView {\n  public init<V: Identifiable, Destination2: View>(\n    item: Binding<V?>,\n    destination: @escaping (V) -> Destination2\n  ) {\n    let value: V? = item.wrappedValue\n    let isActive: Binding<Bool> = Binding(\n      get: { item.wrappedValue != nil },\n      set: { value in\n        if !value {\n          item.wrappedValue = nil\n        }\n      }\n    )\n\n    self.init(\n      destination:\n        AnyView(Group {\n          if let value = value {\n            destination(value)\n          } else {\n            EmptyView()\n          }\n        }),\n      isActive: isActive,\n      label: EmptyView.init\n    )\n  }\n}\n"
  },
  {
    "path": "Identifiable-Navigation/IdentifiableNavigation/IdentifiableNavigation/View+Navigation.swift",
    "content": "//\n\nimport SwiftUI\n\nextension View {\n  func navigation<V: Identifiable, Destination: View>(\n    item: Binding<V?>,\n    destination: @escaping (V) -> Destination\n  ) -> some View {\n    background(NavigationLink(item: item, destination: destination))\n  }\n}\n"
  },
  {
    "path": "Identifiable-Navigation/IdentifiableNavigation/IdentifiableNavigation.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t64B446EA25727737003B2E60 /* IdentifiableNavigationApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64B446E925727737003B2E60 /* IdentifiableNavigationApp.swift */; };\n\t\t64B446EC25727738003B2E60 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64B446EB25727738003B2E60 /* ContentView.swift */; };\n\t\t64B446FD2572778F003B2E60 /* NavigationLink+Identifiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64B446FC2572778F003B2E60 /* NavigationLink+Identifiable.swift */; };\n\t\t64B44700257277C3003B2E60 /* View+Navigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64B446FF257277C3003B2E60 /* View+Navigation.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t64B446E625727737003B2E60 /* IdentifiableNavigation.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = IdentifiableNavigation.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t64B446E925727737003B2E60 /* IdentifiableNavigationApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IdentifiableNavigationApp.swift; sourceTree = \"<group>\"; };\n\t\t64B446EB25727738003B2E60 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = \"<group>\"; };\n\t\t64B446F22572773A003B2E60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t64B446FC2572778F003B2E60 /* NavigationLink+Identifiable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"NavigationLink+Identifiable.swift\"; sourceTree = \"<group>\"; };\n\t\t64B446FF257277C3003B2E60 /* View+Navigation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"View+Navigation.swift\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t64B446E325727737003B2E60 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t64B446DD25727737003B2E60 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64B446E825727737003B2E60 /* IdentifiableNavigation */,\n\t\t\t\t64B446E725727737003B2E60 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t64B446E725727737003B2E60 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64B446E625727737003B2E60 /* IdentifiableNavigation.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t64B446E825727737003B2E60 /* IdentifiableNavigation */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64B446E925727737003B2E60 /* IdentifiableNavigationApp.swift */,\n\t\t\t\t64B446EB25727738003B2E60 /* ContentView.swift */,\n\t\t\t\t64B446FC2572778F003B2E60 /* NavigationLink+Identifiable.swift */,\n\t\t\t\t64B446FF257277C3003B2E60 /* View+Navigation.swift */,\n\t\t\t\t64B446F22572773A003B2E60 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = IdentifiableNavigation;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t64B446E525727737003B2E60 /* IdentifiableNavigation */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 64B446F52572773A003B2E60 /* Build configuration list for PBXNativeTarget \"IdentifiableNavigation\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t64B446E225727737003B2E60 /* Sources */,\n\t\t\t\t64B446E325727737003B2E60 /* Frameworks */,\n\t\t\t\t64B446E425727737003B2E60 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = IdentifiableNavigation;\n\t\t\tproductName = IdentifiableNavigation;\n\t\t\tproductReference = 64B446E625727737003B2E60 /* IdentifiableNavigation.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t64B446DE25727737003B2E60 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 1220;\n\t\t\t\tLastUpgradeCheck = 1220;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t64B446E525727737003B2E60 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 12.2;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 64B446E125727737003B2E60 /* Build configuration list for PBXProject \"IdentifiableNavigation\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 64B446DD25727737003B2E60;\n\t\t\tproductRefGroup = 64B446E725727737003B2E60 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t64B446E525727737003B2E60 /* IdentifiableNavigation */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t64B446E425727737003B2E60 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t64B446E225727737003B2E60 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t64B446EC25727738003B2E60 /* ContentView.swift in Sources */,\n\t\t\t\t64B446FD2572778F003B2E60 /* NavigationLink+Identifiable.swift in Sources */,\n\t\t\t\t64B44700257277C3003B2E60 /* View+Navigation.swift in Sources */,\n\t\t\t\t64B446EA25727737003B2E60 /* IdentifiableNavigationApp.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t64B446F32572773A003B2E60 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.2;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t64B446F42572773A003B2E60 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.2;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t64B446F62572773A003B2E60 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tINFOPLIST_FILE = IdentifiableNavigation/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = blog.fivestars.IdentifiableNavigation;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t64B446F72572773A003B2E60 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tINFOPLIST_FILE = IdentifiableNavigation/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = blog.fivestars.IdentifiableNavigation;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t64B446E125727737003B2E60 /* Build configuration list for PBXProject \"IdentifiableNavigation\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t64B446F32572773A003B2E60 /* Debug */,\n\t\t\t\t64B446F42572773A003B2E60 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t64B446F52572773A003B2E60 /* Build configuration list for PBXNativeTarget \"IdentifiableNavigation\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t64B446F62572773A003B2E60 /* Debug */,\n\t\t\t\t64B446F72572773A003B2E60 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 64B446DE25727737003B2E60 /* Project object */;\n}\n"
  },
  {
    "path": "Identifiable-Navigation/IdentifiableNavigation/IdentifiableNavigation.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Identifiable-Navigation/IdentifiableNavigation/IdentifiableNavigation.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Identifiable-Navigation/README.md",
    "content": "Working proof of concept of an improved SwiftUI navigation API, refer to [The future of SwiftUI navigation (?)][fs] for more details.\n\n![][gif]\n\n[fs]: https://fivestars.blog/swiftui/programmatic-navigation.html\n[gif]: identifiable.gif\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) 2020, Federico Zanetello\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n  Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n  Redistributions in binary form must reproduce the above copyright notice, this\n  list of conditions and the following disclaimer in the documentation and/or\n  other materials provided with the distribution.\n\n  Neither the name of Federico Zanetello nor the names of contributors\n  may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "README.md",
    "content": "Code Samples from [fivestars.blog][fs].\n\n[fs]: http://fivestars.blog/"
  },
  {
    "path": "SafeAreaInset/README.md",
    "content": "Code snippet from [Backport SwiftUI safe area insets to iOS 13 and 14][fs].\n\n![][gif]\n\n[fs]: https://www.fivestars.blog/articles/safe-area-insets-2/\n[gif]: stack.gif\n"
  },
  {
    "path": "SafeAreaInset/content.swift",
    "content": "// Gist from https://www.fivestars.blog/articles/safe-area-insets-2/\n\nimport SwiftUI\n\nstruct ContentView: View {\n  var body: some View {\n    ScrollView {\n      scrollViewContent\n      ExtraBottomSafeAreaInset()\n    }\n    .bottomSafeAreaInset(overlayContent)\n    .bottomSafeAreaInset(overlayContent)\n    .bottomSafeAreaInset(overlayContent)\n    .bottomSafeAreaInset(overlayContent)\n    .bottomSafeAreaInset(overlayContent)\n  }\n\n  var scrollViewContent: some View {\n    ForEach(1..<60) { _ in\n      Text(\"Five Stars\")\n        .font(.title)\n        .frame(maxWidth: .infinity)\n    }\n  }\n\n  var overlayContent: some View {\n    Button {\n      // ...\n    } label: {\n      Text(\"Continue\")\n        .foregroundColor(.white)\n        .padding()\n        .frame(maxWidth: .infinity)\n        .background(Color.accentColor.cornerRadius(8))\n        .padding(.horizontal)\n    }\n  }\n}\n\n@available(iOS, introduced: 13, deprecated: 15, message: \"Use .safeAreaInset() directly\")\nextension View {\n  @ViewBuilder\n  func bottomSafeAreaInset<OverlayContent: View>(_ overlayContent: OverlayContent) -> some View {\n    if #available(iOS 15.0, *) {\n      self.safeAreaInset(edge: .bottom, spacing: 0, content: { overlayContent })\n    } else {\n      self.modifier(BottomInsetViewModifier(overlayContent: overlayContent))\n    }\n  }\n}\n\nextension View {\n  func readHeight(onChange: @escaping (CGFloat) -> Void) -> some View {\n    background(\n      GeometryReader { geometryProxy in\n        Spacer()\n          .preference(\n            key: HeightPreferenceKey.self,\n            value: geometryProxy.size.height\n          )\n      }\n    )\n    .onPreferenceChange(HeightPreferenceKey.self, perform: onChange)\n  }\n}\n\nprivate struct HeightPreferenceKey: PreferenceKey {\n  static var defaultValue: CGFloat = .zero\n  static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {}\n}\n\nstruct BottomInsetViewModifier<OverlayContent: View>: ViewModifier {\n  @Environment(\\.bottomSafeAreaInset) var ancestorBottomSafeAreaInset: CGFloat\n  var overlayContent: OverlayContent\n  @State var overlayContentHeight: CGFloat = 0\n\n  func body(content: Self.Content) -> some View {\n    content\n      .environment(\\.bottomSafeAreaInset, overlayContentHeight + ancestorBottomSafeAreaInset)\n      .overlay(\n        overlayContent\n          .readHeight {\n            overlayContentHeight = $0\n          }\n          .padding(.bottom, ancestorBottomSafeAreaInset)\n        ,\n        alignment: .bottom\n      )\n  }\n}\n\nstruct BottomSafeAreaInsetKey: EnvironmentKey {\n  static var defaultValue: CGFloat = 0\n}\n\nextension EnvironmentValues {\n  var bottomSafeAreaInset: CGFloat {\n    get { self[BottomSafeAreaInsetKey.self] }\n    set { self[BottomSafeAreaInsetKey.self] = newValue }\n  }\n}\n\nstruct ExtraBottomSafeAreaInset: View {\n  @Environment(\\.bottomSafeAreaInset) var bottomSafeAreaInset: CGFloat\n\n  var body: some View {\n    Spacer(minLength: bottomSafeAreaInset)\n  }\n}\n"
  },
  {
    "path": "ScrollView-Offset/README.md",
    "content": "Final code snippet from [SwiftUI ScrollView offset][fs].\n\n![][gif]\n\n[fs]: https://fivestars.blog/swiftui/scrollview-offset.html\n\n[gif]: rainbow.gif\n"
  },
  {
    "path": "ScrollView-Offset/ScrollViewOffset.swift",
    "content": "//\n\nimport SwiftUI\n\nstruct ScrollViewOffset<Content: View>: View {\n  let onOffsetChange: (CGFloat) -> Void\n  let content: () -> Content\n\n  init(\n    onOffsetChange: @escaping (CGFloat) -> Void,\n    @ViewBuilder content: @escaping () -> Content\n  ) {\n    self.onOffsetChange = onOffsetChange\n    self.content = content\n  }\n\n  var body: some View {\n    ScrollView {\n      offsetReader\n      content()\n        .padding(.top, -8)\n    }\n    .coordinateSpace(name: \"frameLayer\")\n    .onPreferenceChange(OffsetPreferenceKey.self, perform: onOffsetChange)\n  }\n\n  var offsetReader: some View {\n    GeometryReader { proxy in\n      Color.clear\n        .preference(\n          key: OffsetPreferenceKey.self,\n          value: proxy.frame(in: .named(\"frameLayer\")).minY\n        )\n    }\n    .frame(height: 0)\n  }\n}\n\nprivate struct OffsetPreferenceKey: PreferenceKey {\n  static var defaultValue: CGFloat = .zero\n  static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {}\n}\n"
  },
  {
    "path": "Stack-vs-Grid/LazyStacks/LazyStacks/ContentView.swift",
    "content": "//\n\nimport SwiftUI\n\nstruct ContentView: View {\n  var body: some View {\n    HStack {\n      ScrollView {\n        LazyVStack(\n          alignment: .leading,\n          spacing: 20,\n          pinnedViews: [.sectionHeaders]\n        ) {\n          Section(header: header(title: \"Original\")) { content }\n        }\n      }\n      ScrollView {\n        LazyVStackMock(\n          alignment: .leading,\n          spacing: 20,\n          pinnedViews: [.sectionHeaders]\n        ) {\n          Section(header: header(title: \"Mock\")) { content }\n        }\n      }\n    }\n    .font(.title)\n  }\n\n  var content: some View {\n    ForEach(1...40, id: \\.self) { count in\n      Label(\"Placeholder \\(count)\", colorfulSystemImage: \"leaf.fill\")\n    }\n  }\n\n  func header(title: String) -> some View {\n    Text(verbatim: title)\n      .bold()\n      .padding(.horizontal)\n      .padding(.vertical, 4)\n      .foregroundColor(.white)\n      .background(\n        Capsule().foregroundColor(.green)\n      )\n  }\n}\n"
  },
  {
    "path": "Stack-vs-Grid/LazyStacks/LazyStacks/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIApplicationSceneManifest</key>\n\t<dict>\n\t\t<key>UIApplicationSupportsMultipleScenes</key>\n\t\t<true/>\n\t</dict>\n\t<key>UIApplicationSupportsIndirectInputEvents</key>\n\t<true/>\n\t<key>UILaunchScreen</key>\n\t<dict/>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Stack-vs-Grid/LazyStacks/LazyStacks/Label.swift",
    "content": "//\n\nimport SwiftUI\n\nextension Label where Title == Text, Icon == Image {\n  init(_ title: LocalizedStringKey, colorfulSystemImage systemImage: String) {\n    self.init {\n      Text(title)\n    } icon: {\n      Image(systemName: systemImage)\n        .renderingMode(.original)\n    }\n  }\n}\n"
  },
  {
    "path": "Stack-vs-Grid/LazyStacks/LazyStacks/LazyStacksApp.swift",
    "content": "//\n\nimport SwiftUI\n\n@main\nstruct LazyStacksApp: App {\n    var body: some Scene {\n        WindowGroup {\n            ContentView()\n        }\n    }\n}\n"
  },
  {
    "path": "Stack-vs-Grid/LazyStacks/LazyStacks/LazyVStackMock.swift",
    "content": "//\n\nimport SwiftUI\n\npublic struct LazyVStackMock<Content: View>: View {\n  let alignment: HorizontalAlignment\n  let spacing: CGFloat?\n  let pinnedViews: PinnedScrollableViews\n  let content: Content\n\n  public init(\n    alignment: HorizontalAlignment = .center,\n    spacing: CGFloat? = nil,\n    pinnedViews: PinnedScrollableViews = .init(),\n    @ViewBuilder content: () -> Content\n  ) {\n    self.alignment = alignment\n    self.spacing = spacing\n    self.pinnedViews = pinnedViews\n    self.content = content()\n  }\n\n  public var body: some View {\n    LazyVGrid(\n      columns: [GridItem(.flexible())],\n      alignment: alignment,\n      spacing: spacing,\n      pinnedViews: pinnedViews,\n      content: { content }\n    )\n  }\n}\n"
  },
  {
    "path": "Stack-vs-Grid/LazyStacks/LazyStacks.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t64998CF92522334B00DA960A /* LazyStacksApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64998CF82522334B00DA960A /* LazyStacksApp.swift */; };\n\t\t64998CFB2522334B00DA960A /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64998CFA2522334B00DA960A /* ContentView.swift */; };\n\t\t64998D0C2522338000DA960A /* Label.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64998D0B2522338000DA960A /* Label.swift */; };\n\t\t64998D0F252233A600DA960A /* LazyVStackMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64998D0E252233A600DA960A /* LazyVStackMock.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t64998CF52522334B00DA960A /* LazyStacks.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LazyStacks.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t64998CF82522334B00DA960A /* LazyStacksApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LazyStacksApp.swift; sourceTree = \"<group>\"; };\n\t\t64998CFA2522334B00DA960A /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = \"<group>\"; };\n\t\t64998D012522334C00DA960A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t64998D0B2522338000DA960A /* Label.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Label.swift; sourceTree = \"<group>\"; };\n\t\t64998D0E252233A600DA960A /* LazyVStackMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LazyVStackMock.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t64998CF22522334B00DA960A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t64998CEC2522334B00DA960A = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64998CF72522334B00DA960A /* LazyStacks */,\n\t\t\t\t64998CF62522334B00DA960A /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t64998CF62522334B00DA960A /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64998CF52522334B00DA960A /* LazyStacks.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t64998CF72522334B00DA960A /* LazyStacks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64998CFA2522334B00DA960A /* ContentView.swift */,\n\t\t\t\t64998D0B2522338000DA960A /* Label.swift */,\n\t\t\t\t64998CF82522334B00DA960A /* LazyStacksApp.swift */,\n\t\t\t\t64998D0E252233A600DA960A /* LazyVStackMock.swift */,\n\t\t\t\t64998D012522334C00DA960A /* Info.plist */,\n\t\t\t);\n\t\t\tpath = LazyStacks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t64998CF42522334B00DA960A /* LazyStacks */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 64998D042522334C00DA960A /* Build configuration list for PBXNativeTarget \"LazyStacks\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t64998CF12522334B00DA960A /* Sources */,\n\t\t\t\t64998CF22522334B00DA960A /* Frameworks */,\n\t\t\t\t64998CF32522334B00DA960A /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = LazyStacks;\n\t\t\tproductName = LazyStacks;\n\t\t\tproductReference = 64998CF52522334B00DA960A /* LazyStacks.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t64998CED2522334B00DA960A /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 1200;\n\t\t\t\tLastUpgradeCheck = 1200;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t64998CF42522334B00DA960A = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 12.0.1;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 64998CF02522334B00DA960A /* Build configuration list for PBXProject \"LazyStacks\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 64998CEC2522334B00DA960A;\n\t\t\tproductRefGroup = 64998CF62522334B00DA960A /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t64998CF42522334B00DA960A /* LazyStacks */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t64998CF32522334B00DA960A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t64998CF12522334B00DA960A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t64998CFB2522334B00DA960A /* ContentView.swift in Sources */,\n\t\t\t\t64998D0F252233A600DA960A /* LazyVStackMock.swift in Sources */,\n\t\t\t\t64998CF92522334B00DA960A /* LazyStacksApp.swift in Sources */,\n\t\t\t\t64998D0C2522338000DA960A /* Label.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t64998D022522334C00DA960A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t64998D032522334C00DA960A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t64998D052522334C00DA960A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tINFOPLIST_FILE = LazyStacks/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = blog.fivestars.LazyStacks;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t64998D062522334C00DA960A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tINFOPLIST_FILE = LazyStacks/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = blog.fivestars.LazyStacks;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t64998CF02522334B00DA960A /* Build configuration list for PBXProject \"LazyStacks\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t64998D022522334C00DA960A /* Debug */,\n\t\t\t\t64998D032522334C00DA960A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t64998D042522334C00DA960A /* Build configuration list for PBXNativeTarget \"LazyStacks\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t64998D052522334C00DA960A /* Debug */,\n\t\t\t\t64998D062522334C00DA960A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 64998CED2522334B00DA960A /* Project object */;\n}\n"
  },
  {
    "path": "Stack-vs-Grid/LazyStacks/LazyStacks.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Stack-vs-Grid/LazyStacks/LazyStacks.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Stack-vs-Grid/README.md",
    "content": "Final code snippet from [Lazy stacks secrets][fs].\n\n![][gif]\n\n[fs]: https://fivestars.blog/swiftui/lazy-stack-grid.html\n\n[gif]: final.gif\n"
  },
  {
    "path": "SwiftUI-Clipping/Clipping/Clipping/ClippingApp.swift",
    "content": "import SwiftUI\n\n@main\nstruct ClippingApp: App {\n  var body: some Scene {\n    WindowGroup {\n      ContentView()\n    }\n  }\n}\n"
  },
  {
    "path": "SwiftUI-Clipping/Clipping/Clipping/ContentView.swift",
    "content": "import SwiftUI\n\nstruct ContentView: View {\n  var body: some View {\n    NavigationView {\n      List {\n        Section(\"Introduction\") {\n          NavigationLink(\"no clip\", destination: FSView0())\n        }\n        Section(\"Clipping\") {\n          NavigationLink(\"clipped()\", destination: FSView1())\n          NavigationLink(\"cornerRadius(:)\", destination: FSView2())\n          NavigationLink(\"clipShape(Circle())\", destination: FSView3())\n          NavigationLink(\"clipShape(Star())\", destination: FSView4())\n          NavigationLink(\"clipShape + even-odd rule\", destination: FSView7())\n          NavigationLink(\"clipShape + animation\", destination: FSView8())\n        }\n        Section(\"Shapes\") {\n          NavigationLink(\"DoubleEllipse\", destination: FSView5())\n          NavigationLink(\"DoubleEllipse even-odd rule\", destination: FSView6())\n        }\n      }\n      .navigationTitle(\"View Clipping\")\n    }\n  }\n}\n"
  },
  {
    "path": "SwiftUI-Clipping/Clipping/Clipping/FSViews.swift",
    "content": "import SwiftUI\n\nstruct FSView0: View {\n  var body: some View {\n    Text(\"Five stars\")\n      .background(Color.yellow)\n      .font(.system(size: 90))\n      .fixedSize()\n      .border(Color.blue)\n      .frame(width: 200, height: 100)\n      .border(Color.red)\n  }\n}\n\nstruct FSView1: View {\n  var body: some View {\n    Text(\"Five stars\")\n      .background(Color.yellow)\n      .font(.system(size: 90))\n      .fixedSize()\n      .border(Color.blue)\n      .frame(width: 200, height: 100)\n      .border(Color.red)\n      .clipped()\n  }\n}\n\nstruct FSView2: View {\n  @State var cornerRadius: Double = 16\n\n  var body: some View {\n    VStack {\n      Text(\"Five stars\")\n        .background(Color.yellow)\n        .font(.system(size: 90))\n        .fixedSize()\n        .frame(width: 200, height: 100)\n        .cornerRadius(cornerRadius)\n      HStack {\n        Text(\"Corner radius\")\n        Slider(value: $cornerRadius, in: 0...50)\n      }\n    }\n    .padding()\n  }\n}\n\nstruct FSView3: View {\n  var body: some View {\n      Text(\"Five stars\")\n        .background(Color.yellow)\n        .font(.system(size: 90))\n        .fixedSize()\n        .frame(width: 200, height: 100)\n        .clipShape(Circle())\n  }\n}\n\nstruct FSView4: View {\n  @State var points: Int = 5\n  @State var angle: Double = 53\n\n  var body: some View {\n    VStack {\n      Text(\"Five stars\")\n        .background(Color.yellow)\n        .font(.system(size: 90))\n        .fixedSize()\n        .frame(width: 200, height: 100)\n        .clipShape(Star(points: points).rotation(.degrees(angle)))\n      Stepper(\"Star points\", value: $points, in: 2...16)\n      HStack {\n        Text(\"Rotation Angle\")\n        Slider(value: $angle, in: 0.0...360.0)\n      }\n    }\n    .padding()\n  }\n}\n\nstruct FSView5: View {\n  @State var overlapping: Double = 0.1\n\n  var body: some View {\n    VStack {\n      DoubleEllipse(overlapping: overlapping)\n        .frame(width: 300, height: 100)\n      HStack {\n        Text(\"Overlapping\")\n        Slider(value: $overlapping, in: 0.0...1.0)\n      }\n    }\n    .padding()\n  }\n}\n\nstruct FSView6: View {\n  @State var overlapping: Double = 0.1\n\n  var body: some View {\n    VStack {\n      DoubleEllipse(overlapping: overlapping)\n        .fill(style: FillStyle(eoFill: true, antialiased: true))\n        .frame(width: 300, height: 100)\n      HStack {\n        Text(\"Overlapping\")\n        Slider(value: $overlapping, in: 0.0...1.0)\n      }\n    }\n    .padding()\n  }\n}\n\nstruct FSView7: View {\n  @State var ellipsesNumber: Int = 8\n  @State var overlapping: Double = 0\n\n  var body: some View {\n    VStack {\n        Text(\"Five stars\")\n          .background(Color.yellow)\n          .font(.system(size: 80))\n          .clipShape(\n            OverlappingEllipses(ellipsesNumber: ellipsesNumber, overlapping: overlapping),\n            style: FillStyle(eoFill: true, antialiased: false)\n          )\n      Stepper(\"Ellipses number:\", value: $ellipsesNumber, in: 2...16)\n      HStack {\n        Text(\"Overlapping\")\n        Slider(value: $overlapping, in: 0.0...1.0)\n      }\n    }\n    .padding()\n  }\n}\n\nstruct FSView8: View {\n  @State var shapeNumber: Int = 8\n  @State var overlapping: Double = 0\n\n  var body: some View {\n    VStack(spacing: 16) {\n        Text(\"Five stars\")\n          .background(Color.yellow)\n          .font(.system(size: 80))\n          .clipShape(\n            OverlappingEllipses(\n              ellipsesNumber: shapeNumber, overlapping: overlapping),\n            style: FillStyle(eoFill: true, antialiased: false)\n          )\n\n      Text(\"Five stars\")\n        .background(Color.yellow)\n        .font(.system(size: 80))\n        .clipShape(\n          OverlappingRectangles(rectanglesNumber: shapeNumber, overlapping: overlapping),\n          style: FillStyle(eoFill: true, antialiased: false)\n        )\n\n      Button(\"Show/Hide\") {\n        withAnimation(.easeInOut(duration: 2)) {\n          overlapping = overlapping == 1 ? 0 : 1\n        }\n      }\n    }\n    .padding()\n  }\n}\n"
  },
  {
    "path": "SwiftUI-Clipping/Clipping/Clipping/Shapes.swift",
    "content": "import SwiftUI\n\nstruct Star: Shape {\n  @Clamping(0...Int.max) var points: Int = 5\n  var innerRatio = 0.4\n\n  func path(in rect : CGRect) -> Path {\n    let center = CGPoint(x: rect.midX, y: rect.midY)\n    let angle: Double = .pi / Double(points)\n    var path = Path()\n    var startPoint: CGPoint = rect.origin\n\n    let outerRadius = min(rect.width / 2, rect.height / 2)\n    let innerRadius = outerRadius * innerRatio\n\n    let maxCorners = 2 * points\n    for corner in 0 ..< maxCorners {\n      let radius = (corner % 2) == 0 ? outerRadius : innerRadius\n\n      let x = center.x + cos(Double(corner) * angle) * radius\n      let y = center.y + sin(Double(corner) * angle) * radius\n      let point = CGPoint(x: x, y: y)\n\n      if corner == 0 {\n        startPoint = point\n        path.move(to: point)\n      } else {\n        path.addLine(to: point)\n      }\n      if corner == (maxCorners - 1) {\n        path.addLine(to: startPoint)\n      }\n    }\n    return path\n  }\n}\n\nstruct DoubleEllipse: Shape {\n  /// 1 = complete overlap\n  /// 0 = no overlap\n  @Clamping(0.0...1.0) var overlapping: Double = 0\n\n  func path(in rect: CGRect) -> Path {\n    let rectSize = CGSize(width: (rect.width / 2) * (1 + overlapping), height: rect.height)\n\n    var path = Path()\n    path.addEllipse(in: CGRect(origin: .zero, size: rectSize))\n    let secondEllipseOrigin = CGPoint(x: (rect.width / 2) * (1 - overlapping), y: rect.origin.y)\n    path.addEllipse(in: CGRect(origin: secondEllipseOrigin, size: rectSize))\n\n    return path\n  }\n}\n\nstruct OverlappingEllipses: Shape {\n  @Clamping(1...Int.max) var ellipsesNumber: Int = 2\n  @Clamping(0.0...1.0) var overlapping: Double = 0\n\n  var animatableData: CGFloat {\n    get { overlapping }\n    set { overlapping = newValue }\n  }\n\n  func path(in rect: CGRect) -> Path {\n    let rectWidth = (rect.width / Double(ellipsesNumber)) * (1 + Double(ellipsesNumber - 1) * overlapping)\n    let rectSize = CGSize(width: rectWidth, height: rect.height)\n\n    var path = Path()\n    for index in 0..<ellipsesNumber {\n      let ellipseOrigin = CGPoint(x: (rect.width - rectWidth) * Double(index) / Double(ellipsesNumber - 1), y: rect.origin.y)\n      path.addEllipse(in: CGRect(origin: ellipseOrigin, size: rectSize))\n    }\n\n    return path\n  }\n}\n\nstruct OverlappingRectangles: Shape {\n  @Clamping(1...Int.max) var rectanglesNumber: Int = 2\n  @Clamping(0.0...1.0) var overlapping: Double = 0\n\n  var animatableData: CGFloat {\n    get { overlapping }\n    set { overlapping = newValue }\n  }\n\n  func path(in rect: CGRect) -> Path {\n    let rectWidth = (rect.width / Double(rectanglesNumber)) * (1 + Double(rectanglesNumber - 1) * overlapping)\n    let rectSize = CGSize(width: rectWidth, height: rect.height)\n\n    var path = Path()\n    for index in 0..<rectanglesNumber {\n      let ellipseOrigin = CGPoint(x: (rect.width - rectWidth) * Double(index) / Double(rectanglesNumber - 1), y: rect.origin.y)\n      path.addRect(CGRect(origin: ellipseOrigin, size: rectSize))\n    }\n\n    return path\n  }\n}\n"
  },
  {
    "path": "SwiftUI-Clipping/Clipping/Clipping/propertyWrapper+Clamping.swift",
    "content": "@propertyWrapper\npublic struct Clamping<Value: Comparable> {\n  var value: Value\n  let range: ClosedRange<Value>\n\n  public init(wrappedValue: Value, _ range: ClosedRange<Value>) {\n    precondition(range.contains(wrappedValue))\n    self.range = range\n    self.value = wrappedValue\n  }\n\n  public var wrappedValue: Value {\n    get { value }\n    set { value = min(max(range.lowerBound, newValue), range.upperBound) }\n  }\n}\n"
  },
  {
    "path": "SwiftUI-Clipping/Clipping/Clipping.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 55;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t6458843C26DB583C00667211 /* ClippingApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6458843B26DB583C00667211 /* ClippingApp.swift */; };\n\t\t6458843E26DB583C00667211 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6458843D26DB583C00667211 /* ContentView.swift */; };\n\t\t6458844B26DB58A100667211 /* FSViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6458844A26DB58A100667211 /* FSViews.swift */; };\n\t\t6458844D26DB58CF00667211 /* propertyWrapper+Clamping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6458844C26DB58CF00667211 /* propertyWrapper+Clamping.swift */; };\n\t\t6458844F26DB590300667211 /* Shapes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6458844E26DB590300667211 /* Shapes.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t6458843826DB583C00667211 /* Clipping.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Clipping.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t6458843B26DB583C00667211 /* ClippingApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClippingApp.swift; sourceTree = \"<group>\"; };\n\t\t6458843D26DB583C00667211 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = \"<group>\"; };\n\t\t6458844A26DB58A100667211 /* FSViews.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FSViews.swift; sourceTree = \"<group>\"; };\n\t\t6458844C26DB58CF00667211 /* propertyWrapper+Clamping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"propertyWrapper+Clamping.swift\"; sourceTree = \"<group>\"; };\n\t\t6458844E26DB590300667211 /* Shapes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Shapes.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t6458843526DB583C00667211 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t6458842F26DB583C00667211 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6458843A26DB583C00667211 /* Clipping */,\n\t\t\t\t6458843926DB583C00667211 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6458843926DB583C00667211 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6458843826DB583C00667211 /* Clipping.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6458843A26DB583C00667211 /* Clipping */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6458843B26DB583C00667211 /* ClippingApp.swift */,\n\t\t\t\t6458843D26DB583C00667211 /* ContentView.swift */,\n\t\t\t\t6458844E26DB590300667211 /* Shapes.swift */,\n\t\t\t\t6458844C26DB58CF00667211 /* propertyWrapper+Clamping.swift */,\n\t\t\t\t6458844A26DB58A100667211 /* FSViews.swift */,\n\t\t\t);\n\t\t\tpath = Clipping;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t6458843726DB583C00667211 /* Clipping */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 6458844626DB583D00667211 /* Build configuration list for PBXNativeTarget \"Clipping\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t6458843426DB583C00667211 /* Sources */,\n\t\t\t\t6458843526DB583C00667211 /* Frameworks */,\n\t\t\t\t6458843626DB583C00667211 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Clipping;\n\t\t\tproductName = Clipping;\n\t\t\tproductReference = 6458843826DB583C00667211 /* Clipping.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t6458843026DB583C00667211 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = 1;\n\t\t\t\tLastSwiftUpdateCheck = 1300;\n\t\t\t\tLastUpgradeCheck = 1300;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t6458843726DB583C00667211 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.0;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 6458843326DB583C00667211 /* Build configuration list for PBXProject \"Clipping\" */;\n\t\t\tcompatibilityVersion = \"Xcode 13.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 6458842F26DB583C00667211;\n\t\t\tproductRefGroup = 6458843926DB583C00667211 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t6458843726DB583C00667211 /* Clipping */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t6458843626DB583C00667211 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t6458843426DB583C00667211 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t6458844D26DB58CF00667211 /* propertyWrapper+Clamping.swift in Sources */,\n\t\t\t\t6458844B26DB58A100667211 /* FSViews.swift in Sources */,\n\t\t\t\t6458844F26DB590300667211 /* Shapes.swift in Sources */,\n\t\t\t\t6458843E26DB583C00667211 /* ContentView.swift in Sources */,\n\t\t\t\t6458843C26DB583C00667211 /* ClippingApp.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t6458844426DB583D00667211 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t6458844526DB583D00667211 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t6458844726DB583D00667211 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;\n\t\t\t\tINFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;\n\t\t\t\tINFOPLIST_KEY_UILaunchScreen_Generation = YES;\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = \"UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = \"UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = blog.fivestars.Clipping;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t6458844826DB583D00667211 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;\n\t\t\t\tINFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;\n\t\t\t\tINFOPLIST_KEY_UILaunchScreen_Generation = YES;\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = \"UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = \"UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = blog.fivestars.Clipping;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t6458843326DB583C00667211 /* Build configuration list for PBXProject \"Clipping\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t6458844426DB583D00667211 /* Debug */,\n\t\t\t\t6458844526DB583D00667211 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t6458844626DB583D00667211 /* Build configuration list for PBXNativeTarget \"Clipping\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t6458844726DB583D00667211 /* Debug */,\n\t\t\t\t6458844826DB583D00667211 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 6458843026DB583C00667211 /* Project object */;\n}\n"
  },
  {
    "path": "SwiftUI-Clipping/Clipping/Clipping.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "SwiftUI-Clipping/Clipping/Clipping.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "SwiftUI-Clipping/README.md",
    "content": "Companion app of [View clipping in SwiftUI][fs].\n\n![][gif]\n\n[fs]: https://fivestars.blog/articles/swiftui-clipping/\n[gif]: animation.mp4\n"
  },
  {
    "path": "SwiftUI-HUD/README.md",
    "content": "Code snippets from [Custom HUD in SwiftUI][fs].\n\n![][gif]\n\n[fs]: https://fivestars.blog/swiftui/swiftui-hud.html\n[gif]: HUD.gif\n"
  },
  {
    "path": "SwiftUI-HUD/global.swift",
    "content": "//\n\nimport SwiftUI\n\n@main\nstruct FiveStarsApp: App {\n  @StateObject var hudState = HUDState()\n\n  var body: some Scene {\n    WindowGroup {\n      ContentView()\n        .hud(isPresented: $hudState.isPresented) {\n          Label(hudState.title, systemImage: hudState.systemImage)\n        }\n        .environmentObject(hudState)\n    }\n  }\n}\n\nfinal class HUDState: ObservableObject {\n  @Published var isPresented: Bool = false\n  private(set) var title: String = \"\"\n  private(set) var systemImage: String = \"\"\n\n  func show(title: String, systemImage: String) {\n    self.title = title\n    self.systemImage = systemImage\n    withAnimation {\n      isPresented = true\n    }\n  }\n}\n\nstruct ContentView: View {\n  @EnvironmentObject private var hud: HUDState\n\n  var body: some View {\n    NavigationView {\n      Button(\"Show/hide HUD\") {\n        hud.show(title: \"Five stars\", systemImage: \"star.fill\")\n      }\n    }\n  }\n}\n\nextension View {\n  func hud<Content: View>(\n    isPresented: Binding<Bool>,\n    @ViewBuilder content: () -> Content\n  ) -> some View {\n    ZStack(alignment: .top) {\n      self\n      if isPresented.wrappedValue {\n        HUD(content: content)\n          .transition(AnyTransition.move(edge: .top).combined(with: .opacity))\n          .onAppear {\n            DispatchQueue.main.asyncAfter(deadline: .now() + 3) {\n              withAnimation {\n                isPresented.wrappedValue = false\n              }\n            }\n          }\n          .zIndex(1)\n      }\n    }\n  }\n}\n\nstruct HUD<Content: View>: View {\n  @ViewBuilder let content: Content\n\n  var body: some View {\n    content\n      .padding(.horizontal, 12)\n      .padding(16)\n      .background(\n        Capsule()\n          .foregroundColor(Color.white)\n          .shadow(color: Color(.black).opacity(0.16), radius: 12, x: 0, y: 5)\n      )\n  }\n}\n"
  },
  {
    "path": "SwiftUI-HUD/local.swift",
    "content": "//\n\nimport SwiftUI\n\nstruct ContentView: View {\n  @State private var showingHUD = false\n\n  var body: some View {\n    NavigationView {\n      VStack {\n        Button(\"Show/hide HUD\") {\n          withAnimation {\n            showingHUD.toggle()\n          }\n        }\n      }\n      .navigationTitle(\"Content View\")\n    }\n    .hud(isPresented: $showingHUD) {\n      Label(\"Five stars\", systemImage: \"star.fill\")\n    }\n  }\n}\n\nextension View {\n  func hud<Content: View>(\n    isPresented: Binding<Bool>,\n    @ViewBuilder content: () -> Content\n  ) -> some View {\n    ZStack(alignment: .top) {\n      self\n      if isPresented.wrappedValue {\n        HUD(content: content)\n          .transition(AnyTransition.move(edge: .top).combined(with: .opacity))\n          .onAppear {\n            DispatchQueue.main.asyncAfter(deadline: .now() + 3) {\n              withAnimation {\n                isPresented.wrappedValue = false\n              }\n            }\n          }\n          .zIndex(1)\n      }\n    }\n  }\n}\n\nstruct HUD<Content: View>: View {\n  @ViewBuilder let content: Content\n\n  var body: some View {\n    content\n      .padding(.horizontal, 12)\n      .padding(16)\n      .background(\n        Capsule()\n          .foregroundColor(Color.white)\n          .shadow(color: Color(.black).opacity(0.16), radius: 12, x: 0, y: 5)\n      )\n  }\n}\n"
  },
  {
    "path": "SwiftUI-Masking/Masking/Masking/ContentView.swift",
    "content": "import SwiftUI\n\nstruct ContentView: View {\n  var body: some View {\n    NavigationView {\n      List {\n        Section(\"Masking\") {\n          NavigationLink(\"Alignment\", destination: FSView1())\n          NavigationLink(\"Views as masks\", destination: FSView2())\n          NavigationLink(\"Content bleeding\", destination: FSView3())\n          NavigationLink(\"Opacity gradient\", destination: FSView4())\n          NavigationLink(\"List + no mask\", destination: FSView5())\n          NavigationLink(\"List + fade\", destination: FSView6())\n          NavigationLink(\"List + blur\", destination: FSView7())\n        }\n      }\n      .navigationTitle(\"View Masking\")\n    }\n  }\n}\n"
  },
  {
    "path": "SwiftUI-Masking/Masking/Masking/FSViews.swift",
    "content": "import SwiftUI\n\nstruct FSView1: View {\n  private let alignments: [Alignment] = [\n    .center, .leading, .trailing, .top, .bottom, .topLeading, .topTrailing, .bottomLeading, .bottomTrailing\n  ]\n  @State var alignment: Alignment = .center\n\n  var body: some View {\n    VStack {\n      Color.yellow\n        .frame(width: 200, height: 200)\n        .mask(alignment: alignment) {\n          Rectangle()\n            .frame(width: 60, height: 60)\n        }\n        .border(.red)\n\n      Button(\"Random alignment\") {\n        withAnimation {\n          alignment = alignments.filter { $0 != alignment } .randomElement()!\n        }\n      }\n    }\n  }\n}\n\nstruct FSView2: View {\n  var body: some View {\n    Color.yellow\n      .frame(width: 200, height: 200)\n      .mask {\n        Text(\"MASK\")\n          .fontWeight(.black)\n          .font(.system(size: 60))\n      }\n      .border(Color.red)\n  }\n}\n\nstruct FSView3: View {\n  var body: some View {\n    Color.yellow\n      .frame(width: 300, height: 300)\n      .frame(width: 200, height: 200)\n      .mask {\n        Text(\"MASK\")\n          .fontWeight(.black)\n          .font(.system(size: 80))\n          .fixedSize() // 👈🏻 Ignores the proposed 200x200 points size\n      }\n      .border(Color.red)\n  }\n}\n\nstruct FSView4: View {\n  var body: some View {\n    Color.yellow\n      .frame(width: 200, height: 200)\n      .mask {\n        LinearGradient(colors: [.clear, .black, .clear], startPoint: .leading, endPoint: .trailing)\n      }\n      .border(Color.red)\n  }\n}\n\nstruct FSView5: View {\n  var body: some View {\n    ScrollView {\n      ForEach(1..<30) { _ in\n        Text(\"Five Stars\")\n          .font(.largeTitle)\n      }\n      .frame(maxWidth: .infinity)\n    }\n    .safeAreaInset(edge: .bottom) {\n      Button { } label: {\n        Text(\"Continue\")\n          .frame(maxWidth: .infinity)\n      }\n      .buttonStyle(.borderedProminent)\n      .controlSize(.large)\n      .padding(.horizontal)\n    }\n  }\n}\n\nstruct FSView6: View {\n  var body: some View {\n    ScrollView {\n      ForEach(1..<30) { _ in\n        Text(\"Five Stars\")\n          .font(.largeTitle)\n      }\n      .frame(maxWidth: .infinity)\n    }\n    .safeAreaInset(edge: .bottom) {\n      Button { } label: {\n        Text(\"Continue\")\n          .frame(maxWidth: .infinity)\n      }\n      .buttonStyle(.borderedProminent)\n      .controlSize(.large)\n      .padding(.horizontal)\n      .background {\n        Color(uiColor: .systemBackground)\n          .mask(alignment: .top) {\n            VStack(spacing: 0) {\n              LinearGradient(\n                stops: [\n                  Gradient.Stop(color: .clear, location: .zero),\n                  Gradient.Stop(color: .black, location: 1.0)\n                ],\n                startPoint: .top,\n                endPoint: .bottom\n              )\n              .frame(height: 32)\n              Color.black\n            }\n          }\n          .padding(.top, -32)\n          .ignoresSafeArea(.all, edges: .bottom)\n      }\n    }\n  }\n}\n\nstruct FSView7: View {\n  var body: some View {\n    ScrollView {\n      ForEach(1..<30) { _ in\n        Text(\"Five Stars\")\n          .font(.largeTitle)\n      }\n      .frame(maxWidth: .infinity)\n    }\n    .safeAreaInset(edge: .bottom) {\n      Button { } label: {\n        Text(\"Continue\")\n          .frame(maxWidth: .infinity)\n      }\n      .buttonStyle(.borderedProminent)\n      .controlSize(.large)\n      .padding(.horizontal)\n      .background {\n        Color.clear\n          .background(.ultraThinMaterial)\n          .mask(alignment: .top) {\n            VStack(spacing: 0) {\n              LinearGradient(\n                stops: [\n                  Gradient.Stop(color: .clear, location: .zero),\n                  Gradient.Stop(color: .black, location: 1.0)\n                ],\n                startPoint: .top,\n                endPoint: .bottom\n              )\n              .frame(height: 32)\n              Color.black\n            }\n          }\n          .padding(.top, -32)\n          .ignoresSafeArea(.all, edges: .bottom)\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "SwiftUI-Masking/Masking/Masking/MaskingApp.swift",
    "content": "import SwiftUI\n\n@main\nstruct MaskingApp: App {\n  var body: some Scene {\n    WindowGroup {\n      ContentView()\n    }\n  }\n}\n"
  },
  {
    "path": "SwiftUI-Masking/Masking/Masking.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 55;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t6458843C26DB583C00667211 /* MaskingApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6458843B26DB583C00667211 /* MaskingApp.swift */; };\n\t\t6458843E26DB583C00667211 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6458843D26DB583C00667211 /* ContentView.swift */; };\n\t\t6458844B26DB58A100667211 /* FSViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6458844A26DB58A100667211 /* FSViews.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t6458843826DB583C00667211 /* Masking.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Masking.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t6458843B26DB583C00667211 /* MaskingApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MaskingApp.swift; sourceTree = \"<group>\"; };\n\t\t6458843D26DB583C00667211 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = \"<group>\"; };\n\t\t6458844A26DB58A100667211 /* FSViews.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FSViews.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t6458843526DB583C00667211 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t6458842F26DB583C00667211 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6458843A26DB583C00667211 /* Masking */,\n\t\t\t\t6458843926DB583C00667211 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6458843926DB583C00667211 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6458843826DB583C00667211 /* Masking.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6458843A26DB583C00667211 /* Masking */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6458843B26DB583C00667211 /* MaskingApp.swift */,\n\t\t\t\t6458843D26DB583C00667211 /* ContentView.swift */,\n\t\t\t\t6458844A26DB58A100667211 /* FSViews.swift */,\n\t\t\t);\n\t\t\tpath = Masking;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t6458843726DB583C00667211 /* Masking */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 6458844626DB583D00667211 /* Build configuration list for PBXNativeTarget \"Masking\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t6458843426DB583C00667211 /* Sources */,\n\t\t\t\t6458843526DB583C00667211 /* Frameworks */,\n\t\t\t\t6458843626DB583C00667211 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Masking;\n\t\t\tproductName = Masking;\n\t\t\tproductReference = 6458843826DB583C00667211 /* Masking.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t6458843026DB583C00667211 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = 1;\n\t\t\t\tLastSwiftUpdateCheck = 1300;\n\t\t\t\tLastUpgradeCheck = 1300;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t6458843726DB583C00667211 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.0;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 6458843326DB583C00667211 /* Build configuration list for PBXProject \"Masking\" */;\n\t\t\tcompatibilityVersion = \"Xcode 13.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 6458842F26DB583C00667211;\n\t\t\tproductRefGroup = 6458843926DB583C00667211 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t6458843726DB583C00667211 /* Masking */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t6458843626DB583C00667211 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t6458843426DB583C00667211 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t6458844B26DB58A100667211 /* FSViews.swift in Sources */,\n\t\t\t\t6458843E26DB583C00667211 /* ContentView.swift in Sources */,\n\t\t\t\t6458843C26DB583C00667211 /* MaskingApp.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t6458844426DB583D00667211 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t6458844526DB583D00667211 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t6458844726DB583D00667211 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;\n\t\t\t\tINFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;\n\t\t\t\tINFOPLIST_KEY_UILaunchScreen_Generation = YES;\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = \"UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = \"UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = blog.fivestars.Masking;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t6458844826DB583D00667211 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;\n\t\t\t\tINFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;\n\t\t\t\tINFOPLIST_KEY_UILaunchScreen_Generation = YES;\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = \"UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = \"UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = blog.fivestars.Masking;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t6458843326DB583C00667211 /* Build configuration list for PBXProject \"Masking\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t6458844426DB583D00667211 /* Debug */,\n\t\t\t\t6458844526DB583D00667211 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t6458844626DB583D00667211 /* Build configuration list for PBXNativeTarget \"Masking\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t6458844726DB583D00667211 /* Debug */,\n\t\t\t\t6458844826DB583D00667211 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 6458843026DB583C00667211 /* Project object */;\n}\n"
  },
  {
    "path": "SwiftUI-Masking/Masking/Masking.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "SwiftUI-Masking/Masking/Masking.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "SwiftUI-Masking/README.md",
    "content": "Companion app of [View masking in SwiftUI][fs].\n\n[fs]: https://fivestars.blog/articles/swiftui-masking/\n"
  },
  {
    "path": "SwiftUI-Reverse-Mask/README.md",
    "content": "Companion app of [How to apply a reverse mask in SwiftUI][fs].\n\n[fs]: https://fivestars.blog/articles/reverse-masks-how-to/"
  },
  {
    "path": "SwiftUI-Reverse-Mask/Reverse-Masking/Reverse-Masking/ContentView.swift",
    "content": "import SwiftUI\n\nstruct ContentView: View {\n  var body: some View {\n    NavigationView {\n      List {\n        Section(\"Reverse masking\") {\n          NavigationLink(\"Star Mask\", destination: FSView1())\n          NavigationLink(\"Text Mask\", destination: FSView2())\n          NavigationLink(\"Fading effect\", destination: FSView3())\n        }\n        Section(\"Blending\") {\n          NavigationLink(\"Rectangle vs Circle\", destination: FSView4())\n          NavigationLink(\"Fade effect vs Circle\", destination: FSView5())\n        }\n      }\n      .navigationTitle(\"View Masking\")\n    }\n  }\n}\n"
  },
  {
    "path": "SwiftUI-Reverse-Mask/Reverse-Masking/Reverse-Masking/FSViews.swift",
    "content": "import SwiftUI\n\nstruct FSView1: View {\n  var body: some View {\n    HStack {\n      Color.yellow\n        .frame(width: 200, height: 200)\n        .mask {\n          Star()\n        }\n        .border(.red)\n\n      Color.yellow\n        .frame(width: 200, height: 200)\n        .reverseMask {\n          Star()\n        }\n        .border(.red)\n    }\n    .padding()\n  }\n}\n\nstruct FSView2: View {\n  var body: some View {\n    HStack {\n      Color.yellow\n        .frame(width: 200, height: 200)\n        .mask {\n          Text(\"MASK\")\n            .font(.system(size: 60).weight(.black))\n        }\n        .border(.red)\n\n      Color.yellow\n        .frame(width: 200, height: 200)\n        .reverseMask {\n          Text(\"MASK\")\n            .font(.system(size: 60).weight(.black))\n        }\n        .border(.red)\n    }\n    .padding()\n  }\n}\n\nstruct FSView3: View {\n  var body: some View {\n    HStack {\n      Color.yellow\n        .frame(width: 200, height: 200)\n        .mask {\n          LinearGradient(\n            colors: [.clear, .black],\n            startPoint: .leading, endPoint: .trailing\n          )\n        }\n        .border(.red)\n      \n      Color.yellow\n        .frame(width: 200, height: 200)\n        .reverseMask {\n          LinearGradient(\n            colors: [.clear, .black],\n            startPoint: .leading, endPoint: .trailing\n          )\n        }\n        .border(.red)\n    }\n    .padding()\n  }\n}\n\nstruct FSView4: View {\n  var body: some View {\n    HStack {\n      ZStack {\n        Rectangle() // destination\n        Circle()    // source\n          .blendMode(.destinationOut)\n      }\n      .compositingGroup()\n      .frame(width: 200, height: 200)\n      .border(.red)\n\n      ZStack {\n        Circle()    // destination\n        Rectangle() // source\n          .blendMode(.destinationOut)\n      }\n      .compositingGroup()\n      .frame(width: 200, height: 200)\n      .border(.red)\n    }\n    .padding()\n  }\n}\n\nstruct FSView5: View {\n  var body: some View {\n    HStack {\n      ZStack {\n        LinearGradient(\n          colors: [.clear, .black],\n          startPoint: .leading, endPoint: .trailing\n        )           // destination\n        Circle()    // source\n          .blendMode(.destinationOut)\n      }\n      .compositingGroup()\n      .frame(width: 200, height: 200)\n      .border(.red)\n\n      ZStack {\n        Circle()    // destination\n        LinearGradient(\n          colors: [.clear, .black],\n          startPoint: .leading, endPoint: .trailing\n        )           // source\n        .blendMode(.destinationOut)\n      }\n      .compositingGroup()\n      .frame(width: 200, height: 200)\n      .border(.red)\n    }\n    .padding()\n  }\n}\n"
  },
  {
    "path": "SwiftUI-Reverse-Mask/Reverse-Masking/Reverse-Masking/ReverseMaskingApp.swift",
    "content": "import SwiftUI\n\n@main\nstruct ReverseMaskingApp: App {\n  var body: some Scene {\n    WindowGroup {\n      ContentView()\n    }\n  }\n}\n"
  },
  {
    "path": "SwiftUI-Reverse-Mask/Reverse-Masking/Reverse-Masking/Star.swift",
    "content": "//\n\nimport SwiftUI\n\nstruct Star: Shape {\n  @Clamping(0...Int.max) var points: Int = 5\n  var innerRatio = 0.4\n\n  func path(in rect : CGRect) -> Path {\n    let center = CGPoint(x: rect.midX, y: rect.midY)\n    let angle: Double = .pi / Double(points)\n    var path = Path()\n    var startPoint: CGPoint = rect.origin\n\n    let outerRadius = min(rect.width / 2, rect.height / 2)\n    let innerRadius = outerRadius * innerRatio\n\n    let maxCorners = 2 * points\n    for corner in 0 ..< maxCorners {\n      let radius = (corner % 2) == 0 ? outerRadius : innerRadius\n\n      let x = center.x + cos(Double(corner) * angle) * radius\n      let y = center.y + sin(Double(corner) * angle) * radius\n      let point = CGPoint(x: x, y: y)\n\n      if corner == 0 {\n        startPoint = point\n        path.move(to: point)\n      } else {\n        path.addLine(to: point)\n      }\n      if corner == (maxCorners - 1) {\n        path.addLine(to: startPoint)\n      }\n    }\n    return path\n  }\n}\n\n@propertyWrapper\npublic struct Clamping<Value: Comparable> {\n  var value: Value\n  let range: ClosedRange<Value>\n\n  public init(wrappedValue: Value, _ range: ClosedRange<Value>) {\n    precondition(range.contains(wrappedValue))\n    self.range = range\n    self.value = wrappedValue\n  }\n\n  public var wrappedValue: Value {\n    get { value }\n    set { value = min(max(range.lowerBound, newValue), range.upperBound) }\n  }\n}\n"
  },
  {
    "path": "SwiftUI-Reverse-Mask/Reverse-Masking/Reverse-Masking/View+reverseMask.swift",
    "content": "//\n\nimport SwiftUI\n\nextension View {\n  @inlinable\n  public func reverseMask<Mask: View>(\n    alignment: Alignment = .center,\n    @ViewBuilder _ mask: () -> Mask\n  ) -> some View {\n    self.mask {\n      Rectangle()\n        .overlay(alignment: alignment) {\n          mask()\n            .blendMode(.destinationOut)\n        }\n    }\n  }\n}\n"
  },
  {
    "path": "SwiftUI-Reverse-Mask/Reverse-Masking/Reverse-Masking.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 55;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t6458843C26DB583C00667211 /* ReverseMaskingApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6458843B26DB583C00667211 /* ReverseMaskingApp.swift */; };\n\t\t6458843E26DB583C00667211 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6458843D26DB583C00667211 /* ContentView.swift */; };\n\t\t6458844B26DB58A100667211 /* FSViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6458844A26DB58A100667211 /* FSViews.swift */; };\n\t\t64880B9F26EC82DB00B340D6 /* Star.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64880B9E26EC82DB00B340D6 /* Star.swift */; };\n\t\t64880BA126EC876C00B340D6 /* View+reverseMask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64880BA026EC876C00B340D6 /* View+reverseMask.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t6458843826DB583C00667211 /* Reverse-Masking.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"Reverse-Masking.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t6458843B26DB583C00667211 /* ReverseMaskingApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReverseMaskingApp.swift; sourceTree = \"<group>\"; };\n\t\t6458843D26DB583C00667211 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = \"<group>\"; };\n\t\t6458844A26DB58A100667211 /* FSViews.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FSViews.swift; sourceTree = \"<group>\"; };\n\t\t64880B9E26EC82DB00B340D6 /* Star.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Star.swift; sourceTree = \"<group>\"; };\n\t\t64880BA026EC876C00B340D6 /* View+reverseMask.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"View+reverseMask.swift\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t6458843526DB583C00667211 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t6458842F26DB583C00667211 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6458843A26DB583C00667211 /* Reverse-Masking */,\n\t\t\t\t6458843926DB583C00667211 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6458843926DB583C00667211 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6458843826DB583C00667211 /* Reverse-Masking.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6458843A26DB583C00667211 /* Reverse-Masking */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6458843B26DB583C00667211 /* ReverseMaskingApp.swift */,\n\t\t\t\t6458843D26DB583C00667211 /* ContentView.swift */,\n\t\t\t\t64880BA026EC876C00B340D6 /* View+reverseMask.swift */,\n\t\t\t\t64880B9E26EC82DB00B340D6 /* Star.swift */,\n\t\t\t\t6458844A26DB58A100667211 /* FSViews.swift */,\n\t\t\t);\n\t\t\tpath = \"Reverse-Masking\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t6458843726DB583C00667211 /* Reverse-Masking */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 6458844626DB583D00667211 /* Build configuration list for PBXNativeTarget \"Reverse-Masking\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t6458843426DB583C00667211 /* Sources */,\n\t\t\t\t6458843526DB583C00667211 /* Frameworks */,\n\t\t\t\t6458843626DB583C00667211 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Reverse-Masking\";\n\t\t\tproductName = Masking;\n\t\t\tproductReference = 6458843826DB583C00667211 /* Reverse-Masking.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t6458843026DB583C00667211 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = 1;\n\t\t\t\tLastSwiftUpdateCheck = 1300;\n\t\t\t\tLastUpgradeCheck = 1300;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t6458843726DB583C00667211 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.0;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 6458843326DB583C00667211 /* Build configuration list for PBXProject \"Reverse-Masking\" */;\n\t\t\tcompatibilityVersion = \"Xcode 13.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 6458842F26DB583C00667211;\n\t\t\tproductRefGroup = 6458843926DB583C00667211 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t6458843726DB583C00667211 /* Reverse-Masking */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t6458843626DB583C00667211 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t6458843426DB583C00667211 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t6458844B26DB58A100667211 /* FSViews.swift in Sources */,\n\t\t\t\t6458843E26DB583C00667211 /* ContentView.swift in Sources */,\n\t\t\t\t64880BA126EC876C00B340D6 /* View+reverseMask.swift in Sources */,\n\t\t\t\t6458843C26DB583C00667211 /* ReverseMaskingApp.swift in Sources */,\n\t\t\t\t64880B9F26EC82DB00B340D6 /* Star.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t6458844426DB583D00667211 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t6458844526DB583D00667211 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t6458844726DB583D00667211 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;\n\t\t\t\tINFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;\n\t\t\t\tINFOPLIST_KEY_UILaunchScreen_Generation = YES;\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = \"UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = \"UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"blog.fivestars.Reverse-Masking\";\n\t\t\t\tPRODUCT_NAME = \"Reverse-Masking\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t6458844826DB583D00667211 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;\n\t\t\t\tINFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;\n\t\t\t\tINFOPLIST_KEY_UILaunchScreen_Generation = YES;\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = \"UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = \"UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"blog.fivestars.Reverse-Masking\";\n\t\t\t\tPRODUCT_NAME = \"Reverse-Masking\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t6458843326DB583C00667211 /* Build configuration list for PBXProject \"Reverse-Masking\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t6458844426DB583D00667211 /* Debug */,\n\t\t\t\t6458844526DB583D00667211 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t6458844626DB583D00667211 /* Build configuration list for PBXNativeTarget \"Reverse-Masking\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t6458844726DB583D00667211 /* Debug */,\n\t\t\t\t6458844826DB583D00667211 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 6458843026DB583C00667211 /* Project object */;\n}\n"
  },
  {
    "path": "SwiftUI-Reverse-Mask/Reverse-Masking/Reverse-Masking.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:/Users/zntfdr/Websites/CodeSamples/SwiftUI-Reverse-Mask/Reverse-Masking/Reverse-Masking.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "SwiftUI-Reverse-Mask/Reverse-Masking/Reverse-Masking.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "SwiftUI-read-a-view-size/README.md",
    "content": "Code snippet from [How to read a view size in SwiftUI][fs].\n\n[fs]: https://fivestars.blog/articles/swiftui-share-layout-information/"
  },
  {
    "path": "SwiftUI-read-a-view-size/View+readSize.swift",
    "content": "// Original article here: https://fivestars.blog/articles/swiftui-share-layout-information/\n\nimport SwiftUI\n\n/*\n\nExample:\n\nvar body: some View {\n  childView\n    .readSize { newSize in\n      print(\"The new child size is: \\(newSize)\")\n    }\n}\n\n*/\n\nextension View {\n  func readSize(onChange: @escaping (CGSize) -> Void) -> some View {\n    background(\n      GeometryReader { geometryProxy in\n        Color.clear\n          .preference(key: SizePreferenceKey.self, value: geometryProxy.size)\n      }\n    )\n    .onPreferenceChange(SizePreferenceKey.self, perform: onChange)\n  }\n}\n\nprivate struct SizePreferenceKey: PreferenceKey {\n  static var defaultValue: CGSize = .zero\n  static func reduce(value: inout CGSize, nextValue: () -> CGSize) {}\n}"
  },
  {
    "path": "Truncable-Text/ContentView.swift",
    "content": "//\n\nimport SwiftUI\n\nstruct ContentView: View {\n  @State var isTruncated: Bool = false\n  @State var forceFullText: Bool = false\n\n  var body: some View {\n    VStack {\n      if forceFullText {\n        text\n          .fixedSize(horizontal: false, vertical: true)\n      } else {\n        TruncableText(\n          text: text,\n          lineLimit: 3\n        ) {\n          isTruncated = $0\n        }\n      }\n      if isTruncated && !forceFullText {\n        Button(\"show all\") {\n          forceFullText = true\n        }\n      }\n    }\n    .padding()\n  }\n\n  var text: Text {\n    Text(\"Introducing a new kind of fitness experience. One that dynamically integrates your personal metrics from Apple Watch, along with music from your favorite artists, to inspire like no other workout in the world.\")\n  }\n}\n\nstruct TruncableText: View {\n  let text: Text\n  let lineLimit: Int?\n  @State private var intrinsicSize: CGSize = .zero\n  @State private var truncatedSize: CGSize = .zero\n  let isTruncatedUpdate: (_ isTruncated: Bool) -> Void\n\n  var body: some View {\n    text\n      .lineLimit(lineLimit)\n      .readSize { size in\n        truncatedSize = size\n        isTruncatedUpdate(truncatedSize != intrinsicSize)\n      }\n      .background(\n        text\n          .fixedSize(horizontal: false, vertical: true)\n          .hidden()\n          .readSize { size in\n            intrinsicSize = size\n            isTruncatedUpdate(truncatedSize != intrinsicSize)\n          }\n      )\n  }\n}\n\npublic extension View {\n    func readSize(onChange: @escaping (CGSize) -> Void) -> some View {\n        background(\n            GeometryReader { geometryProxy in\n                Color.clear\n                    .preference(key: SizePreferenceKey.self, value: geometryProxy.size)\n            }\n        )\n        .onPreferenceChange(SizePreferenceKey.self, perform: onChange)\n    }\n}\n\nprivate struct SizePreferenceKey: PreferenceKey {\n    static var defaultValue: CGSize = .zero\n    static func reduce(value: inout CGSize, nextValue: () -> CGSize) {}\n}\n\nstruct ContentView_Previews: PreviewProvider {\n  static var previews: some View {\n    ContentView()\n  }\n}\n"
  },
  {
    "path": "Truncable-Text/README.md",
    "content": "Code snippet from [How to check if Text is truncated?][fs].\n\n![][gif]\n\n[fs]: https://fivestars.blog/swiftui/trucated-text.html\n[gif]: truncable.gif\n"
  },
  {
    "path": "Windows/README.md",
    "content": "Code snippet from [How to manage windows in SwiftUI][fs].\n\n![][gif]\n\n[fs]: https://fivestars.blog/articles/swiftui-windows/\n[gif]: HUD.gif\n"
  },
  {
    "path": "Windows/SwiftUI-life-cycle/FSSwiftUILifecycleApp/FSAppDelegate.swift",
    "content": "import SwiftUI\n\nfinal class FSAppDelegate: NSObject, UIApplicationDelegate {\n  func application(\n    _ application: UIApplication,\n    configurationForConnecting connectingSceneSession: UISceneSession,\n    options: UIScene.ConnectionOptions\n  ) -> UISceneConfiguration {\n    let sceneConfig = UISceneConfiguration(name: nil, sessionRole: connectingSceneSession.role)\n    sceneConfig.delegateClass = FSSceneDelegate.self // 👈🏻\n    return sceneConfig\n  }\n}\n"
  },
  {
    "path": "Windows/SwiftUI-life-cycle/FSSwiftUILifecycleApp/FSSceneDelegate.swift",
    "content": "import SwiftUI\n\nfinal class FSSceneDelegate: UIResponder, UIWindowSceneDelegate, ObservableObject {\n  var hudState: HudState? {\n    didSet {\n      setupHudWindow()\n    }\n  }\n  var toastWindow: UIWindow?\n  weak var windowScene: UIWindowScene?\n\n  func scene(\n    _ scene: UIScene,\n    willConnectTo session: UISceneSession,\n    options connectionOptions: UIScene.ConnectionOptions\n  ) {\n    windowScene = scene as? UIWindowScene\n  }\n\n  func setupHudWindow() {\n    guard let windowScene = windowScene, let toastState = hudState else {\n      return\n    }\n\n    let toastViewController = UIHostingController(rootView: HudSceneView().environmentObject(toastState))\n    toastViewController.view.backgroundColor = .clear\n\n    let toastWindow = PassThroughWindow(windowScene: windowScene)\n    toastWindow.rootViewController = toastViewController\n    toastWindow.isHidden = false\n    self.toastWindow = toastWindow\n  }\n}\n"
  },
  {
    "path": "Windows/SwiftUI-life-cycle/FSSwiftUILifecycleApp/FSSwiftUILifecycleApp.swift",
    "content": "import SwiftUI\n\n@main\nstruct FSSwiftUILifecycleApp: App {\n  @StateObject var hudState = HudState()\n  @UIApplicationDelegateAdaptor var delegate: FSAppDelegate\n  \n  var body: some Scene {\n    WindowGroup {\n      MainSceneView()\n        .environmentObject(hudState)\n    }\n  }\n}\n"
  },
  {
    "path": "Windows/SwiftUI-life-cycle/FSSwiftUILifecycleApp/HudSceneView.swift",
    "content": "import SwiftUI\n\nstruct HudSceneView: View {\n  @EnvironmentObject var hudState: HudState\n\n  var body: some View {\n    Color.clear\n      .ignoresSafeArea(.all)\n      .hud(isPresented: $hudState.isPresented) {\n        Label(hudState.title, systemImage: hudState.systemImage)\n      }\n  }\n}\n\n"
  },
  {
    "path": "Windows/SwiftUI-life-cycle/FSSwiftUILifecycleApp/HudState.swift",
    "content": "import Combine\n\nfinal class HudState: ObservableObject {\n  @Published var isPresented: Bool = false\n  private(set) var title: String = \"\"\n  private(set) var systemImage: String = \"\"\n\n  func show(title: String, systemImage: String) {\n    self.title = title\n    self.systemImage = systemImage\n    isPresented = true\n  }\n}\n"
  },
  {
    "path": "Windows/SwiftUI-life-cycle/FSSwiftUILifecycleApp/MainSceneView.swift",
    "content": "import SwiftUI\n\nstruct MainSceneView: View {\n  @EnvironmentObject var sceneDelegate: FSSceneDelegate\n  @EnvironmentObject var hudState: HudState\n  @State var showingSheet = false\n\n  var body: some View {\n    NavigationView {\n      VStack {\n        Button(\"Show hud\") {\n          hudState.show(title: \"Five Stars\", systemImage: \"star.fill\")\n        }\n\n        Button(\"Show sheet\") {\n          showingSheet = true\n        }\n      }\n    }\n    .font(.largeTitle)\n    .frame(maxWidth: .infinity)\n    .sheet(isPresented: $showingSheet) {\n      Text(\"Sheet\")\n    }\n    .onAppear {\n      sceneDelegate.hudState = hudState\n    }\n  }\n}\n"
  },
  {
    "path": "Windows/SwiftUI-life-cycle/FSSwiftUILifecycleApp/PassThroughWindow.swift",
    "content": "import UIKit\n\nclass PassThroughWindow: UIWindow {\n  override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {\n    guard let hitView = super.hitTest(point, with: event) else { return nil }\n    return rootViewController?.view == hitView ? nil : hitView\n  }\n}\n"
  },
  {
    "path": "Windows/SwiftUI-life-cycle/FSSwiftUILifecycleApp/View+hud.swift",
    "content": "import SwiftUI\n\nextension View {\n  func hud<Content: View>(\n    isPresented: Binding<Bool>,\n    @ViewBuilder content: () -> Content\n  ) -> some View {\n    overlay(alignment: .top) {\n      HUD(content: content)\n        .onTapGesture {\n            isPresented.wrappedValue = false\n        }\n        .offset(y: isPresented.wrappedValue ? 0 : -128)\n        .animation(Animation.spring(), value: isPresented.wrappedValue)\n    }\n  }\n}\n\nprivate struct HUD<Content: View>: View {\n  @ViewBuilder let content: Content\n\n  var body: some View {\n    content\n      .padding(.horizontal, 12)\n      .padding(16)\n      .background(\n        Capsule()\n          .foregroundColor(Color.white)\n          .shadow(color: Color(.black).opacity(0.16), radius: 12, x: 0, y: 5)\n      )\n  }\n}\n"
  },
  {
    "path": "Windows/SwiftUI-life-cycle/FSSwiftUILifecycleApp.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 55;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t64A8D21326BFE22800CB377D /* View+hud.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A8D20B26BFE22800CB377D /* View+hud.swift */; };\n\t\t64A8D21426BFE22800CB377D /* PassThroughWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A8D20C26BFE22800CB377D /* PassThroughWindow.swift */; };\n\t\t64A8D21526BFE22800CB377D /* FSAppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A8D20D26BFE22800CB377D /* FSAppDelegate.swift */; };\n\t\t64A8D21626BFE22800CB377D /* FSSceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A8D20E26BFE22800CB377D /* FSSceneDelegate.swift */; };\n\t\t64A8D21726BFE22800CB377D /* FSSwiftUILifecycleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A8D20F26BFE22800CB377D /* FSSwiftUILifecycleApp.swift */; };\n\t\t64A8D21826BFE22800CB377D /* HudSceneView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A8D21026BFE22800CB377D /* HudSceneView.swift */; };\n\t\t64A8D21926BFE22800CB377D /* MainSceneView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A8D21126BFE22800CB377D /* MainSceneView.swift */; };\n\t\t64A8D21A26BFE22800CB377D /* HudState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A8D21226BFE22800CB377D /* HudState.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t64A8D1FA26BFE1DE00CB377D /* FSSwiftUILifecycleApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FSSwiftUILifecycleApp.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t64A8D20B26BFE22800CB377D /* View+hud.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"View+hud.swift\"; sourceTree = \"<group>\"; };\n\t\t64A8D20C26BFE22800CB377D /* PassThroughWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PassThroughWindow.swift; sourceTree = \"<group>\"; };\n\t\t64A8D20D26BFE22800CB377D /* FSAppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FSAppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t64A8D20E26BFE22800CB377D /* FSSceneDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FSSceneDelegate.swift; sourceTree = \"<group>\"; };\n\t\t64A8D20F26BFE22800CB377D /* FSSwiftUILifecycleApp.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FSSwiftUILifecycleApp.swift; sourceTree = \"<group>\"; };\n\t\t64A8D21026BFE22800CB377D /* HudSceneView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HudSceneView.swift; sourceTree = \"<group>\"; };\n\t\t64A8D21126BFE22800CB377D /* MainSceneView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainSceneView.swift; sourceTree = \"<group>\"; };\n\t\t64A8D21226BFE22800CB377D /* HudState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HudState.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t64A8D1F726BFE1DE00CB377D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t64A8D1F126BFE1DE00CB377D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64A8D1FC26BFE1DE00CB377D /* FSSwiftUILifecycleApp */,\n\t\t\t\t64A8D1FB26BFE1DE00CB377D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t64A8D1FB26BFE1DE00CB377D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64A8D1FA26BFE1DE00CB377D /* FSSwiftUILifecycleApp.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t64A8D1FC26BFE1DE00CB377D /* FSSwiftUILifecycleApp */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64A8D20F26BFE22800CB377D /* FSSwiftUILifecycleApp.swift */,\n\t\t\t\t64A8D20D26BFE22800CB377D /* FSAppDelegate.swift */,\n\t\t\t\t64A8D20E26BFE22800CB377D /* FSSceneDelegate.swift */,\n\t\t\t\t64A8D21026BFE22800CB377D /* HudSceneView.swift */,\n\t\t\t\t64A8D21226BFE22800CB377D /* HudState.swift */,\n\t\t\t\t64A8D21126BFE22800CB377D /* MainSceneView.swift */,\n\t\t\t\t64A8D20C26BFE22800CB377D /* PassThroughWindow.swift */,\n\t\t\t\t64A8D20B26BFE22800CB377D /* View+hud.swift */,\n\t\t\t);\n\t\t\tpath = FSSwiftUILifecycleApp;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t64A8D1F926BFE1DE00CB377D /* FSSwiftUILifecycleApp */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 64A8D20826BFE1DF00CB377D /* Build configuration list for PBXNativeTarget \"FSSwiftUILifecycleApp\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t64A8D1F626BFE1DE00CB377D /* Sources */,\n\t\t\t\t64A8D1F726BFE1DE00CB377D /* Frameworks */,\n\t\t\t\t64A8D1F826BFE1DE00CB377D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = FSSwiftUILifecycleApp;\n\t\t\tproductName = FSSwiftUILifecycleApp;\n\t\t\tproductReference = 64A8D1FA26BFE1DE00CB377D /* FSSwiftUILifecycleApp.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t64A8D1F226BFE1DE00CB377D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = 1;\n\t\t\t\tLastSwiftUpdateCheck = 1300;\n\t\t\t\tLastUpgradeCheck = 1300;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t64A8D1F926BFE1DE00CB377D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.0;\n\t\t\t\t\t\tLastSwiftMigration = 1300;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 64A8D1F526BFE1DE00CB377D /* Build configuration list for PBXProject \"FSSwiftUILifecycleApp\" */;\n\t\t\tcompatibilityVersion = \"Xcode 13.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 64A8D1F126BFE1DE00CB377D;\n\t\t\tproductRefGroup = 64A8D1FB26BFE1DE00CB377D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t64A8D1F926BFE1DE00CB377D /* FSSwiftUILifecycleApp */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t64A8D1F826BFE1DE00CB377D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t64A8D1F626BFE1DE00CB377D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t64A8D21726BFE22800CB377D /* FSSwiftUILifecycleApp.swift in Sources */,\n\t\t\t\t64A8D21926BFE22800CB377D /* MainSceneView.swift in Sources */,\n\t\t\t\t64A8D21826BFE22800CB377D /* HudSceneView.swift in Sources */,\n\t\t\t\t64A8D21A26BFE22800CB377D /* HudState.swift in Sources */,\n\t\t\t\t64A8D21426BFE22800CB377D /* PassThroughWindow.swift in Sources */,\n\t\t\t\t64A8D21326BFE22800CB377D /* View+hud.swift in Sources */,\n\t\t\t\t64A8D21626BFE22800CB377D /* FSSceneDelegate.swift in Sources */,\n\t\t\t\t64A8D21526BFE22800CB377D /* FSAppDelegate.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t64A8D20626BFE1DF00CB377D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t64A8D20726BFE1DF00CB377D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t64A8D20926BFE1DF00CB377D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;\n\t\t\t\tINFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;\n\t\t\t\tINFOPLIST_KEY_UILaunchScreen_Generation = YES;\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = \"UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = \"UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = blog.fivestars.FSSwiftUILifecycleApp;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t64A8D20A26BFE1DF00CB377D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;\n\t\t\t\tINFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;\n\t\t\t\tINFOPLIST_KEY_UILaunchScreen_Generation = YES;\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = \"UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = \"UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = blog.fivestars.FSSwiftUILifecycleApp;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t64A8D1F526BFE1DE00CB377D /* Build configuration list for PBXProject \"FSSwiftUILifecycleApp\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t64A8D20626BFE1DF00CB377D /* Debug */,\n\t\t\t\t64A8D20726BFE1DF00CB377D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t64A8D20826BFE1DF00CB377D /* Build configuration list for PBXNativeTarget \"FSSwiftUILifecycleApp\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t64A8D20926BFE1DF00CB377D /* Debug */,\n\t\t\t\t64A8D20A26BFE1DF00CB377D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 64A8D1F226BFE1DE00CB377D /* Project object */;\n}\n"
  },
  {
    "path": "Windows/SwiftUI-life-cycle/FSSwiftUILifecycleApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Windows/SwiftUI-life-cycle/FSSwiftUILifecycleApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Windows/UIKit-life-cycle/FSUIKitLifecycleApp/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"13122.16\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"13104.12\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" xcode11CocoaTouchSystemColor=\"systemBackgroundColor\" cocoaTouchSystemColor=\"whiteColor\"/>\n                        <viewLayoutGuide key=\"safeArea\" id=\"6Tk-OE-BBY\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Windows/UIKit-life-cycle/FSUIKitLifecycleApp/FSAppDelegate.swift",
    "content": "//\n\nimport UIKit\n\n@main\nclass FSAppDelegate: UIResponder, UIApplicationDelegate {\n}\n\n"
  },
  {
    "path": "Windows/UIKit-life-cycle/FSUIKitLifecycleApp/FSSceneDelegate.swift",
    "content": "import SwiftUI\n\nfinal class FSSceneDelegate: UIResponder, UIWindowSceneDelegate, ObservableObject {\n  lazy var hudState = HudState()\n  var keyWindow: UIWindow?\n  var hudWindow: UIWindow?\n\n  func scene(\n    _ scene: UIScene,\n    willConnectTo session: UISceneSession,\n    options connectionOptions: UIScene.ConnectionOptions\n  ) {\n    if let windowScene = scene as? UIWindowScene {\n      setupMainWindow(in: windowScene)\n      setupToastWindow(in: windowScene)\n    }\n  }\n\n  func setupMainWindow(in scene: UIWindowScene) {\n    let window = UIWindow(windowScene: scene)\n    window.rootViewController = UIHostingController(rootView: MainSceneView().environmentObject(hudState))\n    self.keyWindow = window\n    window.makeKeyAndVisible()\n  }\n\n  func setupToastWindow(in scene: UIWindowScene) {\n    let toastViewController = UIHostingController(rootView: HudSceneView().environmentObject(hudState))\n    toastViewController.view.backgroundColor = .clear\n\n    let hudWindow = PassThroughWindow(windowScene: scene)\n    hudWindow.rootViewController = toastViewController\n    hudWindow.isHidden = false\n    self.hudWindow = hudWindow\n  }\n}\n"
  },
  {
    "path": "Windows/UIKit-life-cycle/FSUIKitLifecycleApp/HudSceneView.swift",
    "content": "import SwiftUI\n\nstruct HudSceneView: View {\n  @EnvironmentObject var hudState: HudState\n\n  var body: some View {\n    Color.clear\n      .ignoresSafeArea(.all)\n      .hud(isPresented: $hudState.isPresented) {\n        Label(hudState.title, systemImage: hudState.systemImage)\n      }\n  }\n}\n\n"
  },
  {
    "path": "Windows/UIKit-life-cycle/FSUIKitLifecycleApp/HudState.swift",
    "content": "import Combine\n\nfinal class HudState: ObservableObject {\n  @Published var isPresented: Bool = false\n  private(set) var title: String = \"\"\n  private(set) var systemImage: String = \"\"\n\n  func show(title: String, systemImage: String) {\n    self.title = title\n    self.systemImage = systemImage\n    isPresented = true\n  }\n}\n"
  },
  {
    "path": "Windows/UIKit-life-cycle/FSUIKitLifecycleApp/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>UIApplicationSceneManifest</key>\n\t<dict>\n\t\t<key>UIApplicationSupportsMultipleScenes</key>\n\t\t<false/>\n\t\t<key>UISceneConfigurations</key>\n\t\t<dict>\n\t\t\t<key>UIWindowSceneSessionRoleApplication</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>UISceneConfigurationName</key>\n\t\t\t\t\t<string>Default Configuration</string>\n\t\t\t\t\t<key>UISceneDelegateClassName</key>\n\t\t\t\t\t<string>$(PRODUCT_MODULE_NAME).FSSceneDelegate</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "Windows/UIKit-life-cycle/FSUIKitLifecycleApp/MainSceneView.swift",
    "content": "import SwiftUI\n\nstruct MainSceneView: View {\n  @EnvironmentObject var hudState: HudState\n  @State var showingSheet = false\n\n  var body: some View {\n    NavigationView {\n      VStack {\n        Button(\"Show hud\") {\n          hudState.show(title: \"Five Stars\", systemImage: \"star.fill\")\n        }\n\n        Button(\"Show sheet\") {\n          showingSheet = true\n        }\n      }\n    }\n    .font(.largeTitle)\n    .frame(maxWidth: .infinity)\n    .sheet(isPresented: $showingSheet) {\n      Text(\"Sheet\")\n    }\n  }\n}\n"
  },
  {
    "path": "Windows/UIKit-life-cycle/FSUIKitLifecycleApp/PassThroughWindow.swift",
    "content": "import UIKit\n\nclass PassThroughWindow: UIWindow {\n  override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {\n    guard let hitView = super.hitTest(point, with: event) else { return nil }\n    return rootViewController?.view == hitView ? nil : hitView\n  }\n}\n"
  },
  {
    "path": "Windows/UIKit-life-cycle/FSUIKitLifecycleApp/View+hud.swift",
    "content": "import SwiftUI\n\nextension View {\n  func hud<Content: View>(\n    isPresented: Binding<Bool>,\n    @ViewBuilder content: () -> Content\n  ) -> some View {\n    overlay(alignment: .top) {\n      HUD(content: content)\n        .onTapGesture {\n            isPresented.wrappedValue = false\n        }\n        .offset(y: isPresented.wrappedValue ? 0 : -128)\n        .animation(Animation.spring(), value: isPresented.wrappedValue)\n    }\n  }\n}\n\nprivate struct HUD<Content: View>: View {\n  @ViewBuilder let content: Content\n\n  var body: some View {\n    content\n      .padding(.horizontal, 12)\n      .padding(16)\n      .background(\n        Capsule()\n          .foregroundColor(Color.white)\n          .shadow(color: Color(.black).opacity(0.16), radius: 12, x: 0, y: 5)\n      )\n  }\n}\n"
  },
  {
    "path": "Windows/UIKit-life-cycle/FSUIKitLifecycleApp.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 55;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t64A8D25226BFE5C400CB377D /* FSAppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A8D25126BFE5C400CB377D /* FSAppDelegate.swift */; };\n\t\t64A8D25E26BFE5C500CB377D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 64A8D25C26BFE5C500CB377D /* LaunchScreen.storyboard */; };\n\t\t64A8D26C26BFE67500CB377D /* PassThroughWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A8D26526BFE67500CB377D /* PassThroughWindow.swift */; };\n\t\t64A8D26D26BFE67500CB377D /* HudSceneView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A8D26626BFE67500CB377D /* HudSceneView.swift */; };\n\t\t64A8D26E26BFE67500CB377D /* MainSceneView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A8D26726BFE67500CB377D /* MainSceneView.swift */; };\n\t\t64A8D26F26BFE67500CB377D /* HudState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A8D26826BFE67500CB377D /* HudState.swift */; };\n\t\t64A8D27026BFE67500CB377D /* FSSceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A8D26926BFE67500CB377D /* FSSceneDelegate.swift */; };\n\t\t64A8D27226BFE67500CB377D /* View+hud.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64A8D26B26BFE67500CB377D /* View+hud.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t64A8D24E26BFE5C400CB377D /* FSUIKitLifecycleApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FSUIKitLifecycleApp.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t64A8D25126BFE5C400CB377D /* FSAppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FSAppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t64A8D25D26BFE5C500CB377D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t64A8D25F26BFE5C500CB377D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t64A8D26526BFE67500CB377D /* PassThroughWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PassThroughWindow.swift; sourceTree = \"<group>\"; };\n\t\t64A8D26626BFE67500CB377D /* HudSceneView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HudSceneView.swift; sourceTree = \"<group>\"; };\n\t\t64A8D26726BFE67500CB377D /* MainSceneView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainSceneView.swift; sourceTree = \"<group>\"; };\n\t\t64A8D26826BFE67500CB377D /* HudState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HudState.swift; sourceTree = \"<group>\"; };\n\t\t64A8D26926BFE67500CB377D /* FSSceneDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FSSceneDelegate.swift; sourceTree = \"<group>\"; };\n\t\t64A8D26B26BFE67500CB377D /* View+hud.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"View+hud.swift\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t64A8D24B26BFE5C400CB377D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t64A8D24526BFE5C400CB377D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64A8D25026BFE5C400CB377D /* FSUIKitLifecycleApp */,\n\t\t\t\t64A8D24F26BFE5C400CB377D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t64A8D24F26BFE5C400CB377D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64A8D24E26BFE5C400CB377D /* FSUIKitLifecycleApp.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t64A8D25026BFE5C400CB377D /* FSUIKitLifecycleApp */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t64A8D25126BFE5C400CB377D /* FSAppDelegate.swift */,\n\t\t\t\t64A8D26926BFE67500CB377D /* FSSceneDelegate.swift */,\n\t\t\t\t64A8D26626BFE67500CB377D /* HudSceneView.swift */,\n\t\t\t\t64A8D26826BFE67500CB377D /* HudState.swift */,\n\t\t\t\t64A8D26726BFE67500CB377D /* MainSceneView.swift */,\n\t\t\t\t64A8D26526BFE67500CB377D /* PassThroughWindow.swift */,\n\t\t\t\t64A8D26B26BFE67500CB377D /* View+hud.swift */,\n\t\t\t\t64A8D25C26BFE5C500CB377D /* LaunchScreen.storyboard */,\n\t\t\t\t64A8D25F26BFE5C500CB377D /* Info.plist */,\n\t\t\t);\n\t\t\tpath = FSUIKitLifecycleApp;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t64A8D24D26BFE5C400CB377D /* FSUIKitLifecycleApp */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 64A8D26226BFE5C500CB377D /* Build configuration list for PBXNativeTarget \"FSUIKitLifecycleApp\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t64A8D24A26BFE5C400CB377D /* Sources */,\n\t\t\t\t64A8D24B26BFE5C400CB377D /* Frameworks */,\n\t\t\t\t64A8D24C26BFE5C400CB377D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = FSUIKitLifecycleApp;\n\t\t\tproductName = FSUIKitLifecycleApp;\n\t\t\tproductReference = 64A8D24E26BFE5C400CB377D /* FSUIKitLifecycleApp.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t64A8D24626BFE5C400CB377D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = 1;\n\t\t\t\tLastSwiftUpdateCheck = 1300;\n\t\t\t\tLastUpgradeCheck = 1300;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t64A8D24D26BFE5C400CB377D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 13.0;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 64A8D24926BFE5C400CB377D /* Build configuration list for PBXProject \"FSUIKitLifecycleApp\" */;\n\t\t\tcompatibilityVersion = \"Xcode 13.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 64A8D24526BFE5C400CB377D;\n\t\t\tproductRefGroup = 64A8D24F26BFE5C400CB377D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t64A8D24D26BFE5C400CB377D /* FSUIKitLifecycleApp */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t64A8D24C26BFE5C400CB377D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t64A8D25E26BFE5C500CB377D /* LaunchScreen.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t64A8D24A26BFE5C400CB377D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t64A8D27226BFE67500CB377D /* View+hud.swift in Sources */,\n\t\t\t\t64A8D25226BFE5C400CB377D /* FSAppDelegate.swift in Sources */,\n\t\t\t\t64A8D26C26BFE67500CB377D /* PassThroughWindow.swift in Sources */,\n\t\t\t\t64A8D26F26BFE67500CB377D /* HudState.swift in Sources */,\n\t\t\t\t64A8D27026BFE67500CB377D /* FSSceneDelegate.swift in Sources */,\n\t\t\t\t64A8D26E26BFE67500CB377D /* MainSceneView.swift in Sources */,\n\t\t\t\t64A8D26D26BFE67500CB377D /* HudSceneView.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t64A8D25C26BFE5C500CB377D /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t64A8D25D26BFE5C500CB377D /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t64A8D26026BFE5C500CB377D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t64A8D26126BFE5C500CB377D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++17\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t64A8D26326BFE5C500CB377D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = FSUIKitLifecycleApp/Info.plist;\n\t\t\t\tINFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;\n\t\t\t\tINFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations = \"UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = \"UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = \"UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = blog.fivestars.FSUIKitLifecycleApp;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t64A8D26426BFE5C500CB377D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = FSUIKitLifecycleApp/Info.plist;\n\t\t\t\tINFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;\n\t\t\t\tINFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations = \"UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = \"UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tINFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = \"UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = blog.fivestars.FSUIKitLifecycleApp;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t64A8D24926BFE5C400CB377D /* Build configuration list for PBXProject \"FSUIKitLifecycleApp\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t64A8D26026BFE5C500CB377D /* Debug */,\n\t\t\t\t64A8D26126BFE5C500CB377D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t64A8D26226BFE5C500CB377D /* Build configuration list for PBXNativeTarget \"FSUIKitLifecycleApp\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t64A8D26326BFE5C500CB377D /* Debug */,\n\t\t\t\t64A8D26426BFE5C500CB377D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 64A8D24626BFE5C400CB377D /* Project object */;\n}\n"
  },
  {
    "path": "Windows/UIKit-life-cycle/FSUIKitLifecycleApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Windows/UIKit-life-cycle/FSUIKitLifecycleApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  }
]