diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 009663a..529c846 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,6 +1,10 @@ name: ci -on: [push, pull_request] +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] jobs: build: @@ -8,7 +12,7 @@ jobs: runs-on: macos-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Build run: swift build -v - name: Run tests diff --git a/.gitignore b/.gitignore index fc87296..b7bd96b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .DS_Store -/.build -/Packages +*.xcodeproj xcuserdata/ -.swiftpm -Package.resolved + +Packages/ +.build/ +.swiftpm \ No newline at end of file diff --git a/GridDemo iOS/AppDelegate.swift b/Demo/GridDemo iOS/AppDelegate.swift similarity index 100% rename from GridDemo iOS/AppDelegate.swift rename to Demo/GridDemo iOS/AppDelegate.swift diff --git a/GridDemo iOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/Demo/GridDemo iOS/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from GridDemo iOS/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Demo/GridDemo iOS/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/GridDemo iOS/Assets.xcassets/Contents.json b/Demo/GridDemo iOS/Assets.xcassets/Contents.json similarity index 100% rename from GridDemo iOS/Assets.xcassets/Contents.json rename to Demo/GridDemo iOS/Assets.xcassets/Contents.json diff --git a/GridDemo iOS/Assets.xcassets/first.imageset/Contents.json b/Demo/GridDemo iOS/Assets.xcassets/first.imageset/Contents.json similarity index 100% rename from GridDemo iOS/Assets.xcassets/first.imageset/Contents.json rename to Demo/GridDemo iOS/Assets.xcassets/first.imageset/Contents.json diff --git a/GridDemo iOS/Assets.xcassets/first.imageset/first.pdf b/Demo/GridDemo iOS/Assets.xcassets/first.imageset/first.pdf similarity index 100% rename from GridDemo iOS/Assets.xcassets/first.imageset/first.pdf rename to Demo/GridDemo iOS/Assets.xcassets/first.imageset/first.pdf diff --git a/GridDemo iOS/Assets.xcassets/second.imageset/Contents.json b/Demo/GridDemo iOS/Assets.xcassets/second.imageset/Contents.json similarity index 100% rename from GridDemo iOS/Assets.xcassets/second.imageset/Contents.json rename to Demo/GridDemo iOS/Assets.xcassets/second.imageset/Contents.json diff --git a/GridDemo iOS/Assets.xcassets/second.imageset/second.pdf b/Demo/GridDemo iOS/Assets.xcassets/second.imageset/second.pdf similarity index 100% rename from GridDemo iOS/Assets.xcassets/second.imageset/second.pdf rename to Demo/GridDemo iOS/Assets.xcassets/second.imageset/second.pdf diff --git a/GridDemo iOS/Base.lproj/LaunchScreen.storyboard b/Demo/GridDemo iOS/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from GridDemo iOS/Base.lproj/LaunchScreen.storyboard rename to Demo/GridDemo iOS/Base.lproj/LaunchScreen.storyboard diff --git a/GridDemo iOS/ContentView.swift b/Demo/GridDemo iOS/ContentView.swift similarity index 64% rename from GridDemo iOS/ContentView.swift rename to Demo/GridDemo iOS/ContentView.swift index bd6c0d9..9d8c88b 100644 --- a/GridDemo iOS/ContentView.swift +++ b/Demo/GridDemo iOS/ContentView.swift @@ -19,6 +19,20 @@ struct ContentView: View { Text("Staggered Grid") } } + + NavigationLink(destination: SectionedGridView()) { + HStack { + Image(systemName: "rectangle.grid.1x2.fill") + Text("Sectioned Grid") + } + } + + NavigationLink(destination: StaticGridView()) { + HStack { + Image(systemName: "circle.grid.2x2.fill") + Text("Static Grid") + } + } } } .listStyle( diff --git a/GridDemo iOS/Info.plist b/Demo/GridDemo iOS/Info.plist similarity index 100% rename from GridDemo iOS/Info.plist rename to Demo/GridDemo iOS/Info.plist diff --git a/GridDemo iOS/ModularGrid/ModularGridSettingsView.swift b/Demo/GridDemo iOS/ModularGrid/ModularGridSettingsView.swift similarity index 100% rename from GridDemo iOS/ModularGrid/ModularGridSettingsView.swift rename to Demo/GridDemo iOS/ModularGrid/ModularGridSettingsView.swift diff --git a/GridDemo iOS/ModularGrid/ModularGridView.swift b/Demo/GridDemo iOS/ModularGrid/ModularGridView.swift similarity index 100% rename from GridDemo iOS/ModularGrid/ModularGridView.swift rename to Demo/GridDemo iOS/ModularGrid/ModularGridView.swift diff --git a/GridDemo iOS/Preview Content/Preview Assets.xcassets/Contents.json b/Demo/GridDemo iOS/Preview Content/Preview Assets.xcassets/Contents.json similarity index 100% rename from GridDemo iOS/Preview Content/Preview Assets.xcassets/Contents.json rename to Demo/GridDemo iOS/Preview Content/Preview Assets.xcassets/Contents.json diff --git a/GridDemo iOS/SceneDelegate.swift b/Demo/GridDemo iOS/SceneDelegate.swift similarity index 100% rename from GridDemo iOS/SceneDelegate.swift rename to Demo/GridDemo iOS/SceneDelegate.swift diff --git a/Demo/GridDemo iOS/SectionedGrid/SectionedGridView.swift b/Demo/GridDemo iOS/SectionedGrid/SectionedGridView.swift new file mode 100644 index 0000000..8bd21f0 --- /dev/null +++ b/Demo/GridDemo iOS/SectionedGrid/SectionedGridView.swift @@ -0,0 +1,58 @@ +import SwiftUI +import Grid + +struct SectionedGridView: View { + var body: some View { + ScrollView { + ForEach(1..<8) { section in + Section { + HStack { + Text("Section \(section)").font(.headline).fontWeight(.bold) + Spacer() + } + + Grid(self.rangeFor(section: section), id: \.self) { index in + Rectangle() + .foregroundColor(.clear) + .background( + Image("\(index)") + .renderingMode(.original) + .resizable() + .scaledToFill() + ) + .clipped() + .clipShape(RoundedRectangle(cornerRadius: 4)) + } + + Spacer(minLength: 16) + } + } + + .padding(8) + } + .navigationBarTitle("Sectioned Grid", displayMode: .inline) + .gridStyle( + ModularGridStyle(columns: .min(80), rows: .fixed(80), spacing: 4) + ) + } + + private func rangeFor(section: Int) -> Range { + switch section { + case 1: return Range(1...10) + case 2: return Range(11...15) + case 3: return Range(16...26) + case 4: return Range(27...35) + case 5: return Range(36...38) + case 6: return Range(39...55) + case 7: return Range(56...69) + default: + fatalError() + } + } +} + +struct SectionedGridView_Previews: PreviewProvider { + static var previews: some View { + SectionedGridView() + } +} diff --git a/GridDemo iOS/StaggeredGrid/ImageDetailView.swift b/Demo/GridDemo iOS/StaggeredGrid/ImageDetailView.swift similarity index 100% rename from GridDemo iOS/StaggeredGrid/ImageDetailView.swift rename to Demo/GridDemo iOS/StaggeredGrid/ImageDetailView.swift diff --git a/GridDemo iOS/StaggeredGrid/StaggeredGridSettingsView.swift b/Demo/GridDemo iOS/StaggeredGrid/StaggeredGridSettingsView.swift similarity index 100% rename from GridDemo iOS/StaggeredGrid/StaggeredGridSettingsView.swift rename to Demo/GridDemo iOS/StaggeredGrid/StaggeredGridSettingsView.swift diff --git a/GridDemo iOS/StaggeredGrid/StaggeredGridView.swift b/Demo/GridDemo iOS/StaggeredGrid/StaggeredGridView.swift similarity index 100% rename from GridDemo iOS/StaggeredGrid/StaggeredGridView.swift rename to Demo/GridDemo iOS/StaggeredGrid/StaggeredGridView.swift diff --git a/Demo/GridDemo iOS/StaticGrid/StaticGridView.swift b/Demo/GridDemo iOS/StaticGrid/StaticGridView.swift new file mode 100644 index 0000000..46162a6 --- /dev/null +++ b/Demo/GridDemo iOS/StaticGrid/StaticGridView.swift @@ -0,0 +1,33 @@ +import SwiftUI +import Grid + +struct StaticGridView: View { + var body: some View { + ScrollView { + Grid { + Capsule().foregroundColor(.random) + Capsule().foregroundColor(.random) + Capsule().foregroundColor(.random) + Capsule().foregroundColor(.random) + Capsule().foregroundColor(.random) + Capsule().foregroundColor(.random) + Capsule().foregroundColor(.random) + Capsule().foregroundColor(.random) + Capsule().foregroundColor(.random) + Capsule().foregroundColor(.random) + } + .padding(16) + .frame(height: 300) + } + .navigationBarTitle("Static Grid", displayMode: .inline) + .gridStyle( + ModularGridStyle(columns: 5, rows: 2, spacing: 16) + ) + } +} + +struct StaticGridView_Previews: PreviewProvider { + static var previews: some View { + StaticGridView() + } +} diff --git a/GridDemo macOS/AppDelegate.swift b/Demo/GridDemo macOS/AppDelegate.swift similarity index 100% rename from GridDemo macOS/AppDelegate.swift rename to Demo/GridDemo macOS/AppDelegate.swift diff --git a/GridDemo macOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/Demo/GridDemo macOS/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from GridDemo macOS/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Demo/GridDemo macOS/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/GridDemo macOS/Assets.xcassets/Contents.json b/Demo/GridDemo macOS/Assets.xcassets/Contents.json similarity index 100% rename from GridDemo macOS/Assets.xcassets/Contents.json rename to Demo/GridDemo macOS/Assets.xcassets/Contents.json diff --git a/GridDemo macOS/Base.lproj/Main.storyboard b/Demo/GridDemo macOS/Base.lproj/Main.storyboard similarity index 100% rename from GridDemo macOS/Base.lproj/Main.storyboard rename to Demo/GridDemo macOS/Base.lproj/Main.storyboard diff --git a/GridDemo macOS/ContentView.swift b/Demo/GridDemo macOS/ContentView.swift similarity index 72% rename from GridDemo macOS/ContentView.swift rename to Demo/GridDemo macOS/ContentView.swift index 1d6a36f..c8d467b 100644 --- a/GridDemo macOS/ContentView.swift +++ b/Demo/GridDemo macOS/ContentView.swift @@ -12,6 +12,14 @@ struct ContentView: View { NavigationLink(destination: StaggeredGridView()) { Text("Staggered Grid") } + + NavigationLink(destination: SectionedGridView()) { + Text("Sectioned Grid") + } + + NavigationLink(destination: StaticGridView()) { + Text("Static Grid") + } } } .frame(minWidth: 200, maxWidth: 300) diff --git a/GridDemo macOS/GridDemo_macOS.entitlements b/Demo/GridDemo macOS/GridDemo_macOS.entitlements similarity index 100% rename from GridDemo macOS/GridDemo_macOS.entitlements rename to Demo/GridDemo macOS/GridDemo_macOS.entitlements diff --git a/GridDemo macOS/Info.plist b/Demo/GridDemo macOS/Info.plist similarity index 100% rename from GridDemo macOS/Info.plist rename to Demo/GridDemo macOS/Info.plist diff --git a/GridDemo macOS/ModularGrid/ModularGridSettingsView.swift b/Demo/GridDemo macOS/ModularGrid/ModularGridSettingsView.swift similarity index 100% rename from GridDemo macOS/ModularGrid/ModularGridSettingsView.swift rename to Demo/GridDemo macOS/ModularGrid/ModularGridSettingsView.swift diff --git a/GridDemo macOS/ModularGrid/ModularGridView.swift b/Demo/GridDemo macOS/ModularGrid/ModularGridView.swift similarity index 100% rename from GridDemo macOS/ModularGrid/ModularGridView.swift rename to Demo/GridDemo macOS/ModularGrid/ModularGridView.swift diff --git a/GridDemo macOS/Preview Content/Preview Assets.xcassets/Contents.json b/Demo/GridDemo macOS/Preview Content/Preview Assets.xcassets/Contents.json similarity index 100% rename from GridDemo macOS/Preview Content/Preview Assets.xcassets/Contents.json rename to Demo/GridDemo macOS/Preview Content/Preview Assets.xcassets/Contents.json diff --git a/Demo/GridDemo macOS/SectionedGrid/SectionedGridView.swift b/Demo/GridDemo macOS/SectionedGrid/SectionedGridView.swift new file mode 100644 index 0000000..954c1a1 --- /dev/null +++ b/Demo/GridDemo macOS/SectionedGrid/SectionedGridView.swift @@ -0,0 +1,57 @@ +import SwiftUI +import Grid + +struct SectionedGridView: View { + var body: some View { + ScrollView { + ForEach(1..<8) { section in + Section { + HStack { + Text("Section \(section)").font(.headline).fontWeight(.bold) + Spacer() + } + + Grid(self.rangeFor(section: section), id: \.self) { index in + Rectangle() + .foregroundColor(.clear) + .background( + Image("\(index)") + .renderingMode(.original) + .resizable() + .scaledToFill() + ) + .clipped() + .clipShape(RoundedRectangle(cornerRadius: 4)) + } + + Spacer(minLength: 16) + } + } + + .padding(8) + } + .gridStyle( + ModularGridStyle(columns: .min(100), rows: .fixed(100), spacing: 4) + ) + } + + private func rangeFor(section: Int) -> Range { + switch section { + case 1: return Range(1...10) + case 2: return Range(11...15) + case 3: return Range(16...26) + case 4: return Range(27...35) + case 5: return Range(36...38) + case 6: return Range(39...55) + case 7: return Range(56...69) + default: + fatalError() + } + } +} + +struct SectionedGridView_Previews: PreviewProvider { + static var previews: some View { + SectionedGridView() + } +} diff --git a/GridDemo macOS/StaggeredGrid/StaggeredGridSettingsView.swift b/Demo/GridDemo macOS/StaggeredGrid/StaggeredGridSettingsView.swift similarity index 100% rename from GridDemo macOS/StaggeredGrid/StaggeredGridSettingsView.swift rename to Demo/GridDemo macOS/StaggeredGrid/StaggeredGridSettingsView.swift diff --git a/GridDemo macOS/StaggeredGrid/StaggeredGridView.swift b/Demo/GridDemo macOS/StaggeredGrid/StaggeredGridView.swift similarity index 100% rename from GridDemo macOS/StaggeredGrid/StaggeredGridView.swift rename to Demo/GridDemo macOS/StaggeredGrid/StaggeredGridView.swift diff --git a/Demo/GridDemo macOS/StaticGrid/StaticGridView.swift b/Demo/GridDemo macOS/StaticGrid/StaticGridView.swift new file mode 100644 index 0000000..2d53049 --- /dev/null +++ b/Demo/GridDemo macOS/StaticGrid/StaticGridView.swift @@ -0,0 +1,32 @@ +import SwiftUI +import Grid + +struct StaticGridView: View { + var body: some View { + ScrollView { + Grid { + Capsule().foregroundColor(.random) + Capsule().foregroundColor(.random) + Capsule().foregroundColor(.random) + Capsule().foregroundColor(.random) + Capsule().foregroundColor(.random) + Capsule().foregroundColor(.random) + Capsule().foregroundColor(.random) + Capsule().foregroundColor(.random) + Capsule().foregroundColor(.random) + Capsule().foregroundColor(.random) + } + .padding(16) + .frame(height: 300) + } + .gridStyle( + ModularGridStyle(columns: 5, rows: 2, spacing: 16) + ) + } +} + +struct StaticGridView_Previews: PreviewProvider { + static var previews: some View { + StaticGridView() + } +} diff --git a/GridDemo tvOS/AppDelegate.swift b/Demo/GridDemo tvOS/AppDelegate.swift similarity index 100% rename from GridDemo tvOS/AppDelegate.swift rename to Demo/GridDemo tvOS/AppDelegate.swift diff --git a/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json similarity index 100% rename from GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json rename to Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json diff --git a/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json b/Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json similarity index 100% rename from GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json rename to Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json diff --git a/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json b/Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json similarity index 100% rename from GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json rename to Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json diff --git a/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json similarity index 100% rename from GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json rename to Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json diff --git a/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json b/Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json similarity index 100% rename from GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json rename to Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json diff --git a/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json similarity index 100% rename from GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json rename to Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json diff --git a/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json b/Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json similarity index 100% rename from GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json rename to Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json diff --git a/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json similarity index 100% rename from GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json rename to Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json diff --git a/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json b/Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json similarity index 100% rename from GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json rename to Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json diff --git a/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json b/Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json similarity index 100% rename from GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json rename to Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json diff --git a/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json similarity index 100% rename from GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json rename to Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json diff --git a/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json b/Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json similarity index 100% rename from GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json rename to Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json diff --git a/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json similarity index 100% rename from GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json rename to Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json diff --git a/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json b/Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json similarity index 100% rename from GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json rename to Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json diff --git a/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json b/Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json similarity index 100% rename from GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json rename to Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json diff --git a/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json b/Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json similarity index 100% rename from GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json rename to Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json diff --git a/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json b/Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json similarity index 100% rename from GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json rename to Demo/GridDemo tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json diff --git a/GridDemo tvOS/Assets.xcassets/Contents.json b/Demo/GridDemo tvOS/Assets.xcassets/Contents.json similarity index 100% rename from GridDemo tvOS/Assets.xcassets/Contents.json rename to Demo/GridDemo tvOS/Assets.xcassets/Contents.json diff --git a/GridDemo tvOS/Base.lproj/LaunchScreen.storyboard b/Demo/GridDemo tvOS/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from GridDemo tvOS/Base.lproj/LaunchScreen.storyboard rename to Demo/GridDemo tvOS/Base.lproj/LaunchScreen.storyboard diff --git a/GridDemo tvOS/ContentView.swift b/Demo/GridDemo tvOS/ContentView.swift similarity index 100% rename from GridDemo tvOS/ContentView.swift rename to Demo/GridDemo tvOS/ContentView.swift diff --git a/GridDemo tvOS/Info.plist b/Demo/GridDemo tvOS/Info.plist similarity index 100% rename from GridDemo tvOS/Info.plist rename to Demo/GridDemo tvOS/Info.plist diff --git a/GridDemo tvOS/ModularGrid/ModularGridView.swift b/Demo/GridDemo tvOS/ModularGrid/ModularGridView.swift similarity index 100% rename from GridDemo tvOS/ModularGrid/ModularGridView.swift rename to Demo/GridDemo tvOS/ModularGrid/ModularGridView.swift diff --git a/GridDemo tvOS/Preview Content/Preview Assets.xcassets/Contents.json b/Demo/GridDemo tvOS/Preview Content/Preview Assets.xcassets/Contents.json similarity index 100% rename from GridDemo tvOS/Preview Content/Preview Assets.xcassets/Contents.json rename to Demo/GridDemo tvOS/Preview Content/Preview Assets.xcassets/Contents.json diff --git a/GridDemo tvOS/StaggeredGrid/StaggeredGridView.swift b/Demo/GridDemo tvOS/StaggeredGrid/StaggeredGridView.swift similarity index 100% rename from GridDemo tvOS/StaggeredGrid/StaggeredGridView.swift rename to Demo/GridDemo tvOS/StaggeredGrid/StaggeredGridView.swift diff --git a/GridDemo watchOS WatchKit App/Assets.xcassets/AppIcon.appiconset/Contents.json b/Demo/GridDemo watchOS WatchKit App/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from GridDemo watchOS WatchKit App/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Demo/GridDemo watchOS WatchKit App/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/GridDemo watchOS WatchKit App/Assets.xcassets/Contents.json b/Demo/GridDemo watchOS WatchKit App/Assets.xcassets/Contents.json similarity index 100% rename from GridDemo watchOS WatchKit App/Assets.xcassets/Contents.json rename to Demo/GridDemo watchOS WatchKit App/Assets.xcassets/Contents.json diff --git a/GridDemo watchOS WatchKit App/Base.lproj/Interface.storyboard b/Demo/GridDemo watchOS WatchKit App/Base.lproj/Interface.storyboard similarity index 100% rename from GridDemo watchOS WatchKit App/Base.lproj/Interface.storyboard rename to Demo/GridDemo watchOS WatchKit App/Base.lproj/Interface.storyboard diff --git a/GridDemo watchOS WatchKit App/Info.plist b/Demo/GridDemo watchOS WatchKit App/Info.plist similarity index 100% rename from GridDemo watchOS WatchKit App/Info.plist rename to Demo/GridDemo watchOS WatchKit App/Info.plist diff --git a/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json b/Demo/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json similarity index 100% rename from GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json rename to Demo/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json diff --git a/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Contents.json b/Demo/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Contents.json similarity index 100% rename from GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Contents.json rename to Demo/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Contents.json diff --git a/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json b/Demo/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json similarity index 100% rename from GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json rename to Demo/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json diff --git a/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json b/Demo/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json similarity index 100% rename from GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json rename to Demo/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json diff --git a/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json b/Demo/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json similarity index 100% rename from GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json rename to Demo/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json diff --git a/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json b/Demo/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json similarity index 100% rename from GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json rename to Demo/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json diff --git a/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json b/Demo/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json similarity index 100% rename from GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json rename to Demo/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json diff --git a/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json b/Demo/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json similarity index 100% rename from GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json rename to Demo/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json diff --git a/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json b/Demo/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json similarity index 100% rename from GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json rename to Demo/GridDemo watchOS WatchKit Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json diff --git a/GridDemo watchOS WatchKit Extension/Assets.xcassets/Contents.json b/Demo/GridDemo watchOS WatchKit Extension/Assets.xcassets/Contents.json similarity index 100% rename from GridDemo watchOS WatchKit Extension/Assets.xcassets/Contents.json rename to Demo/GridDemo watchOS WatchKit Extension/Assets.xcassets/Contents.json diff --git a/GridDemo watchOS WatchKit Extension/ContentView.swift b/Demo/GridDemo watchOS WatchKit Extension/ContentView.swift similarity index 100% rename from GridDemo watchOS WatchKit Extension/ContentView.swift rename to Demo/GridDemo watchOS WatchKit Extension/ContentView.swift diff --git a/GridDemo watchOS WatchKit Extension/ExtensionDelegate.swift b/Demo/GridDemo watchOS WatchKit Extension/ExtensionDelegate.swift similarity index 100% rename from GridDemo watchOS WatchKit Extension/ExtensionDelegate.swift rename to Demo/GridDemo watchOS WatchKit Extension/ExtensionDelegate.swift diff --git a/GridDemo watchOS WatchKit Extension/HostingController.swift b/Demo/GridDemo watchOS WatchKit Extension/HostingController.swift similarity index 100% rename from GridDemo watchOS WatchKit Extension/HostingController.swift rename to Demo/GridDemo watchOS WatchKit Extension/HostingController.swift diff --git a/GridDemo watchOS WatchKit Extension/Info.plist b/Demo/GridDemo watchOS WatchKit Extension/Info.plist similarity index 100% rename from GridDemo watchOS WatchKit Extension/Info.plist rename to Demo/GridDemo watchOS WatchKit Extension/Info.plist diff --git a/GridDemo watchOS WatchKit Extension/ModularGrid/ModularGridView.swift b/Demo/GridDemo watchOS WatchKit Extension/ModularGrid/ModularGridView.swift similarity index 100% rename from GridDemo watchOS WatchKit Extension/ModularGrid/ModularGridView.swift rename to Demo/GridDemo watchOS WatchKit Extension/ModularGrid/ModularGridView.swift diff --git a/GridDemo watchOS WatchKit Extension/NotificationController.swift b/Demo/GridDemo watchOS WatchKit Extension/NotificationController.swift similarity index 100% rename from GridDemo watchOS WatchKit Extension/NotificationController.swift rename to Demo/GridDemo watchOS WatchKit Extension/NotificationController.swift diff --git a/GridDemo watchOS WatchKit Extension/NotificationView.swift b/Demo/GridDemo watchOS WatchKit Extension/NotificationView.swift similarity index 100% rename from GridDemo watchOS WatchKit Extension/NotificationView.swift rename to Demo/GridDemo watchOS WatchKit Extension/NotificationView.swift diff --git a/GridDemo watchOS WatchKit Extension/Preview Content/Preview Assets.xcassets/Contents.json b/Demo/GridDemo watchOS WatchKit Extension/Preview Content/Preview Assets.xcassets/Contents.json similarity index 100% rename from GridDemo watchOS WatchKit Extension/Preview Content/Preview Assets.xcassets/Contents.json rename to Demo/GridDemo watchOS WatchKit Extension/Preview Content/Preview Assets.xcassets/Contents.json diff --git a/GridDemo watchOS WatchKit Extension/PushNotificationPayload.apns b/Demo/GridDemo watchOS WatchKit Extension/PushNotificationPayload.apns similarity index 100% rename from GridDemo watchOS WatchKit Extension/PushNotificationPayload.apns rename to Demo/GridDemo watchOS WatchKit Extension/PushNotificationPayload.apns diff --git a/GridDemo watchOS WatchKit Extension/StaggeredGrid/StaggeredGridView.swift b/Demo/GridDemo watchOS WatchKit Extension/StaggeredGrid/StaggeredGridView.swift similarity index 100% rename from GridDemo watchOS WatchKit Extension/StaggeredGrid/StaggeredGridView.swift rename to Demo/GridDemo watchOS WatchKit Extension/StaggeredGrid/StaggeredGridView.swift diff --git a/GridDemo.xcodeproj/project.pbxproj b/Demo/GridDemo.xcodeproj/project.pbxproj similarity index 95% rename from GridDemo.xcodeproj/project.pbxproj rename to Demo/GridDemo.xcodeproj/project.pbxproj index b733880..9513bf4 100644 --- a/GridDemo.xcodeproj/project.pbxproj +++ b/Demo/GridDemo.xcodeproj/project.pbxproj @@ -7,7 +7,13 @@ objects = { /* Begin PBXBuildFile section */ - FA6203C323F8AD77009CB0C9 /* Grid in Frameworks */ = {isa = PBXBuildFile; productRef = FA6203C223F8AD77009CB0C9 /* Grid */; }; + FA4266822433CA4A0034CB7B /* Grid in Frameworks */ = {isa = PBXBuildFile; productRef = FA4266812433CA4A0034CB7B /* Grid */; }; + FA4266842433CAFE0034CB7B /* Grid in Frameworks */ = {isa = PBXBuildFile; productRef = FA4266832433CAFE0034CB7B /* Grid */; }; + FA4266862433CB300034CB7B /* Grid in Frameworks */ = {isa = PBXBuildFile; productRef = FA4266852433CB300034CB7B /* Grid */; }; + FA4266882433CB400034CB7B /* Grid in Frameworks */ = {isa = PBXBuildFile; productRef = FA4266872433CB400034CB7B /* Grid */; }; + FA9FFB6D242FFECD0047D145 /* SectionedGridView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA9FFB6C242FFECD0047D145 /* SectionedGridView.swift */; }; + FA9FFB70243005B80047D145 /* SectionedGridView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA9FFB6F243005B80047D145 /* SectionedGridView.swift */; }; + FA9FFB74243008060047D145 /* StaticGridView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA9FFB73243008060047D145 /* StaticGridView.swift */; }; FAA2C96C23DEAECC00FBDE39 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAA2C96B23DEAECC00FBDE39 /* SceneDelegate.swift */; }; FAA2C96E23DEAECC00FBDE39 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAA2C96D23DEAECC00FBDE39 /* ContentView.swift */; }; FAA2C97623DEAECD00FBDE39 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FAA2C97423DEAECD00FBDE39 /* LaunchScreen.storyboard */; }; @@ -65,9 +71,7 @@ FAA2CA5523DEB66A00FBDE39 /* StaggeredGridView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAA2CA5323DEB66900FBDE39 /* StaggeredGridView.swift */; }; FAA2CA5923DEB73200FBDE39 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = FAA2CA5823DEB73200FBDE39 /* README.md */; }; FAAA2FCD241C42E4007021F7 /* ImageDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAAA2FCC241C42E4007021F7 /* ImageDetailView.swift */; }; - FAC9D4DE23DF8CE20007B7DD /* Grid in Frameworks */ = {isa = PBXBuildFile; productRef = FAC9D4DD23DF8CE20007B7DD /* Grid */; }; - FAC9D4E023DF8CE90007B7DD /* Grid in Frameworks */ = {isa = PBXBuildFile; productRef = FAC9D4DF23DF8CE90007B7DD /* Grid */; }; - FAC9D4E223DF8CEE0007B7DD /* Grid in Frameworks */ = {isa = PBXBuildFile; productRef = FAC9D4E123DF8CEE0007B7DD /* Grid */; }; + FAC1C78B2430694C00FFA885 /* StaticGridView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC1C78A2430694C00FFA885 /* StaticGridView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -113,6 +117,10 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + FA68D97F2433C98000132A37 /* swiftui-grid */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "swiftui-grid"; path = ..; sourceTree = ""; }; + FA9FFB6C242FFECD0047D145 /* SectionedGridView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionedGridView.swift; sourceTree = ""; }; + FA9FFB6F243005B80047D145 /* SectionedGridView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionedGridView.swift; sourceTree = ""; }; + FA9FFB73243008060047D145 /* StaticGridView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StaticGridView.swift; sourceTree = ""; }; FAA2C96723DEAECC00FBDE39 /* GridDemo iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "GridDemo iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; FAA2C96B23DEAECC00FBDE39 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; FAA2C96D23DEAECC00FBDE39 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; @@ -169,7 +177,7 @@ FAA2CA5323DEB66900FBDE39 /* StaggeredGridView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StaggeredGridView.swift; sourceTree = ""; }; FAA2CA5823DEB73200FBDE39 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; FAAA2FCC241C42E4007021F7 /* ImageDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageDetailView.swift; sourceTree = ""; }; - FAC9D4DC23DF8C750007B7DD /* */ = {isa = PBXFileReference; lastKnownFileType = folder; name = ""; sourceTree = ""; }; + FAC1C78A2430694C00FFA885 /* StaticGridView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StaticGridView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -177,7 +185,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - FA6203C323F8AD77009CB0C9 /* Grid in Frameworks */, + FA4266822433CA4A0034CB7B /* Grid in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -185,7 +193,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - FAC9D4DE23DF8CE20007B7DD /* Grid in Frameworks */, + FA4266842433CAFE0034CB7B /* Grid in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -193,7 +201,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - FAC9D4E023DF8CE90007B7DD /* Grid in Frameworks */, + FA4266862433CB300034CB7B /* Grid in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -201,13 +209,37 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - FAC9D4E223DF8CEE0007B7DD /* Grid in Frameworks */, + FA4266882433CB400034CB7B /* Grid in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + FA9FFB6B242FFE510047D145 /* SectionedGrid */ = { + isa = PBXGroup; + children = ( + FA9FFB6C242FFECD0047D145 /* SectionedGridView.swift */, + ); + path = SectionedGrid; + sourceTree = ""; + }; + FA9FFB6E2430057F0047D145 /* SectionedGrid */ = { + isa = PBXGroup; + children = ( + FA9FFB6F243005B80047D145 /* SectionedGridView.swift */, + ); + path = SectionedGrid; + sourceTree = ""; + }; + FA9FFB72243007EA0047D145 /* StaticGrid */ = { + isa = PBXGroup; + children = ( + FA9FFB73243008060047D145 /* StaticGridView.swift */, + ); + path = StaticGrid; + sourceTree = ""; + }; FAA2C93B23DEAD2600FBDE39 = { isa = PBXGroup; children = ( @@ -220,7 +252,7 @@ FAA2CA3B23DEB64800FBDE39 /* GridDemo tvOS */, FAA2C94923DEAE7B00FBDE39 /* Products */, FAA2C99423DEB0A700FBDE39 /* Frameworks */, - FAC9D4DC23DF8C750007B7DD /* */, + FA68D97F2433C98000132A37 /* swiftui-grid */, ); sourceTree = ""; }; @@ -240,6 +272,8 @@ FAA2C96823DEAECC00FBDE39 /* GridDemo iOS */ = { isa = PBXGroup; children = ( + FAC1C7892430693900FFA885 /* StaticGrid */, + FA9FFB6E2430057F0047D145 /* SectionedGrid */, FAA2C98823DEB00100FBDE39 /* ModularGrid */, FAA2C98B23DEB00100FBDE39 /* StaggeredGrid */, FAA2C97B23DEAF9200FBDE39 /* AppDelegate.swift */, @@ -301,6 +335,8 @@ FAA2C99D23DEB26200FBDE39 /* GridDemo macOS */ = { isa = PBXGroup; children = ( + FA9FFB72243007EA0047D145 /* StaticGrid */, + FA9FFB6B242FFE510047D145 /* SectionedGrid */, FAA2C9B323DEB31800FBDE39 /* ModularGrid */, FAA2C9B623DEB31800FBDE39 /* StaggeredGrid */, FAA2C99E23DEB26200FBDE39 /* AppDelegate.swift */, @@ -431,6 +467,14 @@ path = StaggeredGrid; sourceTree = ""; }; + FAC1C7892430693900FFA885 /* StaticGrid */ = { + isa = PBXGroup; + children = ( + FAC1C78A2430694C00FFA885 /* StaticGridView.swift */, + ); + path = StaticGrid; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -448,7 +492,7 @@ ); name = "GridDemo iOS"; packageProductDependencies = ( - FA6203C223F8AD77009CB0C9 /* Grid */, + FA4266812433CA4A0034CB7B /* Grid */, ); productName = "GridDemo iOS"; productReference = FAA2C96723DEAECC00FBDE39 /* GridDemo iOS.app */; @@ -468,7 +512,7 @@ ); name = "GridDemo macOS"; packageProductDependencies = ( - FAC9D4DD23DF8CE20007B7DD /* Grid */, + FA4266832433CAFE0034CB7B /* Grid */, ); productName = "GridDemo macOS"; productReference = FAA2C99C23DEB26200FBDE39 /* GridDemo macOS.app */; @@ -522,7 +566,7 @@ ); name = "GridDemo watchOS WatchKit Extension"; packageProductDependencies = ( - FAC9D4DF23DF8CE90007B7DD /* Grid */, + FA4266852433CB300034CB7B /* Grid */, ); productName = "GridDemo watchOS WatchKit Extension"; productReference = FAA2CA0923DEB4D800FBDE39 /* GridDemo watchOS WatchKit Extension.appex */; @@ -542,7 +586,7 @@ ); name = "GridDemo tvOS"; packageProductDependencies = ( - FAC9D4E123DF8CEE0007B7DD /* Grid */, + FA4266872433CB400034CB7B /* Grid */, ); productName = "GridDemo tvOS"; productReference = FAA2CA3A23DEB64800FBDE39 /* GridDemo tvOS.app */; @@ -587,7 +631,6 @@ ); mainGroup = FAA2C93B23DEAD2600FBDE39; packageReferences = ( - FA6203C123F8AD77009CB0C9 /* XCRemoteSwiftPackageReference "swiftui-grid" */, ); productRefGroup = FAA2C94923DEAE7B00FBDE39 /* Products */; projectDirPath = ""; @@ -672,6 +715,7 @@ buildActionMask = 2147483647; files = ( FAA2C98523DEAFF100FBDE39 /* Item.swift in Sources */, + FA9FFB70243005B80047D145 /* SectionedGridView.swift in Sources */, FAA2C99123DEB00100FBDE39 /* StaggeredGridView.swift in Sources */, FAA2C99023DEB00100FBDE39 /* StaggeredGridSettingsView.swift in Sources */, FAAA2FCD241C42E4007021F7 /* ImageDetailView.swift in Sources */, @@ -682,6 +726,7 @@ FAA2C96E23DEAECC00FBDE39 /* ContentView.swift in Sources */, FAA2C98F23DEB00100FBDE39 /* ModularGridSettingsView.swift in Sources */, FAA2C98E23DEB00100FBDE39 /* ModularGridView.swift in Sources */, + FAC1C78B2430694C00FFA885 /* StaticGridView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -689,6 +734,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + FA9FFB6D242FFECD0047D145 /* SectionedGridView.swift in Sources */, + FA9FFB74243008060047D145 /* StaticGridView.swift in Sources */, FAA2C9B023DEB26B00FBDE39 /* Item.swift in Sources */, FAA2C9AF23DEB26B00FBDE39 /* Color+Random.swift in Sources */, FAA2C9BB23DEB31900FBDE39 /* StaggeredGridSettingsView.swift in Sources */, @@ -1746,32 +1793,20 @@ }; /* End XCConfigurationList section */ -/* Begin XCRemoteSwiftPackageReference section */ - FA6203C123F8AD77009CB0C9 /* XCRemoteSwiftPackageReference "swiftui-grid" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "git@github.com:spacenation/swiftui-grid.git"; - requirement = { - branch = master; - kind = branch; - }; - }; -/* End XCRemoteSwiftPackageReference section */ - /* Begin XCSwiftPackageProductDependency section */ - FA6203C223F8AD77009CB0C9 /* Grid */ = { + FA4266812433CA4A0034CB7B /* Grid */ = { isa = XCSwiftPackageProductDependency; - package = FA6203C123F8AD77009CB0C9 /* XCRemoteSwiftPackageReference "swiftui-grid" */; productName = Grid; }; - FAC9D4DD23DF8CE20007B7DD /* Grid */ = { + FA4266832433CAFE0034CB7B /* Grid */ = { isa = XCSwiftPackageProductDependency; productName = Grid; }; - FAC9D4DF23DF8CE90007B7DD /* Grid */ = { + FA4266852433CB300034CB7B /* Grid */ = { isa = XCSwiftPackageProductDependency; productName = Grid; }; - FAC9D4E123DF8CEE0007B7DD /* Grid */ = { + FA4266872433CB400034CB7B /* Grid */ = { isa = XCSwiftPackageProductDependency; productName = Grid; }; diff --git a/GridDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Demo/GridDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from GridDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Demo/GridDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/GridDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Demo/GridDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from GridDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to Demo/GridDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/GridDemo/Card.swift b/Demo/GridDemo/Card.swift similarity index 100% rename from GridDemo/Card.swift rename to Demo/GridDemo/Card.swift diff --git a/GridDemo/Color+Random.swift b/Demo/GridDemo/Color+Random.swift similarity index 100% rename from GridDemo/Color+Random.swift rename to Demo/GridDemo/Color+Random.swift diff --git a/GridDemo/Item.swift b/Demo/GridDemo/Item.swift similarity index 100% rename from GridDemo/Item.swift rename to Demo/GridDemo/Item.swift diff --git a/GridDemo/SharedAssets.xcassets/1.imageset/1.jpg b/Demo/GridDemo/SharedAssets.xcassets/1.imageset/1.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/1.imageset/1.jpg rename to Demo/GridDemo/SharedAssets.xcassets/1.imageset/1.jpg diff --git a/GridDemo/SharedAssets.xcassets/1.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/1.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/1.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/1.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/10.imageset/10.jpg b/Demo/GridDemo/SharedAssets.xcassets/10.imageset/10.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/10.imageset/10.jpg rename to Demo/GridDemo/SharedAssets.xcassets/10.imageset/10.jpg diff --git a/GridDemo/SharedAssets.xcassets/10.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/10.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/10.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/10.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/11.imageset/11.jpg b/Demo/GridDemo/SharedAssets.xcassets/11.imageset/11.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/11.imageset/11.jpg rename to Demo/GridDemo/SharedAssets.xcassets/11.imageset/11.jpg diff --git a/GridDemo/SharedAssets.xcassets/11.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/11.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/11.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/11.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/12.imageset/12.jpg b/Demo/GridDemo/SharedAssets.xcassets/12.imageset/12.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/12.imageset/12.jpg rename to Demo/GridDemo/SharedAssets.xcassets/12.imageset/12.jpg diff --git a/GridDemo/SharedAssets.xcassets/12.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/12.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/12.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/12.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/13.imageset/13.jpg b/Demo/GridDemo/SharedAssets.xcassets/13.imageset/13.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/13.imageset/13.jpg rename to Demo/GridDemo/SharedAssets.xcassets/13.imageset/13.jpg diff --git a/GridDemo/SharedAssets.xcassets/13.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/13.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/13.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/13.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/14.imageset/14.jpg b/Demo/GridDemo/SharedAssets.xcassets/14.imageset/14.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/14.imageset/14.jpg rename to Demo/GridDemo/SharedAssets.xcassets/14.imageset/14.jpg diff --git a/GridDemo/SharedAssets.xcassets/14.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/14.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/14.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/14.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/15.imageset/15.jpg b/Demo/GridDemo/SharedAssets.xcassets/15.imageset/15.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/15.imageset/15.jpg rename to Demo/GridDemo/SharedAssets.xcassets/15.imageset/15.jpg diff --git a/GridDemo/SharedAssets.xcassets/15.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/15.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/15.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/15.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/16.imageset/16.jpg b/Demo/GridDemo/SharedAssets.xcassets/16.imageset/16.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/16.imageset/16.jpg rename to Demo/GridDemo/SharedAssets.xcassets/16.imageset/16.jpg diff --git a/GridDemo/SharedAssets.xcassets/16.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/16.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/16.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/16.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/17.imageset/17.jpg b/Demo/GridDemo/SharedAssets.xcassets/17.imageset/17.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/17.imageset/17.jpg rename to Demo/GridDemo/SharedAssets.xcassets/17.imageset/17.jpg diff --git a/GridDemo/SharedAssets.xcassets/17.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/17.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/17.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/17.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/18.imageset/18.jpg b/Demo/GridDemo/SharedAssets.xcassets/18.imageset/18.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/18.imageset/18.jpg rename to Demo/GridDemo/SharedAssets.xcassets/18.imageset/18.jpg diff --git a/GridDemo/SharedAssets.xcassets/18.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/18.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/18.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/18.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/19.imageset/19.jpg b/Demo/GridDemo/SharedAssets.xcassets/19.imageset/19.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/19.imageset/19.jpg rename to Demo/GridDemo/SharedAssets.xcassets/19.imageset/19.jpg diff --git a/GridDemo/SharedAssets.xcassets/19.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/19.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/19.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/19.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/2.imageset/2.jpg b/Demo/GridDemo/SharedAssets.xcassets/2.imageset/2.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/2.imageset/2.jpg rename to Demo/GridDemo/SharedAssets.xcassets/2.imageset/2.jpg diff --git a/GridDemo/SharedAssets.xcassets/2.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/2.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/2.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/2.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/20.imageset/20.jpg b/Demo/GridDemo/SharedAssets.xcassets/20.imageset/20.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/20.imageset/20.jpg rename to Demo/GridDemo/SharedAssets.xcassets/20.imageset/20.jpg diff --git a/GridDemo/SharedAssets.xcassets/20.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/20.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/20.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/20.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/21.imageset/21.jpg b/Demo/GridDemo/SharedAssets.xcassets/21.imageset/21.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/21.imageset/21.jpg rename to Demo/GridDemo/SharedAssets.xcassets/21.imageset/21.jpg diff --git a/GridDemo/SharedAssets.xcassets/21.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/21.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/21.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/21.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/22.imageset/22.jpg b/Demo/GridDemo/SharedAssets.xcassets/22.imageset/22.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/22.imageset/22.jpg rename to Demo/GridDemo/SharedAssets.xcassets/22.imageset/22.jpg diff --git a/GridDemo/SharedAssets.xcassets/22.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/22.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/22.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/22.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/23.imageset/23.jpg b/Demo/GridDemo/SharedAssets.xcassets/23.imageset/23.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/23.imageset/23.jpg rename to Demo/GridDemo/SharedAssets.xcassets/23.imageset/23.jpg diff --git a/GridDemo/SharedAssets.xcassets/23.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/23.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/23.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/23.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/24.imageset/24.jpg b/Demo/GridDemo/SharedAssets.xcassets/24.imageset/24.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/24.imageset/24.jpg rename to Demo/GridDemo/SharedAssets.xcassets/24.imageset/24.jpg diff --git a/GridDemo/SharedAssets.xcassets/24.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/24.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/24.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/24.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/25.imageset/25.jpg b/Demo/GridDemo/SharedAssets.xcassets/25.imageset/25.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/25.imageset/25.jpg rename to Demo/GridDemo/SharedAssets.xcassets/25.imageset/25.jpg diff --git a/GridDemo/SharedAssets.xcassets/25.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/25.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/25.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/25.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/26.imageset/26.jpg b/Demo/GridDemo/SharedAssets.xcassets/26.imageset/26.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/26.imageset/26.jpg rename to Demo/GridDemo/SharedAssets.xcassets/26.imageset/26.jpg diff --git a/GridDemo/SharedAssets.xcassets/26.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/26.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/26.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/26.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/27.imageset/27.jpg b/Demo/GridDemo/SharedAssets.xcassets/27.imageset/27.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/27.imageset/27.jpg rename to Demo/GridDemo/SharedAssets.xcassets/27.imageset/27.jpg diff --git a/GridDemo/SharedAssets.xcassets/27.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/27.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/27.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/27.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/28.imageset/28.jpg b/Demo/GridDemo/SharedAssets.xcassets/28.imageset/28.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/28.imageset/28.jpg rename to Demo/GridDemo/SharedAssets.xcassets/28.imageset/28.jpg diff --git a/GridDemo/SharedAssets.xcassets/28.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/28.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/28.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/28.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/29.imageset/29.jpg b/Demo/GridDemo/SharedAssets.xcassets/29.imageset/29.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/29.imageset/29.jpg rename to Demo/GridDemo/SharedAssets.xcassets/29.imageset/29.jpg diff --git a/GridDemo/SharedAssets.xcassets/29.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/29.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/29.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/29.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/3.imageset/3.jpg b/Demo/GridDemo/SharedAssets.xcassets/3.imageset/3.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/3.imageset/3.jpg rename to Demo/GridDemo/SharedAssets.xcassets/3.imageset/3.jpg diff --git a/GridDemo/SharedAssets.xcassets/3.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/3.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/3.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/3.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/30.imageset/30.jpg b/Demo/GridDemo/SharedAssets.xcassets/30.imageset/30.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/30.imageset/30.jpg rename to Demo/GridDemo/SharedAssets.xcassets/30.imageset/30.jpg diff --git a/GridDemo/SharedAssets.xcassets/30.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/30.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/30.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/30.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/31.imageset/31.jpg b/Demo/GridDemo/SharedAssets.xcassets/31.imageset/31.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/31.imageset/31.jpg rename to Demo/GridDemo/SharedAssets.xcassets/31.imageset/31.jpg diff --git a/GridDemo/SharedAssets.xcassets/31.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/31.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/31.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/31.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/32.imageset/32.jpg b/Demo/GridDemo/SharedAssets.xcassets/32.imageset/32.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/32.imageset/32.jpg rename to Demo/GridDemo/SharedAssets.xcassets/32.imageset/32.jpg diff --git a/GridDemo/SharedAssets.xcassets/32.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/32.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/32.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/32.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/33.imageset/33.jpg b/Demo/GridDemo/SharedAssets.xcassets/33.imageset/33.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/33.imageset/33.jpg rename to Demo/GridDemo/SharedAssets.xcassets/33.imageset/33.jpg diff --git a/GridDemo/SharedAssets.xcassets/33.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/33.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/33.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/33.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/34.imageset/34.jpg b/Demo/GridDemo/SharedAssets.xcassets/34.imageset/34.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/34.imageset/34.jpg rename to Demo/GridDemo/SharedAssets.xcassets/34.imageset/34.jpg diff --git a/GridDemo/SharedAssets.xcassets/34.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/34.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/34.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/34.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/35.imageset/35.jpg b/Demo/GridDemo/SharedAssets.xcassets/35.imageset/35.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/35.imageset/35.jpg rename to Demo/GridDemo/SharedAssets.xcassets/35.imageset/35.jpg diff --git a/GridDemo/SharedAssets.xcassets/35.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/35.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/35.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/35.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/36.imageset/36.jpg b/Demo/GridDemo/SharedAssets.xcassets/36.imageset/36.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/36.imageset/36.jpg rename to Demo/GridDemo/SharedAssets.xcassets/36.imageset/36.jpg diff --git a/GridDemo/SharedAssets.xcassets/36.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/36.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/36.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/36.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/37.imageset/37.jpg b/Demo/GridDemo/SharedAssets.xcassets/37.imageset/37.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/37.imageset/37.jpg rename to Demo/GridDemo/SharedAssets.xcassets/37.imageset/37.jpg diff --git a/GridDemo/SharedAssets.xcassets/37.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/37.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/37.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/37.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/38.imageset/38.jpg b/Demo/GridDemo/SharedAssets.xcassets/38.imageset/38.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/38.imageset/38.jpg rename to Demo/GridDemo/SharedAssets.xcassets/38.imageset/38.jpg diff --git a/GridDemo/SharedAssets.xcassets/38.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/38.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/38.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/38.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/39.imageset/39.jpg b/Demo/GridDemo/SharedAssets.xcassets/39.imageset/39.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/39.imageset/39.jpg rename to Demo/GridDemo/SharedAssets.xcassets/39.imageset/39.jpg diff --git a/GridDemo/SharedAssets.xcassets/39.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/39.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/39.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/39.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/4.imageset/4.jpg b/Demo/GridDemo/SharedAssets.xcassets/4.imageset/4.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/4.imageset/4.jpg rename to Demo/GridDemo/SharedAssets.xcassets/4.imageset/4.jpg diff --git a/GridDemo/SharedAssets.xcassets/4.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/4.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/4.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/4.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/40.imageset/40.jpg b/Demo/GridDemo/SharedAssets.xcassets/40.imageset/40.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/40.imageset/40.jpg rename to Demo/GridDemo/SharedAssets.xcassets/40.imageset/40.jpg diff --git a/GridDemo/SharedAssets.xcassets/40.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/40.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/40.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/40.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/41.imageset/41.jpg b/Demo/GridDemo/SharedAssets.xcassets/41.imageset/41.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/41.imageset/41.jpg rename to Demo/GridDemo/SharedAssets.xcassets/41.imageset/41.jpg diff --git a/GridDemo/SharedAssets.xcassets/41.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/41.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/41.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/41.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/42.imageset/42.jpg b/Demo/GridDemo/SharedAssets.xcassets/42.imageset/42.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/42.imageset/42.jpg rename to Demo/GridDemo/SharedAssets.xcassets/42.imageset/42.jpg diff --git a/GridDemo/SharedAssets.xcassets/42.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/42.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/42.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/42.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/43.imageset/43.jpg b/Demo/GridDemo/SharedAssets.xcassets/43.imageset/43.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/43.imageset/43.jpg rename to Demo/GridDemo/SharedAssets.xcassets/43.imageset/43.jpg diff --git a/GridDemo/SharedAssets.xcassets/43.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/43.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/43.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/43.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/44.imageset/44.jpg b/Demo/GridDemo/SharedAssets.xcassets/44.imageset/44.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/44.imageset/44.jpg rename to Demo/GridDemo/SharedAssets.xcassets/44.imageset/44.jpg diff --git a/GridDemo/SharedAssets.xcassets/44.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/44.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/44.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/44.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/45.imageset/45.jpg b/Demo/GridDemo/SharedAssets.xcassets/45.imageset/45.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/45.imageset/45.jpg rename to Demo/GridDemo/SharedAssets.xcassets/45.imageset/45.jpg diff --git a/GridDemo/SharedAssets.xcassets/45.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/45.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/45.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/45.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/46.imageset/46.jpg b/Demo/GridDemo/SharedAssets.xcassets/46.imageset/46.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/46.imageset/46.jpg rename to Demo/GridDemo/SharedAssets.xcassets/46.imageset/46.jpg diff --git a/GridDemo/SharedAssets.xcassets/46.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/46.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/46.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/46.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/47.imageset/47.jpg b/Demo/GridDemo/SharedAssets.xcassets/47.imageset/47.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/47.imageset/47.jpg rename to Demo/GridDemo/SharedAssets.xcassets/47.imageset/47.jpg diff --git a/GridDemo/SharedAssets.xcassets/47.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/47.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/47.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/47.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/48.imageset/48.jpg b/Demo/GridDemo/SharedAssets.xcassets/48.imageset/48.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/48.imageset/48.jpg rename to Demo/GridDemo/SharedAssets.xcassets/48.imageset/48.jpg diff --git a/GridDemo/SharedAssets.xcassets/48.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/48.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/48.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/48.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/49.imageset/49.jpg b/Demo/GridDemo/SharedAssets.xcassets/49.imageset/49.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/49.imageset/49.jpg rename to Demo/GridDemo/SharedAssets.xcassets/49.imageset/49.jpg diff --git a/GridDemo/SharedAssets.xcassets/49.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/49.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/49.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/49.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/5.imageset/5.jpg b/Demo/GridDemo/SharedAssets.xcassets/5.imageset/5.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/5.imageset/5.jpg rename to Demo/GridDemo/SharedAssets.xcassets/5.imageset/5.jpg diff --git a/GridDemo/SharedAssets.xcassets/5.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/5.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/5.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/5.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/50.imageset/50.jpg b/Demo/GridDemo/SharedAssets.xcassets/50.imageset/50.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/50.imageset/50.jpg rename to Demo/GridDemo/SharedAssets.xcassets/50.imageset/50.jpg diff --git a/GridDemo/SharedAssets.xcassets/50.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/50.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/50.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/50.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/51.imageset/51.jpg b/Demo/GridDemo/SharedAssets.xcassets/51.imageset/51.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/51.imageset/51.jpg rename to Demo/GridDemo/SharedAssets.xcassets/51.imageset/51.jpg diff --git a/GridDemo/SharedAssets.xcassets/51.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/51.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/51.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/51.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/52.imageset/52.jpg b/Demo/GridDemo/SharedAssets.xcassets/52.imageset/52.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/52.imageset/52.jpg rename to Demo/GridDemo/SharedAssets.xcassets/52.imageset/52.jpg diff --git a/GridDemo/SharedAssets.xcassets/52.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/52.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/52.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/52.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/53.imageset/53.jpg b/Demo/GridDemo/SharedAssets.xcassets/53.imageset/53.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/53.imageset/53.jpg rename to Demo/GridDemo/SharedAssets.xcassets/53.imageset/53.jpg diff --git a/GridDemo/SharedAssets.xcassets/53.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/53.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/53.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/53.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/54.imageset/54.jpg b/Demo/GridDemo/SharedAssets.xcassets/54.imageset/54.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/54.imageset/54.jpg rename to Demo/GridDemo/SharedAssets.xcassets/54.imageset/54.jpg diff --git a/GridDemo/SharedAssets.xcassets/54.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/54.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/54.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/54.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/55.imageset/55.jpg b/Demo/GridDemo/SharedAssets.xcassets/55.imageset/55.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/55.imageset/55.jpg rename to Demo/GridDemo/SharedAssets.xcassets/55.imageset/55.jpg diff --git a/GridDemo/SharedAssets.xcassets/55.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/55.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/55.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/55.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/56.imageset/56.jpg b/Demo/GridDemo/SharedAssets.xcassets/56.imageset/56.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/56.imageset/56.jpg rename to Demo/GridDemo/SharedAssets.xcassets/56.imageset/56.jpg diff --git a/GridDemo/SharedAssets.xcassets/56.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/56.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/56.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/56.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/57.imageset/57.jpg b/Demo/GridDemo/SharedAssets.xcassets/57.imageset/57.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/57.imageset/57.jpg rename to Demo/GridDemo/SharedAssets.xcassets/57.imageset/57.jpg diff --git a/GridDemo/SharedAssets.xcassets/57.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/57.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/57.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/57.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/58.imageset/58.jpg b/Demo/GridDemo/SharedAssets.xcassets/58.imageset/58.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/58.imageset/58.jpg rename to Demo/GridDemo/SharedAssets.xcassets/58.imageset/58.jpg diff --git a/GridDemo/SharedAssets.xcassets/58.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/58.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/58.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/58.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/59.imageset/59.jpg b/Demo/GridDemo/SharedAssets.xcassets/59.imageset/59.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/59.imageset/59.jpg rename to Demo/GridDemo/SharedAssets.xcassets/59.imageset/59.jpg diff --git a/GridDemo/SharedAssets.xcassets/59.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/59.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/59.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/59.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/6.imageset/6.jpg b/Demo/GridDemo/SharedAssets.xcassets/6.imageset/6.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/6.imageset/6.jpg rename to Demo/GridDemo/SharedAssets.xcassets/6.imageset/6.jpg diff --git a/GridDemo/SharedAssets.xcassets/6.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/6.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/6.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/6.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/60.imageset/60.jpg b/Demo/GridDemo/SharedAssets.xcassets/60.imageset/60.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/60.imageset/60.jpg rename to Demo/GridDemo/SharedAssets.xcassets/60.imageset/60.jpg diff --git a/GridDemo/SharedAssets.xcassets/60.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/60.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/60.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/60.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/61.imageset/61.jpg b/Demo/GridDemo/SharedAssets.xcassets/61.imageset/61.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/61.imageset/61.jpg rename to Demo/GridDemo/SharedAssets.xcassets/61.imageset/61.jpg diff --git a/GridDemo/SharedAssets.xcassets/61.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/61.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/61.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/61.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/62.imageset/62.jpg b/Demo/GridDemo/SharedAssets.xcassets/62.imageset/62.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/62.imageset/62.jpg rename to Demo/GridDemo/SharedAssets.xcassets/62.imageset/62.jpg diff --git a/GridDemo/SharedAssets.xcassets/62.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/62.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/62.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/62.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/63.imageset/63.jpg b/Demo/GridDemo/SharedAssets.xcassets/63.imageset/63.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/63.imageset/63.jpg rename to Demo/GridDemo/SharedAssets.xcassets/63.imageset/63.jpg diff --git a/GridDemo/SharedAssets.xcassets/63.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/63.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/63.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/63.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/64.imageset/64.jpg b/Demo/GridDemo/SharedAssets.xcassets/64.imageset/64.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/64.imageset/64.jpg rename to Demo/GridDemo/SharedAssets.xcassets/64.imageset/64.jpg diff --git a/GridDemo/SharedAssets.xcassets/64.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/64.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/64.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/64.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/65.imageset/65.jpg b/Demo/GridDemo/SharedAssets.xcassets/65.imageset/65.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/65.imageset/65.jpg rename to Demo/GridDemo/SharedAssets.xcassets/65.imageset/65.jpg diff --git a/GridDemo/SharedAssets.xcassets/65.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/65.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/65.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/65.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/66.imageset/66.jpg b/Demo/GridDemo/SharedAssets.xcassets/66.imageset/66.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/66.imageset/66.jpg rename to Demo/GridDemo/SharedAssets.xcassets/66.imageset/66.jpg diff --git a/GridDemo/SharedAssets.xcassets/66.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/66.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/66.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/66.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/67.imageset/67.jpg b/Demo/GridDemo/SharedAssets.xcassets/67.imageset/67.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/67.imageset/67.jpg rename to Demo/GridDemo/SharedAssets.xcassets/67.imageset/67.jpg diff --git a/GridDemo/SharedAssets.xcassets/67.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/67.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/67.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/67.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/68.imageset/68.jpg b/Demo/GridDemo/SharedAssets.xcassets/68.imageset/68.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/68.imageset/68.jpg rename to Demo/GridDemo/SharedAssets.xcassets/68.imageset/68.jpg diff --git a/GridDemo/SharedAssets.xcassets/68.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/68.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/68.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/68.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/69.imageset/69.jpg b/Demo/GridDemo/SharedAssets.xcassets/69.imageset/69.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/69.imageset/69.jpg rename to Demo/GridDemo/SharedAssets.xcassets/69.imageset/69.jpg diff --git a/GridDemo/SharedAssets.xcassets/69.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/69.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/69.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/69.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/7.imageset/7.jpg b/Demo/GridDemo/SharedAssets.xcassets/7.imageset/7.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/7.imageset/7.jpg rename to Demo/GridDemo/SharedAssets.xcassets/7.imageset/7.jpg diff --git a/GridDemo/SharedAssets.xcassets/7.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/7.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/7.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/7.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/8.imageset/8.jpg b/Demo/GridDemo/SharedAssets.xcassets/8.imageset/8.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/8.imageset/8.jpg rename to Demo/GridDemo/SharedAssets.xcassets/8.imageset/8.jpg diff --git a/GridDemo/SharedAssets.xcassets/8.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/8.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/8.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/8.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/9.imageset/9.jpg b/Demo/GridDemo/SharedAssets.xcassets/9.imageset/9.jpg similarity index 100% rename from GridDemo/SharedAssets.xcassets/9.imageset/9.jpg rename to Demo/GridDemo/SharedAssets.xcassets/9.imageset/9.jpg diff --git a/GridDemo/SharedAssets.xcassets/9.imageset/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/9.imageset/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/9.imageset/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/9.imageset/Contents.json diff --git a/GridDemo/SharedAssets.xcassets/Contents.json b/Demo/GridDemo/SharedAssets.xcassets/Contents.json similarity index 100% rename from GridDemo/SharedAssets.xcassets/Contents.json rename to Demo/GridDemo/SharedAssets.xcassets/Contents.json diff --git a/LICENSE b/LICENSE index 9fca77d..3f63563 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 SwiftExtensions. +Copyright (c) 2020 SpaceNation Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Package.swift b/Package.swift index 426b749..aba2707 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.1 +// swift-tools-version:5.2 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription @@ -12,7 +12,7 @@ let package = Package( .library(name: "Grid", targets: ["Grid"]) ], targets: [ - .target(name: "Grid", dependencies: []), - .testTarget(name: "GridTests", dependencies: ["Grid"]) + .target(name: "Grid", dependencies: [], exclude: ["Demo"]), + .testTarget(name: "GridTests", dependencies: ["Grid"], exclude: ["Demo"]) ] ) diff --git a/README.md b/README.md index d63580b..dc3e49a 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,11 @@ -# SwiftUI Grid -SwiftUI Grid view layout with custom styles. - [![Build Status](https://github.com/spacenation/swiftui-grid/workflows/ci/badge.svg)](https://github.com/spacenation/swiftui-grid/actions) +## SwiftUI Grid +SwiftUI Grid view layout with custom styles. + ## Features - ZStack based layout - Vertical and horizontal scrolling -- Supports grid of grids, each with it's own style - Supports all apple platforms - Custom styles (ModularGridStyle, StaggeredGridStyle) - SwiftUI code patterns (StyleStructs, EnvironmentValues, ViewBuilder) diff --git a/Sources/Grid/Grid+Inits.swift b/Sources/Grid/Grid+Inits.swift index d342339..fc101fd 100644 --- a/Sources/Grid/Grid+Inits.swift +++ b/Sources/Grid/Grid+Inits.swift @@ -1,5 +1,6 @@ import SwiftUI +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension Grid { public init(_ data: Data, @ViewBuilder item: @escaping (Data.Element) -> Item) where Content == ForEach, Data : RandomAccessCollection, Item : View, Data.Element : Identifiable { self.items = data.map { GridItem(view: AnyView(item($0)), id: AnyHashable($0.id)) } @@ -14,6 +15,7 @@ extension Grid { } } +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension Grid { public init(@ViewBuilder content: () -> Content) where Content == TupleView<(C0, C1)> { self.items = [GridItem(view: AnyView(content().value.0), id: AnyHashable(0)), diff --git a/Sources/Grid/Grid.swift b/Sources/Grid/Grid.swift index 261f7c5..703ae15 100644 --- a/Sources/Grid/Grid.swift +++ b/Sources/Grid/Grid.swift @@ -1,9 +1,10 @@ import SwiftUI /// A view that arranges its children in a grid. +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public struct Grid: View where Content: View { @Environment(\.gridStyle) private var style - @State var preferences: GridPreferences = .init(items: []) + @State var preferences: GridPreferences = GridPreferences(size: .zero, items: []) let items: [GridItem] public var body: some View { @@ -15,8 +16,8 @@ public struct Grid: View where Content: View { width: self.style.autoWidth ? self.preferences[item.id]?.bounds.width : nil, height: self.style.autoHeight ? self.preferences[item.id]?.bounds.height : nil ) - .alignmentGuide(.leading, computeValue: { _ in self.preferences[item.id]?.bounds.origin.x ?? 0 }) - .alignmentGuide(.top, computeValue: { _ in self.preferences[item.id]?.bounds.origin.y ?? 0 }) + .alignmentGuide(.leading, computeValue: { _ in geometry.size.width - (self.preferences[item.id]?.bounds.origin.x ?? 0) }) + .alignmentGuide(.top, computeValue: { _ in geometry.size.height - (self.preferences[item.id]?.bounds.origin.y ?? 0) }) .background(GridPreferencesModifier(id: item.id, bounds: self.preferences[item.id]?.bounds ?? .zero)) .anchorPreference(key: GridItemBoundsPreferencesKey.self, value: .bounds) { [geometry[$0]] } } @@ -25,14 +26,14 @@ public struct Grid: View where Content: View { self.style.transform(preferences: &$0, in: geometry.size) } } - .onPreferenceChange(GridPreferencesKey.self) { preferences in - self.preferences = preferences - } .frame( - width: self.style.axis == .horizontal ? self.preferences.size.width : nil, - height: self.style.axis == .vertical ? self.preferences.size.height : nil, + minWidth: self.style.axis == .horizontal ? self.preferences.size.width : nil, + minHeight: self.style.axis == .vertical ? self.preferences.size.height : nil, alignment: .topLeading ) + .onPreferenceChange(GridPreferencesKey.self) { preferences in + self.preferences = preferences + } } } diff --git a/Sources/Grid/GridItem.swift b/Sources/Grid/GridItem.swift index 646a848..e33ca93 100644 --- a/Sources/Grid/GridItem.swift +++ b/Sources/Grid/GridItem.swift @@ -1,5 +1,6 @@ import SwiftUI +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct GridItem: Identifiable { let view: AnyView let id: AnyHashable diff --git a/Sources/Grid/Styles/Layout/LayoutMath.swift b/Sources/Grid/Styles/Layout/LayoutMath.swift index a844c9c..3a3f283 100644 --- a/Sources/Grid/Styles/Layout/LayoutMath.swift +++ b/Sources/Grid/Styles/Layout/LayoutMath.swift @@ -17,6 +17,7 @@ func tracksCount(tracks: Tracks, spacing: CGFloat, availableLength: CGFloat) -> case .count(let count): return count case .fixed(let length): + precondition(length > 0, "Minimum track length should be greated than 0") let columnCount = Int(availableLength / length) for columns in (0...columnCount).reversed() { @@ -26,8 +27,9 @@ func tracksCount(tracks: Tracks, spacing: CGFloat, availableLength: CGFloat) -> } } return 1 - case .min(let minWidth): - let columnCount = Int(availableLength / minWidth) + case .min(let length): + precondition(length > 0, "Minimum track length should be greated than 0") + let columnCount = Int(availableLength / length) for columns in (0...columnCount).reversed() { let suggestedItemWidth = itemLength(tracksCount: columns, spacing: spacing, availableLength: availableLength) diff --git a/Sources/Grid/Styles/ModularGridStyle.swift b/Sources/Grid/Styles/ModularGridStyle.swift index 99f451e..ec86d29 100644 --- a/Sources/Grid/Styles/ModularGridStyle.swift +++ b/Sources/Grid/Styles/ModularGridStyle.swift @@ -1,6 +1,7 @@ import SwiftUI /// Modular `Grid` style. +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public struct ModularGridStyle: GridStyle { public var columns: Tracks public var rows: Tracks @@ -42,34 +43,34 @@ public struct ModularGridStyle: GridStyle { ) ) - preferences.items = layoutPreferences( + preferences = layoutPreferences( tracks: computedTracksCount, spacing: self.spacing, axis: self.axis, itemSize: itemSize, - preferences: preferences.items + preferences: preferences ) } - private func layoutPreferences(tracks: Int, spacing: CGFloat, axis: Axis, itemSize: CGSize, preferences: [GridPreferences.Item]) -> [GridPreferences.Item] { + private func layoutPreferences(tracks: Int, spacing: CGFloat, axis: Axis, itemSize: CGSize, preferences: GridPreferences) -> GridPreferences { var tracksLengths = Array(repeating: CGFloat(0.0), count: tracks) - var newPreferences: [GridPreferences.Item] = [] + var newPreferences: GridPreferences = GridPreferences(items: []) - preferences.forEach { preference in + preferences.items.forEach { preference in if let minValue = tracksLengths.min(), let indexMin = tracksLengths.firstIndex(of: minValue) { let itemSizeWidth = itemSize.width let itemSizeHeight = itemSize.height let width = axis == .vertical ? itemSizeWidth * CGFloat(indexMin) + CGFloat(indexMin) * spacing : tracksLengths[indexMin] let height = axis == .vertical ? tracksLengths[indexMin] : itemSizeHeight * CGFloat(indexMin) + CGFloat(indexMin) * spacing - let origin = CGPoint(x: 0 - width, y: 0 - height) + let origin = CGPoint(x: width, y: height) tracksLengths[indexMin] += (axis == .vertical ? itemSizeHeight : itemSizeWidth) + spacing - newPreferences.append( - GridPreferences.Item( + newPreferences.merge(with: + GridPreferences(items: [GridPreferences.Item( id: preference.id, bounds: CGRect(origin: origin, size: CGSize(width: itemSizeWidth, height: itemSizeHeight)) - ) + )]) ) } } diff --git a/Sources/Grid/Styles/StaggeredGridStyle.swift b/Sources/Grid/Styles/StaggeredGridStyle.swift index 0ebdd10..a22f3a1 100644 --- a/Sources/Grid/Styles/StaggeredGridStyle.swift +++ b/Sources/Grid/Styles/StaggeredGridStyle.swift @@ -1,6 +1,7 @@ import SwiftUI /// Staggered `Grid` style. +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public struct StaggeredGridStyle: GridStyle { public var tracks: Tracks public var axis: Axis @@ -45,34 +46,34 @@ public struct StaggeredGridStyle: GridStyle { ) ) - preferences.items = layoutPreferences( + preferences = layoutPreferences( tracks: computedTracksCount, spacing: self.spacing, axis: self.axis, itemSize: size, - preferences: preferences.items + preferences: preferences ) } - private func layoutPreferences(tracks: Int, spacing: CGFloat, axis: Axis, itemSize: CGSize, preferences: [GridPreferences.Item]) -> [GridPreferences.Item] { + private func layoutPreferences(tracks: Int, spacing: CGFloat, axis: Axis, itemSize: CGSize, preferences: GridPreferences) -> GridPreferences { var tracksLengths = Array(repeating: CGFloat(0.0), count: tracks) - var newPreferences: [GridPreferences.Item] = [] + var newPreferences: GridPreferences = GridPreferences(items: []) - preferences.forEach { preference in + preferences.items.forEach { preference in if let minValue = tracksLengths.min(), let indexMin = tracksLengths.firstIndex(of: minValue) { let itemSizeWidth = axis == .vertical ? itemSize.width : preference.bounds.size.width let itemSizeHeight = axis == .vertical ? preference.bounds.size.height : itemSize.height let width = axis == .vertical ? itemSizeWidth * CGFloat(indexMin) + CGFloat(indexMin) * spacing : tracksLengths[indexMin] let height = axis == .vertical ? tracksLengths[indexMin] : itemSizeHeight * CGFloat(indexMin) + CGFloat(indexMin) * spacing - let origin = CGPoint(x: 0 - width, y: 0 - height) + let origin = CGPoint(x: width, y: height) tracksLengths[indexMin] += (axis == .vertical ? itemSizeHeight : itemSizeWidth) + spacing - newPreferences.append( - GridPreferences.Item( + newPreferences.merge(with: + GridPreferences(items: [GridPreferences.Item( id: preference.id, bounds: CGRect(origin: origin, size: CGSize(width: itemSizeWidth, height: itemSizeHeight)) - ) + )]) ) } } diff --git a/Sources/Grid/Styles/Style/EnvironmentValues+GridStyle.swift b/Sources/Grid/Styles/Style/EnvironmentValues+GridStyle.swift index 1a65370..000f7b2 100644 --- a/Sources/Grid/Styles/Style/EnvironmentValues+GridStyle.swift +++ b/Sources/Grid/Styles/Style/EnvironmentValues+GridStyle.swift @@ -1,5 +1,6 @@ import SwiftUI +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public extension EnvironmentValues { var gridStyle: GridStyle { get { diff --git a/Sources/Grid/Styles/Style/GridPreferences.swift b/Sources/Grid/Styles/Style/GridPreferences.swift index 9c143de..08f981d 100644 --- a/Sources/Grid/Styles/Style/GridPreferences.swift +++ b/Sources/Grid/Styles/Style/GridPreferences.swift @@ -1,17 +1,23 @@ import Foundation -import SwiftUI +import CoreGraphics public struct GridPreferences: Equatable { public struct Item: Equatable { public let id: AnyHashable public let bounds: CGRect + + public init(id: AnyHashable, bounds: CGRect) { + self.id = id + self.bounds = bounds + } } public var items: [Item] - public var size: CGSize = .zero + public var size: CGSize - public init(items: [Item]) { + public init(size: CGSize = .zero, items: [Item]) { + self.size = size self.items = items } @@ -24,16 +30,8 @@ public struct GridPreferences: Equatable { mutating func merge(with preferences: GridPreferences) { self.items.append(contentsOf: preferences.items) self.size = CGSize( - width: max(self.size.width, abs(self.items.map { $0.bounds.origin.x - $0.bounds.size.width }.min() ?? 0.0).rounded()), - height: max(self.size.height, abs(self.items.map { $0.bounds.origin.y - $0.bounds.size.height }.min() ?? 0.0).rounded()) + width: (self.items.map { $0.bounds.origin.x + $0.bounds.size.width }.max() ?? 0.0).rounded(), + height: (self.items.map { $0.bounds.origin.y + $0.bounds.size.height }.max() ?? 0.0).rounded() ) } } - -public struct GridPreferencesKey: PreferenceKey { - public static var defaultValue: GridPreferences = .init(items: []) - - public static func reduce(value: inout GridPreferences, nextValue: () -> GridPreferences) { - value.merge(with: nextValue()) - } -} diff --git a/Sources/Grid/Styles/Style/GridPreferencesKey.swift b/Sources/Grid/Styles/Style/GridPreferencesKey.swift new file mode 100644 index 0000000..8540562 --- /dev/null +++ b/Sources/Grid/Styles/Style/GridPreferencesKey.swift @@ -0,0 +1,10 @@ +import Foundation +import SwiftUI + +public struct GridPreferencesKey: PreferenceKey { + public static var defaultValue: GridPreferences = .init(items: []) + + public static func reduce(value: inout GridPreferences, nextValue: () -> GridPreferences) { + value.merge(with: nextValue()) + } +} diff --git a/Sources/Grid/Styles/Style/GridPreferencesModifier.swift b/Sources/Grid/Styles/Style/GridPreferencesModifier.swift index 184e7b4..f2913f0 100644 --- a/Sources/Grid/Styles/Style/GridPreferencesModifier.swift +++ b/Sources/Grid/Styles/Style/GridPreferencesModifier.swift @@ -1,5 +1,6 @@ import SwiftUI +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct GridPreferencesModifier: View { let id: AnyHashable let bounds: CGRect diff --git a/Sources/Grid/Styles/Style/GridStyle.swift b/Sources/Grid/Styles/Style/GridStyle.swift index 34e9e08..e25c0d7 100644 --- a/Sources/Grid/Styles/Style/GridStyle.swift +++ b/Sources/Grid/Styles/Style/GridStyle.swift @@ -1,6 +1,7 @@ import SwiftUI /// A specification for the appearance of a `Grid`. +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public protocol GridStyle { var axis: Axis { get } var autoWidth: Bool { get } @@ -8,6 +9,7 @@ public protocol GridStyle { func transform(preferences: inout GridPreferences, in size: CGSize) } +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public extension GridStyle { var axes: Axis.Set { self.axis == .horizontal ? .horizontal : .vertical diff --git a/Sources/Grid/Styles/Style/GridStyleKey.swift b/Sources/Grid/Styles/Style/GridStyleKey.swift index 8bb62a0..bddbec7 100644 --- a/Sources/Grid/Styles/Style/GridStyleKey.swift +++ b/Sources/Grid/Styles/Style/GridStyleKey.swift @@ -1,5 +1,6 @@ import SwiftUI +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct GridStyleKey: EnvironmentKey { static let defaultValue: GridStyle = ModularGridStyle(columns: .min(100), rows: .fixed(100)) } diff --git a/Sources/Grid/Styles/Style/View+GridStyle.swift b/Sources/Grid/Styles/Style/View+GridStyle.swift index 091eefb..fe00852 100644 --- a/Sources/Grid/Styles/Style/View+GridStyle.swift +++ b/Sources/Grid/Styles/Style/View+GridStyle.swift @@ -1,5 +1,6 @@ import SwiftUI +@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public extension View { /// Sets the style for `Grid` within the environment of `self`. @inlinable func gridStyle(_ style: S) -> some View where S : GridStyle { diff --git a/Tests/GridTests/GridPreferencesTests.swift b/Tests/GridTests/GridPreferencesTests.swift new file mode 100644 index 0000000..579ec7c --- /dev/null +++ b/Tests/GridTests/GridPreferencesTests.swift @@ -0,0 +1,30 @@ +@testable import Grid +import XCTest + +class GridPreferencesTests: XCTestCase { + func testGridPreferencesMerge() { + var preferences = GridPreferences(items: [ + GridPreferences.Item(id: 1, bounds: .zero), + GridPreferences.Item(id: 2, bounds: .zero) + ]) + + let updatedPreferences = GridPreferences(items: [ + GridPreferences.Item(id: 1, bounds: .init(origin: CGPoint(x: 0, y: 0), size: CGSize(width: 100, height: 100))), + GridPreferences.Item(id: 2, bounds: .init(origin: CGPoint(x: 50, y: 50), size: CGSize(width: 100, height: 100))) + ]) + + preferences.merge(with: updatedPreferences) + + XCTAssertEqual(preferences.size, CGSize(width: 150, height: 150)) + } + + func testGridPreferencesMergeWithZeroSizeAndItems() { + var preferences = GridPreferences(items: []) + XCTAssertEqual(preferences.size, .zero) + XCTAssertEqual(preferences.items, []) + + preferences.merge(with: GridPreferences(items: [])) + XCTAssertEqual(preferences.size, .zero) + XCTAssertEqual(preferences.items, []) + } +} diff --git a/Tests/GridTests/ModularGridStyleTests.swift b/Tests/GridTests/ModularGridStyleTests.swift new file mode 100644 index 0000000..5dc5b48 --- /dev/null +++ b/Tests/GridTests/ModularGridStyleTests.swift @@ -0,0 +1,62 @@ +@testable import Grid +import XCTest + +class ModularGridStyleTests: XCTestCase { + func testModularGridStyleWithOneRow() { + let style = ModularGridStyle(.vertical, columns: 4, rows: 1, spacing: 0) + + var preferences = GridPreferences(items: [ + GridPreferences.Item(id: 1, bounds: .zero), + GridPreferences.Item(id: 2, bounds: .zero), + GridPreferences.Item(id: 3, bounds: .zero), + GridPreferences.Item(id: 4, bounds: .zero) + ]) + + style.transform(preferences: &preferences, in: CGSize(width: 100, height: 50)) + + XCTAssertEqual(preferences, GridPreferences( + size: CGSize(width: 100, height: 50), + items: [ + GridPreferences.Item(id: 1, bounds: CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: 25, height: 50))), + GridPreferences.Item(id: 2, bounds: CGRect(origin: CGPoint(x: 25, y: 0), size: CGSize(width: 25, height: 50))), + GridPreferences.Item(id: 3, bounds: CGRect(origin: CGPoint(x: 50, y: 0), size: CGSize(width: 25, height: 50))), + GridPreferences.Item(id: 4, bounds: CGRect(origin: CGPoint(x: 75, y: 0), size: CGSize(width: 25, height: 50))) + ]) + ) + } + + func testModularGridStyleWithTwoRows() { + let style = ModularGridStyle(.vertical, columns: 2, rows: .fixed(50), spacing: 0) + + var preferences = GridPreferences(items: [ + GridPreferences.Item(id: 1, bounds: .zero), + GridPreferences.Item(id: 2, bounds: .zero), + GridPreferences.Item(id: 3, bounds: .zero), + GridPreferences.Item(id: 4, bounds: .zero) + ]) + + style.transform(preferences: &preferences, in: CGSize(width: 100, height: 100)) + + XCTAssertEqual(preferences, GridPreferences( + size: CGSize(width: 100, height: 100), + items: [ + GridPreferences.Item(id: 1, bounds: CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: 50, height: 50))), + GridPreferences.Item(id: 2, bounds: CGRect(origin: CGPoint(x: 50, y: 0), size: CGSize(width: 50, height: 50))), + GridPreferences.Item(id: 3, bounds: CGRect(origin: CGPoint(x: 0, y: 50), size: CGSize(width: 50, height: 50))), + GridPreferences.Item(id: 4, bounds: CGRect(origin: CGPoint(x: 50, y: 50), size: CGSize(width: 50, height: 50))) + ]) + ) + } + + func testModularGridStyleWithZeroSizeAndNoItems() { + let style = ModularGridStyle(.vertical, columns: 5, rows: 5, spacing: 0) + + var preferences = GridPreferences(items: []) + XCTAssertEqual(preferences.size, .zero) + + style.transform(preferences: &preferences, in: .zero) + XCTAssertEqual(preferences.size, .zero) + XCTAssertEqual(preferences.items, []) + XCTAssertEqual(preferences.items, []) + } +} diff --git a/Tests/GridTests/StaggeredGridStyleTests.swift b/Tests/GridTests/StaggeredGridStyleTests.swift new file mode 100644 index 0000000..035fd7c --- /dev/null +++ b/Tests/GridTests/StaggeredGridStyleTests.swift @@ -0,0 +1,27 @@ +@testable import Grid +import XCTest + +class StaggeredGridStyleTests: XCTestCase { + func testStaggeredGridStyleWithOneRow() { + let style = StaggeredGridStyle(.horizontal, tracks: 2, spacing: 0) + + var preferences = GridPreferences(items: [ + GridPreferences.Item(id: 1, bounds: CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: 100, height: 50))), + GridPreferences.Item(id: 2, bounds: CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: 100, height: 50))), + GridPreferences.Item(id: 3, bounds: CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: 100, height: 50))), + GridPreferences.Item(id: 4, bounds: CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: 100, height: 50))) + ]) + + style.transform(preferences: &preferences, in: CGSize(width: 200, height: 100)) + + XCTAssertEqual(preferences, GridPreferences( + size: CGSize(width: 200, height: 100), + items: [ + GridPreferences.Item(id: 1, bounds: CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: 100, height: 50))), + GridPreferences.Item(id: 2, bounds: CGRect(origin: CGPoint(x: 0, y: 50), size: CGSize(width: 100, height: 50))), + GridPreferences.Item(id: 3, bounds: CGRect(origin: CGPoint(x: 100, y: 0), size: CGSize(width: 100, height: 50))), + GridPreferences.Item(id: 4, bounds: CGRect(origin: CGPoint(x: 100, y: 50), size: CGSize(width: 100, height: 50))) + ]) + ) + } +}