├── .gitignore ├── LICENSE ├── README.md ├── Shared ├── Assets.xcassets │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── SwiftUI-100.png │ │ ├── SwiftUI-1024@1x-1.png │ │ ├── SwiftUI-1024@1x.png │ │ ├── SwiftUI-172.png │ │ ├── SwiftUI-196.png │ │ ├── SwiftUI-20@1x.png │ │ ├── SwiftUI-20@2x.png │ │ ├── SwiftUI-20@3x.png │ │ ├── SwiftUI-216.png │ │ ├── SwiftUI-29@1x-1.png │ │ ├── SwiftUI-29@1x.png │ │ ├── SwiftUI-29@2x-1.png │ │ ├── SwiftUI-29@2x.png │ │ ├── SwiftUI-29@3x.png │ │ ├── SwiftUI-40@1x-1.png │ │ ├── SwiftUI-40@1x.png │ │ ├── SwiftUI-40@2x-1.png │ │ ├── SwiftUI-40@2x.png │ │ ├── SwiftUI-40@3x.png │ │ ├── SwiftUI-48.png │ │ ├── SwiftUI-55.png │ │ ├── SwiftUI-58.png │ │ ├── SwiftUI-60@2x.png │ │ ├── SwiftUI-60@3x.png │ │ ├── SwiftUI-76@1x.png │ │ ├── SwiftUI-76@2x.png │ │ ├── SwiftUI-80.png │ │ ├── SwiftUI-83.5@2x.png │ │ ├── SwiftUI-87.png │ │ ├── SwiftUI-88.png │ │ ├── SwiftUI-Mac-1024.png │ │ ├── SwiftUI-Mac-128.png │ │ ├── SwiftUI-Mac-16.png │ │ ├── SwiftUI-Mac-256.png │ │ ├── SwiftUI-Mac-257.png │ │ ├── SwiftUI-Mac-32.png │ │ ├── SwiftUI-Mac-33.png │ │ ├── SwiftUI-Mac-512.png │ │ ├── SwiftUI-Mac-513.png │ │ └── SwiftUI-Mac-64.png │ ├── Brand Assets.brandassets │ │ ├── App Icon - App Store.imagestack │ │ │ ├── Back.imagestacklayer │ │ │ │ ├── Content.imageset │ │ │ │ │ └── Contents.json │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ ├── Front.imagestacklayer │ │ │ │ ├── Content.imageset │ │ │ │ │ └── Contents.json │ │ │ │ └── Contents.json │ │ │ └── Middle.imagestacklayer │ │ │ │ ├── Content.imageset │ │ │ │ └── Contents.json │ │ │ │ └── Contents.json │ │ ├── App Icon.imagestack │ │ │ ├── Back.imagestacklayer │ │ │ │ ├── Content.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── back.png │ │ │ │ │ └── back@2x.png │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ ├── Front.imagestacklayer │ │ │ │ ├── Content.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── front.png │ │ │ │ │ └── front@2x.png │ │ │ │ └── Contents.json │ │ │ └── Middle.imagestacklayer │ │ │ │ ├── Content.imageset │ │ │ │ └── Contents.json │ │ │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── Top Shelf Image Wide.imageset │ │ │ ├── Contents.json │ │ │ ├── top-shelf-wide@1x.jpg │ │ │ └── top-shelf-wide@2x.jpg │ │ └── Top Shelf Image.imageset │ │ │ ├── Contents.json │ │ │ ├── top-shelf@1x.jpg │ │ │ └── top-shelf@2x.jpg │ ├── Contents.json │ ├── StrokeColor.colorset │ │ └── Contents.json │ └── Waterfall.imageset │ │ ├── Contents.json │ │ └── Image.jpg ├── ContentView.swift ├── GroupView.swift ├── Groupings │ ├── ButtonModifiers.swift │ ├── ButtonsGroup.swift │ ├── ColorsGroup.swift │ ├── ControlsGroup.swift │ ├── FontsGroup.swift │ ├── GesturesGroup.swift │ ├── HapticsGroup.swift │ ├── ImagesGroup.swift │ ├── IndicatorsGroup.swift │ ├── MapGroup.swift │ ├── ShapesGroup.swift │ └── TextGroup.swift ├── Preview Content │ └── Preview Assets.xcassets │ │ └── Contents.json ├── SectionView.swift └── SwiftUI_KitApp.swift ├── SwiftUI Kit Widget ├── Assets.xcassets │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ └── Contents.json │ ├── Contents.json │ └── WidgetBackground.colorset │ │ └── Contents.json ├── Info.plist ├── SwiftUI_Kit_Widget.intentdefinition └── SwiftUI_Kit_Widget.swift ├── SwiftUI Kit.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ │ └── jordansinger.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── xcuserdata │ └── jordansinger.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist ├── iOS └── Info.plist ├── macOS ├── Info.plist └── SwiftUI_Kit_Mac.entitlements ├── tvOS └── Info.plist ├── watchOS Extension ├── ComplicationController.swift └── Info.plist └── watchOS └── Info.plist /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## User settings 6 | xcuserdata/ 7 | 8 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 9 | *.xcscmblueprint 10 | *.xccheckout 11 | 12 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 13 | build/ 14 | DerivedData/ 15 | *.moved-aside 16 | *.pbxuser 17 | !default.pbxuser 18 | *.mode1v3 19 | !default.mode1v3 20 | *.mode2v3 21 | !default.mode2v3 22 | *.perspectivev3 23 | !default.perspectivev3 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | 28 | ## App packaging 29 | *.ipa 30 | *.dSYM.zip 31 | *.dSYM 32 | 33 | ## Playgrounds 34 | timeline.xctimeline 35 | playground.xcworkspace 36 | 37 | # Swift Package Manager 38 | # 39 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 40 | # Packages/ 41 | # Package.pins 42 | # Package.resolved 43 | # *.xcodeproj 44 | # 45 | # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata 46 | # hence it is not needed unless you have added a package configuration file to your project 47 | # .swiftpm 48 | 49 | .build/ 50 | 51 | # CocoaPods 52 | # 53 | # We recommend against adding the Pods directory to your .gitignore. However 54 | # you should judge for yourself, the pros and cons are mentioned at: 55 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 56 | # 57 | # Pods/ 58 | # 59 | # Add this line if you want to avoid checking in source code from the Xcode workspace 60 | # *.xcworkspace 61 | 62 | # Carthage 63 | # 64 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 65 | # Carthage/Checkouts 66 | 67 | Carthage/Build/ 68 | 69 | # Accio dependency management 70 | Dependencies/ 71 | .accio/ 72 | 73 | # fastlane 74 | # 75 | # It is recommended to not store the screenshots in the git repo. 76 | # Instead, use fastlane to re-generate the screenshots whenever they are needed. 77 | # For more information about the recommended setup visit: 78 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 79 | 80 | fastlane/report.xml 81 | fastlane/Preview.html 82 | fastlane/screenshots/**/*.png 83 | fastlane/test_output 84 | 85 | # Code Injection 86 | # 87 | # After new code Injection tools there's a generated folder /iOSInjectionProject 88 | # https://github.com/johnno1962/injectionforxcode 89 | 90 | iOSInjectionProject/ 91 | 92 | *.DS_Store 93 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Jordan Singer 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SwiftUI Kit 2 | A SwiftUI system components and interactions demo app based on iOS 17, macOS Sonoma, watchOS 10, and tvOS 17. 3 | 4 | ![SwiftUI Kit](https://user-images.githubusercontent.com/110813/87210094-5accf380-c2e2-11ea-91c9-4f21aa313bc6.png) 5 | 6 | Use the SwiftUI Kit app to see how SwiftUI views appear and interact when using the system defaults. You can view the source to see how particular examples work. 7 | 8 | Includes Buttons, Colors, Controls, Fonts, Haptics, Images, Indicators, Shapes, Text, and more. 9 | 10 | ![iOS, iPadOS, macOS, watchOS, tvOS](https://user-images.githubusercontent.com/110813/87250474-f8cfd380-c432-11ea-830b-b90cce39a067.png) 11 | 12 | ![SwiftUI Kit examples](https://user-images.githubusercontent.com/110813/87210295-00806280-c2e3-11ea-91e3-4ea6da79f73e.png) 13 | 14 | #### To run 15 | Make sure you're using [Xcode 15+](https://developer.apple.com/xcode/) as well as a device running iOS 17+. Works on iPhone, iPad, Mac, Apple Watch, and Apple TV. 16 | 17 | #### Accent color 18 | To change the accent color and see how it affects the system components, go to the `AccentColor` section of `Assets.xcassets` in Xcode. You can then change the Light and Dark accent colors that will be applied to the app. 19 | 20 | #### Contributing 21 | Please feel free to submit pull requests in order to contribute back to SwiftUI Kit. This is for the SwiftUI community! 22 | 23 | #### SwiftUI Resources 24 | - [Recreate](https://recreatecode.com) - A video series about recreating popular UI with SwiftUI 25 | - [Primitive](https://primitive.school) - Learn SwiftUI for designers 26 | 27 | #### Apple Resources 28 | - [Apple Human Interface Guidelines](https://developer.apple.com/design/human-interface-guidelines/) - Apple’s design guidelines for creating best-in-class apps. 29 | - [SF Symbols](https://developer.apple.com/sf-symbols/) – Apple’s comprehensive library of vector-based symbols included in Apple’s system fonts that you can incorporate into your app. 30 | 31 | By [Jordan Singer](https://ibuildmyideas.com) ([@jsngr](https://twitter.com/jsngr)) 32 | 33 | Credit [SwiftUI Apple Developer Documentation](https://developer.apple.com/documentation/swiftui) for many examples and terminology 34 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "display-p3", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.000", 9 | "green" : "0.000", 10 | "red" : "0.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "SwiftUI-20@2x.png", 5 | "idiom" : "iphone", 6 | "scale" : "2x", 7 | "size" : "20x20" 8 | }, 9 | { 10 | "filename" : "SwiftUI-20@3x.png", 11 | "idiom" : "iphone", 12 | "scale" : "3x", 13 | "size" : "20x20" 14 | }, 15 | { 16 | "filename" : "SwiftUI-29@1x.png", 17 | "idiom" : "iphone", 18 | "scale" : "1x", 19 | "size" : "29x29" 20 | }, 21 | { 22 | "filename" : "SwiftUI-29@2x.png", 23 | "idiom" : "iphone", 24 | "scale" : "2x", 25 | "size" : "29x29" 26 | }, 27 | { 28 | "filename" : "SwiftUI-29@3x.png", 29 | "idiom" : "iphone", 30 | "scale" : "3x", 31 | "size" : "29x29" 32 | }, 33 | { 34 | "filename" : "SwiftUI-40@2x.png", 35 | "idiom" : "iphone", 36 | "scale" : "2x", 37 | "size" : "40x40" 38 | }, 39 | { 40 | "filename" : "SwiftUI-40@3x.png", 41 | "idiom" : "iphone", 42 | "scale" : "3x", 43 | "size" : "40x40" 44 | }, 45 | { 46 | "filename" : "SwiftUI-60@2x.png", 47 | "idiom" : "iphone", 48 | "scale" : "2x", 49 | "size" : "60x60" 50 | }, 51 | { 52 | "filename" : "SwiftUI-60@3x.png", 53 | "idiom" : "iphone", 54 | "scale" : "3x", 55 | "size" : "60x60" 56 | }, 57 | { 58 | "filename" : "SwiftUI-20@1x.png", 59 | "idiom" : "ipad", 60 | "scale" : "1x", 61 | "size" : "20x20" 62 | }, 63 | { 64 | "filename" : "SwiftUI-40@1x.png", 65 | "idiom" : "ipad", 66 | "scale" : "2x", 67 | "size" : "20x20" 68 | }, 69 | { 70 | "filename" : "SwiftUI-29@1x-1.png", 71 | "idiom" : "ipad", 72 | "scale" : "1x", 73 | "size" : "29x29" 74 | }, 75 | { 76 | "filename" : "SwiftUI-29@2x-1.png", 77 | "idiom" : "ipad", 78 | "scale" : "2x", 79 | "size" : "29x29" 80 | }, 81 | { 82 | "filename" : "SwiftUI-40@1x-1.png", 83 | "idiom" : "ipad", 84 | "scale" : "1x", 85 | "size" : "40x40" 86 | }, 87 | { 88 | "filename" : "SwiftUI-40@2x-1.png", 89 | "idiom" : "ipad", 90 | "scale" : "2x", 91 | "size" : "40x40" 92 | }, 93 | { 94 | "filename" : "SwiftUI-76@1x.png", 95 | "idiom" : "ipad", 96 | "scale" : "1x", 97 | "size" : "76x76" 98 | }, 99 | { 100 | "filename" : "SwiftUI-76@2x.png", 101 | "idiom" : "ipad", 102 | "scale" : "2x", 103 | "size" : "76x76" 104 | }, 105 | { 106 | "filename" : "SwiftUI-83.5@2x.png", 107 | "idiom" : "ipad", 108 | "scale" : "2x", 109 | "size" : "83.5x83.5" 110 | }, 111 | { 112 | "filename" : "SwiftUI-1024@1x.png", 113 | "idiom" : "ios-marketing", 114 | "scale" : "1x", 115 | "size" : "1024x1024" 116 | }, 117 | { 118 | "filename" : "SwiftUI-48.png", 119 | "idiom" : "watch", 120 | "role" : "notificationCenter", 121 | "scale" : "2x", 122 | "size" : "24x24", 123 | "subtype" : "38mm" 124 | }, 125 | { 126 | "filename" : "SwiftUI-55.png", 127 | "idiom" : "watch", 128 | "role" : "notificationCenter", 129 | "scale" : "2x", 130 | "size" : "27.5x27.5", 131 | "subtype" : "42mm" 132 | }, 133 | { 134 | "filename" : "SwiftUI-58.png", 135 | "idiom" : "watch", 136 | "role" : "companionSettings", 137 | "scale" : "2x", 138 | "size" : "29x29" 139 | }, 140 | { 141 | "filename" : "SwiftUI-87.png", 142 | "idiom" : "watch", 143 | "role" : "companionSettings", 144 | "scale" : "3x", 145 | "size" : "29x29" 146 | }, 147 | { 148 | "filename" : "SwiftUI-80.png", 149 | "idiom" : "watch", 150 | "role" : "appLauncher", 151 | "scale" : "2x", 152 | "size" : "40x40", 153 | "subtype" : "38mm" 154 | }, 155 | { 156 | "filename" : "SwiftUI-88.png", 157 | "idiom" : "watch", 158 | "role" : "appLauncher", 159 | "scale" : "2x", 160 | "size" : "44x44", 161 | "subtype" : "40mm" 162 | }, 163 | { 164 | "filename" : "SwiftUI-100.png", 165 | "idiom" : "watch", 166 | "role" : "appLauncher", 167 | "scale" : "2x", 168 | "size" : "50x50", 169 | "subtype" : "44mm" 170 | }, 171 | { 172 | "filename" : "SwiftUI-172.png", 173 | "idiom" : "watch", 174 | "role" : "quickLook", 175 | "scale" : "2x", 176 | "size" : "86x86", 177 | "subtype" : "38mm" 178 | }, 179 | { 180 | "filename" : "SwiftUI-196.png", 181 | "idiom" : "watch", 182 | "role" : "quickLook", 183 | "scale" : "2x", 184 | "size" : "98x98", 185 | "subtype" : "42mm" 186 | }, 187 | { 188 | "filename" : "SwiftUI-216.png", 189 | "idiom" : "watch", 190 | "role" : "quickLook", 191 | "scale" : "2x", 192 | "size" : "108x108", 193 | "subtype" : "44mm" 194 | }, 195 | { 196 | "filename" : "SwiftUI-1024@1x-1.png", 197 | "idiom" : "watch-marketing", 198 | "scale" : "1x", 199 | "size" : "1024x1024" 200 | }, 201 | { 202 | "filename" : "SwiftUI-Mac-16.png", 203 | "idiom" : "mac", 204 | "scale" : "1x", 205 | "size" : "16x16" 206 | }, 207 | { 208 | "filename" : "SwiftUI-Mac-32.png", 209 | "idiom" : "mac", 210 | "scale" : "2x", 211 | "size" : "16x16" 212 | }, 213 | { 214 | "filename" : "SwiftUI-Mac-33.png", 215 | "idiom" : "mac", 216 | "scale" : "1x", 217 | "size" : "32x32" 218 | }, 219 | { 220 | "filename" : "SwiftUI-Mac-64.png", 221 | "idiom" : "mac", 222 | "scale" : "2x", 223 | "size" : "32x32" 224 | }, 225 | { 226 | "filename" : "SwiftUI-Mac-128.png", 227 | "idiom" : "mac", 228 | "scale" : "1x", 229 | "size" : "128x128" 230 | }, 231 | { 232 | "filename" : "SwiftUI-Mac-256.png", 233 | "idiom" : "mac", 234 | "scale" : "2x", 235 | "size" : "128x128" 236 | }, 237 | { 238 | "filename" : "SwiftUI-Mac-257.png", 239 | "idiom" : "mac", 240 | "scale" : "1x", 241 | "size" : "256x256" 242 | }, 243 | { 244 | "filename" : "SwiftUI-Mac-512.png", 245 | "idiom" : "mac", 246 | "scale" : "2x", 247 | "size" : "256x256" 248 | }, 249 | { 250 | "filename" : "SwiftUI-Mac-513.png", 251 | "idiom" : "mac", 252 | "scale" : "1x", 253 | "size" : "512x512" 254 | }, 255 | { 256 | "filename" : "SwiftUI-Mac-1024.png", 257 | "idiom" : "mac", 258 | "scale" : "2x", 259 | "size" : "512x512" 260 | } 261 | ], 262 | "info" : { 263 | "author" : "xcode", 264 | "version" : 1 265 | } 266 | } 267 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-100.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-1024@1x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-1024@1x-1.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-1024@1x.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-172.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-172.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-196.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-196.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-20@1x.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-20@2x.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-20@3x.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-216.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-216.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-29@1x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-29@1x-1.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-29@1x.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-29@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-29@2x-1.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-29@2x.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-29@3x.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-40@1x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-40@1x-1.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-40@1x.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-40@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-40@2x-1.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-40@2x.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-40@3x.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-48.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-55.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-58.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-60@2x.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-60@3x.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-76@1x.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-76@2x.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-80.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-83.5@2x.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-87.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-88.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-88.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-Mac-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-Mac-1024.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-Mac-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-Mac-128.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-Mac-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-Mac-16.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-Mac-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-Mac-256.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-Mac-257.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-Mac-257.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-Mac-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-Mac-32.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-Mac-33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-Mac-33.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-Mac-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-Mac-512.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-Mac-513.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-Mac-513.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-Mac-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/AppIcon.appiconset/SwiftUI-Mac-64.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "tv" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "layers" : [ 7 | { 8 | "filename" : "Front.imagestacklayer" 9 | }, 10 | { 11 | "filename" : "Middle.imagestacklayer" 12 | }, 13 | { 14 | "filename" : "Back.imagestacklayer" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "tv" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "tv" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "back.png", 5 | "idiom" : "tv", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "back@2x.png", 10 | "idiom" : "tv", 11 | "scale" : "2x" 12 | } 13 | ], 14 | "info" : { 15 | "author" : "xcode", 16 | "version" : 1 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/back.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/back@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/back@2x.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "layers" : [ 7 | { 8 | "filename" : "Front.imagestacklayer" 9 | }, 10 | { 11 | "filename" : "Middle.imagestacklayer" 12 | }, 13 | { 14 | "filename" : "Back.imagestacklayer" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "front.png", 5 | "idiom" : "tv", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "front@2x.png", 10 | "idiom" : "tv", 11 | "scale" : "2x" 12 | } 13 | ], 14 | "info" : { 15 | "author" : "xcode", 16 | "version" : 1 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/front.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/front.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/front@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/front@2x.png -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "tv", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "tv", 9 | "scale" : "2x" 10 | } 11 | ], 12 | "info" : { 13 | "author" : "xcode", 14 | "version" : 1 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "assets" : [ 3 | { 4 | "filename" : "App Icon - App Store.imagestack", 5 | "idiom" : "tv", 6 | "role" : "primary-app-icon", 7 | "size" : "1280x768" 8 | }, 9 | { 10 | "filename" : "App Icon.imagestack", 11 | "idiom" : "tv", 12 | "role" : "primary-app-icon", 13 | "size" : "400x240" 14 | }, 15 | { 16 | "filename" : "Top Shelf Image Wide.imageset", 17 | "idiom" : "tv", 18 | "role" : "top-shelf-image-wide", 19 | "size" : "2320x720" 20 | }, 21 | { 22 | "filename" : "Top Shelf Image.imageset", 23 | "idiom" : "tv", 24 | "role" : "top-shelf-image", 25 | "size" : "1920x720" 26 | } 27 | ], 28 | "info" : { 29 | "author" : "xcode", 30 | "version" : 1 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/Top Shelf Image Wide.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "top-shelf-wide@1x.jpg", 5 | "idiom" : "tv", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "top-shelf-wide@2x.jpg", 10 | "idiom" : "tv", 11 | "scale" : "2x" 12 | } 13 | ], 14 | "info" : { 15 | "author" : "xcode", 16 | "version" : 1 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/Top Shelf Image Wide.imageset/top-shelf-wide@1x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/Brand Assets.brandassets/Top Shelf Image Wide.imageset/top-shelf-wide@1x.jpg -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/Top Shelf Image Wide.imageset/top-shelf-wide@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/Brand Assets.brandassets/Top Shelf Image Wide.imageset/top-shelf-wide@2x.jpg -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/Top Shelf Image.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "top-shelf@1x.jpg", 5 | "idiom" : "tv", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "top-shelf@2x.jpg", 10 | "idiom" : "tv", 11 | "scale" : "2x" 12 | } 13 | ], 14 | "info" : { 15 | "author" : "xcode", 16 | "version" : 1 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/Top Shelf Image.imageset/top-shelf@1x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/Brand Assets.brandassets/Top Shelf Image.imageset/top-shelf@1x.jpg -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Brand Assets.brandassets/Top Shelf Image.imageset/top-shelf@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/Brand Assets.brandassets/Top Shelf Image.imageset/top-shelf@2x.jpg -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/StrokeColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "0.050", 8 | "blue" : "0.000", 9 | "green" : "0.000", 10 | "red" : "0.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "0.080", 26 | "blue" : "1.000", 27 | "green" : "1.000", 28 | "red" : "1.000" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Waterfall.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Image.jpg", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Shared/Assets.xcassets/Waterfall.imageset/Image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/Shared/Assets.xcassets/Waterfall.imageset/Image.jpg -------------------------------------------------------------------------------- /Shared/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // SwiftUI Kit 4 | // 5 | // Created by Jordan Singer on 7/10/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ContentView: View { 11 | 12 | var list: some View { 13 | List { 14 | Grouping(title: "Buttons", icon: "capsule", content: { ButtonsGroup() }) 15 | Grouping(title: "Colors", icon: "paintpalette", content: { ColorsGroup() }) 16 | Grouping(title: "Controls", icon: "slider.horizontal.3", content: { ControlsGroup() }) 17 | Grouping(title: "Fonts", icon: "textformat", content: { FontsGroup() }) 18 | 19 | #if os(iOS) 20 | Group{ 21 | Grouping(title: "Haptics", icon: "waveform", content: { HapticsGroup() }) 22 | Grouping(title: "Gestures", icon: "hand.tap", content: { GesturesGroup() }) 23 | } 24 | #endif 25 | Grouping(title: "Images", icon: "photo", content: { ImagesGroup() }) 26 | Grouping(title: "Indicators", icon: "speedometer", content: { IndicatorsGroup() }) 27 | Grouping(title: "Shapes", icon: "square.on.circle", content: { ShapesGroup() }) 28 | Grouping(title: "Text", icon: "text.aligncenter", content: { TextGroup() }) 29 | #if !os(watchOS) 30 | Grouping(title: "Map", icon: "map", content: { MapGroup() }) 31 | #endif 32 | } 33 | } 34 | 35 | var body: some View { 36 | NavigationView { 37 | #if os(iOS) || os(watchOS) || os(tvOS) 38 | list.navigationBarTitle("SwiftUI") 39 | Text("Select a group") 40 | #elseif os(OSX) 41 | list.listStyle(SidebarListStyle()) 42 | Text("Select a group").frame(maxWidth: .infinity, maxHeight: .infinity) 43 | #endif 44 | } 45 | .accentColor(.accentColor) 46 | } 47 | } 48 | 49 | struct Grouping: View { 50 | var title: String 51 | var icon: String 52 | var content: () -> Content 53 | 54 | var body: some View { 55 | NavigationLink(destination: GroupView(title: title, content: content)) { 56 | #if os(iOS) 57 | Label(title, systemImage: icon).font(.headline).padding(.vertical, 8) 58 | #else 59 | Label(title, systemImage: icon) 60 | #endif 61 | } 62 | } 63 | } 64 | 65 | struct ContentView_Previews: PreviewProvider { 66 | static var previews: some View { 67 | ContentView() 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /Shared/GroupView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GroupView.swift 3 | // SwiftUI Kit 4 | // 5 | // Created by Jordan Singer on 7/10/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct GroupView: View { 11 | var title: String 12 | let content: () -> Content 13 | 14 | var body: some View { 15 | #if os(iOS) 16 | return List { 17 | content() 18 | } 19 | .listStyle(InsetGroupedListStyle()) 20 | .navigationBarTitle(title, displayMode: .inline) 21 | #else 22 | return ScrollView { 23 | content().padding() 24 | }.frame(maxWidth: .infinity, maxHeight: .infinity) 25 | #endif 26 | } 27 | } 28 | 29 | struct GroupView_Previews: PreviewProvider { 30 | static var previews: some View { 31 | GroupView(title: "Group", content: { Text("Content") }) 32 | .previewLayout(.sizeThatFits) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Shared/Groupings/ButtonModifiers.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ButtonModifiers.swift 3 | // SwiftUI Kit iOS 4 | // 5 | // Created by Thomas Braun on 8/4/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ButtonStyleParams { 11 | let scale: Double 12 | let rotation: Double 13 | let blur: Double 14 | let color: Color 15 | let unpressedColor: Color 16 | let animate: Bool 17 | let response: Double 18 | let damping: Double 19 | let duration: Double 20 | } 21 | 22 | let DEFAULT_SCALE: Double = 0.85 23 | let DEFAULT_ROTATION: Double = 0 24 | let DEFAULT_BLUR: Double = 0 25 | let DEFAULT_COLOR: Color = Color.primary.opacity(0.75) 26 | let DEFAULT_ANIMATE: Bool = true 27 | let DEFAULT_RESPONSE: Double = 0.35 28 | let DEFAULT_DAMPING: Double = 0.35 29 | let DEFAULT_DURATION: Double = 1 30 | let DEFAULT_BUTTONCOLOR: Color = Color.black 31 | let DEFAULT_TEXTCOLOR: Color = Color.white 32 | 33 | struct ButtonModifiers: View { 34 | @State private var scale = DEFAULT_SCALE 35 | @State private var rotation = DEFAULT_ROTATION 36 | @State private var blur = DEFAULT_BLUR 37 | @State private var color = DEFAULT_COLOR 38 | @State private var buttonColor = DEFAULT_BUTTONCOLOR 39 | @State private var textColor = DEFAULT_TEXTCOLOR 40 | @State private var animate = DEFAULT_ANIMATE 41 | @State private var response = DEFAULT_RESPONSE 42 | @State private var damping = DEFAULT_DAMPING 43 | @State private var duration = DEFAULT_DURATION 44 | 45 | var body: some View { 46 | VStack(spacing: 20) { 47 | Spacer() 48 | HStack(spacing: 30) { 49 | Button(action: { }) { 50 | Text("tap here") 51 | .testButtonStyle(textColor: textColor) 52 | } 53 | .pressableButton(style: getParams()) 54 | .foregroundColor(buttonColor) 55 | Button(action: { }) { 56 | Text("or here") 57 | .font(Font.body.bold()) 58 | .padding() 59 | } 60 | .pressableButton(style: getParams(), drawBackground: false) 61 | Button(action: { }) { 62 | Image(systemName: "star.fill") 63 | .testButtonStyle(textColor: textColor) 64 | } 65 | .pressableButton(style: getParams()) 66 | .foregroundColor(buttonColor) 67 | } 68 | .zIndex(1) 69 | ScrollView { 70 | ScrollViewReader { reader in 71 | VStack(alignment: .leading) { 72 | Group { 73 | Text("Scale Effect: \(scale * 100, specifier: "%.0f")%") 74 | .font(Font.body.bold()) 75 | Slider(value: $scale, in: 0.05...2, step: 0.05) 76 | Text("Rotation Effect: \(rotation, specifier: "%.0f") degrees") 77 | .font(Font.body.bold()) 78 | Slider(value: $rotation, in: -360...360, step: 5) 79 | Text("Blur Radius: \(blur, specifier: "%.1f")") 80 | .font(Font.body.bold()) 81 | Slider(value: $blur, in: 0...15, step: 0.5) 82 | } 83 | Divider() 84 | Group { 85 | ColorPicker("Button Color", selection: $buttonColor) 86 | .font(Font.body.bold()) 87 | .padding(.vertical) 88 | ColorPicker("Button Text Color", selection: $textColor) 89 | .font(Font.body.bold()) 90 | .padding(.vertical) 91 | ColorPicker("Tap Color", selection: $color) 92 | .font(Font.body.bold()) 93 | .padding(.vertical) 94 | } 95 | Divider() 96 | Toggle("Animate", isOn: $animate.animation()) 97 | .font(Font.body.bold()) 98 | .toggleStyle(SwitchToggleStyle(tint: DEFAULT_COLOR)) 99 | .padding(.vertical) 100 | if animate { 101 | Text("Spring Stiffness: \(response, specifier: "%.2f")") 102 | .font(Font.body.bold()) 103 | Slider(value: $response, in: 0...1, step: 0.05) 104 | Text("(low for fast, high for slow)") 105 | .font(Font.caption.bold()) 106 | .padding(.bottom, 10) 107 | Text("Spring Damping: \(damping, specifier: "%.2f")") 108 | .font(Font.body.bold()) 109 | Slider(value: $damping, in: 0.05...1, step: 0.05) 110 | Text("(low for large bounce, high for small bounce)") 111 | .font(Font.caption.bold()) 112 | } 113 | } 114 | .accentColor(DEFAULT_COLOR) 115 | .padding(30) 116 | .background(RoundedRectangle(cornerRadius: 30, style: .continuous) 117 | .foregroundColor(Color.primary.opacity(0.05))) 118 | .padding() 119 | } 120 | } 121 | } 122 | } 123 | 124 | private func getParams() -> ButtonStyleParams { 125 | return ButtonStyleParams(scale: scale, 126 | rotation: rotation, 127 | blur: blur, 128 | color: color, 129 | unpressedColor: buttonColor, 130 | animate: animate, 131 | response: response, 132 | damping: damping, 133 | duration: duration) 134 | } 135 | 136 | 137 | } 138 | 139 | 140 | extension Double { 141 | func rounded(toPlaces places:Int) -> Double { 142 | let divisor = pow(10.0, Double(places)) 143 | return (self * divisor).rounded() / divisor 144 | } 145 | } 146 | 147 | // MARK: - Button 148 | 149 | struct TestButton: ViewModifier { 150 | 151 | let textColor: Color 152 | 153 | func body(content: Content) -> some View { 154 | content 155 | .font(Font.body.bold()) 156 | .imageScale(.large) 157 | .padding() 158 | .foregroundColor(textColor) 159 | // .colorInvert() 160 | } 161 | } 162 | 163 | extension Image { 164 | func testButtonStyle(textColor: Color) -> some View { 165 | self.modifier(TestButton(textColor: textColor)) 166 | } 167 | } 168 | 169 | extension Text { 170 | func testButtonStyle(textColor: Color) -> some View { 171 | self.modifier(TestButton(textColor: textColor)) 172 | } 173 | } 174 | 175 | struct ButtonPressedStyle: ButtonStyle { 176 | var style: ButtonStyleParams 177 | var drawBackground: Bool 178 | 179 | func makeBody(configuration: Self.Configuration) -> some View { 180 | configuration.label 181 | .background(Capsule() 182 | .foregroundColor(configuration.isPressed ? style.color : style.unpressedColor) 183 | .opacity(drawBackground ? 1 : 0)) 184 | .scaleEffect(configuration.isPressed ? CGFloat(style.scale) : 1.0) 185 | .rotationEffect(.degrees(configuration.isPressed ? style.rotation : 0)) 186 | .blur(radius: configuration.isPressed ? CGFloat(style.blur) : 0) 187 | .animation(style.animate ? Animation.spring(response: style.response, dampingFraction: style.damping, blendDuration: style.duration) : .none) 188 | } 189 | } 190 | 191 | extension Button { 192 | func pressableButton(style: ButtonStyleParams, drawBackground: Bool = true) -> some View { 193 | self.buttonStyle(ButtonPressedStyle(style: style, drawBackground: drawBackground)) 194 | } 195 | } 196 | -------------------------------------------------------------------------------- /Shared/Groupings/ButtonsGroup.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ButtonsGroup.swift 3 | // SwiftUI Kit 4 | // 5 | // Created by Jordan Singer on 7/10/20. 6 | // 7 | import SwiftUI 8 | import AuthenticationServices 9 | 10 | struct ButtonsGroup: View { 11 | @State private var showingAlert = false 12 | @State private var showingSheet = false 13 | @State private var showingActionSheet = false 14 | @State private var showButtonSheet = false 15 | 16 | var body: some View { 17 | Group { 18 | SectionView( 19 | title: "Button", 20 | description: "A control that performs an action when triggered.", 21 | content: { 22 | Group { 23 | Button(action: { 24 | self.showingAlert = true 25 | }) { 26 | Text("Show Alert") 27 | } 28 | .alert(isPresented: $showingAlert) { 29 | Alert( 30 | title: Text("Title"), 31 | message: Text("Message"), 32 | primaryButton: .default(Text("Confirm")), 33 | secondaryButton: .cancel() 34 | ) 35 | } 36 | 37 | Button(action: { 38 | self.showingSheet = true 39 | }) { 40 | Text("Show Sheet") 41 | }.sheet(isPresented: $showingSheet) { 42 | Text("Sheet").padding() 43 | #if os(macOS) 44 | Button("Close") { 45 | showingSheet.toggle() 46 | }.padding() 47 | #endif 48 | } 49 | 50 | #if !os(OSX) 51 | Button(action: { 52 | self.showingActionSheet = true 53 | }) { 54 | Text("Show Action Sheet") 55 | } 56 | .actionSheet(isPresented: $showingActionSheet) { 57 | ActionSheet(title: Text("Title"), message: Text("Message"), buttons: [ 58 | .destructive(Text("Delete")), 59 | .default(Text("Option 1")) { }, 60 | .default((Text("Option 2"))) { }, 61 | .cancel() 62 | ]) 63 | } 64 | #endif 65 | } 66 | } 67 | ) 68 | 69 | #if !os(watchOS) && !os(tvOS) 70 | SectionView( 71 | title: "Link", 72 | description: "A control for navigating to a URL.", 73 | content: { 74 | Link("lil.software", destination: URL(string: "https://lil.software")!) 75 | } 76 | ) 77 | #endif 78 | 79 | #if !os(watchOS) 80 | SectionView( 81 | title: "Menu", 82 | description: "A control for presenting a contextually-appropriate menu of buttons.", 83 | content: { 84 | Group { 85 | #if !os(tvOS) 86 | Menu("Show Menu") { 87 | Button("Button") {} 88 | Button("Button") {} 89 | Menu("Submenu") { 90 | Button("Button") {} 91 | Button("Button") {} 92 | Button("Button") {} 93 | } 94 | Divider() 95 | Button("Button") {} 96 | Menu("Submenu") { 97 | Button("Button") {} 98 | Button("Button") {} 99 | Button("Button") {} 100 | } 101 | } 102 | #endif 103 | HStack { 104 | #if os(iOS) 105 | Text("Show Context Menu") 106 | Spacer() 107 | Text("Press & hold").italic().foregroundColor(.secondary) 108 | #elseif os(tvOS) 109 | Button("Press & hold") {} 110 | #elseif os(macOS) 111 | Text("Right click") 112 | #endif 113 | } 114 | .contextMenu { 115 | Button("Button") {} 116 | Button("Button") {} 117 | Button("Button") {} 118 | Divider() 119 | Button("Button") {} 120 | Button("Button") {} 121 | } 122 | } 123 | } 124 | ) 125 | #endif 126 | 127 | SectionView( 128 | title: "NavigationLink", 129 | description: "A view that controls a navigation presentation.", 130 | content: { 131 | NavigationLink(destination: Text("Destination")) { 132 | Text("Next") 133 | } 134 | } 135 | ) 136 | 137 | #if os(iOS) || os(OSX) 138 | SectionView( 139 | title: "SignInWithAppleButton", 140 | description: "A control that you add to your interface to allow users to sign in with their Apple ID.", 141 | content: { 142 | SignInWithAppleButton( 143 | .signIn, 144 | onRequest: { request in 145 | request.requestedScopes = [.fullName, .email] 146 | }, 147 | onCompletion: { result in 148 | 149 | } 150 | ) 151 | } 152 | ) 153 | #endif 154 | 155 | #if os(iOS) 156 | SectionView( 157 | title: "Custom Button Views", 158 | description: "Customize what buttons look like", 159 | content: { 160 | Button(action: { 161 | self.showButtonSheet = true 162 | }) { 163 | Text("Show Button Modifiers") 164 | }.sheet(isPresented: $showButtonSheet) { 165 | ButtonModifiers().padding() 166 | #if os(macOS) 167 | Button("Close") { 168 | showButtonSheet.toggle() 169 | }.padding() 170 | #endif 171 | } 172 | } 173 | 174 | ) 175 | #endif 176 | } 177 | } 178 | } 179 | 180 | struct ButtonsGroup_Previews: PreviewProvider { 181 | static var previews: some View { 182 | ButtonsGroup() 183 | .previewLayout(.sizeThatFits) 184 | } 185 | } 186 | -------------------------------------------------------------------------------- /Shared/Groupings/ColorsGroup.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ColorsGroup.swift 3 | // SwiftUI Kit 4 | // 5 | // Created by Jordan Singer on 7/10/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct StandardColor { 11 | var id = UUID() 12 | var name: String 13 | var color: Color 14 | } 15 | 16 | struct ColorsGroup: View { 17 | var colors = [ 18 | StandardColor(name: "accentColor", color: .accentColor), 19 | StandardColor(name: "black", color: .black), 20 | StandardColor(name: "blue", color: .blue), 21 | StandardColor(name: "clear", color: .clear), 22 | StandardColor(name: "gray", color: .gray), 23 | StandardColor(name: "green", color: .green), 24 | StandardColor(name: "orange", color: .orange), 25 | StandardColor(name: "pink", color: .pink), 26 | StandardColor(name: "primary", color: .primary), 27 | StandardColor(name: "purple", color: .purple), 28 | StandardColor(name: "red", color: .red), 29 | StandardColor(name: "secondary", color: .secondary), 30 | StandardColor(name: "white", color: .white), 31 | StandardColor(name: "yellow", color: .yellow), 32 | ] 33 | 34 | var body: some View { 35 | Group { 36 | ForEach(colors, id: \.id) { color in 37 | Swatch(color: color) 38 | } 39 | } 40 | } 41 | } 42 | 43 | struct Swatch: View { 44 | var color: StandardColor 45 | var body: some View { 46 | HStack(spacing: 12) { 47 | RoundedRectangle(cornerRadius: 4) 48 | .foregroundColor(color.color) 49 | .frame(width: 24, height: 24) 50 | .overlay( 51 | RoundedRectangle(cornerRadius: 4) 52 | .stroke(Color("StrokeColor"), lineWidth: 1) 53 | ) 54 | Text(color.name) 55 | Spacer() 56 | } 57 | } 58 | 59 | } 60 | 61 | struct ColorsGroup_Previews: PreviewProvider { 62 | static var previews: some View { 63 | ColorsGroup() 64 | .previewLayout(.sizeThatFits) 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /Shared/Groupings/ControlsGroup.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ControlsGroup.swift 3 | // SwiftUI Kit 4 | // 5 | // Created by Jordan Singer on 7/10/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ControlsGroup: View { 11 | @State private var vibrateOnRing = true 12 | @State private var vibrateOnSilent = true 13 | @State private var selectedFlavor = Flavor.chocolate 14 | @State private var birthday = Date() 15 | @State private var alarm = Date() 16 | @State private var volume = 50.0 17 | @State private var rating = 5.0 18 | @State private var age = 0 19 | @State private var color = Color(.sRGB, red: 0, green: 0, blue: 0) 20 | 21 | var body: some View { 22 | Group { 23 | SectionView(title: "Toggle", description: "A control that toggles between on and off states. The default style is a switch on iOS, and a checkbox on macOS.") { 24 | Group { 25 | Toggle("Vibrate on Ring", isOn: $vibrateOnRing) 26 | 27 | #if !os(tvOS) 28 | Toggle("Vibrate on Silent", isOn: $vibrateOnSilent) 29 | .toggleStyle(SwitchToggleStyle()) 30 | #endif 31 | } 32 | } 33 | 34 | SectionView(title: "Picker", description: "A control for selecting from a set of mutually exclusive values. The default style is usually a wheel on iOS; in a grouped list like this one it’s styled like a navigation link. The default style is a pop-up button on macOS.") { 35 | Group { 36 | Picker("Flavor", selection: $selectedFlavor) { 37 | ForEach(Flavor.allCases) { Text($0.description).tag($0) } 38 | } 39 | #if os(iOS) || os(OSX) 40 | Picker("Flavor", selection: $selectedFlavor) { 41 | ForEach(Flavor.allCases) { Text($0.description).tag($0) } 42 | } 43 | .pickerStyle(SegmentedPickerStyle()) 44 | #endif 45 | 46 | #if os(macOS) 47 | Picker("Flavor", selection: $selectedFlavor) { 48 | ForEach(Flavor.allCases) { Text($0.description).tag($0) } 49 | } 50 | .pickerStyle(RadioGroupPickerStyle()) 51 | #endif 52 | 53 | #if os(iOS) 54 | Picker("Flavor", selection: $selectedFlavor) { 55 | ForEach(Flavor.allCases) { Text($0.description).tag($0) } 56 | } 57 | .pickerStyle(WheelPickerStyle()) 58 | #endif 59 | } 60 | } 61 | 62 | #if os(iOS) || os(OSX) 63 | SectionView(title: "DatePicker", description: "A control for selecting an absolute date/time.") { 64 | Group { 65 | DatePicker(selection: $birthday, in: ...Date(), displayedComponents: .date) { 66 | Text("Birthday") 67 | } 68 | 69 | DatePicker("Alarm", selection: $alarm, displayedComponents: .hourAndMinute) 70 | } 71 | } 72 | #endif 73 | 74 | #if !os(tvOS) 75 | SectionView(title: "Slider", description: "A control for selecting a value from a bounded linear range of values. It can slide continuously, or snap to fixed increments.") { 76 | Group { 77 | Slider(value: $volume, in: 0...100, minimumValueLabel: Text("0%"), maximumValueLabel: Text("100%"), label: { Text("Volume") }) 78 | 79 | Slider(value: $rating, in: 1...10, step: 1, minimumValueLabel: Text("0"), maximumValueLabel: Text("10"), label: { Text("Rating") }) 80 | } 81 | } 82 | #endif 83 | 84 | #if os(iOS) || os(OSX) 85 | SectionView(title: "Stepper", description: "A control used to perform semantic increment and decrement actions.") { 86 | Stepper("Age: \(age)", value: $age, in: 0...100) 87 | } 88 | #endif 89 | 90 | #if os(iOS) || os(OSX) 91 | SectionView(title: "ColorPicker", description: "A control used to select a color from the system color picker UI.") { 92 | ColorPicker("Color", selection: $color) 93 | } 94 | #endif 95 | } 96 | } 97 | } 98 | 99 | enum Flavor: String, CaseIterable, Identifiable, CustomStringConvertible { 100 | case chocolate 101 | case vanilla 102 | case strawberry 103 | 104 | var id: String { self.rawValue } 105 | var description: String { self.rawValue.localizedCapitalized } 106 | } 107 | 108 | struct ControlsGroup_Previews: PreviewProvider { 109 | static var previews: some View { 110 | ControlsGroup() 111 | .previewLayout(.sizeThatFits) 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /Shared/Groupings/FontsGroup.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FontsGroup.swift 3 | // SwiftUI Kit 4 | // 5 | // Created by Jordan Singer on 7/10/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct FontsGroup: View { 11 | var body: some View { 12 | Group { 13 | Group { 14 | SectionView(description: "A font with the large title text style.") { 15 | Text("largeTitle") 16 | .font(.largeTitle) 17 | } 18 | 19 | SectionView(description: "A font with the title text style.") { 20 | Text("title") 21 | .font(.title) 22 | } 23 | 24 | SectionView(description: "Create a font for second level hierarchical headings.") { 25 | Text("title2") 26 | .font(.title2) 27 | } 28 | 29 | SectionView(description: "Create a font for third level hierarchical headings.") { 30 | Text("title3") 31 | .font(.title3) 32 | } 33 | } 34 | 35 | Group { 36 | SectionView(description: "A font with the headline text style.") { 37 | Text("headline") 38 | .font(.headline) 39 | } 40 | 41 | SectionView(description: "A font with the subheadline text style.") { 42 | Text("subheadline") 43 | .font(.subheadline) 44 | } 45 | } 46 | 47 | SectionView(description: "A font with the body text style.") { 48 | Text("body") 49 | .font(.body) 50 | } 51 | 52 | SectionView(description: "A font with the callout text style.") { 53 | Text("callout") 54 | .font(.callout) 55 | } 56 | 57 | Group { 58 | SectionView(description: "A font with the caption text style.") { 59 | Text("caption") 60 | .font(.caption) 61 | } 62 | 63 | SectionView(description: "Create a font with the alternate caption text style.") { 64 | Text("caption2") 65 | .font(.caption2) 66 | } 67 | } 68 | 69 | SectionView(description: "A font with the footnote text style.") { 70 | Text("footnote") 71 | .font(.footnote) 72 | } 73 | } 74 | } 75 | } 76 | 77 | struct FontsGroup_Previews: PreviewProvider { 78 | static var previews: some View { 79 | FontsGroup() 80 | .previewLayout(.sizeThatFits) 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /Shared/Groupings/GesturesGroup.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GesturesGroup.swift 3 | // SwiftUI Kit iOS 4 | // 5 | // Created by Aaryan Kothari on 27/07/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct GesturesGroup: View { 11 | 12 | var body: some View { 13 | Group{ 14 | SectionView(description: "A Gesture that requires a certain number of taps.") { 15 | TapGestureBlock() 16 | } 17 | 18 | SectionView(description: "A Gesture that detects drag motion.") { 19 | DragGestureBlock() 20 | } 21 | 22 | SectionView(description: "A Gesture that detects a Long Press.") { 23 | LongPressGestureBlock() 24 | } 25 | } 26 | } 27 | } 28 | 29 | struct TapGestureBlock : View { 30 | @State var count = 1 31 | var body : some View { 32 | Group{ 33 | HStack{ 34 | Text("Tap Gesture") 35 | Spacer() 36 | Text("Tap count: \(count)") 37 | .font(.caption) 38 | .foregroundColor(.secondary) 39 | } 40 | } 41 | .onTapGesture(count: count, perform: tapped) 42 | } 43 | func tapped() { 44 | self.count += 1 45 | } 46 | } 47 | 48 | struct DragGestureBlock : View { 49 | @State var color : Color = .accentColor 50 | 51 | var body : some View { 52 | Text("Drag Gesture") 53 | .gesture(drag) 54 | .foregroundColor(color) 55 | } 56 | 57 | var drag: some Gesture { 58 | DragGesture(minimumDistance: 10, coordinateSpace: .local) 59 | .onChanged { value in 60 | self.color = (value.distance > 300) ? .green : .red 61 | } 62 | .onEnded { value in 63 | self.color = (value.distance > 300) ? .green : .accentColor 64 | } 65 | } 66 | } 67 | 68 | struct LongPressGestureBlock: View { 69 | @GestureState var isDetectingLongPress = false 70 | @State var completedLongPress = false 71 | 72 | var longPress: some Gesture { 73 | LongPressGesture(minimumDuration: 3) 74 | .updating($isDetectingLongPress) { currentstate, gestureState,transaction in 75 | gestureState = currentstate 76 | transaction.animation = Animation.easeIn(duration: 2.0) 77 | } 78 | .onEnded { finished in 79 | self.completedLongPress = finished 80 | } 81 | } 82 | 83 | var body: some View { 84 | Text("LongPress Gesture") 85 | .foregroundColor(textColor()) 86 | .gesture(longPress) 87 | } 88 | 89 | func textColor()->Color{ 90 | return self.isDetectingLongPress ? Color.red : 91 | (self.completedLongPress ? .green : .accentColor) 92 | } 93 | } 94 | 95 | struct GesturesGroup_Previews: PreviewProvider { 96 | static var previews: some View { 97 | GesturesGroup() 98 | } 99 | } 100 | 101 | extension DragGesture.Value { 102 | var distance: CGFloat { 103 | return sqrt(pow(self.predictedEndLocation.x,2) + pow(self.predictedEndLocation.y,2)) 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /Shared/Groupings/HapticsGroup.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HapticsGroup.swift 3 | // SwiftUI Kit 4 | // 5 | // Created by Jordan Singer on 7/10/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct HapticsGroup: View { 11 | var body: some View { 12 | Group { 13 | SectionView( 14 | title: "UIImpactFeedbackGenerator", 15 | description: "Haptic feedback provides a tactile response.", 16 | content: { 17 | Group { 18 | Button(action: { playFeedbackHaptic(.heavy) }) { 19 | Text("heavy") 20 | } 21 | 22 | Button(action: { playFeedbackHaptic(.light) }) { 23 | Text("light") 24 | } 25 | 26 | Button(action: { playFeedbackHaptic(.medium) }) { 27 | Text("medium") 28 | } 29 | 30 | Button(action: { playFeedbackHaptic(.rigid) }) { 31 | Text("rigid") 32 | } 33 | 34 | Button(action: { playFeedbackHaptic(.soft) }) { 35 | Text("soft") 36 | } 37 | } 38 | } 39 | ) 40 | 41 | SectionView( 42 | title: "UINotificationFeedbackGenerator", 43 | description: "Haptics to communicate successes, failures, and warnings.", 44 | content: { 45 | Group { 46 | Button(action: { playNotificationHaptic(.error) }) { 47 | Text("error") 48 | } 49 | 50 | Button(action: { playNotificationHaptic(.success) }) { 51 | Text("success") 52 | } 53 | 54 | Button(action: { playNotificationHaptic(.warning) }) { 55 | Text("warning") 56 | } 57 | } 58 | } 59 | ) 60 | } 61 | } 62 | 63 | func playFeedbackHaptic(_ style: UIImpactFeedbackGenerator.FeedbackStyle) { 64 | let generator = UIImpactFeedbackGenerator(style: style) 65 | generator.impactOccurred() 66 | } 67 | 68 | func playNotificationHaptic(_ type: UINotificationFeedbackGenerator.FeedbackType) { 69 | let generator = UINotificationFeedbackGenerator() 70 | generator.notificationOccurred(type) 71 | } 72 | } 73 | 74 | struct HapticsGroup_Previews: PreviewProvider { 75 | static var previews: some View { 76 | HapticsGroup() 77 | .previewLayout(.sizeThatFits) 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /Shared/Groupings/ImagesGroup.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImagesGroup.swift 3 | // SwiftUI Kit 4 | // 5 | // Created by Jordan Singer on 7/10/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ImagesGroup: View { 11 | var body: some View { 12 | Group { 13 | SectionView( 14 | title: "Image", 15 | description: "A view that displays an environment-dependent image.", 16 | content: { 17 | Image("Waterfall") 18 | .resizable() 19 | .aspectRatio(contentMode: .fit) 20 | .frame(maxHeight: 128) 21 | } 22 | ) 23 | 24 | SectionView( 25 | title: "System Images", 26 | description: "Built-in icons that represent common tasks and types of content in a variety of use cases. The full list of icons is available in the SF Symbols app.", 27 | content: { 28 | Group { 29 | Image(systemName: "memories.badge.plus") 30 | // This modifier lets you use the new multi-color system icons in SF Symbols 2 31 | .renderingMode(.original) 32 | Image(systemName: "memories.badge.plus") 33 | } 34 | } 35 | ) 36 | 37 | SectionView( 38 | title: "Label", 39 | description: "A standard label for user interface items, consisting of an icon with a title.", 40 | content: { 41 | Group { 42 | Label("Rain", systemImage: "cloud.rain") 43 | Label("Snow", systemImage: "snow") 44 | Label("Sun", systemImage: "sun.max") 45 | } 46 | } 47 | ) 48 | } 49 | } 50 | } 51 | 52 | struct ImagesGroup_Previews: PreviewProvider { 53 | static var previews: some View { 54 | ImagesGroup() 55 | .previewLayout(.sizeThatFits) 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /Shared/Groupings/IndicatorsGroup.swift: -------------------------------------------------------------------------------- 1 | // 2 | // IndicatorsGroup.swift 3 | // SwiftUI Kit 4 | // 5 | // Created by Jordan Singer on 7/10/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct IndicatorsGroup: View { 11 | @State private var progressAmount = 0.0 12 | @State private var progress = 0.5 13 | 14 | let timer = Timer.publish(every: 0.1, on: .main, in: .common).autoconnect() 15 | 16 | var body: some View { 17 | Group { 18 | SectionView( 19 | title: "ProgressView", 20 | description: "A view that shows the progress towards completion of a task.", 21 | content: { 22 | Group { 23 | ProgressView() 24 | VStack { 25 | ProgressView("Downloading…", value: progressAmount, total: 100) 26 | } 27 | .onReceive(timer) { _ in 28 | if progressAmount < 100 { 29 | progressAmount += 2 30 | } else { 31 | DispatchQueue.main.asyncAfter(deadline: .now() + 2) { 32 | progressAmount = 0.0 33 | } 34 | 35 | } 36 | } 37 | #if os(watchOS) 38 | ProgressView(value: progress) 39 | .progressViewStyle(CircularProgressViewStyle()) 40 | #endif 41 | } 42 | } 43 | ) 44 | 45 | #if os(watchOS) 46 | SectionView( 47 | title: "Gauge", 48 | description: "A view that shows a value within a range.", 49 | content: { 50 | Gauge(value: progress, label: { Label("Progress", systemImage: "clock") }) 51 | } 52 | ) 53 | #endif 54 | } 55 | } 56 | } 57 | 58 | struct IndicatorsGroup_Previews: PreviewProvider { 59 | static var previews: some View { 60 | IndicatorsGroup() 61 | .previewLayout(.sizeThatFits) 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /Shared/Groupings/MapGroup.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MapGroup.swift 3 | // SwiftUI Kit 4 | // 5 | // Created by Steffen Kötte on 2020-07-21. 6 | // 7 | 8 | import MapKit 9 | import SwiftUI 10 | 11 | struct MapGroup: View { 12 | 13 | @State private var coordinateRegion = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 37.3348, longitude: -122.0090), 14 | span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01)) 15 | 16 | var body: some View { 17 | SectionView( 18 | title: "Map", 19 | description: "A map", 20 | content: { 21 | Map(coordinateRegion: $coordinateRegion) 22 | .frame(minWidth: 200, idealWidth: 500, maxWidth: .infinity, minHeight: 200, idealHeight: 500, maxHeight: .infinity) 23 | } 24 | ) 25 | } 26 | 27 | } 28 | 29 | struct MapGroup_Previews: PreviewProvider { 30 | static var previews: some View { 31 | MapGroup() 32 | .previewLayout(.sizeThatFits) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Shared/Groupings/ShapesGroup.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ShapesGroup.swift 3 | // SwiftUI Kit 4 | // 5 | // Created by Jordan Singer on 7/10/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ShapesGroup: View { 11 | 12 | // Define constraints for the shape frames so they don’t stretch out too much on macOS 13 | let frameMinWidth: CGFloat = 16 14 | let frameMaxWidth: CGFloat = 256 15 | let frameMinHeight: CGFloat = 32 16 | let frameMaxHeight: CGFloat = 64 17 | 18 | var body: some View { 19 | Group { 20 | SectionView( 21 | title: "Rectangle", 22 | description: "A rectangular shape aligned inside the frame of the view containing it.", 23 | content: { 24 | Rectangle() 25 | .frame( 26 | minWidth: frameMinWidth, 27 | maxWidth: frameMaxWidth, 28 | minHeight: frameMinHeight, 29 | maxHeight: frameMaxHeight) 30 | } 31 | ) 32 | 33 | SectionView( 34 | title: "RoundedRectangle", 35 | description: "A rectangular shape with rounded corners, aligned inside the frame of the view containing it.", 36 | content: { 37 | RoundedRectangle(cornerRadius: 4) 38 | .frame( 39 | minWidth: frameMinWidth, 40 | maxWidth: frameMaxWidth, 41 | minHeight: frameMinHeight, 42 | maxHeight: frameMaxHeight) 43 | } 44 | ) 45 | 46 | SectionView( 47 | title: "Circle", 48 | description: "A circle centered on the frame of the view containing it.", 49 | content: { 50 | Circle() 51 | .frame( 52 | minWidth: frameMinWidth, 53 | maxWidth: frameMaxWidth, 54 | minHeight: frameMinHeight, 55 | maxHeight: frameMaxHeight) 56 | } 57 | ) 58 | 59 | SectionView( 60 | title: "Ellipse", 61 | description: "An ellipse aligned inside the frame of the view containing it.", 62 | content: { 63 | Ellipse() 64 | .frame( 65 | minWidth: frameMinWidth, 66 | maxWidth: frameMaxWidth, 67 | minHeight: frameMinHeight, 68 | maxHeight: frameMaxHeight) 69 | } 70 | ) 71 | 72 | SectionView( 73 | title: "Capsule", 74 | description: "A capsule shape aligned inside the frame of the view containing it.", 75 | content: { 76 | Capsule() 77 | .frame( 78 | minWidth: frameMinWidth, 79 | maxWidth: frameMaxWidth, 80 | minHeight: frameMinHeight, 81 | maxHeight: frameMaxHeight) 82 | } 83 | ) 84 | } 85 | } 86 | } 87 | 88 | struct ShapesGroup_Previews: PreviewProvider { 89 | static var previews: some View { 90 | ShapesGroup() 91 | .previewLayout(.sizeThatFits) 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /Shared/Groupings/TextGroup.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TextGroup.swift 3 | // SwiftUI Kit 4 | // 5 | // Created by Jordan Singer on 7/10/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct TextGroup: View { 11 | @State private var text = "" 12 | @State private var password = "" 13 | @State private var textEditor = "" 14 | 15 | var body: some View { 16 | Group { 17 | SectionView( 18 | title: "Text", 19 | description: "A view that displays one or more lines of read-only text.", 20 | content: { 21 | Text("Example") 22 | } 23 | ) 24 | 25 | SectionView( 26 | title: "TextField", 27 | description: "A control that displays an editable text interface.", 28 | content: { 29 | TextField("Placeholder", text: $text) 30 | } 31 | ) 32 | 33 | SectionView( 34 | title: "SecureField", 35 | description: "A control into which the user securely enters private text.", 36 | content: { 37 | SecureField("Password", text: $password) 38 | } 39 | ) 40 | 41 | SectionView( 42 | title: "Redacted", 43 | description: "Modifier which hides the text, for example while loading.", 44 | content: { 45 | Text("You cannot read me").redacted(reason: .placeholder) 46 | } 47 | ) 48 | 49 | #if os(iOS) || os(OSX) 50 | SectionView( 51 | title: "TextEditor", 52 | description: "A view that can display and edit long-form text.", 53 | content: { 54 | TextEditor(text: $textEditor) 55 | .frame(height: 88) 56 | } 57 | ) 58 | #endif 59 | } 60 | } 61 | } 62 | 63 | struct TextGroup_Previews: PreviewProvider { 64 | static var previews: some View { 65 | TextGroup() 66 | .previewLayout(.sizeThatFits) 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /Shared/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Shared/SectionView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SectionView.swift 3 | // SwiftUI Kit 4 | // 5 | // Created by Jordan Singer on 7/10/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct SectionView: View { 11 | var title: String? 12 | var description: String 13 | let content: () -> Content 14 | 15 | var body: some View { 16 | Group { 17 | #if os(iOS) 18 | Section(footer: Text(description)) { 19 | if let title = title { 20 | Text(title) 21 | .font(.headline) 22 | } 23 | content() 24 | } 25 | #else 26 | Group { 27 | if let title = title { 28 | Text(title).font(.title3).bold() 29 | } 30 | content() 31 | Text(description).font(.body).foregroundColor(.secondary) 32 | Divider() 33 | } 34 | #endif 35 | } 36 | } 37 | } 38 | 39 | struct SectionView_Previews: PreviewProvider { 40 | static var previews: some View { 41 | SectionView(title: "Section", description: "Description", content: { Text("Content") }) 42 | .previewLayout(.sizeThatFits) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /Shared/SwiftUI_KitApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwiftUI_KitApp.swift 3 | // SwiftUI Kit 4 | // 5 | // Created by Jordan Singer on 7/10/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @main 11 | struct SwiftUI_KitApp: App { 12 | var body: some Scene { 13 | WindowGroup { 14 | #if os(macOS) 15 | ContentView().frame(minWidth: 100, idealWidth: 300, maxWidth: .infinity, minHeight: 100, idealHeight: 200, maxHeight: .infinity) 16 | #else 17 | ContentView() 18 | #endif 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /SwiftUI Kit Widget/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /SwiftUI Kit Widget/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "scale" : "2x", 6 | "size" : "20x20" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "scale" : "3x", 11 | "size" : "20x20" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "2x", 16 | "size" : "29x29" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "scale" : "3x", 21 | "size" : "29x29" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "scale" : "2x", 26 | "size" : "40x40" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "scale" : "3x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "scale" : "2x", 36 | "size" : "60x60" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "scale" : "3x", 41 | "size" : "60x60" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "scale" : "1x", 46 | "size" : "20x20" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "scale" : "2x", 51 | "size" : "20x20" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "scale" : "1x", 56 | "size" : "29x29" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "scale" : "2x", 61 | "size" : "29x29" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "scale" : "1x", 66 | "size" : "40x40" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "scale" : "2x", 71 | "size" : "40x40" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "scale" : "1x", 76 | "size" : "76x76" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "scale" : "2x", 81 | "size" : "76x76" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "scale" : "2x", 86 | "size" : "83.5x83.5" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "scale" : "1x", 91 | "size" : "1024x1024" 92 | } 93 | ], 94 | "info" : { 95 | "author" : "xcode", 96 | "version" : 1 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /SwiftUI Kit Widget/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /SwiftUI Kit Widget/Assets.xcassets/WidgetBackground.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /SwiftUI Kit Widget/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | SwiftUI Kit Widget 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | NSExtension 24 | 25 | NSExtensionPointIdentifier 26 | com.apple.widgetkit-extension 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /SwiftUI Kit Widget/SwiftUI_Kit_Widget.intentdefinition: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | INEnums 6 | 7 | INIntentDefinitionModelVersion 8 | 1.2 9 | INIntentDefinitionNamespace 10 | 88xZPY 11 | INIntentDefinitionSystemVersion 12 | 20A294 13 | INIntentDefinitionToolsBuildVersion 14 | 12A6144 15 | INIntentDefinitionToolsVersion 16 | 12.0 17 | INIntents 18 | 19 | 20 | INIntentCategory 21 | information 22 | INIntentDescriptionID 23 | tVvJ9c 24 | INIntentEligibleForWidgets 25 | 26 | INIntentIneligibleForSuggestions 27 | 28 | INIntentName 29 | Configuration 30 | INIntentResponse 31 | 32 | INIntentResponseCodes 33 | 34 | 35 | INIntentResponseCodeName 36 | success 37 | INIntentResponseCodeSuccess 38 | 39 | 40 | 41 | INIntentResponseCodeName 42 | failure 43 | 44 | 45 | 46 | INIntentTitle 47 | Configuration 48 | INIntentTitleID 49 | gpCwrM 50 | INIntentType 51 | Custom 52 | INIntentVerb 53 | View 54 | 55 | 56 | INTypes 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /SwiftUI Kit Widget/SwiftUI_Kit_Widget.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwiftUI_Kit_Widget.swift 3 | // SwiftUI Kit Widget 4 | // 5 | // Created by Thomas Braun on 8/10/20. 6 | // 7 | 8 | import WidgetKit 9 | import SwiftUI 10 | import Intents 11 | 12 | struct Provider: IntentTimelineProvider { 13 | func placeholder(in context: Context) -> SimpleEntry { 14 | SimpleEntry(date: Date(), configuration: ConfigurationIntent()) 15 | } 16 | 17 | func getSnapshot(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (SimpleEntry) -> ()) { 18 | let entry = SimpleEntry(date: Date(), configuration: configuration) 19 | completion(entry) 20 | } 21 | 22 | func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline) -> ()) { 23 | var entries: [SimpleEntry] = [] 24 | 25 | // Generate a timeline consisting of five entries an hour apart, starting from the current date. 26 | let currentDate = Date() 27 | for hourOffset in 0 ..< 5 { 28 | let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)! 29 | let entry = SimpleEntry(date: entryDate, configuration: configuration) 30 | entries.append(entry) 31 | } 32 | 33 | let timeline = Timeline(entries: entries, policy: .atEnd) 34 | completion(timeline) 35 | } 36 | } 37 | 38 | struct SimpleEntry: TimelineEntry { 39 | let date: Date 40 | let configuration: ConfigurationIntent 41 | } 42 | 43 | struct SwiftUI_Kit_WidgetEntryView : View { 44 | var entry: Provider.Entry 45 | 46 | var body: some View { 47 | VStack { 48 | Text("SwiftUI Kit Example Widget") 49 | .font(.title) 50 | Text(entry.date, style: .time) 51 | } 52 | } 53 | } 54 | 55 | @main 56 | struct SwiftUI_Kit_Widget: Widget { 57 | let kind: String = "SwiftUI_Kit_Widget" 58 | 59 | var body: some WidgetConfiguration { 60 | IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, provider: Provider()) { entry in 61 | SwiftUI_Kit_WidgetEntryView(entry: entry) 62 | } 63 | .configurationDisplayName("My Widget") 64 | .description("This is an example widget.") 65 | } 66 | } 67 | 68 | struct SwiftUI_Kit_Widget_Previews: PreviewProvider { 69 | static var previews: some View { 70 | SwiftUI_Kit_WidgetEntryView(entry: SimpleEntry(date: Date(), configuration: ConfigurationIntent())) 71 | .previewContext(WidgetPreviewContext(family: .systemSmall)) 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /SwiftUI Kit.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 60; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 2D8F830624BA011800E90F0B /* ComplicationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D8F830524BA011800E90F0B /* ComplicationController.swift */; }; 11 | 2D8F830F24BA011900E90F0B /* SwiftUI Kit watchOS.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 2D8F82F324BA011700E90F0B /* SwiftUI Kit watchOS.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 12 | 2D8F831824BA013E00E90F0B /* GroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC65524B90E16005C2F44 /* GroupView.swift */; }; 13 | 2D8F831924BA013E00E90F0B /* ShapesGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC66024B912C9005C2F44 /* ShapesGroup.swift */; }; 14 | 2D8F831A24BA013E00E90F0B /* IndicatorsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC66824B91D4E005C2F44 /* IndicatorsGroup.swift */; }; 15 | 2D8F831B24BA013E00E90F0B /* ImagesGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC66A24B91E1D005C2F44 /* ImagesGroup.swift */; }; 16 | 2D8F831D24BA013E00E90F0B /* TextGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC65A24B91065005C2F44 /* TextGroup.swift */; }; 17 | 2D8F831E24BA013E00E90F0B /* SectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC66424B914FB005C2F44 /* SectionView.swift */; }; 18 | 2D8F831F24BA013E00E90F0B /* ColorsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC66224B912D2005C2F44 /* ColorsGroup.swift */; }; 19 | 2D8F832024BA013E00E90F0B /* ControlsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC65C24B9106E005C2F44 /* ControlsGroup.swift */; }; 20 | 2D8F832124BA013E00E90F0B /* FontsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC65E24B91075005C2F44 /* FontsGroup.swift */; }; 21 | 2DC7DE5624BA0D9A00A84252 /* SwiftUI_KitApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC64524B90DD9005C2F44 /* SwiftUI_KitApp.swift */; }; 22 | 2DC7DE5724BA0D9A00A84252 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC64724B90DD9005C2F44 /* ContentView.swift */; }; 23 | 2DF330AF24BAA8C60034C8D0 /* ControlsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC65C24B9106E005C2F44 /* ControlsGroup.swift */; }; 24 | 2DF330B024BAA8C60034C8D0 /* ShapesGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC66024B912C9005C2F44 /* ShapesGroup.swift */; }; 25 | 2DF330B124BAA8C60034C8D0 /* IndicatorsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC66824B91D4E005C2F44 /* IndicatorsGroup.swift */; }; 26 | 2DF330B224BAA8C60034C8D0 /* TextGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC65A24B91065005C2F44 /* TextGroup.swift */; }; 27 | 2DF330B324BAA8C60034C8D0 /* FontsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC65E24B91075005C2F44 /* FontsGroup.swift */; }; 28 | 2DF330B424BAA8C60034C8D0 /* ImagesGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC66A24B91E1D005C2F44 /* ImagesGroup.swift */; }; 29 | 2DF330B524BAA8C60034C8D0 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC64724B90DD9005C2F44 /* ContentView.swift */; }; 30 | 2DF330B724BAA8C60034C8D0 /* GroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC65524B90E16005C2F44 /* GroupView.swift */; }; 31 | 2DF330B824BAA8C60034C8D0 /* ColorsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC66224B912D2005C2F44 /* ColorsGroup.swift */; }; 32 | 2DF330B924BAA8C60034C8D0 /* SectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC66424B914FB005C2F44 /* SectionView.swift */; }; 33 | 2DF330BA24BAA8C60034C8D0 /* SwiftUI_KitApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC64524B90DD9005C2F44 /* SwiftUI_KitApp.swift */; }; 34 | 2DF330BB24BAAD720034C8D0 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 861EC64924B90DDB005C2F44 /* Assets.xcassets */; }; 35 | 5BE8E05524CE87CB005E833D /* GesturesGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BE8E05424CE87CB005E833D /* GesturesGroup.swift */; }; 36 | 861EC64624B90DD9005C2F44 /* SwiftUI_KitApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC64524B90DD9005C2F44 /* SwiftUI_KitApp.swift */; }; 37 | 861EC64824B90DD9005C2F44 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC64724B90DD9005C2F44 /* ContentView.swift */; }; 38 | 861EC64A24B90DDB005C2F44 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 861EC64924B90DDB005C2F44 /* Assets.xcassets */; }; 39 | 861EC64D24B90DDB005C2F44 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 861EC64C24B90DDB005C2F44 /* Preview Assets.xcassets */; }; 40 | 861EC65624B90E16005C2F44 /* GroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC65524B90E16005C2F44 /* GroupView.swift */; }; 41 | 861EC65B24B91065005C2F44 /* TextGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC65A24B91065005C2F44 /* TextGroup.swift */; }; 42 | 861EC65D24B9106E005C2F44 /* ControlsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC65C24B9106E005C2F44 /* ControlsGroup.swift */; }; 43 | 861EC65F24B91075005C2F44 /* FontsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC65E24B91075005C2F44 /* FontsGroup.swift */; }; 44 | 861EC66124B912C9005C2F44 /* ShapesGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC66024B912C9005C2F44 /* ShapesGroup.swift */; }; 45 | 861EC66324B912D2005C2F44 /* ColorsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC66224B912D2005C2F44 /* ColorsGroup.swift */; }; 46 | 861EC66524B914FB005C2F44 /* SectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC66424B914FB005C2F44 /* SectionView.swift */; }; 47 | 861EC66924B91D4E005C2F44 /* IndicatorsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC66824B91D4E005C2F44 /* IndicatorsGroup.swift */; }; 48 | 861EC66B24B91E1D005C2F44 /* ImagesGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC66A24B91E1D005C2F44 /* ImagesGroup.swift */; }; 49 | 861EC66D24B91F19005C2F44 /* HapticsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC66C24B91F19005C2F44 /* HapticsGroup.swift */; }; 50 | 97DF0A4E24DA6DE300F829B9 /* ButtonModifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97DF0A4C24DA6DE300F829B9 /* ButtonModifiers.swift */; }; 51 | 97DF0A5224DA6DE300F829B9 /* ButtonsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97DF0A4D24DA6DE300F829B9 /* ButtonsGroup.swift */; }; 52 | 97DF0A5324DA6DE300F829B9 /* ButtonsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97DF0A4D24DA6DE300F829B9 /* ButtonsGroup.swift */; }; 53 | 97DF0A5424DA6DE300F829B9 /* ButtonsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97DF0A4D24DA6DE300F829B9 /* ButtonsGroup.swift */; }; 54 | 97DF0A5524DA6DE300F829B9 /* ButtonsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97DF0A4D24DA6DE300F829B9 /* ButtonsGroup.swift */; }; 55 | 97E5A1D224E1A71200246EAD /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 97E5A1D124E1A71200246EAD /* WidgetKit.framework */; }; 56 | 97E5A1D424E1A71200246EAD /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 97E5A1D324E1A71200246EAD /* SwiftUI.framework */; }; 57 | 97E5A1D724E1A71200246EAD /* SwiftUI_Kit_Widget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E5A1D624E1A71200246EAD /* SwiftUI_Kit_Widget.swift */; }; 58 | 97E5A1DA24E1A71300246EAD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97E5A1D924E1A71300246EAD /* Assets.xcassets */; }; 59 | 97E5A1DC24E1A71300246EAD /* SwiftUI_Kit_Widget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 97E5A1D824E1A71200246EAD /* SwiftUI_Kit_Widget.intentdefinition */; }; 60 | 97E5A1DD24E1A71300246EAD /* SwiftUI_Kit_Widget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 97E5A1D824E1A71200246EAD /* SwiftUI_Kit_Widget.intentdefinition */; }; 61 | 97E5A1E024E1A71300246EAD /* SwiftUI Kit WidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 97E5A1CF24E1A71200246EAD /* SwiftUI Kit WidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 62 | F95A4E1F24B9936000697538 /* SwiftUI_KitApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC64524B90DD9005C2F44 /* SwiftUI_KitApp.swift */; }; 63 | F95A4E2024B9937800697538 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC64724B90DD9005C2F44 /* ContentView.swift */; }; 64 | F95A4E2124B9938100697538 /* ShapesGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC66024B912C9005C2F44 /* ShapesGroup.swift */; }; 65 | F95A4E2224B9938100697538 /* ImagesGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC66A24B91E1D005C2F44 /* ImagesGroup.swift */; }; 66 | F95A4E2324B9938100697538 /* GroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC65524B90E16005C2F44 /* GroupView.swift */; }; 67 | F95A4E2524B9938100697538 /* ColorsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC66224B912D2005C2F44 /* ColorsGroup.swift */; }; 68 | F95A4E2624B9938100697538 /* ControlsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC65C24B9106E005C2F44 /* ControlsGroup.swift */; }; 69 | F95A4E2724B9938100697538 /* TextGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC65A24B91065005C2F44 /* TextGroup.swift */; }; 70 | F95A4E2824B9938100697538 /* IndicatorsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC66824B91D4E005C2F44 /* IndicatorsGroup.swift */; }; 71 | F95A4E2924B9938100697538 /* FontsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC65E24B91075005C2F44 /* FontsGroup.swift */; }; 72 | F95A4E2A24B9938100697538 /* SectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EC66424B914FB005C2F44 /* SectionView.swift */; }; 73 | F95A4E2C24B9938500697538 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 861EC64924B90DDB005C2F44 /* Assets.xcassets */; }; 74 | F9E8C6F924C7E46C000A2F66 /* MapGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9E8C6F824C7E46C000A2F66 /* MapGroup.swift */; }; 75 | F9E8C6FA24C7E46C000A2F66 /* MapGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9E8C6F824C7E46C000A2F66 /* MapGroup.swift */; }; 76 | F9E8C6FC24C7E46C000A2F66 /* MapGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9E8C6F824C7E46C000A2F66 /* MapGroup.swift */; }; 77 | /* End PBXBuildFile section */ 78 | 79 | /* Begin PBXContainerItemProxy section */ 80 | 2D8F830D24BA011900E90F0B /* PBXContainerItemProxy */ = { 81 | isa = PBXContainerItemProxy; 82 | containerPortal = 861EC63A24B90DD9005C2F44 /* Project object */; 83 | proxyType = 1; 84 | remoteGlobalIDString = 2D8F82F224BA011700E90F0B; 85 | remoteInfo = "SwiftUI Kit watchOS"; 86 | }; 87 | 97E5A1DE24E1A71300246EAD /* PBXContainerItemProxy */ = { 88 | isa = PBXContainerItemProxy; 89 | containerPortal = 861EC63A24B90DD9005C2F44 /* Project object */; 90 | proxyType = 1; 91 | remoteGlobalIDString = 97E5A1CE24E1A71200246EAD; 92 | remoteInfo = "SwiftUI Kit WidgetExtension"; 93 | }; 94 | /* End PBXContainerItemProxy section */ 95 | 96 | /* Begin PBXCopyFilesBuildPhase section */ 97 | 2D8F831024BA011900E90F0B /* Embed Watch Content */ = { 98 | isa = PBXCopyFilesBuildPhase; 99 | buildActionMask = 2147483647; 100 | dstPath = "$(CONTENTS_FOLDER_PATH)/Watch"; 101 | dstSubfolderSpec = 16; 102 | files = ( 103 | 2D8F830F24BA011900E90F0B /* SwiftUI Kit watchOS.app in Embed Watch Content */, 104 | ); 105 | name = "Embed Watch Content"; 106 | runOnlyForDeploymentPostprocessing = 0; 107 | }; 108 | 97E5A1E124E1A71300246EAD /* Embed Foundation Extensions */ = { 109 | isa = PBXCopyFilesBuildPhase; 110 | buildActionMask = 2147483647; 111 | dstPath = ""; 112 | dstSubfolderSpec = 13; 113 | files = ( 114 | 97E5A1E024E1A71300246EAD /* SwiftUI Kit WidgetExtension.appex in Embed Foundation Extensions */, 115 | ); 116 | name = "Embed Foundation Extensions"; 117 | runOnlyForDeploymentPostprocessing = 0; 118 | }; 119 | /* End PBXCopyFilesBuildPhase section */ 120 | 121 | /* Begin PBXFileReference section */ 122 | 2D8F82F324BA011700E90F0B /* SwiftUI Kit watchOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SwiftUI Kit watchOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 123 | 2D8F82F724BA011800E90F0B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 124 | 2D8F830524BA011800E90F0B /* ComplicationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComplicationController.swift; sourceTree = ""; }; 125 | 2D8F830C24BA011900E90F0B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 126 | 2DF330A024BAA8B80034C8D0 /* SwiftUI Kit tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SwiftUI Kit tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 127 | 2DF330AB24BAA8B90034C8D0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 128 | 5BE8E05424CE87CB005E833D /* GesturesGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GesturesGroup.swift; sourceTree = ""; }; 129 | 861EC64224B90DD9005C2F44 /* SwiftUI Kit iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SwiftUI Kit iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 130 | 861EC64524B90DD9005C2F44 /* SwiftUI_KitApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUI_KitApp.swift; sourceTree = ""; }; 131 | 861EC64724B90DD9005C2F44 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 132 | 861EC64924B90DDB005C2F44 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 133 | 861EC64C24B90DDB005C2F44 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 134 | 861EC64E24B90DDB005C2F44 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 135 | 861EC65524B90E16005C2F44 /* GroupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupView.swift; sourceTree = ""; }; 136 | 861EC65A24B91065005C2F44 /* TextGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextGroup.swift; sourceTree = ""; }; 137 | 861EC65C24B9106E005C2F44 /* ControlsGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ControlsGroup.swift; sourceTree = ""; }; 138 | 861EC65E24B91075005C2F44 /* FontsGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FontsGroup.swift; sourceTree = ""; }; 139 | 861EC66024B912C9005C2F44 /* ShapesGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShapesGroup.swift; sourceTree = ""; }; 140 | 861EC66224B912D2005C2F44 /* ColorsGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorsGroup.swift; sourceTree = ""; }; 141 | 861EC66424B914FB005C2F44 /* SectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionView.swift; sourceTree = ""; }; 142 | 861EC66824B91D4E005C2F44 /* IndicatorsGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IndicatorsGroup.swift; sourceTree = ""; }; 143 | 861EC66A24B91E1D005C2F44 /* ImagesGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImagesGroup.swift; sourceTree = ""; }; 144 | 861EC66C24B91F19005C2F44 /* HapticsGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HapticsGroup.swift; sourceTree = ""; }; 145 | 97DF0A4C24DA6DE300F829B9 /* ButtonModifiers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ButtonModifiers.swift; sourceTree = ""; }; 146 | 97DF0A4D24DA6DE300F829B9 /* ButtonsGroup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ButtonsGroup.swift; sourceTree = ""; }; 147 | 97E5A1CF24E1A71200246EAD /* SwiftUI Kit WidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "SwiftUI Kit WidgetExtension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; 148 | 97E5A1D124E1A71200246EAD /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; }; 149 | 97E5A1D324E1A71200246EAD /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; }; 150 | 97E5A1D624E1A71200246EAD /* SwiftUI_Kit_Widget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUI_Kit_Widget.swift; sourceTree = ""; }; 151 | 97E5A1D824E1A71200246EAD /* SwiftUI_Kit_Widget.intentdefinition */ = {isa = PBXFileReference; lastKnownFileType = file.intentdefinition; path = SwiftUI_Kit_Widget.intentdefinition; sourceTree = ""; }; 152 | 97E5A1D924E1A71300246EAD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 153 | 97E5A1DB24E1A71300246EAD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 154 | F95A4E0F24B9932000697538 /* SwiftUI Kit Mac.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SwiftUI Kit Mac.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 155 | F95A4E1A24B9932200697538 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 156 | F95A4E1B24B9932200697538 /* SwiftUI_Kit_Mac.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = SwiftUI_Kit_Mac.entitlements; sourceTree = ""; }; 157 | F9E8C6F824C7E46C000A2F66 /* MapGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapGroup.swift; sourceTree = ""; }; 158 | /* End PBXFileReference section */ 159 | 160 | /* Begin PBXFrameworksBuildPhase section */ 161 | 2D8F82F924BA011800E90F0B /* Frameworks */ = { 162 | isa = PBXFrameworksBuildPhase; 163 | buildActionMask = 2147483647; 164 | files = ( 165 | ); 166 | runOnlyForDeploymentPostprocessing = 0; 167 | }; 168 | 2DF3309D24BAA8B80034C8D0 /* Frameworks */ = { 169 | isa = PBXFrameworksBuildPhase; 170 | buildActionMask = 2147483647; 171 | files = ( 172 | ); 173 | runOnlyForDeploymentPostprocessing = 0; 174 | }; 175 | 861EC63F24B90DD9005C2F44 /* Frameworks */ = { 176 | isa = PBXFrameworksBuildPhase; 177 | buildActionMask = 2147483647; 178 | files = ( 179 | ); 180 | runOnlyForDeploymentPostprocessing = 0; 181 | }; 182 | 97E5A1CC24E1A71200246EAD /* Frameworks */ = { 183 | isa = PBXFrameworksBuildPhase; 184 | buildActionMask = 2147483647; 185 | files = ( 186 | 97E5A1D424E1A71200246EAD /* SwiftUI.framework in Frameworks */, 187 | 97E5A1D224E1A71200246EAD /* WidgetKit.framework in Frameworks */, 188 | ); 189 | runOnlyForDeploymentPostprocessing = 0; 190 | }; 191 | F95A4E0C24B9932000697538 /* Frameworks */ = { 192 | isa = PBXFrameworksBuildPhase; 193 | buildActionMask = 2147483647; 194 | files = ( 195 | ); 196 | runOnlyForDeploymentPostprocessing = 0; 197 | }; 198 | /* End PBXFrameworksBuildPhase section */ 199 | 200 | /* Begin PBXGroup section */ 201 | 2D8F82F424BA011700E90F0B /* watchOS */ = { 202 | isa = PBXGroup; 203 | children = ( 204 | 2D8F82F724BA011800E90F0B /* Info.plist */, 205 | ); 206 | path = watchOS; 207 | sourceTree = ""; 208 | }; 209 | 2D8F830024BA011800E90F0B /* watchOS Extension */ = { 210 | isa = PBXGroup; 211 | children = ( 212 | 2D8F830524BA011800E90F0B /* ComplicationController.swift */, 213 | 2D8F830C24BA011900E90F0B /* Info.plist */, 214 | ); 215 | path = "watchOS Extension"; 216 | sourceTree = ""; 217 | }; 218 | 2DF330A124BAA8B80034C8D0 /* tvOS */ = { 219 | isa = PBXGroup; 220 | children = ( 221 | 2DF330AB24BAA8B90034C8D0 /* Info.plist */, 222 | ); 223 | path = tvOS; 224 | sourceTree = ""; 225 | }; 226 | 861EC63924B90DD9005C2F44 = { 227 | isa = PBXGroup; 228 | children = ( 229 | 861EC64424B90DD9005C2F44 /* Shared */, 230 | F9E3381324B9A1DC00D233B7 /* iOS */, 231 | F95A4E1024B9932000697538 /* macOS */, 232 | 2D8F82F424BA011700E90F0B /* watchOS */, 233 | 2D8F830024BA011800E90F0B /* watchOS Extension */, 234 | 2DF330A124BAA8B80034C8D0 /* tvOS */, 235 | 97E5A1D524E1A71200246EAD /* SwiftUI Kit Widget */, 236 | 97E5A1D024E1A71200246EAD /* Frameworks */, 237 | 861EC64324B90DD9005C2F44 /* Products */, 238 | ); 239 | sourceTree = ""; 240 | }; 241 | 861EC64324B90DD9005C2F44 /* Products */ = { 242 | isa = PBXGroup; 243 | children = ( 244 | 861EC64224B90DD9005C2F44 /* SwiftUI Kit iOS.app */, 245 | F95A4E0F24B9932000697538 /* SwiftUI Kit Mac.app */, 246 | 2D8F82F324BA011700E90F0B /* SwiftUI Kit watchOS.app */, 247 | 2DF330A024BAA8B80034C8D0 /* SwiftUI Kit tvOS.app */, 248 | 97E5A1CF24E1A71200246EAD /* SwiftUI Kit WidgetExtension.appex */, 249 | ); 250 | name = Products; 251 | sourceTree = ""; 252 | }; 253 | 861EC64424B90DD9005C2F44 /* Shared */ = { 254 | isa = PBXGroup; 255 | children = ( 256 | 861EC64524B90DD9005C2F44 /* SwiftUI_KitApp.swift */, 257 | 861EC64724B90DD9005C2F44 /* ContentView.swift */, 258 | 861EC65424B90DF1005C2F44 /* Groupings */, 259 | 861EC65524B90E16005C2F44 /* GroupView.swift */, 260 | 861EC66424B914FB005C2F44 /* SectionView.swift */, 261 | 861EC64924B90DDB005C2F44 /* Assets.xcassets */, 262 | 861EC64B24B90DDB005C2F44 /* Preview Content */, 263 | ); 264 | path = Shared; 265 | sourceTree = ""; 266 | }; 267 | 861EC64B24B90DDB005C2F44 /* Preview Content */ = { 268 | isa = PBXGroup; 269 | children = ( 270 | 861EC64C24B90DDB005C2F44 /* Preview Assets.xcassets */, 271 | ); 272 | path = "Preview Content"; 273 | sourceTree = ""; 274 | }; 275 | 861EC65424B90DF1005C2F44 /* Groupings */ = { 276 | isa = PBXGroup; 277 | children = ( 278 | 97DF0A4D24DA6DE300F829B9 /* ButtonsGroup.swift */, 279 | 97DF0A4C24DA6DE300F829B9 /* ButtonModifiers.swift */, 280 | 861EC66224B912D2005C2F44 /* ColorsGroup.swift */, 281 | 861EC65C24B9106E005C2F44 /* ControlsGroup.swift */, 282 | 861EC65E24B91075005C2F44 /* FontsGroup.swift */, 283 | 861EC66C24B91F19005C2F44 /* HapticsGroup.swift */, 284 | 5BE8E05424CE87CB005E833D /* GesturesGroup.swift */, 285 | 861EC66A24B91E1D005C2F44 /* ImagesGroup.swift */, 286 | 861EC66824B91D4E005C2F44 /* IndicatorsGroup.swift */, 287 | 861EC66024B912C9005C2F44 /* ShapesGroup.swift */, 288 | 861EC65A24B91065005C2F44 /* TextGroup.swift */, 289 | F9E8C6F824C7E46C000A2F66 /* MapGroup.swift */, 290 | ); 291 | path = Groupings; 292 | sourceTree = ""; 293 | }; 294 | 97E5A1D024E1A71200246EAD /* Frameworks */ = { 295 | isa = PBXGroup; 296 | children = ( 297 | 97E5A1D124E1A71200246EAD /* WidgetKit.framework */, 298 | 97E5A1D324E1A71200246EAD /* SwiftUI.framework */, 299 | ); 300 | name = Frameworks; 301 | sourceTree = ""; 302 | }; 303 | 97E5A1D524E1A71200246EAD /* SwiftUI Kit Widget */ = { 304 | isa = PBXGroup; 305 | children = ( 306 | 97E5A1D624E1A71200246EAD /* SwiftUI_Kit_Widget.swift */, 307 | 97E5A1D824E1A71200246EAD /* SwiftUI_Kit_Widget.intentdefinition */, 308 | 97E5A1D924E1A71300246EAD /* Assets.xcassets */, 309 | 97E5A1DB24E1A71300246EAD /* Info.plist */, 310 | ); 311 | path = "SwiftUI Kit Widget"; 312 | sourceTree = ""; 313 | }; 314 | F95A4E1024B9932000697538 /* macOS */ = { 315 | isa = PBXGroup; 316 | children = ( 317 | F95A4E1A24B9932200697538 /* Info.plist */, 318 | F95A4E1B24B9932200697538 /* SwiftUI_Kit_Mac.entitlements */, 319 | ); 320 | path = macOS; 321 | sourceTree = ""; 322 | }; 323 | F9E3381324B9A1DC00D233B7 /* iOS */ = { 324 | isa = PBXGroup; 325 | children = ( 326 | 861EC64E24B90DDB005C2F44 /* Info.plist */, 327 | ); 328 | path = iOS; 329 | sourceTree = ""; 330 | }; 331 | /* End PBXGroup section */ 332 | 333 | /* Begin PBXNativeTarget section */ 334 | 2D8F82F224BA011700E90F0B /* SwiftUI Kit watchOS */ = { 335 | isa = PBXNativeTarget; 336 | buildConfigurationList = 2D8F831724BA011900E90F0B /* Build configuration list for PBXNativeTarget "SwiftUI Kit watchOS" */; 337 | buildPhases = ( 338 | 2D8F82F124BA011700E90F0B /* Resources */, 339 | 2D8F82F824BA011800E90F0B /* Sources */, 340 | 2D8F82F924BA011800E90F0B /* Frameworks */, 341 | ); 342 | buildRules = ( 343 | ); 344 | dependencies = ( 345 | ); 346 | name = "SwiftUI Kit watchOS"; 347 | productName = "SwiftUI Kit watchOS"; 348 | productReference = 2D8F82F324BA011700E90F0B /* SwiftUI Kit watchOS.app */; 349 | productType = "com.apple.product-type.application"; 350 | }; 351 | 2DF3309F24BAA8B80034C8D0 /* SwiftUI Kit tvOS */ = { 352 | isa = PBXNativeTarget; 353 | buildConfigurationList = 2DF330AE24BAA8B90034C8D0 /* Build configuration list for PBXNativeTarget "SwiftUI Kit tvOS" */; 354 | buildPhases = ( 355 | 2DF3309C24BAA8B80034C8D0 /* Sources */, 356 | 2DF3309D24BAA8B80034C8D0 /* Frameworks */, 357 | 2DF3309E24BAA8B80034C8D0 /* Resources */, 358 | ); 359 | buildRules = ( 360 | ); 361 | dependencies = ( 362 | ); 363 | name = "SwiftUI Kit tvOS"; 364 | productName = "SwiftUI Kit tvOS"; 365 | productReference = 2DF330A024BAA8B80034C8D0 /* SwiftUI Kit tvOS.app */; 366 | productType = "com.apple.product-type.application"; 367 | }; 368 | 861EC64124B90DD9005C2F44 /* SwiftUI Kit iOS */ = { 369 | isa = PBXNativeTarget; 370 | buildConfigurationList = 861EC65124B90DDB005C2F44 /* Build configuration list for PBXNativeTarget "SwiftUI Kit iOS" */; 371 | buildPhases = ( 372 | 861EC63E24B90DD9005C2F44 /* Sources */, 373 | 861EC63F24B90DD9005C2F44 /* Frameworks */, 374 | 861EC64024B90DD9005C2F44 /* Resources */, 375 | 2D8F831024BA011900E90F0B /* Embed Watch Content */, 376 | 97E5A1E124E1A71300246EAD /* Embed Foundation Extensions */, 377 | ); 378 | buildRules = ( 379 | ); 380 | dependencies = ( 381 | 2D8F830E24BA011900E90F0B /* PBXTargetDependency */, 382 | 97E5A1DF24E1A71300246EAD /* PBXTargetDependency */, 383 | ); 384 | name = "SwiftUI Kit iOS"; 385 | productName = "SwiftUI Kit"; 386 | productReference = 861EC64224B90DD9005C2F44 /* SwiftUI Kit iOS.app */; 387 | productType = "com.apple.product-type.application"; 388 | }; 389 | 97E5A1CE24E1A71200246EAD /* SwiftUI Kit WidgetExtension */ = { 390 | isa = PBXNativeTarget; 391 | buildConfigurationList = 97E5A1E424E1A71300246EAD /* Build configuration list for PBXNativeTarget "SwiftUI Kit WidgetExtension" */; 392 | buildPhases = ( 393 | 97E5A1CB24E1A71200246EAD /* Sources */, 394 | 97E5A1CC24E1A71200246EAD /* Frameworks */, 395 | 97E5A1CD24E1A71200246EAD /* Resources */, 396 | ); 397 | buildRules = ( 398 | ); 399 | dependencies = ( 400 | ); 401 | name = "SwiftUI Kit WidgetExtension"; 402 | productName = "SwiftUI Kit WidgetExtension"; 403 | productReference = 97E5A1CF24E1A71200246EAD /* SwiftUI Kit WidgetExtension.appex */; 404 | productType = "com.apple.product-type.app-extension"; 405 | }; 406 | F95A4E0E24B9932000697538 /* SwiftUI Kit Mac */ = { 407 | isa = PBXNativeTarget; 408 | buildConfigurationList = F95A4E1C24B9932200697538 /* Build configuration list for PBXNativeTarget "SwiftUI Kit Mac" */; 409 | buildPhases = ( 410 | F95A4E0B24B9932000697538 /* Sources */, 411 | F95A4E0C24B9932000697538 /* Frameworks */, 412 | F95A4E0D24B9932000697538 /* Resources */, 413 | ); 414 | buildRules = ( 415 | ); 416 | dependencies = ( 417 | ); 418 | name = "SwiftUI Kit Mac"; 419 | productName = "SwiftUI Kit Mac"; 420 | productReference = F95A4E0F24B9932000697538 /* SwiftUI Kit Mac.app */; 421 | productType = "com.apple.product-type.application"; 422 | }; 423 | /* End PBXNativeTarget section */ 424 | 425 | /* Begin PBXProject section */ 426 | 861EC63A24B90DD9005C2F44 /* Project object */ = { 427 | isa = PBXProject; 428 | attributes = { 429 | BuildIndependentTargetsInParallel = YES; 430 | LastSwiftUpdateCheck = 1200; 431 | LastUpgradeCheck = 1500; 432 | ORGANIZATIONNAME = "Lil Software"; 433 | TargetAttributes = { 434 | 2D8F82F224BA011700E90F0B = { 435 | CreatedOnToolsVersion = 12.0; 436 | LastSwiftMigration = 1200; 437 | }; 438 | 2DF3309F24BAA8B80034C8D0 = { 439 | CreatedOnToolsVersion = 12.0; 440 | }; 441 | 861EC64124B90DD9005C2F44 = { 442 | CreatedOnToolsVersion = 12.0; 443 | }; 444 | 97E5A1CE24E1A71200246EAD = { 445 | CreatedOnToolsVersion = 12.0; 446 | }; 447 | F95A4E0E24B9932000697538 = { 448 | CreatedOnToolsVersion = 12.0; 449 | }; 450 | }; 451 | }; 452 | buildConfigurationList = 861EC63D24B90DD9005C2F44 /* Build configuration list for PBXProject "SwiftUI Kit" */; 453 | compatibilityVersion = "Xcode 15.0"; 454 | developmentRegion = en; 455 | hasScannedForEncodings = 0; 456 | knownRegions = ( 457 | en, 458 | Base, 459 | ); 460 | mainGroup = 861EC63924B90DD9005C2F44; 461 | productRefGroup = 861EC64324B90DD9005C2F44 /* Products */; 462 | projectDirPath = ""; 463 | projectRoot = ""; 464 | targets = ( 465 | 861EC64124B90DD9005C2F44 /* SwiftUI Kit iOS */, 466 | F95A4E0E24B9932000697538 /* SwiftUI Kit Mac */, 467 | 2D8F82F224BA011700E90F0B /* SwiftUI Kit watchOS */, 468 | 2DF3309F24BAA8B80034C8D0 /* SwiftUI Kit tvOS */, 469 | 97E5A1CE24E1A71200246EAD /* SwiftUI Kit WidgetExtension */, 470 | ); 471 | }; 472 | /* End PBXProject section */ 473 | 474 | /* Begin PBXResourcesBuildPhase section */ 475 | 2D8F82F124BA011700E90F0B /* Resources */ = { 476 | isa = PBXResourcesBuildPhase; 477 | buildActionMask = 2147483647; 478 | files = ( 479 | ); 480 | runOnlyForDeploymentPostprocessing = 0; 481 | }; 482 | 2DF3309E24BAA8B80034C8D0 /* Resources */ = { 483 | isa = PBXResourcesBuildPhase; 484 | buildActionMask = 2147483647; 485 | files = ( 486 | 2DF330BB24BAAD720034C8D0 /* Assets.xcassets in Resources */, 487 | ); 488 | runOnlyForDeploymentPostprocessing = 0; 489 | }; 490 | 861EC64024B90DD9005C2F44 /* Resources */ = { 491 | isa = PBXResourcesBuildPhase; 492 | buildActionMask = 2147483647; 493 | files = ( 494 | 861EC64D24B90DDB005C2F44 /* Preview Assets.xcassets in Resources */, 495 | 861EC64A24B90DDB005C2F44 /* Assets.xcassets in Resources */, 496 | ); 497 | runOnlyForDeploymentPostprocessing = 0; 498 | }; 499 | 97E5A1CD24E1A71200246EAD /* Resources */ = { 500 | isa = PBXResourcesBuildPhase; 501 | buildActionMask = 2147483647; 502 | files = ( 503 | 97E5A1DA24E1A71300246EAD /* Assets.xcassets in Resources */, 504 | ); 505 | runOnlyForDeploymentPostprocessing = 0; 506 | }; 507 | F95A4E0D24B9932000697538 /* Resources */ = { 508 | isa = PBXResourcesBuildPhase; 509 | buildActionMask = 2147483647; 510 | files = ( 511 | F95A4E2C24B9938500697538 /* Assets.xcassets in Resources */, 512 | ); 513 | runOnlyForDeploymentPostprocessing = 0; 514 | }; 515 | /* End PBXResourcesBuildPhase section */ 516 | 517 | /* Begin PBXSourcesBuildPhase section */ 518 | 2D8F82F824BA011800E90F0B /* Sources */ = { 519 | isa = PBXSourcesBuildPhase; 520 | buildActionMask = 2147483647; 521 | files = ( 522 | 2D8F832124BA013E00E90F0B /* FontsGroup.swift in Sources */, 523 | 2D8F831A24BA013E00E90F0B /* IndicatorsGroup.swift in Sources */, 524 | 2D8F831E24BA013E00E90F0B /* SectionView.swift in Sources */, 525 | 2DC7DE5624BA0D9A00A84252 /* SwiftUI_KitApp.swift in Sources */, 526 | 2D8F831F24BA013E00E90F0B /* ColorsGroup.swift in Sources */, 527 | 2D8F831B24BA013E00E90F0B /* ImagesGroup.swift in Sources */, 528 | 2D8F831824BA013E00E90F0B /* GroupView.swift in Sources */, 529 | 97DF0A5424DA6DE300F829B9 /* ButtonsGroup.swift in Sources */, 530 | 2D8F832024BA013E00E90F0B /* ControlsGroup.swift in Sources */, 531 | 2DC7DE5724BA0D9A00A84252 /* ContentView.swift in Sources */, 532 | 2D8F831D24BA013E00E90F0B /* TextGroup.swift in Sources */, 533 | 2D8F830624BA011800E90F0B /* ComplicationController.swift in Sources */, 534 | 2D8F831924BA013E00E90F0B /* ShapesGroup.swift in Sources */, 535 | ); 536 | runOnlyForDeploymentPostprocessing = 0; 537 | }; 538 | 2DF3309C24BAA8B80034C8D0 /* Sources */ = { 539 | isa = PBXSourcesBuildPhase; 540 | buildActionMask = 2147483647; 541 | files = ( 542 | F9E8C6FC24C7E46C000A2F66 /* MapGroup.swift in Sources */, 543 | 2DF330B024BAA8C60034C8D0 /* ShapesGroup.swift in Sources */, 544 | 2DF330B224BAA8C60034C8D0 /* TextGroup.swift in Sources */, 545 | 2DF330B824BAA8C60034C8D0 /* ColorsGroup.swift in Sources */, 546 | 2DF330BA24BAA8C60034C8D0 /* SwiftUI_KitApp.swift in Sources */, 547 | 2DF330AF24BAA8C60034C8D0 /* ControlsGroup.swift in Sources */, 548 | 2DF330B124BAA8C60034C8D0 /* IndicatorsGroup.swift in Sources */, 549 | 97DF0A5524DA6DE300F829B9 /* ButtonsGroup.swift in Sources */, 550 | 2DF330B524BAA8C60034C8D0 /* ContentView.swift in Sources */, 551 | 2DF330B924BAA8C60034C8D0 /* SectionView.swift in Sources */, 552 | 2DF330B324BAA8C60034C8D0 /* FontsGroup.swift in Sources */, 553 | 2DF330B724BAA8C60034C8D0 /* GroupView.swift in Sources */, 554 | 2DF330B424BAA8C60034C8D0 /* ImagesGroup.swift in Sources */, 555 | ); 556 | runOnlyForDeploymentPostprocessing = 0; 557 | }; 558 | 861EC63E24B90DD9005C2F44 /* Sources */ = { 559 | isa = PBXSourcesBuildPhase; 560 | buildActionMask = 2147483647; 561 | files = ( 562 | F9E8C6F924C7E46C000A2F66 /* MapGroup.swift in Sources */, 563 | 861EC65F24B91075005C2F44 /* FontsGroup.swift in Sources */, 564 | 861EC65B24B91065005C2F44 /* TextGroup.swift in Sources */, 565 | 5BE8E05524CE87CB005E833D /* GesturesGroup.swift in Sources */, 566 | 861EC66524B914FB005C2F44 /* SectionView.swift in Sources */, 567 | 861EC66924B91D4E005C2F44 /* IndicatorsGroup.swift in Sources */, 568 | 861EC64824B90DD9005C2F44 /* ContentView.swift in Sources */, 569 | 861EC66D24B91F19005C2F44 /* HapticsGroup.swift in Sources */, 570 | 861EC66324B912D2005C2F44 /* ColorsGroup.swift in Sources */, 571 | 97DF0A5224DA6DE300F829B9 /* ButtonsGroup.swift in Sources */, 572 | 861EC66B24B91E1D005C2F44 /* ImagesGroup.swift in Sources */, 573 | 861EC66124B912C9005C2F44 /* ShapesGroup.swift in Sources */, 574 | 861EC64624B90DD9005C2F44 /* SwiftUI_KitApp.swift in Sources */, 575 | 97DF0A4E24DA6DE300F829B9 /* ButtonModifiers.swift in Sources */, 576 | 97E5A1DD24E1A71300246EAD /* SwiftUI_Kit_Widget.intentdefinition in Sources */, 577 | 861EC65624B90E16005C2F44 /* GroupView.swift in Sources */, 578 | 861EC65D24B9106E005C2F44 /* ControlsGroup.swift in Sources */, 579 | ); 580 | runOnlyForDeploymentPostprocessing = 0; 581 | }; 582 | 97E5A1CB24E1A71200246EAD /* Sources */ = { 583 | isa = PBXSourcesBuildPhase; 584 | buildActionMask = 2147483647; 585 | files = ( 586 | 97E5A1D724E1A71200246EAD /* SwiftUI_Kit_Widget.swift in Sources */, 587 | 97E5A1DC24E1A71300246EAD /* SwiftUI_Kit_Widget.intentdefinition in Sources */, 588 | ); 589 | runOnlyForDeploymentPostprocessing = 0; 590 | }; 591 | F95A4E0B24B9932000697538 /* Sources */ = { 592 | isa = PBXSourcesBuildPhase; 593 | buildActionMask = 2147483647; 594 | files = ( 595 | F9E8C6FA24C7E46C000A2F66 /* MapGroup.swift in Sources */, 596 | F95A4E2224B9938100697538 /* ImagesGroup.swift in Sources */, 597 | F95A4E1F24B9936000697538 /* SwiftUI_KitApp.swift in Sources */, 598 | F95A4E2824B9938100697538 /* IndicatorsGroup.swift in Sources */, 599 | F95A4E2524B9938100697538 /* ColorsGroup.swift in Sources */, 600 | F95A4E2324B9938100697538 /* GroupView.swift in Sources */, 601 | F95A4E2924B9938100697538 /* FontsGroup.swift in Sources */, 602 | 97DF0A5324DA6DE300F829B9 /* ButtonsGroup.swift in Sources */, 603 | F95A4E2124B9938100697538 /* ShapesGroup.swift in Sources */, 604 | F95A4E2A24B9938100697538 /* SectionView.swift in Sources */, 605 | F95A4E2624B9938100697538 /* ControlsGroup.swift in Sources */, 606 | F95A4E2724B9938100697538 /* TextGroup.swift in Sources */, 607 | F95A4E2024B9937800697538 /* ContentView.swift in Sources */, 608 | ); 609 | runOnlyForDeploymentPostprocessing = 0; 610 | }; 611 | /* End PBXSourcesBuildPhase section */ 612 | 613 | /* Begin PBXTargetDependency section */ 614 | 2D8F830E24BA011900E90F0B /* PBXTargetDependency */ = { 615 | isa = PBXTargetDependency; 616 | target = 2D8F82F224BA011700E90F0B /* SwiftUI Kit watchOS */; 617 | targetProxy = 2D8F830D24BA011900E90F0B /* PBXContainerItemProxy */; 618 | }; 619 | 97E5A1DF24E1A71300246EAD /* PBXTargetDependency */ = { 620 | isa = PBXTargetDependency; 621 | target = 97E5A1CE24E1A71200246EAD /* SwiftUI Kit WidgetExtension */; 622 | targetProxy = 97E5A1DE24E1A71300246EAD /* PBXContainerItemProxy */; 623 | }; 624 | /* End PBXTargetDependency section */ 625 | 626 | /* Begin XCBuildConfiguration section */ 627 | 2D8F831124BA011900E90F0B /* Debug */ = { 628 | isa = XCBuildConfiguration; 629 | buildSettings = { 630 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 631 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 632 | ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; 633 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 634 | CODE_SIGN_STYLE = Automatic; 635 | INFOPLIST_FILE = watchOS/Info.plist; 636 | LD_RUNPATH_SEARCH_PATHS = ( 637 | "@executable_path/Frameworks", 638 | "@executable_path/../../Frameworks", 639 | ); 640 | PRODUCT_BUNDLE_IDENTIFIER = com.swiftui.kit.watchkitapp; 641 | PRODUCT_NAME = "$(TARGET_NAME)"; 642 | SDKROOT = watchos; 643 | SKIP_INSTALL = YES; 644 | SWIFT_VERSION = 5.0; 645 | TARGETED_DEVICE_FAMILY = 4; 646 | WATCHOS_DEPLOYMENT_TARGET = 10.0; 647 | }; 648 | name = Debug; 649 | }; 650 | 2D8F831224BA011900E90F0B /* Release */ = { 651 | isa = XCBuildConfiguration; 652 | buildSettings = { 653 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 654 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 655 | ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; 656 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 657 | CODE_SIGN_STYLE = Automatic; 658 | INFOPLIST_FILE = watchOS/Info.plist; 659 | LD_RUNPATH_SEARCH_PATHS = ( 660 | "@executable_path/Frameworks", 661 | "@executable_path/../../Frameworks", 662 | ); 663 | PRODUCT_BUNDLE_IDENTIFIER = com.swiftui.kit.watchkitapp; 664 | PRODUCT_NAME = "$(TARGET_NAME)"; 665 | SDKROOT = watchos; 666 | SKIP_INSTALL = YES; 667 | SWIFT_VERSION = 5.0; 668 | TARGETED_DEVICE_FAMILY = 4; 669 | WATCHOS_DEPLOYMENT_TARGET = 10.0; 670 | }; 671 | name = Release; 672 | }; 673 | 2DF330AC24BAA8B90034C8D0 /* Debug */ = { 674 | isa = XCBuildConfiguration; 675 | buildSettings = { 676 | ASSETCATALOG_COMPILER_APPICON_NAME = "Brand Assets"; 677 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 678 | CODE_SIGN_STYLE = Automatic; 679 | DEVELOPMENT_ASSET_PATHS = "Shared/Preview\\ Content"; 680 | ENABLE_PREVIEWS = YES; 681 | INFOPLIST_FILE = tvOS/Info.plist; 682 | LD_RUNPATH_SEARCH_PATHS = ( 683 | "$(inherited)", 684 | "@executable_path/Frameworks", 685 | ); 686 | PRIVATE_HEADERS_FOLDER_PATH = tvOS/PrivateHeaders; 687 | PRODUCT_BUNDLE_IDENTIFIER = "lilsoftware.SwiftUI-Kit-tvOS"; 688 | PRODUCT_NAME = "$(TARGET_NAME)"; 689 | PUBLIC_HEADERS_FOLDER_PATH = tvOS/Headers; 690 | SDKROOT = appletvos; 691 | SWIFT_VERSION = 5.0; 692 | TARGETED_DEVICE_FAMILY = 3; 693 | TVOS_DEPLOYMENT_TARGET = 17.0; 694 | }; 695 | name = Debug; 696 | }; 697 | 2DF330AD24BAA8B90034C8D0 /* Release */ = { 698 | isa = XCBuildConfiguration; 699 | buildSettings = { 700 | ASSETCATALOG_COMPILER_APPICON_NAME = "Brand Assets"; 701 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 702 | CODE_SIGN_STYLE = Automatic; 703 | DEVELOPMENT_ASSET_PATHS = "Shared/Preview\\ Content"; 704 | ENABLE_PREVIEWS = YES; 705 | INFOPLIST_FILE = tvOS/Info.plist; 706 | LD_RUNPATH_SEARCH_PATHS = ( 707 | "$(inherited)", 708 | "@executable_path/Frameworks", 709 | ); 710 | PRIVATE_HEADERS_FOLDER_PATH = tvOS/PrivateHeaders; 711 | PRODUCT_BUNDLE_IDENTIFIER = "lilsoftware.SwiftUI-Kit-tvOS"; 712 | PRODUCT_NAME = "$(TARGET_NAME)"; 713 | PUBLIC_HEADERS_FOLDER_PATH = tvOS/Headers; 714 | SDKROOT = appletvos; 715 | SWIFT_VERSION = 5.0; 716 | TARGETED_DEVICE_FAMILY = 3; 717 | TVOS_DEPLOYMENT_TARGET = 17.0; 718 | }; 719 | name = Release; 720 | }; 721 | 861EC64F24B90DDB005C2F44 /* Debug */ = { 722 | isa = XCBuildConfiguration; 723 | buildSettings = { 724 | ALWAYS_SEARCH_USER_PATHS = NO; 725 | CLANG_ANALYZER_NONNULL = YES; 726 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 727 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 728 | CLANG_CXX_LIBRARY = "libc++"; 729 | CLANG_ENABLE_MODULES = YES; 730 | CLANG_ENABLE_OBJC_ARC = YES; 731 | CLANG_ENABLE_OBJC_WEAK = YES; 732 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 733 | CLANG_WARN_BOOL_CONVERSION = YES; 734 | CLANG_WARN_COMMA = YES; 735 | CLANG_WARN_CONSTANT_CONVERSION = YES; 736 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 737 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 738 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 739 | CLANG_WARN_EMPTY_BODY = YES; 740 | CLANG_WARN_ENUM_CONVERSION = YES; 741 | CLANG_WARN_INFINITE_RECURSION = YES; 742 | CLANG_WARN_INT_CONVERSION = YES; 743 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 744 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 745 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 746 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 747 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 748 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 749 | CLANG_WARN_STRICT_PROTOTYPES = YES; 750 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 751 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 752 | CLANG_WARN_UNREACHABLE_CODE = YES; 753 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 754 | COPY_PHASE_STRIP = NO; 755 | DEBUG_INFORMATION_FORMAT = dwarf; 756 | ENABLE_STRICT_OBJC_MSGSEND = YES; 757 | ENABLE_TESTABILITY = YES; 758 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 759 | GCC_C_LANGUAGE_STANDARD = gnu11; 760 | GCC_DYNAMIC_NO_PIC = NO; 761 | GCC_NO_COMMON_BLOCKS = YES; 762 | GCC_OPTIMIZATION_LEVEL = 0; 763 | GCC_PREPROCESSOR_DEFINITIONS = ( 764 | "DEBUG=1", 765 | "$(inherited)", 766 | ); 767 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 768 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 769 | GCC_WARN_UNDECLARED_SELECTOR = YES; 770 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 771 | GCC_WARN_UNUSED_FUNCTION = YES; 772 | GCC_WARN_UNUSED_VARIABLE = YES; 773 | IPHONEOS_DEPLOYMENT_TARGET = 17.0; 774 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 775 | MTL_FAST_MATH = YES; 776 | ONLY_ACTIVE_ARCH = YES; 777 | SDKROOT = iphoneos; 778 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 779 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 780 | }; 781 | name = Debug; 782 | }; 783 | 861EC65024B90DDB005C2F44 /* Release */ = { 784 | isa = XCBuildConfiguration; 785 | buildSettings = { 786 | ALWAYS_SEARCH_USER_PATHS = NO; 787 | CLANG_ANALYZER_NONNULL = YES; 788 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 789 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 790 | CLANG_CXX_LIBRARY = "libc++"; 791 | CLANG_ENABLE_MODULES = YES; 792 | CLANG_ENABLE_OBJC_ARC = YES; 793 | CLANG_ENABLE_OBJC_WEAK = YES; 794 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 795 | CLANG_WARN_BOOL_CONVERSION = YES; 796 | CLANG_WARN_COMMA = YES; 797 | CLANG_WARN_CONSTANT_CONVERSION = YES; 798 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 799 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 800 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 801 | CLANG_WARN_EMPTY_BODY = YES; 802 | CLANG_WARN_ENUM_CONVERSION = YES; 803 | CLANG_WARN_INFINITE_RECURSION = YES; 804 | CLANG_WARN_INT_CONVERSION = YES; 805 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 806 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 807 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 808 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 809 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 810 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 811 | CLANG_WARN_STRICT_PROTOTYPES = YES; 812 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 813 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 814 | CLANG_WARN_UNREACHABLE_CODE = YES; 815 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 816 | COPY_PHASE_STRIP = NO; 817 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 818 | ENABLE_NS_ASSERTIONS = NO; 819 | ENABLE_STRICT_OBJC_MSGSEND = YES; 820 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 821 | GCC_C_LANGUAGE_STANDARD = gnu11; 822 | GCC_NO_COMMON_BLOCKS = YES; 823 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 824 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 825 | GCC_WARN_UNDECLARED_SELECTOR = YES; 826 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 827 | GCC_WARN_UNUSED_FUNCTION = YES; 828 | GCC_WARN_UNUSED_VARIABLE = YES; 829 | IPHONEOS_DEPLOYMENT_TARGET = 17.0; 830 | MTL_ENABLE_DEBUG_INFO = NO; 831 | MTL_FAST_MATH = YES; 832 | SDKROOT = iphoneos; 833 | SWIFT_COMPILATION_MODE = wholemodule; 834 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 835 | VALIDATE_PRODUCT = YES; 836 | }; 837 | name = Release; 838 | }; 839 | 861EC65224B90DDB005C2F44 /* Debug */ = { 840 | isa = XCBuildConfiguration; 841 | buildSettings = { 842 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 843 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 844 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 845 | CODE_SIGN_STYLE = Automatic; 846 | DEVELOPMENT_ASSET_PATHS = "\"Shared/Preview Content\""; 847 | ENABLE_PREVIEWS = YES; 848 | INFOPLIST_FILE = iOS/Info.plist; 849 | INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; 850 | IPHONEOS_DEPLOYMENT_TARGET = 17.0; 851 | LD_RUNPATH_SEARCH_PATHS = ( 852 | "$(inherited)", 853 | "@executable_path/Frameworks", 854 | ); 855 | PRODUCT_BUNDLE_IDENTIFIER = com.swiftui.kit; 856 | PRODUCT_NAME = "$(TARGET_NAME)"; 857 | SWIFT_VERSION = 5.0; 858 | TARGETED_DEVICE_FAMILY = "1,2"; 859 | }; 860 | name = Debug; 861 | }; 862 | 861EC65324B90DDB005C2F44 /* Release */ = { 863 | isa = XCBuildConfiguration; 864 | buildSettings = { 865 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 866 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 867 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 868 | CODE_SIGN_STYLE = Automatic; 869 | DEVELOPMENT_ASSET_PATHS = "\"Shared/Preview Content\""; 870 | ENABLE_PREVIEWS = YES; 871 | INFOPLIST_FILE = iOS/Info.plist; 872 | INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; 873 | IPHONEOS_DEPLOYMENT_TARGET = 17.0; 874 | LD_RUNPATH_SEARCH_PATHS = ( 875 | "$(inherited)", 876 | "@executable_path/Frameworks", 877 | ); 878 | PRODUCT_BUNDLE_IDENTIFIER = com.swiftui.kit; 879 | PRODUCT_NAME = "$(TARGET_NAME)"; 880 | SWIFT_VERSION = 5.0; 881 | TARGETED_DEVICE_FAMILY = "1,2"; 882 | }; 883 | name = Release; 884 | }; 885 | 97E5A1E224E1A71300246EAD /* Debug */ = { 886 | isa = XCBuildConfiguration; 887 | buildSettings = { 888 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 889 | ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; 890 | CODE_SIGN_STYLE = Automatic; 891 | DEVELOPMENT_TEAM = ""; 892 | INFOPLIST_FILE = "SwiftUI Kit Widget/Info.plist"; 893 | LD_RUNPATH_SEARCH_PATHS = ( 894 | "$(inherited)", 895 | "@executable_path/Frameworks", 896 | "@executable_path/../../Frameworks", 897 | ); 898 | PRODUCT_BUNDLE_IDENTIFIER = "com.swiftui.kit.SwiftUI-Kit-Widget"; 899 | PRODUCT_NAME = "$(TARGET_NAME)"; 900 | SKIP_INSTALL = YES; 901 | SWIFT_VERSION = 5.0; 902 | TARGETED_DEVICE_FAMILY = "1,2"; 903 | }; 904 | name = Debug; 905 | }; 906 | 97E5A1E324E1A71300246EAD /* Release */ = { 907 | isa = XCBuildConfiguration; 908 | buildSettings = { 909 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 910 | ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; 911 | CODE_SIGN_STYLE = Automatic; 912 | DEVELOPMENT_TEAM = ""; 913 | INFOPLIST_FILE = "SwiftUI Kit Widget/Info.plist"; 914 | LD_RUNPATH_SEARCH_PATHS = ( 915 | "$(inherited)", 916 | "@executable_path/Frameworks", 917 | "@executable_path/../../Frameworks", 918 | ); 919 | PRODUCT_BUNDLE_IDENTIFIER = "com.swiftui.kit.SwiftUI-Kit-Widget"; 920 | PRODUCT_NAME = "$(TARGET_NAME)"; 921 | SKIP_INSTALL = YES; 922 | SWIFT_VERSION = 5.0; 923 | TARGETED_DEVICE_FAMILY = "1,2"; 924 | }; 925 | name = Release; 926 | }; 927 | F95A4E1D24B9932200697538 /* Debug */ = { 928 | isa = XCBuildConfiguration; 929 | buildSettings = { 930 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 931 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 932 | CODE_SIGN_ENTITLEMENTS = macOS/SwiftUI_Kit_Mac.entitlements; 933 | CODE_SIGN_IDENTITY = "-"; 934 | CODE_SIGN_STYLE = Automatic; 935 | COMBINE_HIDPI_IMAGES = YES; 936 | DEAD_CODE_STRIPPING = YES; 937 | DEVELOPMENT_ASSET_PATHS = "\"Shared/Preview Content\""; 938 | ENABLE_PREVIEWS = YES; 939 | INFOPLIST_FILE = macOS/Info.plist; 940 | INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; 941 | LD_RUNPATH_SEARCH_PATHS = ( 942 | "$(inherited)", 943 | "@executable_path/../Frameworks", 944 | ); 945 | MACOSX_DEPLOYMENT_TARGET = 14.0; 946 | PRODUCT_BUNDLE_IDENTIFIER = "lilsoftware-Kit-Mac"; 947 | PRODUCT_NAME = "$(TARGET_NAME)"; 948 | SDKROOT = macosx; 949 | SWIFT_VERSION = 5.0; 950 | }; 951 | name = Debug; 952 | }; 953 | F95A4E1E24B9932200697538 /* Release */ = { 954 | isa = XCBuildConfiguration; 955 | buildSettings = { 956 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 957 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 958 | CODE_SIGN_ENTITLEMENTS = macOS/SwiftUI_Kit_Mac.entitlements; 959 | CODE_SIGN_IDENTITY = "-"; 960 | CODE_SIGN_STYLE = Automatic; 961 | COMBINE_HIDPI_IMAGES = YES; 962 | DEAD_CODE_STRIPPING = YES; 963 | DEVELOPMENT_ASSET_PATHS = "\"Shared/Preview Content\""; 964 | ENABLE_PREVIEWS = YES; 965 | INFOPLIST_FILE = macOS/Info.plist; 966 | INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; 967 | LD_RUNPATH_SEARCH_PATHS = ( 968 | "$(inherited)", 969 | "@executable_path/../Frameworks", 970 | ); 971 | MACOSX_DEPLOYMENT_TARGET = 14.0; 972 | PRODUCT_BUNDLE_IDENTIFIER = "lilsoftware.SwiftUI-Kit-Mac"; 973 | PRODUCT_NAME = "$(TARGET_NAME)"; 974 | SDKROOT = macosx; 975 | SWIFT_VERSION = 5.0; 976 | }; 977 | name = Release; 978 | }; 979 | /* End XCBuildConfiguration section */ 980 | 981 | /* Begin XCConfigurationList section */ 982 | 2D8F831724BA011900E90F0B /* Build configuration list for PBXNativeTarget "SwiftUI Kit watchOS" */ = { 983 | isa = XCConfigurationList; 984 | buildConfigurations = ( 985 | 2D8F831124BA011900E90F0B /* Debug */, 986 | 2D8F831224BA011900E90F0B /* Release */, 987 | ); 988 | defaultConfigurationIsVisible = 0; 989 | defaultConfigurationName = Release; 990 | }; 991 | 2DF330AE24BAA8B90034C8D0 /* Build configuration list for PBXNativeTarget "SwiftUI Kit tvOS" */ = { 992 | isa = XCConfigurationList; 993 | buildConfigurations = ( 994 | 2DF330AC24BAA8B90034C8D0 /* Debug */, 995 | 2DF330AD24BAA8B90034C8D0 /* Release */, 996 | ); 997 | defaultConfigurationIsVisible = 0; 998 | defaultConfigurationName = Release; 999 | }; 1000 | 861EC63D24B90DD9005C2F44 /* Build configuration list for PBXProject "SwiftUI Kit" */ = { 1001 | isa = XCConfigurationList; 1002 | buildConfigurations = ( 1003 | 861EC64F24B90DDB005C2F44 /* Debug */, 1004 | 861EC65024B90DDB005C2F44 /* Release */, 1005 | ); 1006 | defaultConfigurationIsVisible = 0; 1007 | defaultConfigurationName = Release; 1008 | }; 1009 | 861EC65124B90DDB005C2F44 /* Build configuration list for PBXNativeTarget "SwiftUI Kit iOS" */ = { 1010 | isa = XCConfigurationList; 1011 | buildConfigurations = ( 1012 | 861EC65224B90DDB005C2F44 /* Debug */, 1013 | 861EC65324B90DDB005C2F44 /* Release */, 1014 | ); 1015 | defaultConfigurationIsVisible = 0; 1016 | defaultConfigurationName = Release; 1017 | }; 1018 | 97E5A1E424E1A71300246EAD /* Build configuration list for PBXNativeTarget "SwiftUI Kit WidgetExtension" */ = { 1019 | isa = XCConfigurationList; 1020 | buildConfigurations = ( 1021 | 97E5A1E224E1A71300246EAD /* Debug */, 1022 | 97E5A1E324E1A71300246EAD /* Release */, 1023 | ); 1024 | defaultConfigurationIsVisible = 0; 1025 | defaultConfigurationName = Release; 1026 | }; 1027 | F95A4E1C24B9932200697538 /* Build configuration list for PBXNativeTarget "SwiftUI Kit Mac" */ = { 1028 | isa = XCConfigurationList; 1029 | buildConfigurations = ( 1030 | F95A4E1D24B9932200697538 /* Debug */, 1031 | F95A4E1E24B9932200697538 /* Release */, 1032 | ); 1033 | defaultConfigurationIsVisible = 0; 1034 | defaultConfigurationName = Release; 1035 | }; 1036 | /* End XCConfigurationList section */ 1037 | }; 1038 | rootObject = 861EC63A24B90DD9005C2F44 /* Project object */; 1039 | } 1040 | -------------------------------------------------------------------------------- /SwiftUI Kit.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /SwiftUI Kit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /SwiftUI Kit.xcodeproj/project.xcworkspace/xcuserdata/jordansinger.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/SwiftUI-Kit/1211aa6b1aee07a3860e4f45d5cd5efcfec64509/SwiftUI Kit.xcodeproj/project.xcworkspace/xcuserdata/jordansinger.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /SwiftUI Kit.xcodeproj/xcuserdata/jordansinger.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | SwiftUI Kit.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /iOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | SwiftUI 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UIApplicationSceneManifest 26 | 27 | UIApplicationSupportsMultipleScenes 28 | 29 | 30 | UIApplicationSupportsIndirectInputEvents 31 | 32 | UILaunchScreen 33 | 34 | UIRequiredDeviceCapabilities 35 | 36 | armv7 37 | 38 | UIRequiresFullScreen 39 | 40 | UISupportedInterfaceOrientations 41 | 42 | UIInterfaceOrientationPortrait 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | UISupportedInterfaceOrientations~ipad 47 | 48 | UIInterfaceOrientationPortrait 49 | UIInterfaceOrientationPortraitUpsideDown 50 | UIInterfaceOrientationLandscapeLeft 51 | UIInterfaceOrientationLandscapeRight 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /macOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSApplicationCategoryType 22 | public.app-category.developer-tools 23 | LSMinimumSystemVersion 24 | $(MACOSX_DEPLOYMENT_TARGET) 25 | 26 | 27 | -------------------------------------------------------------------------------- /macOS/SwiftUI_Kit_Mac.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.files.user-selected.read-only 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /tvOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchScreen 24 | 25 | UIRequiredDeviceCapabilities 26 | 27 | arm64 28 | 29 | UIUserInterfaceStyle 30 | Automatic 31 | 32 | 33 | -------------------------------------------------------------------------------- /watchOS Extension/ComplicationController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ComplicationController.swift 3 | // SwiftUI Kit watchOS Extension 4 | // 5 | // Created by Ramy Majouji on 7/11/20. 6 | // 7 | 8 | import ClockKit 9 | 10 | 11 | class ComplicationController: NSObject, CLKComplicationDataSource { 12 | 13 | // MARK: - Complication Configuration 14 | 15 | func getComplicationDescriptors(handler: @escaping ([CLKComplicationDescriptor]) -> Void) { 16 | let descriptors = [ 17 | CLKComplicationDescriptor(identifier: "complication", displayName: "SwiftUI Kit", supportedFamilies: CLKComplicationFamily.allCases) 18 | // Multiple complication support can be added here with more descriptors 19 | ] 20 | 21 | // Call the handler with the currently supported complication descriptors 22 | handler(descriptors) 23 | } 24 | 25 | func handleSharedComplicationDescriptors(_ complicationDescriptors: [CLKComplicationDescriptor]) { 26 | // Do any necessary work to support these newly shared complication descriptors 27 | } 28 | 29 | // MARK: - Timeline Configuration 30 | 31 | func getTimelineEndDate(for complication: CLKComplication, withHandler handler: @escaping (Date?) -> Void) { 32 | // Call the handler with the last entry date you can currently provide or nil if you can't support future timelines 33 | handler(nil) 34 | } 35 | 36 | func getPrivacyBehavior(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationPrivacyBehavior) -> Void) { 37 | // Call the handler with your desired behavior when the device is locked 38 | handler(.showOnLockScreen) 39 | } 40 | 41 | // MARK: - Timeline Population 42 | 43 | func getCurrentTimelineEntry(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimelineEntry?) -> Void) { 44 | // Call the handler with the current timeline entry 45 | handler(nil) 46 | } 47 | 48 | func getTimelineEntries(for complication: CLKComplication, after date: Date, limit: Int, withHandler handler: @escaping ([CLKComplicationTimelineEntry]?) -> Void) { 49 | // Call the handler with the timeline entries after the given date 50 | handler(nil) 51 | } 52 | 53 | // MARK: - Sample Templates 54 | 55 | func getLocalizableSampleTemplate(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTemplate?) -> Void) { 56 | // This method will be called once per supported complication, and the results will be cached 57 | handler(nil) 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /watchOS Extension/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | SwiftUI Kit watchOS Extension 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | CLKComplicationPrincipalClass 24 | $(PRODUCT_MODULE_NAME).ComplicationController 25 | NSExtension 26 | 27 | NSExtensionAttributes 28 | 29 | WKAppBundleIdentifier 30 | com.swiftui.kit.watchkitapp 31 | 32 | NSExtensionPointIdentifier 33 | com.apple.watchkit 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /watchOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | SwiftUI Kit 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | CLKComplicationPrincipalClass 24 | $(PRODUCT_MODULE_NAME).ComplicationController 25 | UISupportedInterfaceOrientations 26 | 27 | UIInterfaceOrientationPortrait 28 | UIInterfaceOrientationPortraitUpsideDown 29 | 30 | WKApplication 31 | 32 | WKCompanionAppBundleIdentifier 33 | com.swiftui.kit 34 | 35 | 36 | --------------------------------------------------------------------------------