diff --git a/README.md b/README.md index ec7779c..0683576 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,33 @@ # SFSymbolsArtCollection -The Art collection made from SF Symbols +The art collection of **SF Symbols art**. -## Art works + -### Magician - +## What's SFSymbols art -### WORLD PEACE - +SF Symbols art is simply the art created by combining SF Symbols. -### Party Animals - +You can experience that through SwiftUI with variable color, symbol effects, and keyframe animations, advancing SF Symbols art even further. -### Arm Hair - +## How amazing SFSymbols art is -### Demon Wrestler - +Check some previews below. + +### Nosebleed + +https://github.com/littleossa/SFSymbolsArtCollection/assets/67716751/e4ecc405-ea26-4bfd-a1b2-af02256c3d22 + +### Arm hair + +https://github.com/littleossa/SFSymbolsArtCollection/assets/67716751/8775c0b8-851b-4607-9394-558d8479190f ### Fireworks - -Let's enjoy SF Symbols Art. +https://github.com/littleossa/SFSymbolsArtCollection/assets/67716751/ed369c58-0315-4123-bc64-2bd0237b369c + +Other wonderful SFSymbols' artworks are also here, so please feel free to check them out. + +I would be delighted if you could give it a star. + +Have a good day with SFSymbols art. diff --git a/SFSymbolsArtCollection.xcodeproj/project.pbxproj b/SFSymbolsArtCollection.xcodeproj/project.pbxproj index 21a063e..afd4668 100644 --- a/SFSymbolsArtCollection.xcodeproj/project.pbxproj +++ b/SFSymbolsArtCollection.xcodeproj/project.pbxproj @@ -7,124 +7,119 @@ objects = { /* Begin PBXBuildFile section */ - 971D9DE828C9497D00136A36 /* MagicianSunGlasses.swift in Sources */ = {isa = PBXBuildFile; fileRef = 971D9DE728C9497D00136A36 /* MagicianSunGlasses.swift */; }; - 971D9DEA28C9731D00136A36 /* iOSDCJapan2022SymbolType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 971D9DE928C9731D00136A36 /* iOSDCJapan2022SymbolType.swift */; }; - 973B2CA128C2546C006ED5F0 /* ArrangeShapeWithFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = 973B2CA028C2546C006ED5F0 /* ArrangeShapeWithFont.swift */; }; - 973B2CA428C25DAA006ED5F0 /* ArrangeShapeWithWidthAndHeight.swift in Sources */ = {isa = PBXBuildFile; fileRef = 973B2CA328C25DAA006ED5F0 /* ArrangeShapeWithWidthAndHeight.swift */; }; - 9748BE15289338A3006DF0BE /* Magician.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE14289338A3006DF0BE /* Magician.swift */; }; - 9748BE1828933E40006DF0BE /* MagicianHat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE1728933E40006DF0BE /* MagicianHat.swift */; }; - 9748BE1A289341BE006DF0BE /* MagicianFace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE19289341BE006DF0BE /* MagicianFace.swift */; }; - 9748BE1D289399CF006DF0BE /* SFAlphabet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE1C289399CF006DF0BE /* SFAlphabet.swift */; }; 9748BE2028939B04006DF0BE /* FlipType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE1F28939B04006DF0BE /* FlipType.swift */; }; - 9748BE232893B35A006DF0BE /* WorldPeace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE222893B35A006DF0BE /* WorldPeace.swift */; }; - 9748BE292893BFE3006DF0BE /* Earth.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE282893BFE3006DF0BE /* Earth.swift */; }; - 9748BE2C2893C428006DF0BE /* Bear.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE2B2893C428006DF0BE /* Bear.swift */; }; - 9748BE2E2893C688006DF0BE /* AnimalOutline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE2D2893C688006DF0BE /* AnimalOutline.swift */; }; - 9748BE302893C706006DF0BE /* AnimalNose.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE2F2893C706006DF0BE /* AnimalNose.swift */; }; - 9748BE322893C91F006DF0BE /* AnimalEye.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE312893C91F006DF0BE /* AnimalEye.swift */; }; - 9748BE352893CB67006DF0BE /* Lion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE342893CB67006DF0BE /* Lion.swift */; }; - 9748BE372893D064006DF0BE /* PartyAnimals.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE362893D064006DF0BE /* PartyAnimals.swift */; }; - 9748BE3A2893D0E3006DF0BE /* Frog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE392893D0E3006DF0BE /* Frog.swift */; }; - 9748BE3C2897AA28006DF0BE /* AnimalWhiskers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE3B2897AA28006DF0BE /* AnimalWhiskers.swift */; }; - 9748BE3F2897AE68006DF0BE /* ArmHair.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE3E2897AE68006DF0BE /* ArmHair.swift */; }; - 9748BE412897CD6C006DF0BE /* Arm.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE402897CD6C006DF0BE /* Arm.swift */; }; - 9748BE4328980C4D006DF0BE /* Hair.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE4228980C4D006DF0BE /* Hair.swift */; }; - 9748BE4628981011006DF0BE /* DemonWrestler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE4528981011006DF0BE /* DemonWrestler.swift */; }; - 9748BE4828981096006DF0BE /* DemonWrestlerFace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE4728981096006DF0BE /* DemonWrestlerFace.swift */; }; - 9748BE4A28995877006DF0BE /* DemonWrestlerOutline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE4928995877006DF0BE /* DemonWrestlerOutline.swift */; }; - 9748BE4C28995A43006DF0BE /* DemonWrestlerBody.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE4B28995A43006DF0BE /* DemonWrestlerBody.swift */; }; - 9748BE50289AB439006DF0BE /* DemonWrestlerHand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE4F289AB439006DF0BE /* DemonWrestlerHand.swift */; }; - 9748BE57289DCBB0006DF0BE /* LargeFirework.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE56289DCBB0006DF0BE /* LargeFirework.swift */; }; - 9748BE59289DCE17006DF0BE /* Fireworks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE58289DCE17006DF0BE /* Fireworks.swift */; }; - 9748BE5D289DD696006DF0BE /* Building.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE5C289DD696006DF0BE /* Building.swift */; }; - 9748BE5F289F194E006DF0BE /* RocketFirework.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE5E289F194E006DF0BE /* RocketFirework.swift */; }; - 9748BE6428A3936E006DF0BE /* ArtWorkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE6328A3936E006DF0BE /* ArtWorkView.swift */; }; - 9748BE6628A395D5006DF0BE /* ArtWork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9748BE6528A395D5006DF0BE /* ArtWork.swift */; }; - 97624C2A28C2BC9A004E1720 /* MediumFirework.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97624C2928C2BC9A004E1720 /* MediumFirework.swift */; }; - 97624C2C28C2DDAA004E1720 /* Buildings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97624C2B28C2DDAA004E1720 /* Buildings.swift */; }; - 97624C2F28C2E608004E1720 /* SmallFirework.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97624C2E28C2E608004E1720 /* SmallFirework.swift */; }; - 97624C3328C4F43F004E1720 /* GeometryProxy+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97624C3228C4F43F004E1720 /* GeometryProxy+Extensions.swift */; }; - 97624C3A28C82DBB004E1720 /* CharacterAppearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97624C3928C82DBB004E1720 /* CharacterAppearance.swift */; }; - 97624C3C28C935F0004E1720 /* FiveCharactersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97624C3B28C935F0004E1720 /* FiveCharactersView.swift */; }; - 97624C3E28C93693004E1720 /* CharactersType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97624C3D28C93693004E1720 /* CharactersType.swift */; }; - 97CD46E428BEF84100919B65 /* iOSDCJapan2022Symbol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97CD46E328BEF84100919B65 /* iOSDCJapan2022Symbol.swift */; }; - 97CD46E928BF080300919B65 /* iOSDCJapan2022Logo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97CD46E828BF080200919B65 /* iOSDCJapan2022Logo.swift */; }; + 97624C3328C4F43F004E1720 /* GeometryProxy+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97624C3228C4F43F004E1720 /* GeometryProxy+.swift */; }; + 9767DEFA2B751C2C00457DA1 /* WorldPeaceArtView+CoverArt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9767DEF92B751C2C00457DA1 /* WorldPeaceArtView+CoverArt.swift */; }; + 9767DF002B752E4700457DA1 /* WorldPeaceArtView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9767DEFF2B752E4700457DA1 /* WorldPeaceArtView.swift */; }; + 9767DF032B759B2D00457DA1 /* PartyAnimalsArtView+CoverArt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9767DF022B759B2D00457DA1 /* PartyAnimalsArtView+CoverArt.swift */; }; + 9767DF052B75AFE200457DA1 /* PartyAnimalsArtView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9767DF042B75AFE200457DA1 /* PartyAnimalsArtView.swift */; }; + 9767DF0B2B75D1A100457DA1 /* SymbolArtElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9767DF0A2B75D1A100457DA1 /* SymbolArtElement.swift */; }; + 9767DF0D2B75DDEC00457DA1 /* AfroBoyArtView+Element.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9767DF0C2B75DDEC00457DA1 /* AfroBoyArtView+Element.swift */; }; + 9767DF0F2B75DFB400457DA1 /* SymbolArtDisplayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9767DF0E2B75DFB400457DA1 /* SymbolArtDisplayView.swift */; }; + 9767DF112B75E8FC00457DA1 /* MagicianArtView+Element.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9767DF102B75E8FC00457DA1 /* MagicianArtView+Element.swift */; }; + 9767DF132B75EDB700457DA1 /* CrayonBoyArtView+Element.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9767DF122B75EDB700457DA1 /* CrayonBoyArtView+Element.swift */; }; + 9767DF152B75F7BE00457DA1 /* WorldPeaceArtView+Element.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9767DF142B75F7BE00457DA1 /* WorldPeaceArtView+Element.swift */; }; + 9767DF172B75FF0700457DA1 /* PartyAnimalsArtView+Element.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9767DF162B75FF0700457DA1 /* PartyAnimalsArtView+Element.swift */; }; + 9767DF192B76032600457DA1 /* NosebleedArtView+Element.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9767DF182B76032600457DA1 /* NosebleedArtView+Element.swift */; }; + 9767DF1B2B762DA000457DA1 /* ImWearingPantsArtView+FinishPoseElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9767DF1A2B762DA000457DA1 /* ImWearingPantsArtView+FinishPoseElement.swift */; }; + 9767DF1D2B762E1200457DA1 /* ImWearingPantsArtView+Pose.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9767DF1C2B762E1200457DA1 /* ImWearingPantsArtView+Pose.swift */; }; + 9767DF1F2B762E9000457DA1 /* ImWearingPantsArtView+FaceElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9767DF1E2B762E9000457DA1 /* ImWearingPantsArtView+FaceElement.swift */; }; + 9767DF232B7658E200457DA1 /* ArmHairArtView+CoverArt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9767DF222B7658E200457DA1 /* ArmHairArtView+CoverArt.swift */; }; + 9767DF252B76C9BE00457DA1 /* ArmHairArtView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9767DF242B76C9BE00457DA1 /* ArmHairArtView.swift */; }; + 9767DF272B76CCE300457DA1 /* ArmHairArtView+Element.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9767DF262B76CCE300457DA1 /* ArmHairArtView+Element.swift */; }; + 9767DF292B76FF0400457DA1 /* DemonWrestlerArtView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9767DF282B76FF0400457DA1 /* DemonWrestlerArtView.swift */; }; + 9767DF2B2B776D5800457DA1 /* DemonWrestlerArtView+CoverArt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9767DF2A2B776D5800457DA1 /* DemonWrestlerArtView+CoverArt.swift */; }; + 9767DF2D2B776DA100457DA1 /* DemonWrestlerArtView+Element.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9767DF2C2B776DA100457DA1 /* DemonWrestlerArtView+Element.swift */; }; + 9778A4932B781DCE001BF9E8 /* FireworksArtView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9778A4922B781DCE001BF9E8 /* FireworksArtView.swift */; }; + 9778A4952B78C076001BF9E8 /* FireworksArtView+Element.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9778A4942B78C076001BF9E8 /* FireworksArtView+Element.swift */; }; + 9778A4972B78C0C2001BF9E8 /* FireworksArtView+CoverArt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9778A4962B78C0C2001BF9E8 /* FireworksArtView+CoverArt.swift */; }; + 9778A49D2B7974E4001BF9E8 /* SweetBeanBunManArtView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9778A49C2B7974E4001BF9E8 /* SweetBeanBunManArtView.swift */; }; + 9778A49F2B7A179F001BF9E8 /* SweetBeanBunManArtWork+Element.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9778A49E2B7A179F001BF9E8 /* SweetBeanBunManArtWork+Element.swift */; }; + 9778A4A12B7A17CD001BF9E8 /* SweetBeanBunManArtWork+CoverArt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9778A4A02B7A17CD001BF9E8 /* SweetBeanBunManArtWork+CoverArt.swift */; }; + 9778A4A32B7A1F87001BF9E8 /* ArtGalleryView+ArtWorkPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9778A4A22B7A1F87001BF9E8 /* ArtGalleryView+ArtWorkPath.swift */; }; + 97AD530C2B70DA2F0034FB5D /* ArtGalleryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97AD530B2B70DA2F0034FB5D /* ArtGalleryView.swift */; }; + 97AD53102B70DE230034FB5D /* SymbolNameFrameView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97AD530F2B70DE230034FB5D /* SymbolNameFrameView.swift */; }; + 97AD53122B70DEB60034FB5D /* UIDevice+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97AD53112B70DEB60034FB5D /* UIDevice+.swift */; }; + 97AD53182B70DFF30034FB5D /* AnimationValues.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97AD53172B70DFF30034FB5D /* AnimationValues.swift */; }; + 97AD531A2B70E0530034FB5D /* Font.Weight+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97AD53192B70E0530034FB5D /* Font.Weight+.swift */; }; + 97AD53222B70E3FA0034FB5D /* AnimatableSymbolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97AD53212B70E3FA0034FB5D /* AnimatableSymbolView.swift */; }; + 97AD53242B70E48F0034FB5D /* PlayButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97AD53232B70E48F0034FB5D /* PlayButton.swift */; }; + 97AD53292B7100670034FB5D /* ArtWorkModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97AD53282B7100670034FB5D /* ArtWorkModel.swift */; }; + 97AD532B2B71068B0034FB5D /* AfroBoyArtView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97AD532A2B71068B0034FB5D /* AfroBoyArtView.swift */; }; + 97AD532D2B717C950034FB5D /* AfroBoyArtView+CoverArt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97AD532C2B717C950034FB5D /* AfroBoyArtView+CoverArt.swift */; }; + 97AD53312B71A5130034FB5D /* GalleryGridView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97AD53302B71A5130034FB5D /* GalleryGridView.swift */; }; 97E11D502817381100B2AB32 /* SFSymbolsArtCollectionApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E11D4F2817381100B2AB32 /* SFSymbolsArtCollectionApp.swift */; }; - 97E11D522817381100B2AB32 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E11D512817381100B2AB32 /* ContentView.swift */; }; 97E11D542817381200B2AB32 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97E11D532817381200B2AB32 /* Assets.xcassets */; }; 97E11D572817381200B2AB32 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97E11D562817381200B2AB32 /* Preview Assets.xcassets */; }; - 97E11DF028176A0D00B2AB32 /* SFUserFriendlySymbols in Frameworks */ = {isa = PBXBuildFile; productRef = 97E11DEF28176A0D00B2AB32 /* SFUserFriendlySymbols */; }; - 97E11E33281971E200B2AB32 /* CrayonHair.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E11E30281971E100B2AB32 /* CrayonHair.swift */; }; - 97E11E34281971E200B2AB32 /* CrayonFace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E11E31281971E200B2AB32 /* CrayonFace.swift */; }; - 97E11E35281971E200B2AB32 /* CrayonMouth.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E11E32281971E200B2AB32 /* CrayonMouth.swift */; }; - 97E11E3B281971ED00B2AB32 /* CrayonEyes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E11E36281971EC00B2AB32 /* CrayonEyes.swift */; }; - 97E11E3C281971ED00B2AB32 /* CrayonEye.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E11E37281971EC00B2AB32 /* CrayonEye.swift */; }; - 97E11E3D281971ED00B2AB32 /* CrayonEyelid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E11E38281971ED00B2AB32 /* CrayonEyelid.swift */; }; - 97E11E3E281971ED00B2AB32 /* CrayonEyebrow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E11E39281971ED00B2AB32 /* CrayonEyebrow.swift */; }; - 97E11E3F281971ED00B2AB32 /* CrayonEyeBall.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E11E3A281971ED00B2AB32 /* CrayonEyeBall.swift */; }; - 97E11E442819729B00B2AB32 /* Color+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E11E432819729B00B2AB32 /* Color+Extensions.swift */; }; - 97E11E462819734700B2AB32 /* CrayonBoy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E11E452819734700B2AB32 /* CrayonBoy.swift */; }; + 97EF438B2B725E02003648F5 /* NosebleedArtView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97EF438A2B725E02003648F5 /* NosebleedArtView.swift */; }; + 97EF438D2B726CE6003648F5 /* ArtWorkModel+InitialSymbolRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97EF438C2B726CE6003648F5 /* ArtWorkModel+InitialSymbolRow.swift */; }; + 97EF43902B72D2E4003648F5 /* NosebleedArtView+CoverArt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97EF438F2B72D2E4003648F5 /* NosebleedArtView+CoverArt.swift */; }; + 97EF43932B72D3E2003648F5 /* ImWearingPantsArtView+CoverArt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97EF43922B72D3E2003648F5 /* ImWearingPantsArtView+CoverArt.swift */; }; + 97EF43952B72DA69003648F5 /* ImWearingPantsArtView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97EF43942B72DA69003648F5 /* ImWearingPantsArtView.swift */; }; + 97EF43982B733337003648F5 /* MagicianArtView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97EF43972B733337003648F5 /* MagicianArtView.swift */; }; + 97EF439C2B7421A7003648F5 /* MagicianArtView+CoverArt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97EF439B2B7421A7003648F5 /* MagicianArtView+CoverArt.swift */; }; + 97EF439E2B744C4C003648F5 /* Color+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97EF439D2B744C4C003648F5 /* Color+.swift */; }; + 97EF43A12B74CA38003648F5 /* CrayonBoyArtView+CoverArt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97EF43A02B74CA38003648F5 /* CrayonBoyArtView+CoverArt.swift */; }; + 97EF43A52B74F27D003648F5 /* CrayonBoyArtView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97EF43A42B74F27D003648F5 /* CrayonBoyArtView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 971D9DE728C9497D00136A36 /* MagicianSunGlasses.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MagicianSunGlasses.swift; sourceTree = ""; }; - 971D9DE928C9731D00136A36 /* iOSDCJapan2022SymbolType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iOSDCJapan2022SymbolType.swift; sourceTree = ""; }; - 973B2CA028C2546C006ED5F0 /* ArrangeShapeWithFont.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArrangeShapeWithFont.swift; sourceTree = ""; }; - 973B2CA328C25DAA006ED5F0 /* ArrangeShapeWithWidthAndHeight.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArrangeShapeWithWidthAndHeight.swift; sourceTree = ""; }; - 9748BE14289338A3006DF0BE /* Magician.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Magician.swift; sourceTree = ""; }; - 9748BE1728933E40006DF0BE /* MagicianHat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MagicianHat.swift; sourceTree = ""; }; - 9748BE19289341BE006DF0BE /* MagicianFace.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MagicianFace.swift; sourceTree = ""; }; - 9748BE1C289399CF006DF0BE /* SFAlphabet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SFAlphabet.swift; sourceTree = ""; }; 9748BE1F28939B04006DF0BE /* FlipType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlipType.swift; sourceTree = ""; }; - 9748BE222893B35A006DF0BE /* WorldPeace.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorldPeace.swift; sourceTree = ""; }; - 9748BE282893BFE3006DF0BE /* Earth.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Earth.swift; sourceTree = ""; }; - 9748BE2B2893C428006DF0BE /* Bear.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Bear.swift; sourceTree = ""; }; - 9748BE2D2893C688006DF0BE /* AnimalOutline.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnimalOutline.swift; sourceTree = ""; }; - 9748BE2F2893C706006DF0BE /* AnimalNose.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnimalNose.swift; sourceTree = ""; }; - 9748BE312893C91F006DF0BE /* AnimalEye.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnimalEye.swift; sourceTree = ""; }; - 9748BE342893CB67006DF0BE /* Lion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Lion.swift; sourceTree = ""; }; - 9748BE362893D064006DF0BE /* PartyAnimals.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartyAnimals.swift; sourceTree = ""; }; - 9748BE392893D0E3006DF0BE /* Frog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Frog.swift; sourceTree = ""; }; - 9748BE3B2897AA28006DF0BE /* AnimalWhiskers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnimalWhiskers.swift; sourceTree = ""; }; - 9748BE3E2897AE68006DF0BE /* ArmHair.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArmHair.swift; sourceTree = ""; }; - 9748BE402897CD6C006DF0BE /* Arm.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Arm.swift; sourceTree = ""; }; - 9748BE4228980C4D006DF0BE /* Hair.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Hair.swift; sourceTree = ""; }; - 9748BE4528981011006DF0BE /* DemonWrestler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemonWrestler.swift; sourceTree = ""; }; - 9748BE4728981096006DF0BE /* DemonWrestlerFace.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemonWrestlerFace.swift; sourceTree = ""; }; - 9748BE4928995877006DF0BE /* DemonWrestlerOutline.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemonWrestlerOutline.swift; sourceTree = ""; }; - 9748BE4B28995A43006DF0BE /* DemonWrestlerBody.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemonWrestlerBody.swift; sourceTree = ""; }; - 9748BE4F289AB439006DF0BE /* DemonWrestlerHand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemonWrestlerHand.swift; sourceTree = ""; }; - 9748BE56289DCBB0006DF0BE /* LargeFirework.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LargeFirework.swift; sourceTree = ""; }; - 9748BE58289DCE17006DF0BE /* Fireworks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Fireworks.swift; sourceTree = ""; }; - 9748BE5C289DD696006DF0BE /* Building.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Building.swift; sourceTree = ""; }; - 9748BE5E289F194E006DF0BE /* RocketFirework.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RocketFirework.swift; sourceTree = ""; }; 9748BE62289F4BFB006DF0BE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; - 9748BE6328A3936E006DF0BE /* ArtWorkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArtWorkView.swift; sourceTree = ""; }; - 9748BE6528A395D5006DF0BE /* ArtWork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArtWork.swift; sourceTree = ""; }; - 97624C2928C2BC9A004E1720 /* MediumFirework.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediumFirework.swift; sourceTree = ""; }; - 97624C2B28C2DDAA004E1720 /* Buildings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Buildings.swift; sourceTree = ""; }; - 97624C2E28C2E608004E1720 /* SmallFirework.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmallFirework.swift; sourceTree = ""; }; - 97624C3228C4F43F004E1720 /* GeometryProxy+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GeometryProxy+Extensions.swift"; sourceTree = ""; }; - 97624C3928C82DBB004E1720 /* CharacterAppearance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CharacterAppearance.swift; sourceTree = ""; }; - 97624C3B28C935F0004E1720 /* FiveCharactersView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FiveCharactersView.swift; sourceTree = ""; }; - 97624C3D28C93693004E1720 /* CharactersType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CharactersType.swift; sourceTree = ""; }; - 97CD46E328BEF84100919B65 /* iOSDCJapan2022Symbol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iOSDCJapan2022Symbol.swift; sourceTree = ""; }; - 97CD46E828BF080200919B65 /* iOSDCJapan2022Logo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iOSDCJapan2022Logo.swift; sourceTree = ""; }; + 97624C3228C4F43F004E1720 /* GeometryProxy+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GeometryProxy+.swift"; sourceTree = ""; }; + 9767DEF92B751C2C00457DA1 /* WorldPeaceArtView+CoverArt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WorldPeaceArtView+CoverArt.swift"; sourceTree = ""; }; + 9767DEFF2B752E4700457DA1 /* WorldPeaceArtView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorldPeaceArtView.swift; sourceTree = ""; }; + 9767DF022B759B2D00457DA1 /* PartyAnimalsArtView+CoverArt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PartyAnimalsArtView+CoverArt.swift"; sourceTree = ""; }; + 9767DF042B75AFE200457DA1 /* PartyAnimalsArtView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartyAnimalsArtView.swift; sourceTree = ""; }; + 9767DF0A2B75D1A100457DA1 /* SymbolArtElement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SymbolArtElement.swift; sourceTree = ""; }; + 9767DF0C2B75DDEC00457DA1 /* AfroBoyArtView+Element.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AfroBoyArtView+Element.swift"; sourceTree = ""; }; + 9767DF0E2B75DFB400457DA1 /* SymbolArtDisplayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SymbolArtDisplayView.swift; sourceTree = ""; }; + 9767DF102B75E8FC00457DA1 /* MagicianArtView+Element.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MagicianArtView+Element.swift"; sourceTree = ""; }; + 9767DF122B75EDB700457DA1 /* CrayonBoyArtView+Element.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CrayonBoyArtView+Element.swift"; sourceTree = ""; }; + 9767DF142B75F7BE00457DA1 /* WorldPeaceArtView+Element.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WorldPeaceArtView+Element.swift"; sourceTree = ""; }; + 9767DF162B75FF0700457DA1 /* PartyAnimalsArtView+Element.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PartyAnimalsArtView+Element.swift"; sourceTree = ""; }; + 9767DF182B76032600457DA1 /* NosebleedArtView+Element.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NosebleedArtView+Element.swift"; sourceTree = ""; }; + 9767DF1A2B762DA000457DA1 /* ImWearingPantsArtView+FinishPoseElement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ImWearingPantsArtView+FinishPoseElement.swift"; sourceTree = ""; }; + 9767DF1C2B762E1200457DA1 /* ImWearingPantsArtView+Pose.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ImWearingPantsArtView+Pose.swift"; sourceTree = ""; }; + 9767DF1E2B762E9000457DA1 /* ImWearingPantsArtView+FaceElement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ImWearingPantsArtView+FaceElement.swift"; sourceTree = ""; }; + 9767DF222B7658E200457DA1 /* ArmHairArtView+CoverArt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ArmHairArtView+CoverArt.swift"; sourceTree = ""; }; + 9767DF242B76C9BE00457DA1 /* ArmHairArtView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArmHairArtView.swift; sourceTree = ""; }; + 9767DF262B76CCE300457DA1 /* ArmHairArtView+Element.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ArmHairArtView+Element.swift"; sourceTree = ""; }; + 9767DF282B76FF0400457DA1 /* DemonWrestlerArtView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemonWrestlerArtView.swift; sourceTree = ""; }; + 9767DF2A2B776D5800457DA1 /* DemonWrestlerArtView+CoverArt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DemonWrestlerArtView+CoverArt.swift"; sourceTree = ""; }; + 9767DF2C2B776DA100457DA1 /* DemonWrestlerArtView+Element.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DemonWrestlerArtView+Element.swift"; sourceTree = ""; }; + 9778A4922B781DCE001BF9E8 /* FireworksArtView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FireworksArtView.swift; sourceTree = ""; }; + 9778A4942B78C076001BF9E8 /* FireworksArtView+Element.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FireworksArtView+Element.swift"; sourceTree = ""; }; + 9778A4962B78C0C2001BF9E8 /* FireworksArtView+CoverArt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FireworksArtView+CoverArt.swift"; sourceTree = ""; }; + 9778A49C2B7974E4001BF9E8 /* SweetBeanBunManArtView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SweetBeanBunManArtView.swift; sourceTree = ""; }; + 9778A49E2B7A179F001BF9E8 /* SweetBeanBunManArtWork+Element.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SweetBeanBunManArtWork+Element.swift"; sourceTree = ""; }; + 9778A4A02B7A17CD001BF9E8 /* SweetBeanBunManArtWork+CoverArt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SweetBeanBunManArtWork+CoverArt.swift"; sourceTree = ""; }; + 9778A4A22B7A1F87001BF9E8 /* ArtGalleryView+ArtWorkPath.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ArtGalleryView+ArtWorkPath.swift"; sourceTree = ""; }; + 97AD530B2B70DA2F0034FB5D /* ArtGalleryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArtGalleryView.swift; sourceTree = ""; }; + 97AD530F2B70DE230034FB5D /* SymbolNameFrameView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SymbolNameFrameView.swift; sourceTree = ""; }; + 97AD53112B70DEB60034FB5D /* UIDevice+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIDevice+.swift"; sourceTree = ""; }; + 97AD53172B70DFF30034FB5D /* AnimationValues.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnimationValues.swift; sourceTree = ""; }; + 97AD53192B70E0530034FB5D /* Font.Weight+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Font.Weight+.swift"; sourceTree = ""; }; + 97AD53212B70E3FA0034FB5D /* AnimatableSymbolView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnimatableSymbolView.swift; sourceTree = ""; }; + 97AD53232B70E48F0034FB5D /* PlayButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayButton.swift; sourceTree = ""; }; + 97AD53282B7100670034FB5D /* ArtWorkModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArtWorkModel.swift; sourceTree = ""; }; + 97AD532A2B71068B0034FB5D /* AfroBoyArtView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AfroBoyArtView.swift; sourceTree = ""; }; + 97AD532C2B717C950034FB5D /* AfroBoyArtView+CoverArt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AfroBoyArtView+CoverArt.swift"; sourceTree = ""; }; + 97AD53302B71A5130034FB5D /* GalleryGridView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GalleryGridView.swift; sourceTree = ""; }; 97E11D4C2817381100B2AB32 /* SFSymbolsArtCollection.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SFSymbolsArtCollection.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97E11D4F2817381100B2AB32 /* SFSymbolsArtCollectionApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SFSymbolsArtCollectionApp.swift; sourceTree = ""; }; - 97E11D512817381100B2AB32 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 97E11D532817381200B2AB32 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97E11D562817381200B2AB32 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; - 97E11E30281971E100B2AB32 /* CrayonHair.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CrayonHair.swift; sourceTree = ""; }; - 97E11E31281971E200B2AB32 /* CrayonFace.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CrayonFace.swift; sourceTree = ""; }; - 97E11E32281971E200B2AB32 /* CrayonMouth.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CrayonMouth.swift; sourceTree = ""; }; - 97E11E36281971EC00B2AB32 /* CrayonEyes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CrayonEyes.swift; sourceTree = ""; }; - 97E11E37281971EC00B2AB32 /* CrayonEye.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CrayonEye.swift; sourceTree = ""; }; - 97E11E38281971ED00B2AB32 /* CrayonEyelid.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CrayonEyelid.swift; sourceTree = ""; }; - 97E11E39281971ED00B2AB32 /* CrayonEyebrow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CrayonEyebrow.swift; sourceTree = ""; }; - 97E11E3A281971ED00B2AB32 /* CrayonEyeBall.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CrayonEyeBall.swift; sourceTree = ""; }; - 97E11E432819729B00B2AB32 /* Color+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+Extensions.swift"; sourceTree = ""; }; - 97E11E452819734700B2AB32 /* CrayonBoy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrayonBoy.swift; sourceTree = ""; }; + 97EF438A2B725E02003648F5 /* NosebleedArtView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NosebleedArtView.swift; sourceTree = ""; }; + 97EF438C2B726CE6003648F5 /* ArtWorkModel+InitialSymbolRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ArtWorkModel+InitialSymbolRow.swift"; sourceTree = ""; }; + 97EF438F2B72D2E4003648F5 /* NosebleedArtView+CoverArt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NosebleedArtView+CoverArt.swift"; sourceTree = ""; }; + 97EF43922B72D3E2003648F5 /* ImWearingPantsArtView+CoverArt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ImWearingPantsArtView+CoverArt.swift"; sourceTree = ""; }; + 97EF43942B72DA69003648F5 /* ImWearingPantsArtView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImWearingPantsArtView.swift; sourceTree = ""; }; + 97EF43972B733337003648F5 /* MagicianArtView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MagicianArtView.swift; sourceTree = ""; }; + 97EF439B2B7421A7003648F5 /* MagicianArtView+CoverArt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MagicianArtView+CoverArt.swift"; sourceTree = ""; }; + 97EF439D2B744C4C003648F5 /* Color+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+.swift"; sourceTree = ""; }; + 97EF43A02B74CA38003648F5 /* CrayonBoyArtView+CoverArt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CrayonBoyArtView+CoverArt.swift"; sourceTree = ""; }; + 97EF43A42B74F27D003648F5 /* CrayonBoyArtView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrayonBoyArtView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -132,267 +127,264 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 97E11DF028176A0D00B2AB32 /* SFUserFriendlySymbols in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 971D9DE528C93E5900136A36 /* Entity */ = { + 9748BE1E28939AE5006DF0BE /* Enums */ = { isa = PBXGroup; children = ( - 97624C3D28C93693004E1720 /* CharactersType.swift */, - 97624C3928C82DBB004E1720 /* CharacterAppearance.swift */, + 9748BE1F28939B04006DF0BE /* FlipType.swift */, ); - path = Entity; + path = Enums; sourceTree = ""; }; - 971D9DE628C93EB500136A36 /* Common */ = { + 9748BE4428980FE4006DF0BE /* DemonWrestler */ = { isa = PBXGroup; children = ( - 973B2CA228C2584F006ED5F0 /* ViewModifiers */, - 9748BE1E28939AE5006DF0BE /* Enum */, - 97E11E412819727A00B2AB32 /* Extensions */, + 9767DF282B76FF0400457DA1 /* DemonWrestlerArtView.swift */, + 9767DF2C2B776DA100457DA1 /* DemonWrestlerArtView+Element.swift */, + 9767DF2A2B776D5800457DA1 /* DemonWrestlerArtView+CoverArt.swift */, ); - path = Common; + path = DemonWrestler; sourceTree = ""; }; - 971D9DEB28C973AD00136A36 /* Entity */ = { + 9767DEF82B751C1300457DA1 /* WorldPeace */ = { isa = PBXGroup; children = ( - 971D9DE928C9731D00136A36 /* iOSDCJapan2022SymbolType.swift */, + 9767DEFF2B752E4700457DA1 /* WorldPeaceArtView.swift */, + 9767DF142B75F7BE00457DA1 /* WorldPeaceArtView+Element.swift */, + 9767DEF92B751C2C00457DA1 /* WorldPeaceArtView+CoverArt.swift */, ); - path = Entity; + path = WorldPeace; sourceTree = ""; }; - 971D9DEC28C98BF900136A36 /* CrayonEye */ = { + 9767DF012B759AFC00457DA1 /* PartyAnimals */ = { isa = PBXGroup; children = ( - 97E11E36281971EC00B2AB32 /* CrayonEyes.swift */, - 97E11E37281971EC00B2AB32 /* CrayonEye.swift */, - 97E11E3A281971ED00B2AB32 /* CrayonEyeBall.swift */, - 97E11E39281971ED00B2AB32 /* CrayonEyebrow.swift */, - 97E11E38281971ED00B2AB32 /* CrayonEyelid.swift */, + 9767DF042B75AFE200457DA1 /* PartyAnimalsArtView.swift */, + 9767DF162B75FF0700457DA1 /* PartyAnimalsArtView+Element.swift */, + 9767DF022B759B2D00457DA1 /* PartyAnimalsArtView+CoverArt.swift */, ); - path = CrayonEye; + path = PartyAnimals; sourceTree = ""; }; - 973B2CA228C2584F006ED5F0 /* ViewModifiers */ = { + 9767DF212B7658CB00457DA1 /* ArmHair */ = { isa = PBXGroup; children = ( - 973B2CA028C2546C006ED5F0 /* ArrangeShapeWithFont.swift */, - 973B2CA328C25DAA006ED5F0 /* ArrangeShapeWithWidthAndHeight.swift */, + 9767DF242B76C9BE00457DA1 /* ArmHairArtView.swift */, + 9767DF262B76CCE300457DA1 /* ArmHairArtView+Element.swift */, + 9767DF222B7658E200457DA1 /* ArmHairArtView+CoverArt.swift */, ); - path = ViewModifiers; + path = ArmHair; sourceTree = ""; }; - 9748BE16289338C9006DF0BE /* Magician */ = { + 9778A4912B781DA6001BF9E8 /* Fireworks */ = { isa = PBXGroup; children = ( - 9748BE14289338A3006DF0BE /* Magician.swift */, - 9748BE1728933E40006DF0BE /* MagicianHat.swift */, - 9748BE19289341BE006DF0BE /* MagicianFace.swift */, - 971D9DE728C9497D00136A36 /* MagicianSunGlasses.swift */, + 9778A4922B781DCE001BF9E8 /* FireworksArtView.swift */, + 9778A4942B78C076001BF9E8 /* FireworksArtView+Element.swift */, + 9778A4962B78C0C2001BF9E8 /* FireworksArtView+CoverArt.swift */, ); - path = Magician; + path = Fireworks; sourceTree = ""; }; - 9748BE1E28939AE5006DF0BE /* Enum */ = { + 9778A49B2B7974A3001BF9E8 /* SweetBeanBunMan */ = { isa = PBXGroup; children = ( - 9748BE1F28939B04006DF0BE /* FlipType.swift */, + 9778A49C2B7974E4001BF9E8 /* SweetBeanBunManArtView.swift */, + 9778A49E2B7A179F001BF9E8 /* SweetBeanBunManArtWork+Element.swift */, + 9778A4A02B7A17CD001BF9E8 /* SweetBeanBunManArtWork+CoverArt.swift */, ); - path = Enum; + path = SweetBeanBunMan; sourceTree = ""; }; - 9748BE212893B2CD006DF0BE /* WorldPeace */ = { + 9778A4A42B7A1FA6001BF9E8 /* ArtGallery */ = { isa = PBXGroup; children = ( - 9748BE222893B35A006DF0BE /* WorldPeace.swift */, - 9748BE282893BFE3006DF0BE /* Earth.swift */, - 97624C3B28C935F0004E1720 /* FiveCharactersView.swift */, - 9748BE1C289399CF006DF0BE /* SFAlphabet.swift */, - 971D9DE528C93E5900136A36 /* Entity */, + 97AD530B2B70DA2F0034FB5D /* ArtGalleryView.swift */, + 9778A4A22B7A1F87001BF9E8 /* ArtGalleryView+ArtWorkPath.swift */, ); - path = WorldPeace; + path = ArtGallery; sourceTree = ""; }; - 9748BE2A2893C406006DF0BE /* PartyAnimals */ = { + 97AD530D2B70DBC70034FB5D /* ArtisticWorldOfSFSymbols */ = { isa = PBXGroup; children = ( - 9748BE362893D064006DF0BE /* PartyAnimals.swift */, - 97624C3728C81E90004E1720 /* Animals */, + 9778A4A42B7A1FA6001BF9E8 /* ArtGallery */, + 97AD531B2B70E0A10034FB5D /* ArtWorks */, + 97AD530E2B70DDD10034FB5D /* Common */, + 97E11E412819727A00B2AB32 /* Extensions */, ); - path = PartyAnimals; + path = ArtisticWorldOfSFSymbols; sourceTree = ""; }; - 9748BE382893D079006DF0BE /* Animal */ = { + 97AD530E2B70DDD10034FB5D /* Common */ = { isa = PBXGroup; children = ( - 9748BE312893C91F006DF0BE /* AnimalEye.swift */, - 9748BE2D2893C688006DF0BE /* AnimalOutline.swift */, - 9748BE2F2893C706006DF0BE /* AnimalNose.swift */, - 9748BE3B2897AA28006DF0BE /* AnimalWhiskers.swift */, + 9748BE1E28939AE5006DF0BE /* Enums */, + 97AD53142B70DF8A0034FB5D /* Models */, + 97AD53132B70DF5A0034FB5D /* Views */, ); - path = Animal; + path = Common; sourceTree = ""; }; - 9748BE3D2897ADBD006DF0BE /* ArmHair */ = { + 97AD53132B70DF5A0034FB5D /* Views */ = { isa = PBXGroup; children = ( - 9748BE3E2897AE68006DF0BE /* ArmHair.swift */, - 9748BE402897CD6C006DF0BE /* Arm.swift */, - 9748BE4228980C4D006DF0BE /* Hair.swift */, + 97AD53252B70E4DA0034FB5D /* AnimatableSymbolView */, + 97AD53302B71A5130034FB5D /* GalleryGridView.swift */, + 97AD53232B70E48F0034FB5D /* PlayButton.swift */, ); - path = ArmHair; + path = Views; sourceTree = ""; }; - 9748BE4428980FE4006DF0BE /* DemonWrestler */ = { + 97AD53142B70DF8A0034FB5D /* Models */ = { isa = PBXGroup; children = ( - 9748BE4528981011006DF0BE /* DemonWrestler.swift */, - 97624C3428C74A41004E1720 /* Face */, - 97624C3528C74A50004E1720 /* Body */, + 97EF438E2B726D66003648F5 /* ArtWorkModel */, + 97AD53172B70DFF30034FB5D /* AnimationValues.swift */, + 9767DF0A2B75D1A100457DA1 /* SymbolArtElement.swift */, ); - path = DemonWrestler; + path = Models; sourceTree = ""; }; - 9748BE55289DCB82006DF0BE /* Fireworks */ = { + 97AD531B2B70E0A10034FB5D /* ArtWorks */ = { isa = PBXGroup; children = ( - 9748BE58289DCE17006DF0BE /* Fireworks.swift */, - 9748BE56289DCBB0006DF0BE /* LargeFirework.swift */, - 97624C2928C2BC9A004E1720 /* MediumFirework.swift */, - 97624C2E28C2E608004E1720 /* SmallFirework.swift */, - 9748BE5E289F194E006DF0BE /* RocketFirework.swift */, - 97624C2D28C2E43C004E1720 /* Buildings */, + 97EF43962B7332FB003648F5 /* Magician */, + 97EF439F2B74CA22003648F5 /* CrayonBoy */, + 9767DEF82B751C1300457DA1 /* WorldPeace */, + 9767DF012B759AFC00457DA1 /* PartyAnimals */, + 9767DF212B7658CB00457DA1 /* ArmHair */, + 9748BE4428980FE4006DF0BE /* DemonWrestler */, + 9778A4912B781DA6001BF9E8 /* Fireworks */, + 97AD531E2B70E2770034FB5D /* AfroBoy */, + 9778A49B2B7974A3001BF9E8 /* SweetBeanBunMan */, + 97EF43892B725DE7003648F5 /* Nosebleed */, + 97EF43912B72D3AF003648F5 /* ImWearingPants */, ); - path = Fireworks; + path = ArtWorks; sourceTree = ""; }; - 97624C2D28C2E43C004E1720 /* Buildings */ = { + 97AD531E2B70E2770034FB5D /* AfroBoy */ = { isa = PBXGroup; children = ( - 97624C2B28C2DDAA004E1720 /* Buildings.swift */, - 9748BE5C289DD696006DF0BE /* Building.swift */, + 97AD532A2B71068B0034FB5D /* AfroBoyArtView.swift */, + 9767DF0C2B75DDEC00457DA1 /* AfroBoyArtView+Element.swift */, + 97AD532C2B717C950034FB5D /* AfroBoyArtView+CoverArt.swift */, ); - path = Buildings; + path = AfroBoy; sourceTree = ""; }; - 97624C3428C74A41004E1720 /* Face */ = { + 97AD53252B70E4DA0034FB5D /* AnimatableSymbolView */ = { isa = PBXGroup; children = ( - 9748BE4728981096006DF0BE /* DemonWrestlerFace.swift */, - 9748BE4928995877006DF0BE /* DemonWrestlerOutline.swift */, + 97AD53212B70E3FA0034FB5D /* AnimatableSymbolView.swift */, + 9767DF0E2B75DFB400457DA1 /* SymbolArtDisplayView.swift */, + 97AD530F2B70DE230034FB5D /* SymbolNameFrameView.swift */, ); - path = Face; + path = AnimatableSymbolView; sourceTree = ""; }; - 97624C3528C74A50004E1720 /* Body */ = { + 97E11D432817381100B2AB32 = { isa = PBXGroup; children = ( - 9748BE4B28995A43006DF0BE /* DemonWrestlerBody.swift */, - 9748BE4F289AB439006DF0BE /* DemonWrestlerHand.swift */, + 97E11D4E2817381100B2AB32 /* SFSymbolsArtCollection */, + 97E11D4D2817381100B2AB32 /* Products */, ); - path = Body; sourceTree = ""; }; - 97624C3628C74AA0004E1720 /* ArtWorks */ = { + 97E11D4D2817381100B2AB32 /* Products */ = { isa = PBXGroup; children = ( - 9748BE6328A3936E006DF0BE /* ArtWorkView.swift */, - 9748BE6528A395D5006DF0BE /* ArtWork.swift */, - 9748BE55289DCB82006DF0BE /* Fireworks */, - 9748BE4428980FE4006DF0BE /* DemonWrestler */, - 9748BE3D2897ADBD006DF0BE /* ArmHair */, - 9748BE2A2893C406006DF0BE /* PartyAnimals */, - 9748BE212893B2CD006DF0BE /* WorldPeace */, - 9748BE16289338C9006DF0BE /* Magician */, - 97E11E402819720900B2AB32 /* CrayonBoy */, - 97CD46E528BEF8A000919B65 /* iOSDCJapan2022 */, + 97E11D4C2817381100B2AB32 /* SFSymbolsArtCollection.app */, ); - path = ArtWorks; + name = Products; sourceTree = ""; }; - 97624C3728C81E90004E1720 /* Animals */ = { + 97E11D4E2817381100B2AB32 /* SFSymbolsArtCollection */ = { isa = PBXGroup; children = ( - 9748BE342893CB67006DF0BE /* Lion.swift */, - 9748BE392893D0E3006DF0BE /* Frog.swift */, - 9748BE2B2893C428006DF0BE /* Bear.swift */, - 9748BE382893D079006DF0BE /* Animal */, + 9748BE62289F4BFB006DF0BE /* Info.plist */, + 97E11D4F2817381100B2AB32 /* SFSymbolsArtCollectionApp.swift */, + 97AD530D2B70DBC70034FB5D /* ArtisticWorldOfSFSymbols */, + 97E11D532817381200B2AB32 /* Assets.xcassets */, + 97E11D552817381200B2AB32 /* Preview Content */, ); - path = Animals; + path = SFSymbolsArtCollection; sourceTree = ""; }; - 97CD46E528BEF8A000919B65 /* iOSDCJapan2022 */ = { + 97E11D552817381200B2AB32 /* Preview Content */ = { isa = PBXGroup; children = ( - 97CD46E828BF080200919B65 /* iOSDCJapan2022Logo.swift */, - 97CD46E328BEF84100919B65 /* iOSDCJapan2022Symbol.swift */, - 971D9DEB28C973AD00136A36 /* Entity */, + 97E11D562817381200B2AB32 /* Preview Assets.xcassets */, ); - path = iOSDCJapan2022; + path = "Preview Content"; sourceTree = ""; }; - 97E11D432817381100B2AB32 = { + 97E11E412819727A00B2AB32 /* Extensions */ = { isa = PBXGroup; children = ( - 97E11D4E2817381100B2AB32 /* SFSymbolsArtCollection */, - 97E11D4D2817381100B2AB32 /* Products */, + 97EF439D2B744C4C003648F5 /* Color+.swift */, + 97624C3228C4F43F004E1720 /* GeometryProxy+.swift */, + 97AD53112B70DEB60034FB5D /* UIDevice+.swift */, + 97AD53192B70E0530034FB5D /* Font.Weight+.swift */, ); + path = Extensions; sourceTree = ""; }; - 97E11D4D2817381100B2AB32 /* Products */ = { + 97EF43892B725DE7003648F5 /* Nosebleed */ = { isa = PBXGroup; children = ( - 97E11D4C2817381100B2AB32 /* SFSymbolsArtCollection.app */, + 97EF438A2B725E02003648F5 /* NosebleedArtView.swift */, + 9767DF182B76032600457DA1 /* NosebleedArtView+Element.swift */, + 97EF438F2B72D2E4003648F5 /* NosebleedArtView+CoverArt.swift */, ); - name = Products; + path = Nosebleed; sourceTree = ""; }; - 97E11D4E2817381100B2AB32 /* SFSymbolsArtCollection */ = { + 97EF438E2B726D66003648F5 /* ArtWorkModel */ = { isa = PBXGroup; children = ( - 9748BE62289F4BFB006DF0BE /* Info.plist */, - 97E11D4F2817381100B2AB32 /* SFSymbolsArtCollectionApp.swift */, - 97E11D512817381100B2AB32 /* ContentView.swift */, - 97624C3628C74AA0004E1720 /* ArtWorks */, - 971D9DE628C93EB500136A36 /* Common */, - 97E11D532817381200B2AB32 /* Assets.xcassets */, - 97E11D552817381200B2AB32 /* Preview Content */, + 97AD53282B7100670034FB5D /* ArtWorkModel.swift */, + 97EF438C2B726CE6003648F5 /* ArtWorkModel+InitialSymbolRow.swift */, ); - path = SFSymbolsArtCollection; + path = ArtWorkModel; sourceTree = ""; }; - 97E11D552817381200B2AB32 /* Preview Content */ = { + 97EF43912B72D3AF003648F5 /* ImWearingPants */ = { isa = PBXGroup; children = ( - 97E11D562817381200B2AB32 /* Preview Assets.xcassets */, + 97EF43942B72DA69003648F5 /* ImWearingPantsArtView.swift */, + 97EF43922B72D3E2003648F5 /* ImWearingPantsArtView+CoverArt.swift */, + 9767DF1E2B762E9000457DA1 /* ImWearingPantsArtView+FaceElement.swift */, + 9767DF1A2B762DA000457DA1 /* ImWearingPantsArtView+FinishPoseElement.swift */, + 9767DF1C2B762E1200457DA1 /* ImWearingPantsArtView+Pose.swift */, ); - path = "Preview Content"; + path = ImWearingPants; sourceTree = ""; }; - 97E11E402819720900B2AB32 /* CrayonBoy */ = { + 97EF43962B7332FB003648F5 /* Magician */ = { isa = PBXGroup; children = ( - 97E11E452819734700B2AB32 /* CrayonBoy.swift */, - 97E11E31281971E200B2AB32 /* CrayonFace.swift */, - 97E11E30281971E100B2AB32 /* CrayonHair.swift */, - 97E11E32281971E200B2AB32 /* CrayonMouth.swift */, - 971D9DEC28C98BF900136A36 /* CrayonEye */, + 97EF43972B733337003648F5 /* MagicianArtView.swift */, + 9767DF102B75E8FC00457DA1 /* MagicianArtView+Element.swift */, + 97EF439B2B7421A7003648F5 /* MagicianArtView+CoverArt.swift */, ); - path = CrayonBoy; + path = Magician; sourceTree = ""; }; - 97E11E412819727A00B2AB32 /* Extensions */ = { + 97EF439F2B74CA22003648F5 /* CrayonBoy */ = { isa = PBXGroup; children = ( - 97E11E432819729B00B2AB32 /* Color+Extensions.swift */, - 97624C3228C4F43F004E1720 /* GeometryProxy+Extensions.swift */, + 97EF43A42B74F27D003648F5 /* CrayonBoyArtView.swift */, + 9767DF122B75EDB700457DA1 /* CrayonBoyArtView+Element.swift */, + 97EF43A02B74CA38003648F5 /* CrayonBoyArtView+CoverArt.swift */, ); - path = Extensions; + path = CrayonBoy; sourceTree = ""; }; /* End PBXGroup section */ @@ -412,7 +404,6 @@ ); name = SFSymbolsArtCollection; packageProductDependencies = ( - 97E11DEF28176A0D00B2AB32 /* SFUserFriendlySymbols */, ); productName = SFSymbolsArtCollection; productReference = 97E11D4C2817381100B2AB32 /* SFSymbolsArtCollection.app */; @@ -426,7 +417,7 @@ attributes = { BuildIndependentTargetsInParallel = 1; LastSwiftUpdateCheck = 1330; - LastUpgradeCheck = 1330; + LastUpgradeCheck = 1520; TargetAttributes = { 97E11D4B2817381100B2AB32 = { CreatedOnToolsVersion = 13.3; @@ -443,7 +434,6 @@ ); mainGroup = 97E11D432817381100B2AB32; packageReferences = ( - 97E11DEE28176A0D00B2AB32 /* XCRemoteSwiftPackageReference "SFUserFriendlySymbols" */, ); productRefGroup = 97E11D4D2817381100B2AB32 /* Products */; projectDirPath = ""; @@ -471,60 +461,58 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 97624C2F28C2E608004E1720 /* SmallFirework.swift in Sources */, - 9748BE232893B35A006DF0BE /* WorldPeace.swift in Sources */, - 9748BE57289DCBB0006DF0BE /* LargeFirework.swift in Sources */, - 9748BE4828981096006DF0BE /* DemonWrestlerFace.swift in Sources */, - 9748BE372893D064006DF0BE /* PartyAnimals.swift in Sources */, - 971D9DEA28C9731D00136A36 /* iOSDCJapan2022SymbolType.swift in Sources */, - 971D9DE828C9497D00136A36 /* MagicianSunGlasses.swift in Sources */, - 97624C3E28C93693004E1720 /* CharactersType.swift in Sources */, - 97624C2A28C2BC9A004E1720 /* MediumFirework.swift in Sources */, - 97E11E33281971E200B2AB32 /* CrayonHair.swift in Sources */, - 97624C3A28C82DBB004E1720 /* CharacterAppearance.swift in Sources */, - 9748BE3A2893D0E3006DF0BE /* Frog.swift in Sources */, - 97CD46E928BF080300919B65 /* iOSDCJapan2022Logo.swift in Sources */, + 9767DF192B76032600457DA1 /* NosebleedArtView+Element.swift in Sources */, + 9767DF172B75FF0700457DA1 /* PartyAnimalsArtView+Element.swift in Sources */, + 9767DF0D2B75DDEC00457DA1 /* AfroBoyArtView+Element.swift in Sources */, + 97EF43932B72D3E2003648F5 /* ImWearingPantsArtView+CoverArt.swift in Sources */, + 9778A4952B78C076001BF9E8 /* FireworksArtView+Element.swift in Sources */, + 97EF439E2B744C4C003648F5 /* Color+.swift in Sources */, + 9767DF2B2B776D5800457DA1 /* DemonWrestlerArtView+CoverArt.swift in Sources */, + 9767DF2D2B776DA100457DA1 /* DemonWrestlerArtView+Element.swift in Sources */, + 9767DF002B752E4700457DA1 /* WorldPeaceArtView.swift in Sources */, + 9778A4A12B7A17CD001BF9E8 /* SweetBeanBunManArtWork+CoverArt.swift in Sources */, + 9767DF132B75EDB700457DA1 /* CrayonBoyArtView+Element.swift in Sources */, + 97AD532D2B717C950034FB5D /* AfroBoyArtView+CoverArt.swift in Sources */, + 9778A49F2B7A179F001BF9E8 /* SweetBeanBunManArtWork+Element.swift in Sources */, + 97EF438B2B725E02003648F5 /* NosebleedArtView.swift in Sources */, + 9778A4932B781DCE001BF9E8 /* FireworksArtView.swift in Sources */, + 97AD53182B70DFF30034FB5D /* AnimationValues.swift in Sources */, + 9767DF152B75F7BE00457DA1 /* WorldPeaceArtView+Element.swift in Sources */, + 97EF43982B733337003648F5 /* MagicianArtView.swift in Sources */, + 9767DEFA2B751C2C00457DA1 /* WorldPeaceArtView+CoverArt.swift in Sources */, + 97AD53242B70E48F0034FB5D /* PlayButton.swift in Sources */, 9748BE2028939B04006DF0BE /* FlipType.swift in Sources */, - 9748BE15289338A3006DF0BE /* Magician.swift in Sources */, - 9748BE3C2897AA28006DF0BE /* AnimalWhiskers.swift in Sources */, - 97E11E35281971E200B2AB32 /* CrayonMouth.swift in Sources */, - 9748BE6428A3936E006DF0BE /* ArtWorkView.swift in Sources */, - 97E11E3D281971ED00B2AB32 /* CrayonEyelid.swift in Sources */, - 97624C3C28C935F0004E1720 /* FiveCharactersView.swift in Sources */, - 9748BE292893BFE3006DF0BE /* Earth.swift in Sources */, - 97E11E3E281971ED00B2AB32 /* CrayonEyebrow.swift in Sources */, - 9748BE5F289F194E006DF0BE /* RocketFirework.swift in Sources */, - 9748BE2E2893C688006DF0BE /* AnimalOutline.swift in Sources */, - 9748BE322893C91F006DF0BE /* AnimalEye.swift in Sources */, - 9748BE59289DCE17006DF0BE /* Fireworks.swift in Sources */, - 97E11E3C281971ED00B2AB32 /* CrayonEye.swift in Sources */, - 9748BE5D289DD696006DF0BE /* Building.swift in Sources */, - 9748BE1D289399CF006DF0BE /* SFAlphabet.swift in Sources */, - 9748BE6628A395D5006DF0BE /* ArtWork.swift in Sources */, - 973B2CA128C2546C006ED5F0 /* ArrangeShapeWithFont.swift in Sources */, - 9748BE3F2897AE68006DF0BE /* ArmHair.swift in Sources */, - 97E11D522817381100B2AB32 /* ContentView.swift in Sources */, - 9748BE412897CD6C006DF0BE /* Arm.swift in Sources */, - 9748BE4328980C4D006DF0BE /* Hair.swift in Sources */, - 97624C3328C4F43F004E1720 /* GeometryProxy+Extensions.swift in Sources */, - 9748BE1828933E40006DF0BE /* MagicianHat.swift in Sources */, - 9748BE50289AB439006DF0BE /* DemonWrestlerHand.swift in Sources */, - 97E11E3F281971ED00B2AB32 /* CrayonEyeBall.swift in Sources */, - 9748BE2C2893C428006DF0BE /* Bear.swift in Sources */, - 973B2CA428C25DAA006ED5F0 /* ArrangeShapeWithWidthAndHeight.swift in Sources */, - 97E11E462819734700B2AB32 /* CrayonBoy.swift in Sources */, - 97E11E3B281971ED00B2AB32 /* CrayonEyes.swift in Sources */, - 9748BE352893CB67006DF0BE /* Lion.swift in Sources */, - 97624C2C28C2DDAA004E1720 /* Buildings.swift in Sources */, - 97CD46E428BEF84100919B65 /* iOSDCJapan2022Symbol.swift in Sources */, - 97E11E442819729B00B2AB32 /* Color+Extensions.swift in Sources */, - 9748BE4A28995877006DF0BE /* DemonWrestlerOutline.swift in Sources */, - 97E11E34281971E200B2AB32 /* CrayonFace.swift in Sources */, - 9748BE4C28995A43006DF0BE /* DemonWrestlerBody.swift in Sources */, + 97AD531A2B70E0530034FB5D /* Font.Weight+.swift in Sources */, + 97AD53122B70DEB60034FB5D /* UIDevice+.swift in Sources */, + 97AD53312B71A5130034FB5D /* GalleryGridView.swift in Sources */, + 97AD530C2B70DA2F0034FB5D /* ArtGalleryView.swift in Sources */, + 9778A4972B78C0C2001BF9E8 /* FireworksArtView+CoverArt.swift in Sources */, + 9767DF272B76CCE300457DA1 /* ArmHairArtView+Element.swift in Sources */, + 9767DF292B76FF0400457DA1 /* DemonWrestlerArtView.swift in Sources */, + 97AD532B2B71068B0034FB5D /* AfroBoyArtView.swift in Sources */, + 97624C3328C4F43F004E1720 /* GeometryProxy+.swift in Sources */, + 97EF43952B72DA69003648F5 /* ImWearingPantsArtView.swift in Sources */, + 9767DF232B7658E200457DA1 /* ArmHairArtView+CoverArt.swift in Sources */, + 9767DF1D2B762E1200457DA1 /* ImWearingPantsArtView+Pose.swift in Sources */, + 97AD53292B7100670034FB5D /* ArtWorkModel.swift in Sources */, + 97EF439C2B7421A7003648F5 /* MagicianArtView+CoverArt.swift in Sources */, + 97EF438D2B726CE6003648F5 /* ArtWorkModel+InitialSymbolRow.swift in Sources */, + 9767DF1B2B762DA000457DA1 /* ImWearingPantsArtView+FinishPoseElement.swift in Sources */, + 97EF43A52B74F27D003648F5 /* CrayonBoyArtView.swift in Sources */, + 9767DF052B75AFE200457DA1 /* PartyAnimalsArtView.swift in Sources */, + 9767DF1F2B762E9000457DA1 /* ImWearingPantsArtView+FaceElement.swift in Sources */, + 97AD53222B70E3FA0034FB5D /* AnimatableSymbolView.swift in Sources */, + 9767DF032B759B2D00457DA1 /* PartyAnimalsArtView+CoverArt.swift in Sources */, + 9767DF0B2B75D1A100457DA1 /* SymbolArtElement.swift in Sources */, + 97EF43A12B74CA38003648F5 /* CrayonBoyArtView+CoverArt.swift in Sources */, + 97EF43902B72D2E4003648F5 /* NosebleedArtView+CoverArt.swift in Sources */, + 9767DF112B75E8FC00457DA1 /* MagicianArtView+Element.swift in Sources */, + 9778A4A32B7A1F87001BF9E8 /* ArtGalleryView+ArtWorkPath.swift in Sources */, + 9767DF0F2B75DFB400457DA1 /* SymbolArtDisplayView.swift in Sources */, + 9778A49D2B7974E4001BF9E8 /* SweetBeanBunManArtView.swift in Sources */, + 9767DF252B76C9BE00457DA1 /* ArmHairArtView.swift in Sources */, 97E11D502817381100B2AB32 /* SFSymbolsArtCollectionApp.swift in Sources */, - 9748BE1A289341BE006DF0BE /* MagicianFace.swift in Sources */, - 9748BE4628981011006DF0BE /* DemonWrestler.swift in Sources */, - 9748BE302893C706006DF0BE /* AnimalNose.swift in Sources */, + 97AD53102B70DE230034FB5D /* SymbolNameFrameView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -535,6 +523,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; @@ -567,6 +556,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -581,7 +571,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.4; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -595,6 +585,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; @@ -627,6 +618,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -635,7 +627,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.4; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; @@ -651,24 +643,24 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_ASSET_PATHS = "\"SFSymbolsArtCollection/Preview Content\""; DEVELOPMENT_TEAM = 2V4975L824; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = SFSymbolsArtCollection/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "Art collection"; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UIStatusBarHidden = YES; - INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = UIInterfaceOrientationPortrait; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.1.2; + MARKETING_VERSION = 2.0.0; PRODUCT_BUNDLE_IDENTIFIER = jp.co.hotmail.lilossa.SFSymbolsArtCollection; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; @@ -683,24 +675,24 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_ASSET_PATHS = "\"SFSymbolsArtCollection/Preview Content\""; DEVELOPMENT_TEAM = 2V4975L824; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = SFSymbolsArtCollection/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "Art collection"; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UIStatusBarHidden = YES; - INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = UIInterfaceOrientationPortrait; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.1.2; + MARKETING_VERSION = 2.0.0; PRODUCT_BUNDLE_IDENTIFIER = jp.co.hotmail.lilossa.SFSymbolsArtCollection; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; @@ -731,25 +723,6 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ - -/* Begin XCRemoteSwiftPackageReference section */ - 97E11DEE28176A0D00B2AB32 /* XCRemoteSwiftPackageReference "SFUserFriendlySymbols" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/littleossa/SFUserFriendlySymbols.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 0.4.0; - }; - }; -/* End XCRemoteSwiftPackageReference section */ - -/* Begin XCSwiftPackageProductDependency section */ - 97E11DEF28176A0D00B2AB32 /* SFUserFriendlySymbols */ = { - isa = XCSwiftPackageProductDependency; - package = 97E11DEE28176A0D00B2AB32 /* XCRemoteSwiftPackageReference "SFUserFriendlySymbols" */; - productName = SFUserFriendlySymbols; - }; -/* End XCSwiftPackageProductDependency section */ }; rootObject = 97E11D442817381100B2AB32 /* Project object */; } diff --git a/SFSymbolsArtCollection.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/SFSymbolsArtCollection.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved deleted file mode 100644 index 4b6b578..0000000 --- a/SFSymbolsArtCollection.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ /dev/null @@ -1,14 +0,0 @@ -{ - "pins" : [ - { - "identity" : "sfuserfriendlysymbols", - "kind" : "remoteSourceControl", - "location" : "https://github.com/littleossa/SFUserFriendlySymbols.git", - "state" : { - "revision" : "9d003e1c818de1dbe34a36b197ce11d9524a54d9", - "version" : "0.4.0" - } - } - ], - "version" : 2 -} diff --git a/SFSymbolsArtCollection/ArtWorks/ArmHair/Arm.swift b/SFSymbolsArtCollection/ArtWorks/ArmHair/Arm.swift deleted file mode 100644 index c9887cd..0000000 --- a/SFSymbolsArtCollection/ArtWorks/ArmHair/Arm.swift +++ /dev/null @@ -1,61 +0,0 @@ -// -// Arm.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/08/01. -// - -import SwiftUI - -struct Arm: View { - - let baseLength: CGFloat - let skinColor: Color = .paleOrange - - var body: some View { - HStack(spacing: 0) { - - // Arm - ZStack { - Image(symbol: .rectangleFill) - .arrangeShape(color: skinColor, - width: baseLength * 0.5, - height: baseLength * 0.125, - fontWeight: .light) - - Image(symbol: .rectangle) - .arrangeShape(width: baseLength * 0.5, - height: baseLength * 0.125, - fontWeight: .thin) - } - - ZStack { - - // Hand - ZStack { - Image(symbol: .handRaisedFill) - .arrangeShape(color: skinColor, - fontSize: baseLength * 0.225, - rotationDegrees: -90) - - Image(symbol: .handRaised) - .arrangeShape(fontSize: baseLength * 0.25, - fontWeight: .light, - rotationDegrees: -90) - } - .offset(x: -20, y: 5) - - Image(symbol: .rectangleFill) - .arrangeShape(color: skinColor, - fontSize: baseLength * 0.1, - offsetX: baseLength * -0.125) - } - } - } -} - -struct Arm_Previews: PreviewProvider { - static var previews: some View { - Arm(baseLength: 400) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/ArmHair/ArmHair.swift b/SFSymbolsArtCollection/ArtWorks/ArmHair/ArmHair.swift deleted file mode 100644 index 92adcfe..0000000 --- a/SFSymbolsArtCollection/ArtWorks/ArmHair/ArmHair.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// ArmHair.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/08/01. -// - -import SwiftUI - -struct ArmHair: View { - - var body: some View { - - GeometryReader { proxy in - - let baseLength = proxy.baseLength - - let lowestX = Int(baseLength * -0.35) - let highestX = Int(baseLength * 0.1) - let lowestY = Int(baseLength * -0.075) - let highestY = Int(baseLength * 0.02) - - ZStack { - Arm(baseLength: baseLength) - - ForEach(0..<250) { _ in - Hair(baseLength: baseLength) - .offset(x: CGFloat(Int.random(in: lowestX...highestX)), - y: CGFloat(Int.random(in: lowestY...highestY))) - } - } - .position(proxy.localCenter) - } - } -} - -struct ArmHair_Previews: PreviewProvider { - static var previews: some View { - ArmHair() - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/ArmHair/Hair.swift b/SFSymbolsArtCollection/ArtWorks/ArmHair/Hair.swift deleted file mode 100644 index 37d14d6..0000000 --- a/SFSymbolsArtCollection/ArtWorks/ArmHair/Hair.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// Hair.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/08/01. -// - -import SwiftUI - -struct Hair: View { - - let baseLength: CGFloat - - var body: some View { - - Image(symbol: .alternatingcurrent) - .arrangeShape(fontSize: baseLength * 0.0825, - fontWeight: .thin, - rotationDegrees: 100) - } -} - -struct Hair_Previews: PreviewProvider { - static var previews: some View { - Hair(baseLength: 400) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/ArtWork.swift b/SFSymbolsArtCollection/ArtWorks/ArtWork.swift deleted file mode 100644 index 54dc1ab..0000000 --- a/SFSymbolsArtCollection/ArtWorks/ArtWork.swift +++ /dev/null @@ -1,39 +0,0 @@ -// -// ArtWork.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/08/10. -// - -import Foundation - -enum ArtWork: Identifiable, CaseIterable { - case crayonBoy - case magician - case worldPeace - case partyAnimals - case armHair - case demonWrestler - case fireworks - - var title: String { - switch self { - case .crayonBoy: - return "Crayon Boy" - case .magician: - return "Magician" - case .worldPeace: - return "WORLD PEACE" - case .partyAnimals: - return "Party Animals" - case .armHair: - return "Arm Hair" - case .demonWrestler: - return "Demon Wrestler" - case .fireworks: - return "Fireworks" - } - } - - var id: String { self.title } -} diff --git a/SFSymbolsArtCollection/ArtWorks/ArtWorkView.swift b/SFSymbolsArtCollection/ArtWorks/ArtWorkView.swift deleted file mode 100644 index 472def3..0000000 --- a/SFSymbolsArtCollection/ArtWorks/ArtWorkView.swift +++ /dev/null @@ -1,39 +0,0 @@ -// -// ArtWorkView.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/08/10. -// - -import SwiftUI - -struct ArtWorkView: View { - - @Binding var artwork: ArtWork - - var body: some View { - - switch artwork { - case .crayonBoy: - CrayonBoy() - case .magician: - Magician() - case .worldPeace: - WorldPeace() - case .partyAnimals: - PartyAnimals() - case .armHair: - ArmHair() - case .demonWrestler: - DemonWrestler() - case .fireworks: - Fireworks() - } - } -} - -struct ArtWorkView_Previews: PreviewProvider { - static var previews: some View { - ArtWorkView(artwork: .constant(.crayonBoy)) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonBoy.swift b/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonBoy.swift deleted file mode 100644 index 29e5b06..0000000 --- a/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonBoy.swift +++ /dev/null @@ -1,56 +0,0 @@ -// -// CrayonBoy.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/04/27. -// - -import SwiftUI - -struct CrayonBoy: View { - - var body: some View { - - GeometryReader { proxy in - - let baseLength = proxy.baseLength - - ZStack { - CrayonFace(faceType: .fill, - baseLength: baseLength) - - CrayonHair(baseLength: baseLength) - .offset(x: baseLength * 0.025, - y: baseLength * -0.125) - - Group { - CrayonEye(baseLength: baseLength) - .offset(x: baseLength * -0.0625, - y: 0) - - CrayonEye(baseLength: baseLength) - .offset(x: baseLength * 0.125, - y: 0) - - } - .rotationEffect(.radians(0.1)) - - CrayonFace(faceType: .line, - baseLength: baseLength) - - - CrayonMouth(baseLength: baseLength) - .offset(x: baseLength * -0.075, - y: baseLength * 0.225) - - } - .position(proxy.localCenter) - } - } -} - -struct CrayonBoy_Previews: PreviewProvider { - static var previews: some View { - CrayonBoy() - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonEye/CrayonEye.swift b/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonEye/CrayonEye.swift deleted file mode 100644 index 9b1fe80..0000000 --- a/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonEye/CrayonEye.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// CrayonEye.swift -// CrayonShinchan -// -// Created by 平岡修 on 2022/02/23. -// - -import SwiftUI - -struct CrayonEye: View { - - let baseLength: CGFloat - - var body: some View { - - ZStack { - CrayonEyebrow(baseLength: baseLength) - .offset(x: 0, - y: baseLength * -0.125) - - CrayonEyelid(baseLength: baseLength) - - CrayonEyeBall(baseLength: baseLength) - .offset(x: baseLength * -0.0075, - y: baseLength * 0.025) - } - } -} - -struct CrayonEye_Previews: PreviewProvider { - static var previews: some View { - CrayonEye(baseLength: 400) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonEye/CrayonEyeBall.swift b/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonEye/CrayonEyeBall.swift deleted file mode 100644 index bc65387..0000000 --- a/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonEye/CrayonEyeBall.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// CrayonEyeBall.swift -// CrayonShinchan -// -// Created by 平岡修 on 2022/02/23. -// - -import SwiftUI - -struct CrayonEyeBall: View { - - let baseLength: CGFloat - - var body: some View { - ZStack { - - Image(symbol: .circleFill) - .arrangeShape(fontSize: baseLength * 0.125) - - Image(symbol: .circleFill) - .arrangeShape(color: .white, - fontSize: baseLength * 0.05) - } - } -} - -struct CrayonEyeBall_Previews: PreviewProvider { - static var previews: some View { - CrayonEyeBall(baseLength: 400) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonEye/CrayonEyebrow.swift b/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonEye/CrayonEyebrow.swift deleted file mode 100644 index b07d5c8..0000000 --- a/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonEye/CrayonEyebrow.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// CrayonEyebrow.swift -// CrayonShinchan -// -// Created by 平岡修 on 2022/02/23. -// - -import SwiftUI - -struct CrayonEyebrow: View { - - let baseLength: CGFloat - - var body: some View { - - Image(symbol: .control) - .arrangeShape(fontSize: baseLength * 0.2, - fontWeight: .black) - } -} - -struct CrayonEyebrow_Previews: PreviewProvider { - static var previews: some View { - CrayonEyebrow(baseLength: 400) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonEye/CrayonEyelid.swift b/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonEye/CrayonEyelid.swift deleted file mode 100644 index d1d0a84..0000000 --- a/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonEye/CrayonEyelid.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// CrayonEyelid.swift -// CrayonShinchan -// -// Created by 平岡修 on 2022/02/23. -// - -import SwiftUI - -struct CrayonEyelid: View { - - let baseLength: CGFloat - - var body: some View { - - ZStack { - Image(symbol: .circle) - .arrangeShape(fontSize: baseLength * 0.15, - fontWeight: .ultraLight) - - Image(symbol: .rectangleFill) - .arrangeShape(color: .paleOrange, - fontSize: baseLength * 0.15, - fontWeight: .ultraLight, - offsetY: baseLength * 0.05) - } - } -} - -struct CrayonEyelid_Previews: PreviewProvider { - static var previews: some View { - CrayonEyelid(baseLength: 400) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonEye/CrayonEyes.swift b/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonEye/CrayonEyes.swift deleted file mode 100644 index e9fa169..0000000 --- a/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonEye/CrayonEyes.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// CrayonEyes.swift -// CrayonShinchan -// -// Created by 平岡修 on 2022/02/23. -// - -import SwiftUI - -struct CrayonEyes: View { - - let baseLength: CGFloat - - var body: some View { - HStack(spacing: 0) { - Spacer() - - CrayonEye(baseLength: baseLength) - - CrayonEye(baseLength: baseLength) - - Spacer() - } - .rotationEffect(.radians(0.1)) - } -} - -struct CrayonEyes_Previews: PreviewProvider { - static var previews: some View { - CrayonEyes(baseLength: 400) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonFace.swift b/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonFace.swift deleted file mode 100644 index 1c0f37e..0000000 --- a/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonFace.swift +++ /dev/null @@ -1,61 +0,0 @@ -// -// CrayonFace.swift -// CrayonShinchan -// -// Created by littleossa on 2022/02/23. -// - -import SwiftUI -import SFUserFriendlySymbols - -struct CrayonFace: View { - - enum FaceType: String { - case line - case fill - - var symbol: SFSymbols { - switch self { - case .line: - return .cloud - case .fill: - return .cloudFill - } - } - - var color: Color { - switch self { - case .line: - return .black - case .fill: - return .paleOrange - } - } - } - - let faceType: FaceType - let baseLength: CGFloat - - var body: some View { - - Image(symbol: faceType.symbol) - .arrangeShape(color: faceType.color, - width: baseLength * 0.75, - height: baseLength * 0.5, - fontWeight: .ultraLight, - flipType: .horizontal, - rotationDegrees: 8) - } -} - -struct CrayonFace_Previews: PreviewProvider { - static var previews: some View { - - ZStack { - CrayonFace(faceType: .fill, - baseLength: 400) - CrayonFace(faceType: .line, - baseLength: 400) - } - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonHair.swift b/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonHair.swift deleted file mode 100644 index 722c9c7..0000000 --- a/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonHair.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// CrayonHair.swift -// CrayonShinchan -// -// Created by 平岡修 on 2022/02/23. -// - -import SwiftUI - -struct CrayonHair: View { - - let baseLength: CGFloat - - var body: some View { - ZStack { - Image(symbol: .circleFill) - .arrangeShape(width: baseLength * 0.375, - height: baseLength * 0.25) - - Image(symbol: .rectangleFill) - .arrangeShape(color: .paleOrange, - width: baseLength * 0.375, - height: baseLength * 0.25, - offsetY: baseLength * 0.075) - } - } -} - -struct CrayonHair_Previews: PreviewProvider { - static var previews: some View { - CrayonHair(baseLength: 400) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonMouth.swift b/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonMouth.swift deleted file mode 100644 index 3f5bcb9..0000000 --- a/SFSymbolsArtCollection/ArtWorks/CrayonBoy/CrayonMouth.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// CrayonMouse.swift -// CrayonShinchan -// -// Created by 平岡修 on 2022/02/23. -// - -import SwiftUI - -struct CrayonMouth: View { - - let baseLength: CGFloat - - var body: some View { - - ZStack { - Image(symbol: .capsulePortraitFill) - .arrangeShape(color: .red, - width: baseLength * 0.105, - height: baseLength * 0.15, fontWeight: .ultraLight) - - Image(symbol: .capsulePortrait) - .arrangeShape(width: baseLength * 0.105, - height: baseLength * 0.15, fontWeight: .ultraLight) - } - .rotationEffect(.degrees(10)) - } -} - -struct CrayonMouth_Previews: PreviewProvider { - static var previews: some View { - CrayonMouth(baseLength: 400) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/DemonWrestler/Body/DemonWrestlerBody.swift b/SFSymbolsArtCollection/ArtWorks/DemonWrestler/Body/DemonWrestlerBody.swift deleted file mode 100644 index fc3e014..0000000 --- a/SFSymbolsArtCollection/ArtWorks/DemonWrestler/Body/DemonWrestlerBody.swift +++ /dev/null @@ -1,87 +0,0 @@ -// -// ElectricMagneticWaveManBody.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/08/02. -// - -import SwiftUI - -struct DemonWrestlerBody: View { - - let baseLength: CGFloat - let skinColor: Color = .paleOrange - - var body: some View { - ZStack { - - Image(symbol: .figureWave) - .arrangeShape(color: skinColor, - fontSize: baseLength * 0.825) - - Image(symbol: .powerplugFill) - .arrangeShape(color: skinColor, - fontSize: baseLength * 0.1875, - fontWeight: .bold, - rotationDegrees: -90, - offsetX: baseLength * 0.0275, - offsetY: baseLength * -0.19) - - Image(symbol: .locationFill) - .arrangeShape(fontSize: baseLength * 0.125, - rotationDegrees: -132, - offsetX: baseLength * 0.02, - offsetY: baseLength * 0.04) - - Group { - Image(symbol: .minus) - .arrangeShape(fontSize: baseLength * 0.15, - fontWeight: .bold, - rotationDegrees: 70, - offsetX: baseLength * 0.065, - offsetY: baseLength * -0.025) - - Image(symbol: .minus) - .arrangeShape(fontSize: baseLength * 0.15, - fontWeight: .bold, - rotationDegrees: 75, - offsetX: baseLength * 0.096, - offsetY: baseLength * -0.125) - - Image(symbol: .minus) - .arrangeShape(fontSize: baseLength * 0.1025, - fontWeight: .black, - rotationDegrees: 80, - offsetX: baseLength * 0.1143, - offsetY: baseLength * -0.2) - - Image(symbol: .minus) - .arrangeShape(fontSize: baseLength * 0.15, - fontWeight: .bold, - rotationDegrees: -70, - offsetX: baseLength * -0.0225, - offsetY: baseLength * -0.025) - - Image(symbol: .minus) - .arrangeShape(fontSize: baseLength * 0.15, - fontWeight: .bold, - rotationDegrees: -75, - offsetX: baseLength * -0.0525, - offsetY: baseLength * -0.125) - - Image(symbol: .minus) - .arrangeShape(fontSize: baseLength * 0.1025, - fontWeight: .black, - rotationDegrees: -80, - offsetX: baseLength * -0.07, - offsetY: baseLength * -0.2) - } - } - } -} - -struct DemonWrestlerBody_Previews: PreviewProvider { - static var previews: some View { - DemonWrestlerBody(baseLength: 400) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/DemonWrestler/Body/DemonWrestlerHand.swift b/SFSymbolsArtCollection/ArtWorks/DemonWrestler/Body/DemonWrestlerHand.swift deleted file mode 100644 index e252105..0000000 --- a/SFSymbolsArtCollection/ArtWorks/DemonWrestler/Body/DemonWrestlerHand.swift +++ /dev/null @@ -1,62 +0,0 @@ -// -// ElectricMagneticWaveLeftHand.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/08/03. -// - -import SwiftUI - -struct DemonWrestlerHand: View { - - enum HandType { - case left - case right - - var appearance: HandAppearance { - switch self { - case .left: - return HandAppearance(coneFlipType: .vertical, - handFlipType: .horizontalAndVertical, - offsetYMagnification: 0.0875) - case .right: - return HandAppearance(coneFlipType: .none, - handFlipType: .none, - offsetYMagnification: -0.0875) - } - } - - struct HandAppearance { - let coneFlipType: FlipType - let handFlipType: FlipType - let offsetYMagnification: CGFloat - } - } - - let type: HandType - let baseLength: CGFloat - - var body: some View { - ZStack { - Image(symbol: .coneFill) - .arrangeShape(width: baseLength * 0.1125, - height: baseLength * 0.2, - flipType: type.appearance.coneFlipType) - - Image(symbol: .handRaisedFill) - .arrangeShape(fontSize: baseLength * 0.1375, - flipType: type.appearance.handFlipType, - offsetY: baseLength * type.appearance.offsetYMagnification) - } - } -} - -struct DemonWrestlerHand_Previews: PreviewProvider { - static var previews: some View { - DemonWrestlerHand(type: .left, - baseLength: 400) - - DemonWrestlerHand(type: .right, - baseLength: 400) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/DemonWrestler/DemonWrestler.swift b/SFSymbolsArtCollection/ArtWorks/DemonWrestler/DemonWrestler.swift deleted file mode 100644 index 1fd2a17..0000000 --- a/SFSymbolsArtCollection/ArtWorks/DemonWrestler/DemonWrestler.swift +++ /dev/null @@ -1,44 +0,0 @@ -// -// ElectroMagneticWaveMan.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/08/01. -// - -import SwiftUI -import SFUserFriendlySymbols - -struct DemonWrestler: View { - - var body: some View { - - GeometryReader { proxy in - let baseLength = proxy.baseLength * 1.2 - - ZStack { - DemonWrestlerBody(baseLength: baseLength) - - DemonWrestlerHand(type: .left, - baseLength: baseLength) - .offset(x: baseLength * 0.19, - y: baseLength * 0.14) - - DemonWrestlerFace(baseLength: baseLength) - .offset(x: baseLength * 0.025, - y: baseLength * -0.325) - - DemonWrestlerHand(type: .right, - baseLength: baseLength) - .offset(x: baseLength * -0.1875, - y: baseLength * -0.465) - } - .position(proxy.localCenter) - } - } -} - -struct DemonWrestler_Previews: PreviewProvider { - static var previews: some View { - DemonWrestler() - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/DemonWrestler/Face/DemonWrestlerFace.swift b/SFSymbolsArtCollection/ArtWorks/DemonWrestler/Face/DemonWrestlerFace.swift deleted file mode 100644 index 6c6ce09..0000000 --- a/SFSymbolsArtCollection/ArtWorks/DemonWrestler/Face/DemonWrestlerFace.swift +++ /dev/null @@ -1,70 +0,0 @@ -// -// ElectroMagneticWaveManFace.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/08/01. -// - -import SwiftUI -import SFUserFriendlySymbols - -struct DemonWrestlerFace: View { - - let baseLength: CGFloat - - var body: some View { - ZStack { - DemonWrestlerOutline(baseLength: baseLength) - - VStack(spacing: 1) { - HStack(spacing: 5) { - - ForEach(0..<2) { _ in - ZStack { - Image(symbol: .capsuleFill) - .arrangeShape(color: .indigo, - fontSize: baseLength * 0.033, - offsetY: baseLength * 0.005) - - Image(symbol: .eye) - .arrangeShape(fontSize: baseLength * 0.035) - - Image(symbol: .eyeFill) - .arrangeShape(color: .white, - fontSize: baseLength * 0.031) - } - } - } - - Image(symbol: .nose) - .arrangeShape(fontSize: baseLength * 0.05, - fontWeight: .thin) - - Spacer() - .frame(height: 8) - - ZStack { - Image(symbol: .mouth) - .arrangeShape(fontSize: baseLength * 0.05, - fontWeight: .bold) - - Image(symbol: .mouthFill) - .arrangeShape(color: .red, - fontSize: baseLength * 0.05) - } - } - - Image(symbol: .waveformPath) - .arrangeShape(color: .red, - fontSize: 20, - rotationDegrees: 45, - offsetX: 25) - } - } -} - -struct DemonWrestlerFace_Previews: PreviewProvider { - static var previews: some View { - DemonWrestlerFace(baseLength: 400) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/DemonWrestler/Face/DemonWrestlerOutline.swift b/SFSymbolsArtCollection/ArtWorks/DemonWrestler/Face/DemonWrestlerOutline.swift deleted file mode 100644 index 50c7774..0000000 --- a/SFSymbolsArtCollection/ArtWorks/DemonWrestler/Face/DemonWrestlerOutline.swift +++ /dev/null @@ -1,93 +0,0 @@ -// -// ElectroMagneticWaveOutline.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/08/02. -// - -import SwiftUI - -struct DemonWrestlerOutline: View { - - let baseLength: CGFloat - - var body: some View { - ZStack { - - // Hat - Group { - - // horns - Group { - Image(symbol: .boltHorizontalFill) - .arrangeShape(color: .red, - fontSize: baseLength * 0.2, - rotationDegrees: 55, - offsetX: baseLength * 0.15, - offsetY: baseLength * -0.2) - - Image(symbol: .boltHorizontal) - .arrangeShape(fontSize: baseLength * 0.25, - fontWeight: .light, - rotationDegrees: 55, - offsetX: baseLength * 0.14, - offsetY: baseLength * -0.19) - - Image(symbol: .boltHorizontalFill) - .arrangeShape(color: .red, - fontSize: baseLength * 0.2, - flipType: .vertical, - rotationDegrees: -55, - offsetX: baseLength * -0.15, - offsetY: baseLength * -0.2) - - Image(symbol: .boltHorizontal) - .arrangeShape(fontSize: baseLength * 0.25, - fontWeight: .light, - flipType: .vertical, - rotationDegrees: -55, - offsetX: baseLength * -0.14, - offsetY: baseLength * -0.19) - } - - Image(symbol: .shieldFill) - .arrangeShape(fontSize: baseLength * 0.375, - flipType: .vertical, - offsetY: baseLength * -0.1) - - ZStack { - Image(symbol: .circleFill) - .arrangeShape(color: .red, - fontSize: baseLength * 0.1, - fontWeight: .bold) - - Image(symbol: ._4AltCircleFill) - .arrangeShape(fontSize: baseLength * 0.15, - fontWeight: .bold) - } - .offset(x: 0, y: baseLength * -0.175) - } - - ZStack { - Image(symbol: .capsulePortrait) - .arrangeShape(fontSize: baseLength * 0.2025, - fontWeight: .light) - - Image(symbol: .capsulePortraitFill) - .arrangeShape(color: .paleOrange, - fontSize: baseLength * 0.2) - } - - Image(symbol: .chevronCompactDown) - .arrangeShape(fontSize: baseLength * 0.2, - fontWeight: .bold, - offsetY: baseLength * -0.1175) - } - } -} - -struct DemonWrestlerOutline_Previews: PreviewProvider { - static var previews: some View { - DemonWrestlerOutline(baseLength: 400) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/Fireworks/Buildings/Building.swift b/SFSymbolsArtCollection/ArtWorks/Fireworks/Buildings/Building.swift deleted file mode 100644 index af79cf7..0000000 --- a/SFSymbolsArtCollection/ArtWorks/Fireworks/Buildings/Building.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// Building.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/08/06. -// - -import SwiftUI - -struct Building: View { - - let fontSize: CGFloat - let color: Color - let lightColor: Color - - var body: some View { - - ZStack { - - Image(symbol: .rectanglePortraitFill) - .arrangeShape(color: lightColor, - fontSize: fontSize * 0.9) - - Image(symbol: .buildingFill) - .arrangeShape(color: color, - fontSize: fontSize) - } - } -} - -struct Building_Previews: PreviewProvider { - static var previews: some View { - Building(fontSize: 180, - color: .black, - lightColor: .yellow) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/Fireworks/Buildings/Buildings.swift b/SFSymbolsArtCollection/ArtWorks/Fireworks/Buildings/Buildings.swift deleted file mode 100644 index f132731..0000000 --- a/SFSymbolsArtCollection/ArtWorks/Fireworks/Buildings/Buildings.swift +++ /dev/null @@ -1,45 +0,0 @@ -// -// Buildings.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/09/03. -// - -import SwiftUI - -struct Buildings: View { - - let baseLength: CGFloat - let color: Color - let lightColor: Color - - var body: some View { - - HStack(spacing: 0) { - - Spacer() - - Building(fontSize: baseLength * 0.25, - color: color, - lightColor: lightColor) - .offset(x: baseLength * 0.09, - y: baseLength * 0.1) - - Building(fontSize: baseLength * 0.45, - color: color, - lightColor: lightColor) - - Spacer() - } - .offset(x: baseLength * -0.05, - y: 0) - } -} - -struct Buildings_Previews: PreviewProvider { - static var previews: some View { - Buildings(baseLength: 400, - color: .black, - lightColor: .yellow) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/Fireworks/Fireworks.swift b/SFSymbolsArtCollection/ArtWorks/Fireworks/Fireworks.swift deleted file mode 100644 index 5ba017a..0000000 --- a/SFSymbolsArtCollection/ArtWorks/Fireworks/Fireworks.swift +++ /dev/null @@ -1,110 +0,0 @@ -// -// Fireworks.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/08/06. -// - -import SwiftUI - -struct Fireworks: View { - - var body: some View { - - GeometryReader { proxy in - - let baseLength = proxy.baseLength - - // Background - ZStack { - Image(symbol: .rectangleFill) - .arrangeShape(color: .midnightNavy, - width: proxy.size.width * 1.5, - height: proxy.size.height * 1.5) - } - .position(proxy.localCenter) - - ZStack { - - // SmallFireworks - Group { - SmallFirework(color: .pink, - fontSize: baseLength * 0.125, - offsetX: baseLength * -0.225, - offsetY: baseLength * 0.125) - - SmallFirework(color: .lemonYellow, - fontSize: baseLength * 0.125, - offsetX: baseLength * -0.075, - offsetY: baseLength * 0.25) - - SmallFirework(color: .green, - fontSize: baseLength * 0.125, - offsetX: baseLength * 0.15, - offsetY: baseLength * 0.2) - } - - // LargeFireworks - Group { - LargeFirework(baseLength: baseLength, - color: Color(uiColor: .red), - dotColor: .white) - .offset(x: baseLength * -0.1, - y: baseLength * -0.3) - - LargeFirework(baseLength: baseLength, - color: .white, - dotColor: .yellow) - .offset(x: baseLength * 0.1, - y: baseLength * -0.5) - } - - // RocketFireworks - Group { - RocketFirework(baseLength: baseLength, - color: .yellow) - .offset(x: baseLength * 0.0025, - y: baseLength * 0.325) - - RocketFirework(baseLength: baseLength, - color: .white) - .offset(x: baseLength * -0.2, - y: baseLength * 0.5) - } - - MediumFirework(baseLength: baseLength, - color: .lemonYellow, - dotColor: .red) - .offset(x: baseLength * 0.225, - y: baseLength * 0.075) - - VStack { - Spacer() - - Buildings(baseLength: baseLength * 0.77, - color: .gray, - lightColor: .yellow) - } - - VStack { - Spacer() - - HStack(spacing: 0) { - - // Audience - ForEach(0..<4) { _ in - Image(symbol: .person3SequenceFill) - .arrangeShape(fontSize: baseLength * 0.13) - } - } - } - } - } - } -} - -struct Fireworks_Previews: PreviewProvider { - static var previews: some View { - Fireworks() - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/Fireworks/LargeFirework.swift b/SFSymbolsArtCollection/ArtWorks/Fireworks/LargeFirework.swift deleted file mode 100644 index cd98c62..0000000 --- a/SFSymbolsArtCollection/ArtWorks/Fireworks/LargeFirework.swift +++ /dev/null @@ -1,71 +0,0 @@ -// -// LargeFirework.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/08/06. -// - -import SwiftUI - -struct LargeFirework: View { - - let baseLength: CGFloat - let color: Color - let dotColor: Color - - var body: some View { - - ZStack { - - // DotRadiowaves - Group { - - Image(symbol: .dotRadiowavesRight) - .arrangeShape(color: color, - fontSize: baseLength * 0.25, - fontWeight: .bold, - offsetX: baseLength * 0.095) - - Image(symbol: .dotRadiowavesRight) - .arrangeShape(color: color, - fontSize: baseLength * 0.25, - fontWeight: .bold, - flipType: .horizontal, - offsetX: baseLength * -0.095) - - Image(symbol: .dotRadiowavesRight) - .arrangeShape(color: color, - fontSize: baseLength * 0.25, - fontWeight: .bold, - rotationDegrees: 90, - offsetY: baseLength * -0.095) - - Image(symbol: .dotRadiowavesRight) - .arrangeShape(color: color, - fontSize: baseLength * 0.25, - fontWeight: .bold, - rotationDegrees: -90, - offsetY: baseLength * 0.095) - } - - Image(symbol: .circleDotted) - .arrangeShape(color: dotColor, - fontSize: baseLength * 0.55, - fontWeight: .ultraLight, - rotationDegrees: baseLength * 0.225) - - Image(symbol: .circleFill) - .arrangeShape(color: dotColor, - fontSize: baseLength * 0.085) - } - } -} - -struct Firework_Previews: PreviewProvider { - static var previews: some View { - - LargeFirework(baseLength: 400, - color: .red, - dotColor: .yellow) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/Fireworks/MediumFirework.swift b/SFSymbolsArtCollection/ArtWorks/Fireworks/MediumFirework.swift deleted file mode 100644 index 0349d97..0000000 --- a/SFSymbolsArtCollection/ArtWorks/Fireworks/MediumFirework.swift +++ /dev/null @@ -1,40 +0,0 @@ -// -// MediumFirework.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/09/03. -// - -import SwiftUI - -struct MediumFirework: View { - - let baseLength: CGFloat - let color: Color - let dotColor: Color - - var body: some View { - - ZStack { - Image(symbol: .helm) - .arrangeShape(color: color, - fontSize: baseLength * 0.25) - - Image(symbol: .circleDotted) - .arrangeShape(color: dotColor, - fontSize: baseLength * 0.30) - - Image(symbol: .circleFill) - .arrangeShape(color: dotColor, - fontSize: baseLength * 0.037) - } - } -} - -struct FMediumFirework_Previews: PreviewProvider { - static var previews: some View { - MediumFirework(baseLength: 400, - color: .red, - dotColor: .lemonYellow) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/Fireworks/RocketFirework.swift b/SFSymbolsArtCollection/ArtWorks/Fireworks/RocketFirework.swift deleted file mode 100644 index ef0287e..0000000 --- a/SFSymbolsArtCollection/ArtWorks/Fireworks/RocketFirework.swift +++ /dev/null @@ -1,54 +0,0 @@ -// -// RocketFirework.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/08/07. -// - -import SwiftUI - -struct RocketFirework: View { - - let baseLength: CGFloat - let color: Color - - var body: some View { - - ZStack { - Image(symbol: .circleFill) - .arrangeShape(color: color, - fontSize: baseLength * 0.05, - offsetY: baseLength * -0.35) - - // AlternatingCurrents - Group { - Image(symbol: .alternatingcurrent) - .arrangeShape(color: color, - width: baseLength * 0.25, - height: baseLength * 0.025, - rotationDegrees: 90, - offsetY: baseLength * -0.22) - - Image(symbol: .alternatingcurrent) - .arrangeShape(color: color, - width: baseLength * 0.25, - height: baseLength * 0.025, - rotationDegrees: 90) - - Image(symbol: .alternatingcurrent) - .arrangeShape(color: color, - width: baseLength * 0.25, - height: baseLength * 0.025, - rotationDegrees: 90, - offsetY: baseLength * 0.22) - } - } - } -} - -struct RocketFirework_Previews: PreviewProvider { - static var previews: some View { - RocketFirework(baseLength: 400, - color: .red) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/Fireworks/SmallFirework.swift b/SFSymbolsArtCollection/ArtWorks/Fireworks/SmallFirework.swift deleted file mode 100644 index 5d987d8..0000000 --- a/SFSymbolsArtCollection/ArtWorks/Fireworks/SmallFirework.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// SmallFirework.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/09/03. -// - -import SwiftUI - -struct SmallFirework: View { - - let color: Color - let fontSize: CGFloat - let offsetX: CGFloat - let offsetY: CGFloat - - var body: some View { - - Image(symbol: .timelapse) - .arrangeShape(color: color, - fontSize: fontSize, - offsetX: offsetX, - offsetY: offsetY) - } -} - -struct SmallFirework_Previews: PreviewProvider { - static var previews: some View { - SmallFirework(color: .pink, - fontSize: 50, - offsetX: 0, - offsetY: 0) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/Magician/Magician.swift b/SFSymbolsArtCollection/ArtWorks/Magician/Magician.swift deleted file mode 100644 index a1d2129..0000000 --- a/SFSymbolsArtCollection/ArtWorks/Magician/Magician.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// Magician.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/07/29. -// - -import SwiftUI - -struct Magician: View { - var body: some View { - - GeometryReader { proxy in - - let baseLength = proxy.baseLength - - ZStack { - MagicianFace(baseLength: baseLength) - .offset(x: 0, y: baseLength * 0.125) - MagicianHat(baseLength: baseLength) - .offset(x: 0, y: baseLength * -0.375) - } - .position(proxy.localCenter) - } - } -} - -struct Magician_Previews: PreviewProvider { - static var previews: some View { - Magician() - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/Magician/MagicianFace.swift b/SFSymbolsArtCollection/ArtWorks/Magician/MagicianFace.swift deleted file mode 100644 index 9cd7e10..0000000 --- a/SFSymbolsArtCollection/ArtWorks/Magician/MagicianFace.swift +++ /dev/null @@ -1,65 +0,0 @@ -// -// MagicianFace.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/07/29. -// - -import SwiftUI - -struct MagicianFace: View { - - let baseLength: CGFloat - - var body: some View { - ZStack { - // Outline - Image(symbol: .dropFill) - .arrangeShape(color: .paleOrange, - fontSize: baseLength * 0.75, - flipType: .vertical) - - VStack { - // Eyebrows - HStack(spacing: 0) { - ForEach(0..<2) { _ in - Image(symbol: .chevronCompactUp) - .arrangeShape(fontSize: baseLength * 0.225, - fontWeight: .thin) - } - } - - Spacer() - .frame(height: 0) - - MagicianSunGlasses(baseLength: baseLength) - - // Nose - Image(symbol: .cloudHeavyrain) - .arrangeShape(fontSize: baseLength * 0.1625, - fontWeight: .light) - - // Mouse - ZStack { - - Image(symbol: .rectangleRoundedbottomFill) - .arrangeShape(color: .red, - width: baseLength * 0.15, - height: baseLength * 0.075) - - Image(symbol: .capsuleFill) - .arrangeShape(color: .orange, - width: baseLength * 0.145, - height: baseLength * 0.025, - offsetY: baseLength * 0.025) - } - } - } - } -} - -struct MagicianFace_Previews: PreviewProvider { - static var previews: some View { - MagicianFace(baseLength: 400) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/Magician/MagicianHat.swift b/SFSymbolsArtCollection/ArtWorks/Magician/MagicianHat.swift deleted file mode 100644 index bb32bb8..0000000 --- a/SFSymbolsArtCollection/ArtWorks/Magician/MagicianHat.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// MagicianHat.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/07/29. -// - -import SwiftUI - -struct MagicianHat: View { - - let baseLength: CGFloat - - var body: some View { - ZStack { - - Image(symbol: .rectangleFill) - .arrangeShape(color: .red, - width: baseLength * 0.435, - height: baseLength * 0.075, - flipType: .vertical, - offsetY: baseLength * 0.1) - - Image(symbol: .archiveboxFill) - .arrangeShape(fontSize: baseLength * 0.525, - flipType: .vertical) - - Image(symbol: .rectangleFill) - .arrangeShape(width: baseLength * 0.625, - height: baseLength * 0.125, - flipType: .vertical, - offsetY: baseLength * 0.1875) - } - } -} - -struct MagicianHat_Previews: PreviewProvider { - static var previews: some View { - MagicianHat(baseLength: 400) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/Magician/MagicianSunGlasses.swift b/SFSymbolsArtCollection/ArtWorks/Magician/MagicianSunGlasses.swift deleted file mode 100644 index 616c7a6..0000000 --- a/SFSymbolsArtCollection/ArtWorks/Magician/MagicianSunGlasses.swift +++ /dev/null @@ -1,59 +0,0 @@ -// -// MagicianSunGlasses.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/09/08. -// - -import SwiftUI - -struct MagicianSunGlasses: View { - - let baseLength: CGFloat - - var body: some View { - - HStack(spacing: 0) { - - Image(symbol: .minus) - .arrangeShape(width: baseLength * 0.075, - height: baseLength * 0.0125) - - ZStack { - - Image(symbol: .circleFill) - .arrangeShape(color: .white, - fontSize: baseLength * 0.125) - - Image(symbol: .moonCircleFill) - .arrangeShape(fontSize: baseLength * 0.125) - - } - - Image(symbol: .minus) - .arrangeShape(width: baseLength * 0.075, - height: baseLength * 0.0125) - - ZStack { - - Image(symbol: .circleFill) - .arrangeShape(color: .white, - fontSize: baseLength * 0.125) - - Image(symbol: .moonCircleFill) - .arrangeShape(fontSize: baseLength * 0.125) - - } - - Image(symbol: .minus) - .arrangeShape(width: baseLength * 0.075, - height: baseLength * 0.0125) - } - } -} - -struct MagicianSunGlasses_Previews: PreviewProvider { - static var previews: some View { - MagicianSunGlasses(baseLength: 400) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/PartyAnimals/Animals/Animal/AnimalEye.swift b/SFSymbolsArtCollection/ArtWorks/PartyAnimals/Animals/Animal/AnimalEye.swift deleted file mode 100644 index dbc145f..0000000 --- a/SFSymbolsArtCollection/ArtWorks/PartyAnimals/Animals/Animal/AnimalEye.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// AnimalEye.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/07/29. -// - -import SwiftUI - -struct AnimalEye: View { - - let baseLength: CGFloat - let eyeColor: Color - - var body: some View { - ZStack { - Image(symbol: .circleFill) - .arrangeShape(color: eyeColor, - fontSize: baseLength * 0.05) - - Image(symbol: .circleFill) - .arrangeShape(color: .white, - fontSize: baseLength * 0.02) - } - } -} - -struct AnimalEye_Previews: PreviewProvider { - static var previews: some View { - AnimalEye(baseLength: 400, - eyeColor: Color(uiColor: .brown)) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/PartyAnimals/Animals/Animal/AnimalNose.swift b/SFSymbolsArtCollection/ArtWorks/PartyAnimals/Animals/Animal/AnimalNose.swift deleted file mode 100644 index ecc9e6c..0000000 --- a/SFSymbolsArtCollection/ArtWorks/PartyAnimals/Animals/Animal/AnimalNose.swift +++ /dev/null @@ -1,57 +0,0 @@ -// -// BearNose.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/07/29. -// - -import SwiftUI - -struct AnimalNose: View { - - let baseLength: CGFloat - let noseTipColor: Color - let mouthColor: Color - - var body: some View { - ZStack { - Image(symbol: .circleFill) - .arrangeShape(color: .white, - fontSize: baseLength * 0.125) - - Image(symbol: .arrowDown) - .arrangeShape(color: mouthColor, - fontSize: baseLength * 0.09, - offsetY: baseLength * 0.0125) - - // Nose tip - Group { - Image(symbol: .circleFill) - .arrangeShape(color: .white, - fontSize: baseLength * 0.05, - offsetY: baseLength * -0.01) - - Image(symbol: .moonCircleFill) - .arrangeShape(color: noseTipColor, - fontSize: baseLength * 0.05, - fontWeight: .bold, - flipType: .horizontalAndVertical, - offsetY: baseLength * -0.01) - } - } - } -} - -struct AnimalNose_Previews: PreviewProvider { - static var previews: some View { - ZStack { - Rectangle() - .fill(.brown) - .ignoresSafeArea() - - AnimalNose(baseLength: 400, - noseTipColor: .red, - mouthColor: .black) - } - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/PartyAnimals/Animals/Animal/AnimalOutline.swift b/SFSymbolsArtCollection/ArtWorks/PartyAnimals/Animals/Animal/AnimalOutline.swift deleted file mode 100644 index f668140..0000000 --- a/SFSymbolsArtCollection/ArtWorks/PartyAnimals/Animals/Animal/AnimalOutline.swift +++ /dev/null @@ -1,57 +0,0 @@ -// -// BearOutline.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/07/29. -// - -import SwiftUI - -struct AnimalOutline: View { - - let baseLength: CGFloat - let faceColor: Color - let earColor: Color - - var body: some View { - ZStack { - Image(symbol: .circleFill) - .arrangeShape(color: faceColor, - fontSize: baseLength * 0.15, - offsetX: baseLength * 0.125, - offsetY: baseLength * -0.15) - - Image(symbol: .rectangleRoundedtopFill) - .arrangeShape(color: earColor, - fontSize: baseLength * 0.06, - rotationDegrees: -20, - offsetX: baseLength * 0.125, - offsetY: baseLength * -0.15) - - Image(symbol: .circleFill) - .arrangeShape(color: faceColor, - fontSize: baseLength * 0.15, - offsetX: baseLength * -0.125, - offsetY: baseLength * -0.15) - - Image(symbol: .rectangleRoundedtopFill) - .arrangeShape(color: earColor, - fontSize: baseLength * 0.06, - rotationDegrees: 20, - offsetX: baseLength * -0.125, - offsetY: baseLength * -0.15) - - Image(symbol: .ovalFill) - .arrangeShape(color: faceColor, - fontSize: baseLength * 0.325) - } - } -} - -struct AnimalOutline_Previews: PreviewProvider { - static var previews: some View { - AnimalOutline(baseLength: 400, - faceColor: .brown, - earColor: .palePink) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/PartyAnimals/Animals/Animal/AnimalWhiskers.swift b/SFSymbolsArtCollection/ArtWorks/PartyAnimals/Animals/Animal/AnimalWhiskers.swift deleted file mode 100644 index 2acb17b..0000000 --- a/SFSymbolsArtCollection/ArtWorks/PartyAnimals/Animals/Animal/AnimalWhiskers.swift +++ /dev/null @@ -1,38 +0,0 @@ -// -// AnimalWhiskers.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/08/01. -// - -import SwiftUI - -struct AnimalWhiskers: View { - - let baseLength: CGFloat - let color: Color - let skinColor: Color - - var body: some View { - ZStack { - Image(symbol: .rays) - .arrangeShape(color: color, - width: baseLength * 0.175, - height: baseLength * 0.1) - - Image(symbol: .rectangleFill) - .arrangeShape(color: skinColor, - fontSize: baseLength * 0.15, - rotationDegrees: 90, - offsetX: baseLength * 0.05) - } - } -} - -struct AnimalWhiskers_Previews: PreviewProvider { - static var previews: some View { - AnimalWhiskers(baseLength: 400, - color: .darkBrown, - skinColor: .red) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/PartyAnimals/Animals/Bear.swift b/SFSymbolsArtCollection/ArtWorks/PartyAnimals/Animals/Bear.swift deleted file mode 100644 index 24c9288..0000000 --- a/SFSymbolsArtCollection/ArtWorks/PartyAnimals/Animals/Bear.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// Bear.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/07/29. -// - -import SwiftUI - -struct Bear: View { - - let baseLength: CGFloat - - var body: some View { - ZStack { - AnimalOutline(baseLength: baseLength, - faceColor: .brown, - earColor: .palePink) - - // Eyes - Group { - AnimalEye(baseLength: baseLength, - eyeColor: .darkBrown) - .offset(x: baseLength * 0.075, - y: baseLength * -0.04) - - AnimalEye(baseLength: baseLength, - eyeColor: .darkBrown) - .offset(x: baseLength * -0.075, - y: baseLength * -0.04) - } - - AnimalNose(baseLength: baseLength, - noseTipColor: .red, - mouthColor: .black) - .offset(x: 0, - y: baseLength * 0.0375) - } - } -} - -struct Bear_Previews: PreviewProvider { - static var previews: some View { - Bear(baseLength: 400) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/PartyAnimals/Animals/Frog.swift b/SFSymbolsArtCollection/ArtWorks/PartyAnimals/Animals/Frog.swift deleted file mode 100644 index 7d3691c..0000000 --- a/SFSymbolsArtCollection/ArtWorks/PartyAnimals/Animals/Frog.swift +++ /dev/null @@ -1,45 +0,0 @@ -// -// Frog.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/07/29. -// - -import SwiftUI - -struct Frog: View { - - let baseLength: CGFloat - - var body: some View { - ZStack { - AnimalOutline(baseLength: baseLength, - faceColor: .green, - earColor: .green) - - // Eyes - Group { - AnimalEye(baseLength: baseLength, - eyeColor: .black) - .offset(x: baseLength * -0.125, - y: baseLength * -0.15) - - AnimalEye(baseLength: baseLength, - eyeColor: .black) - .offset(x: baseLength * 0.125, - y: baseLength * -0.15) - } - - Image(symbol: .chevronDown) - .arrangeShape(fontSize: baseLength * 0.1, - fontWeight: .bold, - offsetY: baseLength * 0.025) - } - } -} - -struct Frog_Previews: PreviewProvider { - static var previews: some View { - Frog(baseLength: 400) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/PartyAnimals/Animals/Lion.swift b/SFSymbolsArtCollection/ArtWorks/PartyAnimals/Animals/Lion.swift deleted file mode 100644 index 4f710d8..0000000 --- a/SFSymbolsArtCollection/ArtWorks/PartyAnimals/Animals/Lion.swift +++ /dev/null @@ -1,80 +0,0 @@ -// -// Lion.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/07/29. -// - -import SwiftUI - -struct Lion: View { - - let baseLength: CGFloat - - var body: some View { - ZStack { - - // Lion's mane - Group { - Image(symbol: .sealFill) - .arrangeShape(color: .orange, - fontSize: baseLength * 0.575, - fontWeight: .ultraLight) - - Image(symbol: .sealFill) - .arrangeShape(color: .orange, - fontSize: baseLength * 0.575, - fontWeight: .ultraLight, - rotationDegrees: 20) - } - - AnimalOutline(baseLength: baseLength, - faceColor: .yellow, - earColor: .yellow) - .offset(x: 0, - y: baseLength * 0.0375) - - // Whiskers - Group { - AnimalWhiskers(baseLength: baseLength, - color: .darkBrown, - skinColor: .yellow) - .offset(x: baseLength * -0.08, - y: baseLength * 0.075) - - AnimalWhiskers(baseLength: baseLength, - color: .darkBrown, - skinColor: .yellow) - .offset(x: baseLength * -0.08, - y: baseLength * 0.075) - .rotation3DEffect(.degrees(180), - axis: FlipType.horizontal.axis, - anchorZ: 1) - } - - Group { - AnimalEye(baseLength: baseLength, - eyeColor: .darkBrown) - .offset(x: baseLength * -0.075, - y: baseLength * -0.0025) - - AnimalEye(baseLength: baseLength, - eyeColor: .darkBrown) - .offset(x: baseLength * 0.075, - y: baseLength * -0.0025) - } - - AnimalNose(baseLength: baseLength, - noseTipColor: .darkBrown, - mouthColor: .darkBrown) - .offset(x: 0, - y: baseLength * 0.075) - } - } -} - -struct Lion_Previews: PreviewProvider { - static var previews: some View { - Lion(baseLength: 400) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/PartyAnimals/PartyAnimals.swift b/SFSymbolsArtCollection/ArtWorks/PartyAnimals/PartyAnimals.swift deleted file mode 100644 index 1159664..0000000 --- a/SFSymbolsArtCollection/ArtWorks/PartyAnimals/PartyAnimals.swift +++ /dev/null @@ -1,74 +0,0 @@ -// -// PartyAnimals.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/07/29. -// - -import SwiftUI - -struct PartyAnimals: View { - var body: some View { - - GeometryReader { proxy in - - let baseLength = proxy.baseLength - - VStack { - - HStack { - VStack { - Image(symbol: .pawprintFill) - .arrangeShape(color: .red, - fontSize: baseLength * 0.15, - fontWeight: .regular, - rotationDegrees: 20, - offsetY: baseLength * -0.025) - - Image(symbol: .pawprintFill) - .arrangeShape(color: .blue, - fontSize: baseLength * 0.15, - fontWeight: .regular, - rotationDegrees: -15, - offsetX: baseLength * -0.05, - offsetY: baseLength * -0.025) - } - Bear(baseLength: baseLength) - } - - HStack { - Frog(baseLength: baseLength) - - VStack { - - Image(symbol: .pawprintFill) - .arrangeShape(color: .orange, - fontSize: baseLength * 0.15, - fontWeight: .regular, - rotationDegrees: 15, - offsetY: baseLength * -0.025) - - Image(symbol: .pawprintFill) - .arrangeShape(color: .cyan, - fontSize: baseLength * 0.15, - fontWeight: .regular, - rotationDegrees: -15, - offsetX: baseLength * 0.05, - offsetY: baseLength * -0.025) - } - } - .offset(x: 0, - y: baseLength * 0.025) - - Lion(baseLength: baseLength) - } - .position(proxy.localCenter) - } - } -} - -struct PartyAnimals_Previews: PreviewProvider { - static var previews: some View { - PartyAnimals() - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/WorldPeace/Earth.swift b/SFSymbolsArtCollection/ArtWorks/WorldPeace/Earth.swift deleted file mode 100644 index ae39be7..0000000 --- a/SFSymbolsArtCollection/ArtWorks/WorldPeace/Earth.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// Earth.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/07/29. -// - -import SwiftUI - -struct Earth: View { - - let baseLength: CGFloat - - var body: some View { - ZStack { - Image(symbol: .circleFill) - .arrangeShape(color: .cyan, - fontSize: baseLength * 0.5) - - Image(symbol: .globeAsiaAustraliaFill) - .arrangeShape(color: .green, - fontSize: baseLength * 0.55, - fontWeight: .ultraLight) - - Image(symbol: .globeAsiaAustralia) - .arrangeShape(fontSize: baseLength * 0.55, - fontWeight: .ultraLight) - } - } -} - -struct Earth_Previews: PreviewProvider { - static var previews: some View { - Earth(baseLength: 400) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/WorldPeace/Entity/CharacterAppearance.swift b/SFSymbolsArtCollection/ArtWorks/WorldPeace/Entity/CharacterAppearance.swift deleted file mode 100644 index 1b98621..0000000 --- a/SFSymbolsArtCollection/ArtWorks/WorldPeace/Entity/CharacterAppearance.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// CharacterAppearance.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/09/07. -// - -import SwiftUI - -struct CharacterAppearance: Hashable { - let alphabet: SFAlphabet.Alphabet - let color: Color - let offsetX: CGFloat -} diff --git a/SFSymbolsArtCollection/ArtWorks/WorldPeace/Entity/CharactersType.swift b/SFSymbolsArtCollection/ArtWorks/WorldPeace/Entity/CharactersType.swift deleted file mode 100644 index 24bd3c7..0000000 --- a/SFSymbolsArtCollection/ArtWorks/WorldPeace/Entity/CharactersType.swift +++ /dev/null @@ -1,54 +0,0 @@ -// -// CharactersType.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/09/08. -// - -import CoreGraphics - -enum CharactersType { - case world - case peace - - func characterAppearances(with baseLength: CGFloat) -> [CharacterAppearance] { - switch self { - case .world: - return [ - CharacterAppearance(alphabet: .w, - color: .red, - offsetX: 0), - CharacterAppearance(alphabet: .o, - color: .yellow, - offsetX: baseLength * -0.05), - CharacterAppearance(alphabet: .r, - color: .green, - offsetX: baseLength * -0.1), - CharacterAppearance(alphabet: .l, - color: .blue, - offsetX: baseLength * -0.15), - CharacterAppearance(alphabet: .d, - color: .purple, - offsetX: baseLength * -0.2) - ] - case .peace: - return [ - CharacterAppearance(alphabet: .p, - color: .cyan, - offsetX: 0), - CharacterAppearance(alphabet: .e, - color: .pink, - offsetX: baseLength * -0.05), - CharacterAppearance(alphabet: .a, - color: .mint, - offsetX: baseLength * -0.1), - CharacterAppearance(alphabet: .c, - color: .indigo, - offsetX: baseLength * -0.15), - CharacterAppearance(alphabet: .e, - color: .orange, - offsetX: baseLength * -0.2) - ] - } - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/WorldPeace/FiveCharactersView.swift b/SFSymbolsArtCollection/ArtWorks/WorldPeace/FiveCharactersView.swift deleted file mode 100644 index be3c93d..0000000 --- a/SFSymbolsArtCollection/ArtWorks/WorldPeace/FiveCharactersView.swift +++ /dev/null @@ -1,60 +0,0 @@ -// -// FiveCharactersView.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/09/08. -// - -import SwiftUI - -// MARK: - Initializer -extension FiveCharactersView { - - init(type: CharactersType, baseLength: CGFloat) { - self.baseLength = baseLength - characters = type.characterAppearances(with: baseLength) - } -} - -struct FiveCharactersView: View { - - let baseLength: CGFloat - let characters: [CharacterAppearance] - - var body: some View { - ZStack { - HStack(spacing: 0) { - ForEach(characters, id: \.self) { character in - SFAlphabet(character.alphabet, - fontSize: baseLength * 0.175, - fontWeight: .bold, - offsetX: character.offsetX) - } - } - .offset(x: baseLength * 0.12, - y: 0) - - HStack(spacing: 0) { - ForEach(characters, id: \.self) { character in - SFAlphabet(character.alphabet, - color: character.color, - fontSize: baseLength * 0.175, - fontWeight: .bold, - offsetX: character.offsetX, - offsetY: 0) - } - } - .offset(x: baseLength * 0.1125, - y: 0) - } - } -} - -struct FiveCharactersView_Previews: PreviewProvider { - static var previews: some View { - FiveCharactersView(type: .world, - baseLength: 400) - FiveCharactersView(type: .peace, - baseLength: 400) - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/WorldPeace/SFAlphabet.swift b/SFSymbolsArtCollection/ArtWorks/WorldPeace/SFAlphabet.swift deleted file mode 100644 index bd052dc..0000000 --- a/SFSymbolsArtCollection/ArtWorks/WorldPeace/SFAlphabet.swift +++ /dev/null @@ -1,155 +0,0 @@ -// -// SFCharacter.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/07/29. -// - -import SwiftUI -import SFUserFriendlySymbols - -extension SFAlphabet { - - init(_ alphabet: Alphabet, - color: Color = .black, - frameColor: Color = .white, - fontSize: CGFloat, - fontWeight: Font.Weight = .regular, - flipType: FlipType = .none, - rotationDegrees: CGFloat = 0, - offsetX: CGFloat = 0, - offsetY: CGFloat = 0) { - self.alphabet = alphabet - self.color = color - self.frameColor = frameColor - self.fontSize = fontSize - self.fontWeight = fontWeight - self.flipType = flipType - self.rotationDegrees = rotationDegrees - self.offsetX = offsetX - self.offsetY = offsetY - } -} - -struct SFAlphabet: View { - - enum Alphabet: String { - - case a = "a.circle" - case b = "b.circle" - case c = "c.circle" - case d = "d.circle" - case e = "e.circle" - case f = "f.circle" - case g = "g.circle" - case h = "h.circle" - case i = "i.circle" - case j = "j.circle" - case k = "k.circle" - case l = "l.circle" - case m = "m.circle" - case n = "n.circle" - case o = "o.circle" - case p = "p.circle" - case q = "q.circle" - case r = "r.circle" - case s = "s.circle" - case t = "t.circle" - case u = "u.circle" - case v = "v.circle" - case w = "w.circle" - case x = "x.circle" - case y = "y.circle" - case z = "z.circle" - - var symbolInCircle: SFSymbols { - return SFSymbols(rawValue: self.rawValue) ?? .xmark - } - } - - private let alphabet: Alphabet - private let color: Color - /// Circle-frame color - private let frameColor: Color - private let fontSize: CGFloat - private let fontWeight: Font.Weight - private let flipType: FlipType - private let rotationDegrees: CGFloat - private let offsetX: CGFloat - private let offsetY: CGFloat - - var body: some View { - ZStack { - - Image(symbol: alphabet.symbolInCircle) - .arrangeShape(color: color, - fontSize: fontSize, - fontWeight: fontWeight, - flipType: flipType, - rotationDegrees: rotationDegrees, - offsetX: offsetX, - offsetY: offsetY) - - // Hide Circle-Frame - Group { - - Image(symbol: .circle) - .arrangeShape(color: frameColor, - fontSize: fontSize * 1.1, - fontWeight: fontWeight, - flipType: flipType, - rotationDegrees: rotationDegrees, - offsetX: offsetX, - offsetY: offsetY) - - Image(symbol: .circle) - .arrangeShape(color: frameColor, - fontSize: fontSize * 1.05, - fontWeight: fontWeight, - flipType: flipType, - rotationDegrees: rotationDegrees, - offsetX: offsetX, - offsetY: offsetY) - - Image(symbol: .circle) - .arrangeShape(color: frameColor, - fontSize: fontSize, - fontWeight: fontWeight, - flipType: flipType, - rotationDegrees: rotationDegrees, - offsetX: offsetX, - offsetY: offsetY) - - Image(symbol: .circle) - .arrangeShape(color: frameColor, - fontSize: fontSize * 0.95, - fontWeight: fontWeight, - flipType: flipType, - rotationDegrees: rotationDegrees, - offsetX: offsetX, - offsetY: offsetY) - - Image(symbol: .circle) - .arrangeShape(color: frameColor, - fontSize: fontSize * 0.9, - fontWeight: fontWeight, - flipType: flipType, - rotationDegrees: rotationDegrees, - offsetX: offsetX, - offsetY: offsetY) - } - } - } -} - -struct SFCharacter_Previews: PreviewProvider { - static var previews: some View { - VStack { - SFAlphabet(.a, fontSize: 200) - SFAlphabet(.h, fontSize: 100) - SFAlphabet(.a, fontSize: 25, fontWeight: .black) - SFAlphabet(.a, fontSize: 10, fontWeight: .black) - SFAlphabet(.a, fontSize: 1, fontWeight: .black) - } - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/WorldPeace/WorldPeace.swift b/SFSymbolsArtCollection/ArtWorks/WorldPeace/WorldPeace.swift deleted file mode 100644 index 71a9a32..0000000 --- a/SFSymbolsArtCollection/ArtWorks/WorldPeace/WorldPeace.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// ColorfulAlphabets.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/07/29. -// - -import SwiftUI - -struct WorldPeace: View { - var body: some View { - - GeometryReader { proxy in - - let baseLength = proxy.baseLength - - VStack { - - FiveCharactersView(type: .world, - baseLength: baseLength) - ZStack { - Earth(baseLength: baseLength) - - Image(symbol: .peacesign) - .arrangeShape(color: .white, - fontSize: baseLength * 0.52, - fontWeight: .thin) - } - - FiveCharactersView(type: .peace, - baseLength: baseLength) - } - .position(proxy.localCenter) - } - } -} - -struct WorldPeace_Previews: PreviewProvider { - static var previews: some View { - WorldPeace() - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/iOSDCJapan2022/Entity/iOSDCJapan2022SymbolType.swift b/SFSymbolsArtCollection/ArtWorks/iOSDCJapan2022/Entity/iOSDCJapan2022SymbolType.swift deleted file mode 100644 index a997897..0000000 --- a/SFSymbolsArtCollection/ArtWorks/iOSDCJapan2022/Entity/iOSDCJapan2022SymbolType.swift +++ /dev/null @@ -1,51 +0,0 @@ -// -// iOSDCJapan2022SymbolType.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/09/08. -// - -import SwiftUI - -enum iOSDCJapan2022SymbolType: String, Identifiable, CaseIterable { - case green - case orange - case blue - case punk - - var id: String { self.rawValue } - - var configuration: SymbolAppearance { - switch self { - case .green: - return SymbolAppearance(color: .green, - sizeMagnification: 0.25, - offsetXMagnification: 0.1, - offsetYMagnification: -0.15) - - case .orange: - return SymbolAppearance(color: .orange, - sizeMagnification: 0.2, - offsetXMagnification: -0.07, - offsetYMagnification: 0.17) - case .blue: - return SymbolAppearance(color: .blue, - sizeMagnification: 0.16, - offsetXMagnification: -0.22, - offsetYMagnification: -0.12) - - case .punk: - return SymbolAppearance(color: .pink, - sizeMagnification: 0.12, - offsetXMagnification: 0.2, - offsetYMagnification: 0.15) - } - } - - struct SymbolAppearance { - let color: Color - let sizeMagnification: CGFloat - let offsetXMagnification: CGFloat - let offsetYMagnification: CGFloat - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/iOSDCJapan2022/iOSDCJapan2022Logo.swift b/SFSymbolsArtCollection/ArtWorks/iOSDCJapan2022/iOSDCJapan2022Logo.swift deleted file mode 100644 index 319c036..0000000 --- a/SFSymbolsArtCollection/ArtWorks/iOSDCJapan2022/iOSDCJapan2022Logo.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// iOSDCJapan2022Logo.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/08/31. -// - -import SwiftUI - -struct iOSDCJapan2022Logo: View { - - var body: some View { - - GeometryReader { proxy in - - let baseLength = proxy.baseLength * 2 - - ZStack { - ForEach(iOSDCJapan2022SymbolType.allCases) { type in - let appearance = type.configuration - - iOSDCJapan2022Symbol(size: baseLength * appearance.sizeMagnification, - color: appearance.color) - .offset(x: baseLength * appearance.offsetXMagnification, - y: baseLength * appearance.offsetYMagnification) - } - - Image(symbol: .circleSquareFill) - .arrangeShape(color: .white, - fontSize: baseLength) - } - .position(proxy.localCenter) - } - } -} - -struct iOSDCJapan2022Logo_Previews: PreviewProvider { - static var previews: some View { - iOSDCJapan2022Logo() - } -} diff --git a/SFSymbolsArtCollection/ArtWorks/iOSDCJapan2022/iOSDCJapan2022Symbol.swift b/SFSymbolsArtCollection/ArtWorks/iOSDCJapan2022/iOSDCJapan2022Symbol.swift deleted file mode 100644 index 36fcda1..0000000 --- a/SFSymbolsArtCollection/ArtWorks/iOSDCJapan2022/iOSDCJapan2022Symbol.swift +++ /dev/null @@ -1,80 +0,0 @@ -// -// iOSDCJapan2022.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/08/31. -// - -import SwiftUI - -extension iOSDCJapan2022Symbol { - - init(size: CGFloat, color: Color) { - self.size = size - self.color = color - innerSlowmoSize = size * 0.73 - dotSize = size * 0.13 - - let x0_34Value = size * 0.34 - let x0_58Value = size * 0.58 - let x0_68Value = size * 0.68 - - dotOffsets = [ - DotOffset(x: 0, y: -x0_68Value), - DotOffset(x: x0_34Value, y: -x0_58Value), - DotOffset(x: x0_58Value, y: -x0_34Value), - DotOffset(x: x0_68Value, y: 0), - DotOffset(x: x0_58Value, y: x0_34Value), - DotOffset(x: x0_34Value, y: x0_58Value), - DotOffset(x: 0, y: x0_68Value), - DotOffset(x: -x0_34Value, y: x0_58Value), - DotOffset(x: -x0_58Value, y: x0_34Value), - DotOffset(x: -x0_68Value, y: 0), - DotOffset(x: -x0_34Value, y: -x0_58Value), - DotOffset(x: -x0_58Value, y: -x0_34Value), - ] - } - - struct DotOffset: Hashable { - let x: CGFloat - let y: CGFloat - } -} - -struct iOSDCJapan2022Symbol: View { - - let size: CGFloat - let color: Color - let innerSlowmoSize: CGFloat - let dotSize: CGFloat - let dotOffsets: [DotOffset] - - var body: some View { - ZStack { - Image(systemName: "slowmo") - .arrangeShape(color: color, - fontSize: size) - - Image(systemName: "slowmo") - .arrangeShape(color: color, - fontSize: innerSlowmoSize, - fontWeight: .bold) - - ForEach(dotOffsets, id: \.self) { offset in - Image(systemName: "circle.fill") - .arrangeShape(color: color, - fontSize: dotSize, - offsetX: offset.x, - offsetY: offset.y) - } - } - } -} - -struct iOSDCJapan2022Symbol_Previews: PreviewProvider { - static var previews: some View { - iOSDCJapan2022Symbol(size: 100, color: .black) - iOSDCJapan2022Symbol(size: 50, color: .red) - iOSDCJapan2022Symbol(size: 25, color: .gray) - } -} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtGallery/ArtGalleryView+ArtWorkPath.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtGallery/ArtGalleryView+ArtWorkPath.swift new file mode 100644 index 0000000..13b7029 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtGallery/ArtGalleryView+ArtWorkPath.swift @@ -0,0 +1,88 @@ +// +// ArtGalleryView+ArtWorkPath.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension ArtGalleryView { + + enum ArtWorkPath: String, CaseIterable, Identifiable { + case magician = "Magician" + case crayonBoy = "Crayon boy" + case worldPeace = "World peace" + case partyAnimals = "Party animals" + case armHair = "Arm hair" + case demonWrestler = "Demon wrestler" + case fireworks = "Fireworks" + case afroBoy = "Afro boy" + case sweetBeanBunMan = "Sweet bean bun man" + case nosebleed = "Nosebleed" + case imWearingPants = "ImWearingPants" + + var id: String { rawValue } + + @ViewBuilder + var coverArt: some View { + switch self { + case .magician: + MagicianArtView.CoverArt() + case .crayonBoy: + CrayonBoyArtView.CoverArt() + case .worldPeace: + WorldPeaceArtView.CoverArt() + case .partyAnimals: + PartyAnimalsArtView.CoverArt() + case .armHair: + ArmHairArtView.CoverArt() + case .demonWrestler: + DemonWrestlerArtView.CoverArt() + case .fireworks: + FireworksArtView.CoverArt() + case .afroBoy: + AfroBoyArtView.CoverArt() + case .sweetBeanBunMan: + SweetBeanBunManArtView.CoverArt() + case .nosebleed: + NosebleedArtView.CoverArt() + case .imWearingPants: + ImWearingPantsArtView.CoverArt() + } + } + + var coverArtBackground: Color { + self == .fireworks ? .midnightNavy : .white + } + + @ViewBuilder + var destination: some View { + switch self { + case .magician: + MagicianArtView() + case .crayonBoy: + CrayonBoyArtView() + case .worldPeace: + WorldPeaceArtView() + case .partyAnimals: + PartyAnimalsArtView() + case .armHair: + ArmHairArtView() + case .demonWrestler: + DemonWrestlerArtView() + case .fireworks: + FireworksArtView() + case .afroBoy: + AfroBoyArtView() + case .sweetBeanBunMan: + SweetBeanBunManArtView() + case .nosebleed: + NosebleedArtView() + case .imWearingPants: + ImWearingPantsArtView() + } + } + } +} + diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtGallery/ArtGalleryView.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtGallery/ArtGalleryView.swift new file mode 100644 index 0000000..0a00eb8 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtGallery/ArtGalleryView.swift @@ -0,0 +1,57 @@ +// +// ArtGalleryView.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension ArtGalleryView { + + init(screenSize: CGSize) { + self.model = ArtWorkModel(screenSize: screenSize) + self.columns = Array(repeating: GridItem(.fixed(model.galleryColumnLength), spacing: model.galleryColumnSpacing), + count: model.galleryColumnCount) + } +} + +struct ArtGalleryView: View { + + @State private var path = NavigationPath() + private let model: ArtWorkModel + private let columns: [GridItem] + + var body: some View { + + NavigationStack(path: $path) { + ScrollView { + LazyVGrid(columns: columns) { + + ForEach(ArtWorkPath.allCases) { path in + NavigationLink(value: path) { + path.coverArt + .galleryGridItemView( + backgroundColor: path.coverArtBackground, + length: model.galleryColumnLength + ) + } + } + } + .padding(.horizontal, 24) + .navigationDestination(for: ArtWorkPath.self) { path in + path.destination + .navigationTitle(path.rawValue) + .navigationBarTitleDisplayMode(.inline) + } + } + .navigationTitle("Art Gallery") + } + .environment(model) + } +} + +#Preview { + ArtGalleryView(screenSize: .init(width: 1024, + height: 1024)) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/AfroBoy/AfroBoyArtView+CoverArt.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/AfroBoy/AfroBoyArtView+CoverArt.swift new file mode 100644 index 0000000..52b8dbd --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/AfroBoy/AfroBoyArtView+CoverArt.swift @@ -0,0 +1,27 @@ +// +// AfroBoyArtView+CoverArt.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension AfroBoyArtView { + + struct CoverArt: View { + + var body: some View { + ZStack { + ForEach(Element.allCases) { + SymbolArtDisplayView(element: $0.value) + } + } + } + } +} + +#Preview { + AfroBoyArtView.CoverArt() + .environment(ArtWorkModel.preview) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/AfroBoy/AfroBoyArtView+Element.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/AfroBoy/AfroBoyArtView+Element.swift new file mode 100644 index 0000000..2d40c5f --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/AfroBoy/AfroBoyArtView+Element.swift @@ -0,0 +1,82 @@ +// +// AfroBoyArtView+Element.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension AfroBoyArtView { + + enum Element: String, CaseIterable, Identifiable { + case hair + case outline + case face + case comb + + var id: String { rawValue } + + var value: SymbolArtElement { + switch self { + case .hair: + SymbolArtElement( + symbol: "􁝰", + name: "tree.fill", + initialPosition: .third(.first), + primaryColor: .black, + widthRatio: 0.9, + heightRatio: 0.9, + symbolCountToWaitFor: 0 + ) + case .outline: + SymbolArtElement( + symbol: "􀙧", + name: "shield.fill", + initialPosition: .third(.second), + primaryColor: .paleOrange, + widthRatio: 0.5, + heightRatio: 0.6, + verticalOffsetRatio: 0.17, + symbolCountToWaitFor: 1 + ) + case .face: + SymbolArtElement( + symbol: "􀎽", + name: "faceid", + initialPosition: .third(.third), + primaryColor: .black, + secondaryColor: .paleOrange, + widthRatio: 0.3, + heightRatio: 0.3, + verticalOffsetRatio: 0.16, + symbolCountToWaitFor: 2 + ) + case .comb: + SymbolArtElement( + symbol: "􀦉", + name: "comb.fill", + initialPosition: .third(.fourth), + primaryColor: .red, + widthRatio: 0.2, + heightRatio: 0.2, + horizontalOffsetRatio: -0.2, + verticalOffsetRatio: -0.2, + symbolCountToWaitFor: 3 + ) + } + } + } +} + +#Preview { + NavigationStack { + AfroBoyArtView() + .environment(ArtWorkModel.preview) + } +} + +#Preview { + AfroBoyArtView.CoverArt() + .environment(ArtWorkModel.preview) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/AfroBoy/AfroBoyArtView.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/AfroBoy/AfroBoyArtView.swift new file mode 100644 index 0000000..bd40b2e --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/AfroBoy/AfroBoyArtView.swift @@ -0,0 +1,39 @@ +// +// AfroBoyArtView.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +struct AfroBoyArtView: View { + + @State private var isAnimating = false + + var body: some View { + ZStack { + ForEach(Element.allCases) { + AnimatableSymbolView(element: $0.value, isAnimating: isAnimating) + } + } + .toolbar(content: { + ToolbarItemGroup(placement: .bottomBar) { + Spacer() + + PlayButton { + isAnimating = true + } + .font(.system(size: 32)) + .disabled(isAnimating) + } + }) + } +} + +#Preview { + NavigationStack { + AfroBoyArtView() + .environment(ArtWorkModel.preview) + } +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ArmHair/ArmHairArtView+CoverArt.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ArmHair/ArmHairArtView+CoverArt.swift new file mode 100644 index 0000000..50e1d36 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ArmHair/ArmHairArtView+CoverArt.swift @@ -0,0 +1,49 @@ +// +// ArmHairArtView+CoverArt.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension ArmHairArtView { + + struct CoverArt: View { + + @Environment(ArtWorkModel.self) var model + + var hairOffset: CGSize { + let lowestX = model.calculatingProportionalValue(withRatio: -0.14, shouldResizeForCoverArt: true) + let highestX = model.calculatingProportionalValue(withRatio: 0.246, shouldResizeForCoverArt: true) + let lowestY = model.calculatingProportionalValue(withRatio: -0.075, shouldResizeForCoverArt: true) + let highestY = model.calculatingProportionalValue(withRatio: 0.02, shouldResizeForCoverArt: true) + return CGSize( + width: CGFloat.random(in: lowestX...highestX), + height: CGFloat.random(in: lowestY...highestY) + ) + } + + var body: some View { + ZStack { + ForEach(Element.allCases) { + SymbolArtDisplayView(shouldResizeForCoverArt: true, element: $0.value) + } + + ForEach(0..<260) { _ in + Image(systemName: "alternatingcurrent") + .foregroundStyle(.black) + .font(.system(size: model.calculatingProportionalValue(withRatio: 0.0825, shouldResizeForCoverArt: true))) + .fontWeight(.thin) + .rotationEffect(.degrees(100)) + .offset(hairOffset) + } + } + } + } +} + +#Preview { + ArmHairArtView.CoverArt() + .environment(ArtWorkModel.preview) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ArmHair/ArmHairArtView+Element.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ArmHair/ArmHairArtView+Element.swift new file mode 100644 index 0000000..4ad1062 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ArmHair/ArmHairArtView+Element.swift @@ -0,0 +1,118 @@ +// +// ArmHairArtView+Element.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension ArmHairArtView { + + enum Element: String, CaseIterable, Identifiable { + case armFrame + case arm + case handFirst + case handSecond + case handFrame + case handConcealment + + var id: String { rawValue } + + var value: SymbolArtElement { + switch self { + case .armFrame: + SymbolArtElement( + symbol: "􀏄", + name: "rectangle.fill", + initialPosition: .third(.first), + primaryColor: .paleOrange, + fontWeight: .light, + widthRatio: 0.5, + heightRatio: 0.125, + symbolCountToWaitFor: 1 + ) + case .arm: + SymbolArtElement( + symbol: "􀏃", + name: "rectangle", + initialPosition: .third(.second), + primaryColor: .black, + fontWeight: .ultraLight, + widthRatio: 0.54, + heightRatio: 0.13, + symbolCountToWaitFor: 0 + ) + + case .handFrame: + SymbolArtElement( + symbol: "􀉻", + name: "hand.raised", + initialPosition: .third(.fourth), + primaryColor: .black, + fontWeight: .ultraLight, + widthRatio: 0.225, + heightRatio: 0.225, + rotationDegrees: -90, + horizontalOffsetRatio: -0.24, + verticalOffsetRatio: -0.02, + symbolCountToWaitFor: 2 + ) + + case .handFirst: + SymbolArtElement( + symbol: "􀉼", + name: "hand.raised.fill", + initialPosition: .third(.third), + primaryColor: .paleOrange, + widthRatio: 0.21, + heightRatio: 0.225, + rotationDegrees: -90, + horizontalOffsetRatio: -0.24, + verticalOffsetRatio: -0.02, + symbolCountToWaitFor: 3 + ) + + case .handSecond: + SymbolArtElement( + symbol: "􀉼", + name: "hand.raised.fill", + initialPosition: .third(.third), + primaryColor: .paleOrange, + fontWeight: .black, + widthRatio: 0.188, + heightRatio: 0.225, + rotationDegrees: -90, + horizontalOffsetRatio: -0.236, + verticalOffsetRatio: -0.01, + symbolCountToWaitFor: 3 + ) + + case .handConcealment: + SymbolArtElement( + symbol: "􀏄", + name: "rectangle.fill", + initialPosition: .third(.first), + primaryColor: .paleOrange, + widthRatio: 0.1, + heightRatio: 0.12, + horizontalOffsetRatio: -0.14, + verticalOffsetRatio: -0.0, + symbolCountToWaitFor: 1 + ) + } + } + } +} + +#Preview { + NavigationStack { + ArmHairArtView() + .environment(ArtWorkModel.preview) + } +} + +#Preview { + ArmHairArtView.CoverArt() + .environment(ArtWorkModel.preview) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ArmHair/ArmHairArtView.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ArmHair/ArmHairArtView.swift new file mode 100644 index 0000000..73a1fc5 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ArmHair/ArmHairArtView.swift @@ -0,0 +1,172 @@ +// +// ArmHairArtView.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +struct ArmHairArtView: View { + + @Environment(ArtWorkModel.self) var model + @State private var isAnimating = false + + private let hairAnimationDuration = 3.0 + + var hairOffset: CGSize { + let lowestX = model.calculatingProportionalValue(withRatio: -0.14) + let highestX = model.calculatingProportionalValue(withRatio: 0.246) + let lowestY = model.calculatingProportionalValue(withRatio: -0.075) + let highestY = model.calculatingProportionalValue(withRatio: 0.02) + return CGSize( + width: CGFloat.random(in: lowestX...highestX), + height: CGFloat.random(in: lowestY...highestY) + ) + } + + var randomOffsetRatio: CGSize { + let range: ClosedRange = -0.45...0.45 + let offsetX = model.calculatingProportionalValue(withRatio: CGFloat.random(in: range)) + let offsetY = model.calculatingProportionalValue(withRatio: CGFloat.random(in: range)) + return CGSize( + width: offsetX, + height: offsetY + ) + } + + var randomRotationDegrees: CGFloat { + CGFloat.random(in: -720...720) + } + + var body: some View { + ZStack { + ForEach(ArmHairArtView.Element.allCases) { + AnimatableSymbolView(element: $0.value, isAnimating: isAnimating) + } + + ForEach(0..<260) { _ in + Image(systemName: "alternatingcurrent") + .resizable() + .foregroundStyle(.black) + .keyframeAnimator( + initialValue: AnimationValues( + width: model.initialSymbolLength, + height: model.initialSymbolLength, + offsetX: model.calculatingInitialOffsetX(forPosition: .third(.fifth)), + offsetY: model.calculatingInitialOffsetY(forPosition: .third(.fifth)) + ), + trigger: isAnimating + ) { content, value in + + SymbolNameFrameView( + name: "alternatingcurrent", + length: model.initialSymbolLength, + frameOpacity: value.symbolNameVisibleValue + ) { + + Group { + if value.symbolNameVisibleValue == 1 { + content + .scaledToFit() + } else { + content + } + } + .foregroundStyle( + value.primaryColor, + value.secondaryColor + ) + .fontWeight(value.fontWeight) + .frame( + width: value.width, + height: value.height + ) + .rotationEffect(.degrees(value.rotationDegrees)) + } + .offset(value.offset) + + } keyframes: { value in + + KeyframeTrack(\.fontWeightValue) { + LinearKeyframe( + value.fontWeightValue, + duration: model.waitingTime(forCount: 4) + ) + CubicKeyframe(Font.Weight.thin.animatableValue, duration: hairAnimationDuration) + } + + KeyframeTrack(\.width) { + LinearKeyframe( + value.height, + duration: model.waitingTime(forCount: 4) + ) + CubicKeyframe(model.calculatingProportionalValue(withRatio: 0.08), duration: hairAnimationDuration) + } + + KeyframeTrack(\.height) { + LinearKeyframe( + value.height, + duration: model.waitingTime(forCount: 4) + ) + CubicKeyframe(model.calculatingProportionalValue(withRatio: 0.024), duration: hairAnimationDuration) + } + + KeyframeTrack(\.rotationDegrees) { + LinearKeyframe( + value.rotationDegrees, + duration: model.waitingTime(forCount: 4) + ) + LinearKeyframe(randomRotationDegrees, duration: hairAnimationDuration * 0.1) + LinearKeyframe(randomRotationDegrees, duration: hairAnimationDuration * 0.1) + LinearKeyframe(randomRotationDegrees, duration: hairAnimationDuration * 0.1) + LinearKeyframe(randomRotationDegrees, duration: hairAnimationDuration * 0.1) + LinearKeyframe(randomRotationDegrees, duration: hairAnimationDuration * 0.1) + LinearKeyframe(randomRotationDegrees, duration: hairAnimationDuration * 0.1) + LinearKeyframe(randomRotationDegrees, duration: hairAnimationDuration * 0.1) + LinearKeyframe(randomRotationDegrees, duration: hairAnimationDuration * 0.1) + LinearKeyframe(100, duration: hairAnimationDuration * 0.1) + } + + KeyframeTrack(\.offset) { + LinearKeyframe( + value.offset, + duration: model.waitingTime(forCount: 4) + ) + LinearKeyframe(randomOffsetRatio, duration: hairAnimationDuration * 0.1) + LinearKeyframe(randomOffsetRatio, duration: hairAnimationDuration * 0.1) + LinearKeyframe(randomOffsetRatio, duration: hairAnimationDuration * 0.1) + LinearKeyframe(randomOffsetRatio, duration: hairAnimationDuration * 0.1) + LinearKeyframe(randomOffsetRatio, duration: hairAnimationDuration * 0.1) + LinearKeyframe(randomOffsetRatio, duration: hairAnimationDuration * 0.1) + LinearKeyframe(randomOffsetRatio, duration: hairAnimationDuration * 0.1) + LinearKeyframe(hairOffset, duration: hairAnimationDuration * 0.3) + } + + KeyframeTrack(\.symbolNameVisibleValue) { + LinearKeyframe(1, duration: model.waitingTime(forCount: 4)) + CubicKeyframe(0, duration: model.animationDurationPerSymbol * 0.2) + } + } + } + } + .toolbar(content: { + ToolbarItemGroup(placement: .bottomBar) { + Spacer() + + PlayButton { + isAnimating = true + } + .font(.system(size: 32)) + .disabled(isAnimating) + } + }) + } +} + +#Preview { + NavigationStack { + ArmHairArtView() + .environment(ArtWorkModel.preview) + } +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/CrayonBoy/CrayonBoyArtView+CoverArt.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/CrayonBoy/CrayonBoyArtView+CoverArt.swift new file mode 100644 index 0000000..c02ec8b --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/CrayonBoy/CrayonBoyArtView+CoverArt.swift @@ -0,0 +1,56 @@ +// +// CrayonBoyArtView+CoverArt.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension CrayonBoyArtView { + + struct CoverArt: View { + + @Environment(ArtWorkModel.self) var model + + var body: some View { + ZStack { + ForEach(Element.allCases) { + SymbolArtDisplayView(element: $0.value) + } + + Image(systemName: "cloud.fill") + .resizable() + .foregroundStyle(.black.opacity(0.9)) + .frame( + width: model.calculatingProportionalValue( + withRatio: 0.85, + shouldResizeForCoverArt: true + ), + height: model.calculatingProportionalValue( + withRatio: 0.6, + shouldResizeForCoverArt: true + ) + ) + .rotationEffect(.degrees(8)) + .rotation3DEffect( + .degrees(180), + axis: (x: 0, y: 1, z: 0) + ) + + Image(systemName: "questionmark.app.fill") + .foregroundStyle(.white, .black.opacity(0.9)) + .font(.system(size: model.calculatingProportionalValue( + withRatio: 0.4, + shouldResizeForCoverArt: true + ))) + .bold() + } + } + } +} + +#Preview { + CrayonBoyArtView.CoverArt() + .environment(ArtWorkModel.preview) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/CrayonBoy/CrayonBoyArtView+Element.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/CrayonBoy/CrayonBoyArtView+Element.swift new file mode 100644 index 0000000..67297e1 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/CrayonBoy/CrayonBoyArtView+Element.swift @@ -0,0 +1,243 @@ +// +// CrayonBoyArtView+Element.swift +// SFSymbolsArtCollection +// +// + +import SwiftUI + +extension CrayonBoyArtView { + + enum Element: String, CaseIterable, Identifiable { + case outline + case hair + case hairConcealment + case eyebrowRight + case eyebrowLeft + case eyelidRight + case eyelidLeft + case eyelidConcealmentRight + case eyelidConcealmentLeft + case eyeRight + case eyeLeft + case outlineFrame + case mouth + case mouthFrame + case sideburns + + var id: String { rawValue } + + var value: SymbolArtElement { + switch self { + case .outline: + SymbolArtElement( + symbol: "􀇃", + name: "cloud.fill", + initialPosition: .second(.first), + primaryColor: .paleOrange, + fontWeight: .ultraLight, + widthRatio: 0.75, + heightRatio: 0.5, + rotationDegrees: 8, + flip: .horizontal, + symbolCountToWaitFor: 0 + ) + case .hair: + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .second(.second), + primaryColor: .black, + widthRatio: 0.44, + heightRatio: 0.25, + horizontalOffsetRatio: 0.05, + verticalOffsetRatio: -0.125, + symbolCountToWaitFor: 2 + ) + case .hairConcealment: + SymbolArtElement( + symbol: "􀏄", + name: "rectangle.fill", + initialPosition: .third(.fifth), + primaryColor: .paleOrange, + widthRatio: 0.4, + heightRatio: 0.25, + horizontalOffsetRatio: 0.033, + verticalOffsetRatio: -0.05, + symbolCountToWaitFor: 3 + ) + case .eyebrowRight: + SymbolArtElement( + symbol: "􀆍", + name: "control", + initialPosition: .third(.sixth), + primaryColor: .black, + fontWeight: .black, + widthRatio: 0.2, + heightRatio: 0.1, + rotationDegrees: 6, + horizontalOffsetRatio: -0.07, + verticalOffsetRatio: -0.14, + symbolCountToWaitFor: 4 + ) + case .eyebrowLeft: + SymbolArtElement( + symbol: "􀆍", + name: "control", + initialPosition: .third(.sixth), + primaryColor: .black, + fontWeight: .black, + widthRatio: 0.2, + heightRatio: 0.1, + rotationDegrees: 6, + horizontalOffsetRatio: 0.14, + verticalOffsetRatio: -0.12, + symbolCountToWaitFor: 4 + ) + case .eyelidRight: + SymbolArtElement( + symbol: "􀀀", + name: "circle", + initialPosition: .second(.third), + primaryColor: .black, + fontWeight: .ultraLight, + widthRatio: 0.17, + heightRatio: 0.16, + horizontalOffsetRatio: 0.12, + verticalOffsetRatio: -0.01, + symbolCountToWaitFor: 5 + ) + case .eyelidLeft: + SymbolArtElement( + symbol: "􀀀", + name: "circle", + initialPosition: .second(.third), + primaryColor: .black, + fontWeight: .ultraLight, + widthRatio: 0.17, + heightRatio: 0.16, + horizontalOffsetRatio: -0.08, + verticalOffsetRatio: -0.01, + symbolCountToWaitFor: 5 + ) + case .eyelidConcealmentRight: + SymbolArtElement( + symbol: "􀏄", + name: "rectangle.fill", + initialPosition: .third(.fifth), + primaryColor: .paleOrange, + widthRatio: 0.2, + heightRatio: 0.16, + horizontalOffsetRatio: 0.13, + verticalOffsetRatio: 0.06, + symbolCountToWaitFor: 6 + ) + case .eyelidConcealmentLeft: + SymbolArtElement( + symbol: "􀏄", + name: "rectangle.fill", + initialPosition: .third(.fifth), + primaryColor: .paleOrange, + widthRatio: 0.2, + heightRatio: 0.16, + horizontalOffsetRatio: -0.08, + verticalOffsetRatio: 0.06, + symbolCountToWaitFor: 6 + ) + case .eyeRight: + SymbolArtElement( + symbol: "􀢚", + name: "record.circle.fill", + initialPrimaryColor: .systemBackground, + initialPosition: .third(.seventh), + primaryColor: .white, + widthRatio: 0.14, + heightRatio: 0.14, + horizontalOffsetRatio: 0.1, + verticalOffsetRatio: 0.02, + symbolCountToWaitFor: 7 + ) + case .eyeLeft: + SymbolArtElement( + symbol: "􀢚", + name: "record.circle.fill", + initialPrimaryColor: .systemBackground, + initialPosition: .third(.seventh), + primaryColor: .white, + widthRatio: 0.14, + heightRatio: 0.14, + horizontalOffsetRatio: -0.06, + verticalOffsetRatio: 0.016, + symbolCountToWaitFor: 7 + ) + case .outlineFrame: + SymbolArtElement( + symbol: "􀇂", + name: "cloud", + initialPosition: .third(.first), + primaryColor: .black, + fontWeight: .ultraLight, + widthRatio: 0.75, + heightRatio: 0.5, + rotationDegrees: 8, + flip: .horizontal, + symbolCountToWaitFor: 1 + ) + case .mouth: + SymbolArtElement( + symbol: "􀧷", + name: "capsule.portrait.fill", + initialPosition: .third(.second), + primaryColor: .red, + fontWeight: .ultraLight, + widthRatio: 0.1, + heightRatio: 0.15, + rotationDegrees: 16, + horizontalOffsetRatio: -0.09, + verticalOffsetRatio: 0.225, + symbolCountToWaitFor: 8 + ) + case .mouthFrame: + SymbolArtElement( + symbol: "􀧶", + name: "capsule.portrait", + initialPosition: .third(.third), + primaryColor: .black, + fontWeight: .ultraLight, + widthRatio: 0.1, + heightRatio: 0.15, + rotationDegrees: 16, + horizontalOffsetRatio: -0.09, + verticalOffsetRatio: 0.225, + symbolCountToWaitFor: 8 + ) + case .sideburns: + SymbolArtElement( + symbol: "􁹬", + name: "righttriangle.fill", + initialPosition: .third(.fourth), + primaryColor: .black, + widthRatio: 0.064, + heightRatio: 0.2, + rotationDegrees: 170, + flip: .horizontal, + horizontalOffsetRatio: 0.215, + verticalOffsetRatio: -0.07, + symbolCountToWaitFor: 9 + ) + } + } + } +} + +#Preview { + NavigationStack { + CrayonBoyArtView() + .environment(ArtWorkModel.preview) + } +} + +#Preview { + CrayonBoyArtView.CoverArt() + .environment(ArtWorkModel.preview) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/CrayonBoy/CrayonBoyArtView.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/CrayonBoy/CrayonBoyArtView.swift new file mode 100644 index 0000000..b8b52dc --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/CrayonBoy/CrayonBoyArtView.swift @@ -0,0 +1,41 @@ +// +// CrayonBoyArtView.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +struct CrayonBoyArtView: View { + + @State private var isAnimating = false + + var body: some View { + + ZStack { + ForEach(Element.allCases) { + AnimatableSymbolView(element: $0.value, + isAnimating: isAnimating) + } + } + .toolbar(content: { + ToolbarItemGroup(placement: .bottomBar) { + Spacer() + + PlayButton { + isAnimating = true + } + .font(.system(size: 32)) + .disabled(isAnimating) + } + }) + } +} + +#Preview { + NavigationStack { + CrayonBoyArtView() + .environment(ArtWorkModel.preview) + } +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/DemonWrestler/DemonWrestlerArtView+CoverArt.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/DemonWrestler/DemonWrestlerArtView+CoverArt.swift new file mode 100644 index 0000000..a4edb6b --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/DemonWrestler/DemonWrestlerArtView+CoverArt.swift @@ -0,0 +1,27 @@ +// +// DemonWrestlerArtView+CoverArt.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension DemonWrestlerArtView { + + struct CoverArt: View { + + var body: some View { + ZStack { + ForEach(Element.allCases) { + SymbolArtDisplayView(element: $0.value) + } + } + } + } +} + +#Preview { + DemonWrestlerArtView.CoverArt() + .environment(ArtWorkModel.preview) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/DemonWrestler/DemonWrestlerArtView+Element.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/DemonWrestler/DemonWrestlerArtView+Element.swift new file mode 100644 index 0000000..664ecbc --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/DemonWrestler/DemonWrestlerArtView+Element.swift @@ -0,0 +1,356 @@ +// +// DemonWrestlerArtView+Element.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension DemonWrestlerArtView { + + enum Element: String, CaseIterable, Identifiable { + case body + case neck + case pants + case handRight + case handLeft + case hornRight + case hornLeft + case handGloveRight + case handGloveLeft + case hat + case outlineFrame + case outline + case hatCenterTip + case numberFour + case eyeBagRight + case eyeBagLeft + case eyeFrameRight + case eyeFrameLeft + case eyeRight + case eyeLeft + case nose + case mouth + case mouthFrame + case scar + + var id: String { rawValue } + + var value: SymbolArtElement { + switch self { + case .body: + SymbolArtElement( + symbol: "􀝻", + name: "figure.wave", + initialPosition: .first(.first), + primaryColor: .paleOrange, + widthRatio: 0.6, + heightRatio: 0.84, + symbolCountToWaitFor: 0) + case .neck: + SymbolArtElement( + symbol: "􀡸", + name: "powerplug.fill", + initialPosition: .first(.second), + primaryColor: .paleOrange, + widthRatio: 0.2, + heightRatio: 0.3, + rotationDegrees: 90, + horizontalOffsetRatio: 0.03, + verticalOffsetRatio: -0.18, + symbolCountToWaitFor: 1) + case .pants: + SymbolArtElement( + symbol: "􀒋", + name: "pencil.tip", + initialPosition: .first(.third), + primaryColor: .black, + widthRatio: 0.2, + heightRatio: 0.35, + rotationDegrees: 180, + horizontalOffsetRatio: 0.02, + verticalOffsetRatio: -0.047, + symbolCountToWaitFor: 2) + case .handRight: + SymbolArtElement( + symbol: "􁗪", + name: "hand.raised.fingers.spread.fill", + initialPosition: .second(.fourth), + primaryColor: .black, + widthRatio: 0.14, + heightRatio: 0.1375, + horizontalOffsetRatio: -0.235, + verticalOffsetRatio: -0.48, + symbolCountToWaitFor: 3) + + case .handLeft: + SymbolArtElement( + symbol: "􁗪", + name: "hand.raised.fingers.spread.fill", + initialPosition: .second(.fourth), + primaryColor: .black, + widthRatio: 0.14, + heightRatio: 0.1375, + rotationDegrees: 180, + horizontalOffsetRatio: 0.23, + verticalOffsetRatio: 0.19, + symbolCountToWaitFor: 3) + + case .hornRight: + SymbolArtElement( + symbol: "􀒘", + name: "bolt.horizontal.fill", + initialPosition: .second(.fifth), + primaryColor: .red, + widthRatio: 0.17, + heightRatio: 0.2, + rotationDegrees: 138, + flip: .vertical, + horizontalOffsetRatio: -0.12, + verticalOffsetRatio: -0.44, + symbolCountToWaitFor: 4) + + case .hornLeft: + SymbolArtElement( + symbol: "􀒘", + name: "bolt.horizontal.fill", + initialPosition: .second(.fifth), + primaryColor: .red, + widthRatio: 0.17, + heightRatio: 0.2, + rotationDegrees: 138, + horizontalOffsetRatio: 0.16, + verticalOffsetRatio: -0.44, + symbolCountToWaitFor: 4) + + case .handGloveRight: + SymbolArtElement( + symbol: "􀳈", + name: "cone.fill", + initialPosition: .second(.sixth), + primaryColor: .black, + widthRatio: 0.14, + heightRatio: 0.2, + horizontalOffsetRatio: -0.24, + verticalOffsetRatio: -0.39, + symbolCountToWaitFor: 5) + + case .handGloveLeft: + SymbolArtElement( + symbol: "􀳈", + name: "cone.fill", + initialPosition: .second(.sixth), + primaryColor: .black, + widthRatio: 0.14, + heightRatio: 0.2, + rotationDegrees: 180, + horizontalOffsetRatio: 0.235, + verticalOffsetRatio: 0.1, + symbolCountToWaitFor: 5) + + case .hat: + SymbolArtElement( + symbol: "􀙧", + name: "shield.fill", + initialPosition: .second(.seventh), + primaryColor: .black, + widthRatio: 0.3, + heightRatio: 0.3, + rotationDegrees: 180, + horizontalOffsetRatio: 0.018, + verticalOffsetRatio: -0.4, + symbolCountToWaitFor: 6) + + case .outlineFrame: + SymbolArtElement( + symbol: "􀧶", + name: "capsule.portrait", + initialPosition: .second(.second), + primaryColor: .black.opacity(0.3), + fontWeight: .ultraLight, + widthRatio: 0.19, + heightRatio: 0.26, + horizontalOffsetRatio: 0.018, + verticalOffsetRatio: -0.296, + symbolCountToWaitFor: 7) + + case .outline: + SymbolArtElement( + symbol: "􀧷", + name: "capsule.portrait.fill", + initialPosition: .second(.third), + primaryColor: .paleOrange, + fontWeight: .ultraLight, + widthRatio: 0.2025, + heightRatio: 0.26, + horizontalOffsetRatio: 0.018, + verticalOffsetRatio: -0.3, + symbolCountToWaitFor: 7) + + case .hatCenterTip: + SymbolArtElement( + symbol: "􀙧", + name: "shield.fill", + initialPosition: .second(.seventh), + primaryColor: .black, + widthRatio: 0.14, + heightRatio: 0.18, + horizontalOffsetRatio: 0.018, + verticalOffsetRatio: -0.44, + symbolCountToWaitFor: 6) + + case .numberFour: + SymbolArtElement( + symbol: "􀘘", + name: "4.alt.circle.fill", + initialPrimaryColor: .systemBackground, + initialPosition: .third(.first), + primaryColor: .red, + secondaryColor: .black, + widthRatio: 0.12, + heightRatio: 0.12, + horizontalOffsetRatio: 0.018, + verticalOffsetRatio: -0.45, + symbolCountToWaitFor: 8) + + case .eyeBagRight: + SymbolArtElement( + symbol: "􁹩", + name: "lightspectrum.horizontal", + initialPosition: .third(.second), + primaryColor: .indigo, + widthRatio: 0.05, + heightRatio: 0.038, + horizontalOffsetRatio: 0.058, + verticalOffsetRatio: -0.32, + symbolCountToWaitFor: 9) + + case .eyeBagLeft: + SymbolArtElement( + symbol: "􁹩", + name: "lightspectrum.horizontal", + initialPosition: .third(.second), + primaryColor: .indigo, + widthRatio: 0.05, + heightRatio: 0.038, + horizontalOffsetRatio: -0.03, + verticalOffsetRatio: -0.32, + symbolCountToWaitFor: 9) + + case .eyeFrameRight: + SymbolArtElement( + symbol: "􀋭", + name: "eye", + initialPosition: .third(.third), + primaryColor: .black, + widthRatio: 0.05, + heightRatio: 0.025, + horizontalOffsetRatio: 0.058, + verticalOffsetRatio: -0.328, + symbolCountToWaitFor: 10) + + case .eyeFrameLeft: + SymbolArtElement( + symbol: "􀋭", + name: "eye", + initialPosition: .third(.third), + primaryColor: .black, + widthRatio: 0.05, + heightRatio: 0.025, + horizontalOffsetRatio: -0.03, + verticalOffsetRatio: -0.328, + symbolCountToWaitFor: 10) + + case .eyeRight: + SymbolArtElement( + symbol: "􀋮", + name: "eye.fill", + initialPosition: .third(.fourth), + primaryColor: .white, + widthRatio: 0.05, + heightRatio: 0.025, + horizontalOffsetRatio: 0.058, + verticalOffsetRatio: -0.328, + symbolCountToWaitFor: 10) + + case .eyeLeft: + SymbolArtElement( + symbol: "􀋮", + name: "eye.fill", + initialPosition: .third(.fourth), + primaryColor: .white, + widthRatio: 0.05, + heightRatio: 0.025, + horizontalOffsetRatio: -0.03, + verticalOffsetRatio: -0.328, + symbolCountToWaitFor: 10) + + case .nose: + SymbolArtElement( + symbol: "􀨯", + name: "nose", + initialPosition: .third(.fifth), + primaryColor: .black, + fontWeight: .thin, + widthRatio: 0.05, + heightRatio: 0.05, + horizontalOffsetRatio: 0.018, + verticalOffsetRatio: -0.28, + symbolCountToWaitFor: 11) + + case .mouth: + SymbolArtElement( + symbol: "􀦪", + name: "mouth.fill", + initialPosition: .third(.sixth), + primaryColor: .red, + fontWeight: .thin, + widthRatio: 0.07, + heightRatio: 0.03, + horizontalOffsetRatio: 0.018, + verticalOffsetRatio: -0.21, + symbolCountToWaitFor: 12) + + case .mouthFrame: + SymbolArtElement( + symbol: "􀦩", + name: "mouth", + initialPosition: .third(.seventh), + primaryColor: .black, + fontWeight: .thin, + widthRatio: 0.07, + heightRatio: 0.03, + horizontalOffsetRatio: 0.018, + verticalOffsetRatio: -0.21, + symbolCountToWaitFor: 12) + + case .scar: + SymbolArtElement( + symbol: "􀜟", + name: "waveform.path.ecg", + initialPosition: .second(.first), + primaryColor: .indigo, + fontWeight: .thin, + widthRatio: 0.05, + heightRatio: 0.03, + rotationDegrees: -15, + horizontalOffsetRatio: 0.07, + verticalOffsetRatio: -0.248, + symbolCountToWaitFor: 13) + } + } + } +} + +#Preview { + NavigationStack { + DemonWrestlerArtView() + .environment(ArtWorkModel.preview) + } +} + +#Preview { + DemonWrestlerArtView.CoverArt() + .environment(ArtWorkModel.preview) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/DemonWrestler/DemonWrestlerArtView.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/DemonWrestler/DemonWrestlerArtView.swift new file mode 100644 index 0000000..b277deb --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/DemonWrestler/DemonWrestlerArtView.swift @@ -0,0 +1,39 @@ +// +// DemonWrestlerArtView.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +struct DemonWrestlerArtView: View { + + @State private var isAnimating = false + + var body: some View { + ZStack { + ForEach(Element.allCases) { + AnimatableSymbolView(element: $0.value, isAnimating: isAnimating) + } + } + .toolbar(content: { + ToolbarItemGroup(placement: .bottomBar) { + Spacer() + + PlayButton { + isAnimating = true + } + .font(.system(size: 32)) + .disabled(isAnimating) + } + }) + } +} + +#Preview { + NavigationStack { + DemonWrestlerArtView() + .environment(ArtWorkModel.preview) + } +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Fireworks/FireworksArtView+CoverArt.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Fireworks/FireworksArtView+CoverArt.swift new file mode 100644 index 0000000..1c013bb --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Fireworks/FireworksArtView+CoverArt.swift @@ -0,0 +1,22 @@ +// +// FireworksArtView+CoverArt.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension FireworksArtView { + + struct CoverArt: View { + + var body: some View { + ZStack { + ForEach(Element.allCases) { + SymbolArtDisplayView(element: $0.value) + } + } + } + } +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Fireworks/FireworksArtView+Element.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Fireworks/FireworksArtView+Element.swift new file mode 100644 index 0000000..530394c --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Fireworks/FireworksArtView+Element.swift @@ -0,0 +1,427 @@ +// +// FireworksArtView+Element.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension FireworksArtView { + + enum Element: String, CaseIterable, Identifiable { + case moon + case rocketFireworkYellow + case rocketFireworkYellowConcealmentRight + case rocketFireworkYellowConcealmentLeft + case rocketFireworkYellowTop + case rocketFireworkWhite + case rocketFireworkWhiteConcealmentRight + case rocketFireworkWhiteConcealmentLeft + case rocketFireworkWhiteTop + case litBuildingLarge + case litBuildingSmall + case buildingLarge + case buildingSmall + case personRight + case personLeft + case personCenterRight + case personCenterLeft + case smallFireworkPink + case smallFireworkYellow + case smallFireworkGreen + case mediumFirework + case largeHorizontalFireworkLeft + case largeVerticalFireworkLeft + case largeDotFireworkLeft + case largeHorizontalFireworkRight + case largeVerticalFireworkRight + case largeDotFireworkRight + + var id: String { rawValue } + + var value: SymbolArtElement { + switch self { + case .moon: + SymbolArtElement( + symbol: "􀇁", + name: "moon.stars.fill", + initialPosition: .none, + primaryColor: .yellow.opacity(0.7), + secondaryColor: .awesomeYellow.opacity(0.6), + widthRatio: 0.12, + heightRatio: 0.12, + horizontalOffsetRatio: 0.4, + verticalOffsetRatio: -0.51, + symbolCountToWaitFor: 0 + ) + + case .rocketFireworkYellow: + SymbolArtElement( + symbol: "􁎄", + name: "water.waves", + initialPosition: .none, + primaryColor: .yellow, + fontWeight: .ultraLight, + widthRatio: 0.57, + heightRatio: 0.2, + rotationDegrees: 90, + horizontalOffsetRatio: -0.01, + verticalOffsetRatio: 0.305, + symbolCountToWaitFor: 0 + ) + + case .rocketFireworkYellowConcealmentRight: + SymbolArtElement( + symbol: "􀏄", + name: "rectangle.fill", + initialPosition: .none, + primaryColor: .midnightNavy, + widthRatio: 0.1, + heightRatio: 0.57, + horizontalOffsetRatio: -0.1, + verticalOffsetRatio: 0.3, + symbolCountToWaitFor: 0 + ) + + case .rocketFireworkYellowConcealmentLeft: + SymbolArtElement( + symbol: "􀏄", + name: "rectangle.fill", + initialPosition: .none, + primaryColor: .midnightNavy, + widthRatio: 0.1, + heightRatio: 0.57, + horizontalOffsetRatio: 0.08, + verticalOffsetRatio: 0.3, + symbolCountToWaitFor: 0 + ) + + case .rocketFireworkYellowTop: + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .none, + primaryColor: .yellow, + widthRatio: 0.04, + heightRatio: 0.045, + horizontalOffsetRatio: -0.02, + verticalOffsetRatio: 0.03, + symbolCountToWaitFor: 0 + ) + + case .rocketFireworkWhite: + SymbolArtElement( + symbol: "􁎄", + name: "water.waves", + initialPosition: .none, + primaryColor: .white, + fontWeight: .ultraLight, + widthRatio: 0.43, + heightRatio: 0.2, + rotationDegrees: 90, + horizontalOffsetRatio: -0.18, + verticalOffsetRatio: 0.37, + symbolCountToWaitFor: 0 + ) + + case .rocketFireworkWhiteConcealmentRight: + SymbolArtElement( + symbol: "􀏄", + name: "rectangle.fill", + initialPosition: .none, + primaryColor: .midnightNavy, + widthRatio: 0.08, + heightRatio: 0.46, + horizontalOffsetRatio: -0.09, + verticalOffsetRatio: 0.355, + symbolCountToWaitFor: 0 + ) + + case .rocketFireworkWhiteConcealmentLeft: + SymbolArtElement( + symbol: "􀏄", + name: "rectangle.fill", + initialPosition: .none, + primaryColor: .midnightNavy, + widthRatio: 0.08, + heightRatio: 0.46, + horizontalOffsetRatio: -0.26, + verticalOffsetRatio: 0.355, + symbolCountToWaitFor: 0 + ) + + case .rocketFireworkWhiteTop: + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .none, + primaryColor: .white, + widthRatio: 0.04, + heightRatio: 0.045, + horizontalOffsetRatio: -0.19, + verticalOffsetRatio: 0.2, + symbolCountToWaitFor: 0 + ) + + case .litBuildingLarge: + SymbolArtElement( + symbol: "􀏄", + name: "rectangle.fill", + initialPosition: .third(.third), + primaryColor: .yellow, + widthRatio: 0.18, + heightRatio: 0.3, + horizontalOffsetRatio: 0.07, + verticalOffsetRatio: 0.434, + symbolCountToWaitFor: 0 + ) + + case .litBuildingSmall: + SymbolArtElement( + symbol: "􀏄", + name: "rectangle.fill", + initialPosition: .third(.third), + primaryColor: .yellow, + widthRatio: 0.1, + heightRatio: 0.17, + horizontalOffsetRatio: -0.09, + verticalOffsetRatio: 0.497, + symbolCountToWaitFor: 0 + ) + + case .buildingLarge: + SymbolArtElement( + symbol: "􀮆", + name: "building.fill", + initialPosition: .third(.second), + primaryColor: .lightGray, + widthRatio: 0.2, + heightRatio: 0.3, + horizontalOffsetRatio: 0.07, + verticalOffsetRatio: 0.434, + symbolCountToWaitFor: 0 + ) + + case .buildingSmall: + SymbolArtElement( + symbol: "􀮆", + name: "building.fill", + initialPosition: .third(.second), + primaryColor: .lightGray, + widthRatio: 0.12, + heightRatio: 0.17, + horizontalOffsetRatio: -0.09, + verticalOffsetRatio: 0.497, + symbolCountToWaitFor: 0 + ) + + case .personRight: + SymbolArtElement( + symbol: "􀻸", + name: "person.3.sequence.fill", + initialPosition: .none, + primaryColor: .black, + secondaryColor: .black, + widthRatio: 0.2, + heightRatio: 0.1, + flip: .horizontal, + horizontalOffsetRatio: 0.34, + verticalOffsetRatio: 0.538, + symbolCountToWaitFor: 0 + ) + + case .personLeft: + SymbolArtElement( + symbol: "􀻸", + name: "person.3.sequence.fill", + initialPosition: .none, + primaryColor: .black, + secondaryColor: .black, + widthRatio: 0.2, + heightRatio: 0.1, + horizontalOffsetRatio: -0.34, + verticalOffsetRatio: 0.538, + symbolCountToWaitFor: 0 + ) + case .personCenterRight: + SymbolArtElement( + symbol: "􀝋", + name: "person.3.fill", + initialPosition: .none, + primaryColor: .black, + secondaryColor: .black, + widthRatio: 0.2, + heightRatio: 0.1, + horizontalOffsetRatio: 0.12, + verticalOffsetRatio: 0.538, + symbolCountToWaitFor: 0 + ) + case .personCenterLeft: + SymbolArtElement( + symbol: "􀝋", + name: "person.3.fill", + initialPosition: .none, + primaryColor: .black, + secondaryColor: .black, + widthRatio: 0.2, + heightRatio: 0.1, + horizontalOffsetRatio: -0.12, + verticalOffsetRatio: 0.538, + symbolCountToWaitFor: 0 + ) + + case .smallFireworkPink: + SymbolArtElement( + symbol: "􀇲", + name: "timelapse", + initialPosition: .none, + primaryColor: .pink, + widthRatio: 0.125, + heightRatio: 0.125, + horizontalOffsetRatio: -0.225, + verticalOffsetRatio: 0.125, + symbolCountToWaitFor: 0 + ) + case .smallFireworkYellow: + SymbolArtElement( + symbol: "􀇲", + name: "timelapse", + initialPosition: .none, + primaryColor: .yellow, + widthRatio: 0.125, + heightRatio: 0.125, + horizontalOffsetRatio: -0.075, + verticalOffsetRatio: 0.25, + symbolCountToWaitFor: 0 + ) + case .smallFireworkGreen: + SymbolArtElement( + symbol: "􀇲", + name: "timelapse", + initialPosition: .none, + primaryColor: .green, + widthRatio: 0.125, + heightRatio: 0.125, + horizontalOffsetRatio: 0.34, + verticalOffsetRatio: 0.18, + symbolCountToWaitFor: 0 + ) + case .mediumFirework: + SymbolArtElement( + symbol: "􂁞", + name: "fireworks", + initialPosition: .none, + primaryColor: .yellow, + secondaryColor: .red, + widthRatio: 0.24, + heightRatio: 0.24, + horizontalOffsetRatio: 0.14, + verticalOffsetRatio: 0.07, + symbolCountToWaitFor: 0 + ) + case .largeHorizontalFireworkLeft: + SymbolArtElement( + symbol: "􀌙", + name: "dot.radiowaves.left.and.right", + initialPosition: .none, + primaryColor: .white, + secondaryColor: .red, + fontWeight: .black, + widthRatio: 0.347, + heightRatio: 0.235, + horizontalOffsetRatio: -0.17, + verticalOffsetRatio: -0.18, + symbolCountToWaitFor: 0 + ) + case .largeVerticalFireworkLeft: + SymbolArtElement( + symbol: "􀌙", + name: "dot.radiowaves.left.and.right", + initialPosition: .none, + primaryColor: .white, + secondaryColor: .red, + fontWeight: .black, + widthRatio: 0.347, + heightRatio: 0.235, + rotationDegrees: 90, + horizontalOffsetRatio: -0.17, + verticalOffsetRatio: -0.18, + symbolCountToWaitFor: 0 + ) + + case .largeDotFireworkLeft: + SymbolArtElement( + symbol: "􁅃", + name: "circle.dotted", + initialPosition: .none, + primaryColor: .white, + fontWeight: .ultraLight, + widthRatio: 0.42, + heightRatio: 0.42, + horizontalOffsetRatio: -0.17, + verticalOffsetRatio: -0.18, + symbolCountToWaitFor: 0 + ) + + case .largeHorizontalFireworkRight: + SymbolArtElement( + symbol: "􀌙", + name: "dot.radiowaves.left.and.right", + initialPosition: .none, + primaryColor: .yellow, + secondaryColor: .white, + fontWeight: .black, + widthRatio: 0.347, + heightRatio: 0.235, + horizontalOffsetRatio: 0.105, + verticalOffsetRatio: -0.34, + symbolCountToWaitFor: 0 + ) + case .largeVerticalFireworkRight: + SymbolArtElement( + symbol: "􀌙", + name: "dot.radiowaves.left.and.right", + initialPosition: .none, + primaryColor: .yellow, + secondaryColor: .white, + fontWeight: .black, + widthRatio: 0.347, + heightRatio: 0.235, + rotationDegrees: 90, + horizontalOffsetRatio: 0.1, + verticalOffsetRatio: -0.34, + symbolCountToWaitFor: 0 + ) + case .largeDotFireworkRight: + SymbolArtElement( + symbol: "􁅃", + name: "circle.dotted", + initialPosition: .none, + primaryColor: .yellow, + fontWeight: .ultraLight, + widthRatio: 0.42, + heightRatio: 0.42, + horizontalOffsetRatio: 0.1, + verticalOffsetRatio: -0.34, + symbolCountToWaitFor: 0 + ) + } + } + } +} + +#Preview { + NavigationStack { + FireworksArtView() + .environment(ArtWorkModel.preview) + } +} + +#Preview { + Color.midnightNavy + .overlay { + FireworksArtView.CoverArt() + .environment(ArtWorkModel.preview) + } +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Fireworks/FireworksArtView.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Fireworks/FireworksArtView.swift new file mode 100644 index 0000000..da5809c --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Fireworks/FireworksArtView.swift @@ -0,0 +1,789 @@ +// +// FireworksArtView.swift +// SFSymbolsArtCollection +// +// Created Lil Ossa +// + +import SwiftUI + +struct FireworksArtView: View { + + @Environment(ArtWorkModel.self) var model + @State private var isAnimating = false + @State private var isBouncedMediumFirework = false + + var body: some View { + + ZStack { + background + sun + moon + rocketFireworks + buildings + people + fireworks + } + .toolbar(content: { + ToolbarItemGroup(placement: .bottomBar) { + Spacer() + + PlayButton { + isAnimating = true + } + .font(.system(size: 32)) + .disabled(isAnimating) + } + }) + .onChange(of: isAnimating) { _, newValue in + if newValue { + Timer.scheduledTimer(withTimeInterval: 15, repeats: false) { _ in + isBouncedMediumFirework = true + } + } + } + } +} + +#Preview { + NavigationStack { + FireworksArtView() + .environment(ArtWorkModel.preview) + } +} + +// MARK: - Private components +extension FireworksArtView { + // MARK: - Background + private var background: some View { + Color.midnightNavy + .keyframeAnimator( + initialValue: AnimationValues( + width: 0, + height: 0, + opacity: 0 + ), + trigger: isAnimating + ) { content, value in + content + .opacity(value.opacity) + } keyframes: { value in + KeyframeTrack(\.opacity) { + CubicKeyframe(1, duration: 4) + } + } + } + + // MARK: - 􀆮 Sun + private var sun: some View { + Image(systemName: "sun.max.fill") + .resizable() + .foregroundStyle(.orange) + .keyframeAnimator( + initialValue: AnimationValues( + width: model.calculatingProportionalValue(withRatio: 0.12), + height: model.calculatingProportionalValue(withRatio: 0.12), + offsetX: model.calculatingProportionalValue(withRatio: 0.4), + offsetY: model.calculatingProportionalValue(withRatio: -0.51) + ), + trigger: isAnimating + ) { content, value in + content + .frame(width: value.width, height: value.height) + .offset(value.offset) + } keyframes: { value in + KeyframeTrack(\.opacity) { + CubicKeyframe(1, duration: 4) + } + + KeyframeTrack(\.offset) { + CubicKeyframe( + CGSize(width: model.calculatingProportionalValue(withRatio: 0.8), + height: model.calculatingProportionalValue(withRatio: -0.31)), + duration: 4 + ) + } + } + } + + // MARK: - 􀇁 Moon + private var moon: some View { + Image(systemName: "moon.stars.fill") + .resizable() + .keyframeAnimator( + initialValue: AnimationValues( + primaryColor: .yellow.opacity(0.7), + secondaryColor: .awesomeYellow.opacity(0.6), + width: model.calculatingProportionalValue(withRatio: 0.12), + height: model.calculatingProportionalValue(withRatio: 0.12), + offsetX: model.calculatingProportionalValue(withRatio: -0.6), + offsetY: model.calculatingProportionalValue(withRatio: -0.41) + ), + trigger: isAnimating + ) { content, value in + content + .foregroundStyle(value.primaryColor, value.secondaryColor) + .frame(width: value.width, height: value.height) + .offset(value.offset) + } keyframes: { value in + KeyframeTrack(\.opacity) { + CubicKeyframe(1, duration: 4) + } + + KeyframeTrack(\.offset) { + CubicKeyframe( + CGSize( + width: model.calculatingProportionalValue(withRatio: -0.4), + height: model.calculatingProportionalValue(withRatio: -0.44) + ), + duration: 2 + ) + + CubicKeyframe( + CGSize( + width: model.calculatingProportionalValue(withRatio: 0.4), + height: model.calculatingProportionalValue(withRatio: -0.51) + ), + duration: 4 + ) + } + } + } + + private var rocketFireworks: some View { + ZStack { + // MARK: - RocketFireworkRed + rocketFirework(.red) + .keyframeAnimator( + initialValue: AnimationValues( + width: 0, + height: 0, + offsetX: model.calculatingProportionalValue(withRatio: -0.215), + offsetY: model.calculatingProportionalValue(withRatio: 0.48), + opacity: 0 + ), + trigger: isAnimating + ) { content, value in + content + .offset(value.offset) + .opacity(value.opacity) + } keyframes: { value in + KeyframeTrack(\.offset) { + LinearKeyframe(CGSize( + width: model.calculatingProportionalValue(withRatio: -0.215), + height: model.calculatingProportionalValue(withRatio: 0.48)), duration: 7) + CubicKeyframe(CGSize( + width: model.calculatingProportionalValue(withRatio: -0.215), + height: model.calculatingProportionalValue(withRatio: 0.23) + ), duration: 3) + } + + KeyframeTrack(\.opacity) { + LinearKeyframe(0, duration: 7) + CubicKeyframe(1, duration: 3) + CubicKeyframe(0, duration: 1) + } + } + + // MARK: - RocketFireworkYellow + rocketFirework(.yellow) + .keyframeAnimator( + initialValue: AnimationValues( + width: 0, + height: 0, + offsetX: model.calculatingProportionalValue(withRatio: -0.076), + offsetY: model.calculatingProportionalValue(withRatio: 0.48), + opacity: 0 + ), + trigger: isAnimating + ) { content, value in + content + .offset(value.offset) + .opacity(value.opacity) + } keyframes: { value in + KeyframeTrack(\.offset) { + LinearKeyframe(CGSize( + width: model.calculatingProportionalValue(withRatio: -0.076), + height: model.calculatingProportionalValue(withRatio: 0.48)), duration: 9) + CubicKeyframe(CGSize( + width: model.calculatingProportionalValue(withRatio: -0.076), + height: model.calculatingProportionalValue(withRatio: 0.36) + ), duration: 2) + } + + KeyframeTrack(\.opacity) { + LinearKeyframe(0, duration: 9) + CubicKeyframe(1, duration: 2) + CubicKeyframe(0, duration: 1) + } + } + + // MARK: - RocketFireworkYellow + rocketFirework(.green) + .keyframeAnimator( + initialValue: AnimationValues( + width: 0, + height: 0, + offsetX: model.calculatingProportionalValue(withRatio: 0.34), + offsetY: model.calculatingProportionalValue(withRatio: 0.48), + opacity: 0 + ), + trigger: isAnimating + ) { content, value in + content + .offset(value.offset) + .opacity(value.opacity) + } keyframes: { value in + KeyframeTrack(\.offset) { + LinearKeyframe(CGSize( + width: model.calculatingProportionalValue(withRatio: 0.34), + height: model.calculatingProportionalValue(withRatio: 0.48)), duration: 10) + CubicKeyframe(CGSize( + width: model.calculatingProportionalValue(withRatio: 0.34), + height: model.calculatingProportionalValue(withRatio: 0.28) + ), duration: 2) + } + + KeyframeTrack(\.opacity) { + LinearKeyframe(0, duration: 10) + CubicKeyframe(1, duration: 2) + CubicKeyframe(0, duration: 1) + } + } + + // MARK: - RocketMediumFirework + rocketFirework(.red) + .keyframeAnimator( + initialValue: AnimationValues( + width: 0, + height: 0, + offsetX: model.calculatingProportionalValue(withRatio: 0.16), + offsetY: model.calculatingProportionalValue(withRatio: 0.48), + opacity: 0 + ), + trigger: isAnimating + ) { content, value in + content + .offset(value.offset) + .opacity(value.opacity) + } keyframes: { value in + KeyframeTrack(\.offset) { + LinearKeyframe(CGSize( + width: model.calculatingProportionalValue(withRatio: 0.16), + height: model.calculatingProportionalValue(withRatio: 0.48)), duration: 12) + CubicKeyframe(CGSize( + width: model.calculatingProportionalValue(withRatio: 0.16), + height: model.calculatingProportionalValue(withRatio: 0.18) + ), duration: 2) + } + + KeyframeTrack(\.opacity) { + LinearKeyframe(0, duration: 12) + CubicKeyframe(1, duration: 2) + CubicKeyframe(0, duration: 1) + } + } + + // MARK: - RocketLargeFirework + rocketFirework(.white) + .keyframeAnimator( + initialValue: AnimationValues( + width: 0, + height: 0, + offsetX: model.calculatingProportionalValue(withRatio: -0.1), + offsetY: model.calculatingProportionalValue(withRatio: 0.48), + opacity: 0 + ), + trigger: isAnimating + ) { content, value in + content + .offset(value.offset) + .opacity(value.opacity) + } keyframes: { value in + KeyframeTrack(\.offset) { + LinearKeyframe(CGSize( + width: model.calculatingProportionalValue(withRatio: -0.1), + height: model.calculatingProportionalValue(withRatio: 0.48)), duration: 14) + CubicKeyframe(CGSize( + width: model.calculatingProportionalValue(withRatio: -0.1), + height: model.calculatingProportionalValue(withRatio: 0) + ), duration: 3) + } + + KeyframeTrack(\.opacity) { + LinearKeyframe(0, duration: 15) + CubicKeyframe(1, duration: 1) + CubicKeyframe(0, duration: 1) + } + } + + // MARK: - RocketLargeFirework Yellow + rocketFirework(.yellow) + .keyframeAnimator( + initialValue: AnimationValues( + width: 0, + height: 0, + offsetX: model.calculatingProportionalValue(withRatio: 0.11), + offsetY: model.calculatingProportionalValue(withRatio: 0.48), + opacity: 0 + ), + trigger: isAnimating + ) { content, value in + content + .offset(value.offset) + .opacity(value.opacity) + } keyframes: { value in + KeyframeTrack(\.offset) { + LinearKeyframe(CGSize( + width: model.calculatingProportionalValue(withRatio: 0.11), + height: model.calculatingProportionalValue(withRatio: 0.48)), duration: 16) + CubicKeyframe(CGSize( + width: model.calculatingProportionalValue(withRatio: 0.11), + height: model.calculatingProportionalValue(withRatio: -0.23) + ), duration: 3) + } + + KeyframeTrack(\.opacity) { + LinearKeyframe(0, duration: 16) + CubicKeyframe(1, duration: 1) + CubicKeyframe(0, duration: 1) + } + } + } + } + + private var buildings: some View { + ZStack { + // MARK: - 􀏄 LitBuildingLarge + Image(systemName: "rectangle.fill") + .resizable() + .keyframeAnimator( + initialValue: AnimationValues( + width: model.calculatingProportionalValue(withRatio: 0.18), + height: model.calculatingProportionalValue(withRatio: 0.3), + offsetX: model.calculatingProportionalValue(withRatio: 0.07), + offsetY: model.calculatingProportionalValue(withRatio: 0.434) + ), + trigger: isAnimating + ) { content, value in + content + .foregroundStyle(.yellow) + .frame(width: value.width, height: value.height) + .offset(value.offset) + } keyframes: { value in + KeyframeTrack(\.opacity) { + CubicKeyframe(1, duration: 4) + } + } + + // MARK: - 􀏄 LitBuildingLarge + Image(systemName: "rectangle.fill") + .resizable() + .keyframeAnimator( + initialValue: AnimationValues( + primaryColor: .white, + width: model.calculatingProportionalValue(withRatio: 0.18), + height: model.calculatingProportionalValue(withRatio: 0.3), + offsetX: model.calculatingProportionalValue(withRatio: 0.07), + offsetY: model.calculatingProportionalValue(withRatio: 0.434) + ), + trigger: isAnimating + ) { content, value in + content + .foregroundStyle(value.primaryColor) + .frame(width: value.width, height: value.height) + .offset(value.offset) + } keyframes: { value in + KeyframeTrack(\.primaryColor) { + CubicKeyframe(Color.yellow.resolve(in: .init()), duration: 6) + } + } + + // MARK: - 􀏄 LitBuildingSmall + Image(systemName: "rectangle.fill") + .resizable() + .keyframeAnimator( + initialValue: AnimationValues( + primaryColor: .white, + width: model.calculatingProportionalValue(withRatio: 0.1), + height: model.calculatingProportionalValue(withRatio: 0.17), + offsetX: model.calculatingProportionalValue(withRatio: -0.09), + offsetY: model.calculatingProportionalValue(withRatio: 0.497) + ), + trigger: isAnimating + ) { content, value in + content + .foregroundStyle(value.primaryColor) + .frame(width: value.width, height: value.height) + .offset(value.offset) + } keyframes: { value in + KeyframeTrack(\.primaryColor) { + CubicKeyframe(Color.yellow.resolve(in: .init()), duration: 6) + } + } + + // MARK: - 􀮆 BuildingLarge + Image(systemName: "building.fill") + .resizable() + .keyframeAnimator( + initialValue: AnimationValues( + primaryColor: .gray, + width: model.calculatingProportionalValue(withRatio: 0.2), + height: model.calculatingProportionalValue(withRatio: 0.3), + offsetX: model.calculatingProportionalValue(withRatio: 0.07), + offsetY: model.calculatingProportionalValue(withRatio: 0.434) + ), + trigger: isAnimating + ) { content, value in + content + .foregroundStyle(value.primaryColor) + .frame(width: value.width, height: value.height) + .offset(value.offset) + } keyframes: { value in + KeyframeTrack(\.primaryColor) { + CubicKeyframe(Color.lightGray.resolve(in: .init()), duration: 6) + } + } + + // MARK: - 􀮆 BuildingSmall + Image(systemName: "building.fill") + .resizable() + .keyframeAnimator( + initialValue: AnimationValues( + primaryColor: .gray, + width: model.calculatingProportionalValue(withRatio: 0.12), + height: model.calculatingProportionalValue(withRatio: 0.17), + offsetX: model.calculatingProportionalValue(withRatio: -0.09), + offsetY: model.calculatingProportionalValue(withRatio: 0.497) + ), + trigger: isAnimating + ) { content, value in + content + .foregroundStyle(value.primaryColor) + .frame(width: value.width, height: value.height) + .offset(value.offset) + } keyframes: { value in + KeyframeTrack(\.primaryColor) { + CubicKeyframe(Color.lightGray.resolve(in: .init()), duration: 6) + } + } + } + } + + private var people: some View { + ZStack { + // MARK: - 􀻸 PersonRight + Image(systemName: "person.3.sequence.fill") + .resizable() + .foregroundStyle(.black) + .keyframeAnimator( + initialValue: AnimationValues( + width: model.calculatingProportionalValue(withRatio: 0.2), + height: model.calculatingProportionalValue(withRatio: 0.1), + offsetX: model.calculatingProportionalValue(withRatio: 0.64), + offsetY: model.calculatingProportionalValue(withRatio: 0.538) + ), + trigger: isAnimating + ) { content, value in + content + .foregroundStyle(value.primaryColor) + .frame(width: value.width, height: value.height) + .rotation3DEffect( + .degrees(180), + axis: FlipType.horizontal.axis + ) + .offset(value.offset) + } keyframes: { value in + KeyframeTrack(\.offset) { + LinearKeyframe( + CGSize( + width: model.calculatingProportionalValue(withRatio: 0.64), + height: model.calculatingProportionalValue(withRatio: 0.538) + ), + duration: 4 + ) + CubicKeyframe( + CGSize( + width: model.calculatingProportionalValue(withRatio: 0.34), + height: model.calculatingProportionalValue(withRatio: 0.538) + ), + duration: 2 + ) + } + } + + // MARK: - 􀻸 PersonLeft + Image(systemName: "person.3.sequence.fill") + .resizable() + .foregroundStyle(.black) + .keyframeAnimator( + initialValue: AnimationValues( + width: model.calculatingProportionalValue(withRatio: 0.2), + height: model.calculatingProportionalValue(withRatio: 0.1), + offsetX: model.calculatingProportionalValue(withRatio: -0.64), + offsetY: model.calculatingProportionalValue(withRatio: 0.538) + ), + trigger: isAnimating + ) { content, value in + content + .foregroundStyle(value.primaryColor) + .frame(width: value.width, height: value.height) + .offset(value.offset) + } keyframes: { value in + KeyframeTrack(\.offset) { + LinearKeyframe( + CGSize( + width: model.calculatingProportionalValue(withRatio: -0.64), + height: model.calculatingProportionalValue(withRatio: 0.538) + ), + duration: 4 + ) + CubicKeyframe( + CGSize( + width: model.calculatingProportionalValue(withRatio: -0.34), + height: model.calculatingProportionalValue(withRatio: 0.538) + ), + duration: 2 + ) + } + } + + // MARK: - 􀝋 personCenterRight + Image(systemName: "person.3.fill") + .resizable() + .foregroundStyle(.black) + .keyframeAnimator( + initialValue: AnimationValues( + width: model.calculatingProportionalValue(withRatio: 0.2), + height: model.calculatingProportionalValue(withRatio: 0.1), + offsetX: model.calculatingProportionalValue(withRatio: 0.12), + offsetY: model.calculatingProportionalValue(withRatio: 0.538), + opacity: 0 + ), + trigger: isAnimating + ) { content, value in + content + .foregroundStyle(value.primaryColor) + .frame(width: value.width, height: value.height) + .offset(value.offset) + .opacity(value.opacity) + } keyframes: { value in + KeyframeTrack(\.opacity) { + CubicKeyframe(0, duration: 5) + CubicKeyframe(1, duration: 2) + } + } + + // MARK: - 􀝋 personCenterRight + Image(systemName: "person.3.fill") + .resizable() + .foregroundStyle(.black) + .keyframeAnimator( + initialValue: AnimationValues( + width: model.calculatingProportionalValue(withRatio: 0.2), + height: model.calculatingProportionalValue(withRatio: 0.1), + offsetX: model.calculatingProportionalValue(withRatio: -0.12), + offsetY: model.calculatingProportionalValue(withRatio: 0.538), + opacity: 0 + ), + trigger: isAnimating + ) { content, value in + content + .foregroundStyle(value.primaryColor) + .frame(width: value.width, height: value.height) + .offset(value.offset) + .opacity(value.opacity) + } keyframes: { value in + KeyframeTrack(\.opacity) { + CubicKeyframe(0, duration: 5) + CubicKeyframe(1, duration: 2) + } + } + } + } + + private var fireworks: some View { + ZStack { + // MARK: - 􀇲 smallFireworkPink + Image(systemName: "timelapse") + .resizable() + .foregroundStyle(.pink) + .frame(width: model.calculatingProportionalValue(withRatio: 0.125), + height: model.calculatingProportionalValue(withRatio: 0.125)) + .offset(x: model.calculatingProportionalValue(withRatio: -0.225), + y: model.calculatingProportionalValue(withRatio: 0.125)) + .keyframeAnimator(initialValue: 0, trigger: isAnimating) { content, value in + content + .opacity(value) + } keyframes: { value in + KeyframeTrack { + LinearKeyframe(0, duration: 10) + CubicKeyframe(1, duration: 1) + CubicKeyframe(0, duration: 2) + } + } + + // MARK: - 􀇲 smallFireworkYellow + Image(systemName: "timelapse") + .resizable() + .foregroundStyle(.yellow) + .frame(width: model.calculatingProportionalValue(withRatio: 0.125), + height: model.calculatingProportionalValue(withRatio: 0.125)) + .offset(x: model.calculatingProportionalValue(withRatio: -0.075), + y: model.calculatingProportionalValue(withRatio: 0.25)) + .keyframeAnimator(initialValue: 0, trigger: isAnimating) { content, value in + content + .opacity(value) + } keyframes: { value in + KeyframeTrack { + LinearKeyframe(0, duration: 12) + CubicKeyframe(1, duration: 1) + CubicKeyframe(0, duration: 2) + } + } + + // MARK: - 􀇲 smallFireworkGreen + Image(systemName: "timelapse") + .resizable() + .foregroundStyle(.green) + .frame(width: model.calculatingProportionalValue(withRatio: 0.125), + height: model.calculatingProportionalValue(withRatio: 0.125)) + .offset(x: model.calculatingProportionalValue(withRatio: 0.34), + y: model.calculatingProportionalValue(withRatio: 0.18)) + .keyframeAnimator(initialValue: 0, trigger: isAnimating) { content, value in + content + .opacity(value) + } keyframes: { value in + KeyframeTrack { + LinearKeyframe(0, duration: 13) + CubicKeyframe(1, duration: 1) + CubicKeyframe(0, duration: 2) + } + } + + // MARK: - 􂁞 mediumFirework + Image(systemName: "fireworks") + .resizable() + .foregroundStyle(.yellow, .red) + .frame(width: model.calculatingProportionalValue(withRatio: 0.24), + height: model.calculatingProportionalValue(withRatio: 0.24)) + .offset(x: model.calculatingProportionalValue(withRatio: 0.14), + y: model.calculatingProportionalValue(withRatio: 0.07)) + .keyframeAnimator(initialValue: 0, trigger: isAnimating) { content, value in + content + .opacity(value) + } keyframes: { value in + KeyframeTrack { + LinearKeyframe(0, duration: 15) + CubicKeyframe(1, duration: 1) + CubicKeyframe(0, duration: 2) + } + } + .symbolEffect(.bounce, value: isBouncedMediumFirework) + + largeFirework(primaryColor: .white, secondaryColor: .red) + .offset(x: model.calculatingProportionalValue(withRatio: -0.17), + y: model.calculatingProportionalValue(withRatio: -0.18)) + .keyframeAnimator(initialValue: 0, trigger: isAnimating) { content, value in + content + .opacity(value) + .scaleEffect(value) + } keyframes: { value in + KeyframeTrack { + LinearKeyframe(0, duration: 18) + CubicKeyframe(2, duration: 1) + CubicKeyframe(0, duration: 2) + } + } + .symbolEffect(.variableColor.dimInactiveLayers, + options: .repeating.speed(2), + isActive: true) + + largeFirework(primaryColor: .yellow, secondaryColor: .white) + .offset(x: model.calculatingProportionalValue(withRatio: 0.105), + y: model.calculatingProportionalValue(withRatio: -0.34)) + .keyframeAnimator(initialValue: 0, trigger: isAnimating) { content, value in + content + .opacity(value) + .scaleEffect(value) + } keyframes: { value in + KeyframeTrack { + LinearKeyframe(0, duration: 19) + CubicKeyframe(1.2, duration: 1) + CubicKeyframe(0, duration: 2) + } + } + .symbolEffect(.variableColor.dimInactiveLayers, + options: .repeating.speed(2), + isActive: true) + } + } + + // MARK: - RocketFirework + private func rocketFirework(_ color: Color) -> some View { + + ZStack { + // MARK: - 􁎄 Rocket smoke + Image(systemName: "water.waves") + .resizable() + .foregroundStyle(color) + .fontWeight(.ultraLight) + .frame(width: model.calculatingProportionalValue(withRatio: 0.2), + height: model.calculatingProportionalValue(withRatio: 0.1)) + .rotationEffect(.degrees(90)) + + // MARK: - 􀏄 Rocket smoke right concealment + Image(systemName: "rectangle.fill") + .resizable() + .foregroundStyle(.midnightNavy) + .frame(width: model.calculatingProportionalValue(withRatio: 0.05), + height: model.calculatingProportionalValue(withRatio: 0.2)) + .offset(x: model.calculatingProportionalValue(withRatio: 0.046)) + + // MARK: - 􀏄 Rocket smoke left concealment + Image(systemName: "rectangle.fill") + .resizable() + .foregroundStyle(.midnightNavy) + .frame(width: model.calculatingProportionalValue(withRatio: 0.05), + height: model.calculatingProportionalValue(withRatio: 0.2)) + .offset(x: model.calculatingProportionalValue(withRatio: -0.046)) + + // MARK: - 􀀁 Rocket smoke top + Image(systemName: "circle.fill") + .resizable() + .foregroundStyle(color) + .frame(width: model.calculatingProportionalValue(withRatio: 0.03), + height: model.calculatingProportionalValue(withRatio: 0.04)) + .offset(y: model.calculatingProportionalValue(withRatio: -0.1)) + } + } + + private func largeFirework(primaryColor: Color, secondaryColor: Color) -> some View { + ZStack { + // MARK: - 􀌙 large horizontal firework + Image(systemName: "dot.radiowaves.left.and.right") + .resizable() + .foregroundStyle(primaryColor, secondaryColor) + .fontWeight(.black) + .frame(width: model.calculatingProportionalValue(withRatio: 0.347), + height: model.calculatingProportionalValue(withRatio: 0.235)) + + // MARK: - 􀌙 large vertical firework + Image(systemName: "dot.radiowaves.left.and.right") + .resizable() + .foregroundStyle(primaryColor, secondaryColor) + .fontWeight(.black) + .frame(width: model.calculatingProportionalValue(withRatio: 0.347), + height: model.calculatingProportionalValue(withRatio: 0.235)) + .rotationEffect(.degrees(90)) + + // MARK: - 􁅃 large dot firework + Image(systemName: "circle.dotted") + .resizable() + .foregroundStyle(primaryColor) + .fontWeight(.ultraLight) + .frame(width: model.calculatingProportionalValue(withRatio: 0.42), + height: model.calculatingProportionalValue(withRatio: 0.42)) + } + } +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ImWearingPants/ImWearingPantsArtView+CoverArt.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ImWearingPants/ImWearingPantsArtView+CoverArt.swift new file mode 100644 index 0000000..d545b80 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ImWearingPants/ImWearingPantsArtView+CoverArt.swift @@ -0,0 +1,31 @@ +// +// ImWearingPantsArtView+CoverArt.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension ImWearingPantsArtView { + + struct CoverArt: View { + + var body: some View { + ZStack { + ForEach(FinishPoseElement.allCases) { + SymbolArtDisplayView(element: $0.value) + } + + ForEach(FaceElement.allCases) { + SymbolArtDisplayView(element: $0.value) + } + } + } + } +} + +#Preview { + ImWearingPantsArtView.CoverArt() + .environment(ArtWorkModel.preview) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ImWearingPants/ImWearingPantsArtView+FaceElement.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ImWearingPants/ImWearingPantsArtView+FaceElement.swift new file mode 100644 index 0000000..44b67f2 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ImWearingPants/ImWearingPantsArtView+FaceElement.swift @@ -0,0 +1,330 @@ +// +// ImWearingPantsArtView+FaceElement.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension ImWearingPantsArtView { + enum FaceElement: String, CaseIterable, Identifiable { + case musicFirst + case musicSecond + case faceBackground + case face + case joe + case nose + case eyebrowRight + case eyebrowLeft + case eyebrowConcealmentRight + case eyebrowConcealmentLeft + case eyeFrameRight + case eyeFrameLeft + case eyeRight + case eyeLeft + case mouthTop + case mouthBottom + case teethRight + case teethLeft + case hairTop + case hairRight + case hairLeft + + var id: String { rawValue } + + var value: SymbolArtElement { + switch self { + case .musicFirst: + SymbolArtElement( + symbol: "􀑪", + name: "music.note", + initialPosition: .second(.first), + primaryColor: .black, + widthRatio: 0.1, + heightRatio: 0.15, + horizontalOffsetRatio: 0.35, + verticalOffsetRatio: -0.5, + symbolCountToWaitFor: 0 + ) + case .musicSecond: + SymbolArtElement( + symbol: "􀫀", + name: "music.quarternote.3", + initialPosition: .second(.second), + primaryColor: .black, + widthRatio: 0.2, + heightRatio: 0.15, + horizontalOffsetRatio: -0.34, + verticalOffsetRatio: -0.38, + symbolCountToWaitFor: 1 + ) + case .faceBackground: + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .second(.third), + primaryColor: .systemBackground, + widthRatio: 0.2, + heightRatio: 0.2, + verticalOffsetRatio: -0.4, + symbolCountToWaitFor: 2 + ) + case .face: + SymbolArtElement( + symbol: "􀧷", + name: "capsule.portrait.fill", + initialPosition: .second(.fourth), + primaryColor: .yellow, + fontWeight: .ultraLight, + widthRatio: 0.16, + heightRatio: 0.22, + verticalOffsetRatio: -0.4, + symbolCountToWaitFor: 2 + ) + case .joe: + SymbolArtElement( + symbol: "􀧷", + name: "capsule.portrait.fill", + initialPosition: .second(.fourth), + primaryColor: .yellow, + widthRatio: 0.1, + heightRatio: 0.16, + verticalOffsetRatio: -0.35, + symbolCountToWaitFor: 2 + ) + case .nose: + SymbolArtElement( + symbol: "􀨯", + name: "nose", + initialPosition: .second(.fifth), + primaryColor: .black, + fontWeight: .ultraLight, + widthRatio: 0.045, + heightRatio: 0.06, + verticalOffsetRatio: -0.38, + symbolCountToWaitFor: 3 + ) + case .eyebrowRight: + SymbolArtElement( + symbol: "􀦭", + name: "eyebrow", + initialPosition: .second(.sixth), + primaryColor: .black, + fontWeight: .ultraLight, + widthRatio: 0.04, + heightRatio: 0.04, + horizontalOffsetRatio: 0.03, + verticalOffsetRatio: -0.41, + symbolCountToWaitFor: 4 + ) + case .eyebrowLeft: + SymbolArtElement( + symbol: "􀦭", + name: "eyebrow", + initialPosition: .second(.sixth), + primaryColor: .black, + fontWeight: .ultraLight, + widthRatio: 0.045, + heightRatio: 0.04, + flip: .horizontal, + horizontalOffsetRatio: -0.03, + verticalOffsetRatio: -0.408, + symbolCountToWaitFor: 4 + ) + case .eyebrowConcealmentRight: + SymbolArtElement( + symbol: "􀧷", + name: "capsule.portrait.fill", + initialPosition: .second(.fourth), + primaryColor: .yellow, + widthRatio: 0.05, + heightRatio: 0.02, + rotationDegrees: -10, + horizontalOffsetRatio: -0.035, + verticalOffsetRatio: -0.396, + symbolCountToWaitFor: 5 + ) + case .eyebrowConcealmentLeft: + SymbolArtElement( + symbol: "􀧷", + name: "capsule.portrait.fill", + initialPosition: .second(.fourth), + primaryColor: .yellow, + widthRatio: 0.05, + heightRatio: 0.02, + rotationDegrees: 10, + horizontalOffsetRatio: 0.035, + verticalOffsetRatio: -0.396, + symbolCountToWaitFor: 5 + ) + case .eyeFrameRight: + SymbolArtElement( + symbol: "􀋭", + name: "eye", + initialPosition: .second(.seventh), + primaryColor: .black, + fontWeight: .ultraLight, + widthRatio: 0.04, + heightRatio: 0.02, + horizontalOffsetRatio: 0.03, + verticalOffsetRatio: -0.4, + symbolCountToWaitFor: 5 + ) + case .eyeFrameLeft: + SymbolArtElement( + symbol: "􀋭", + name: "eye", + initialPosition: .second(.seventh), + primaryColor: .black, + fontWeight: .ultraLight, + widthRatio: 0.04, + heightRatio: 0.02, + horizontalOffsetRatio: -0.03, + verticalOffsetRatio: -0.4, + symbolCountToWaitFor: 5 + ) + case .eyeRight: + SymbolArtElement( + symbol: "􀋮", + name: "eye.fill", + initialPosition: .third(.seventh), + primaryColor: .white, + widthRatio: 0.04, + heightRatio: 0.02, + horizontalOffsetRatio: 0.03, + verticalOffsetRatio: -0.4, + symbolCountToWaitFor: 5 + ) + case .eyeLeft: + SymbolArtElement( + symbol: "􀋮", + name: "eye.fill", + initialPosition: .third(.seventh), + primaryColor: .white, + widthRatio: 0.04, + heightRatio: 0.02, + horizontalOffsetRatio: -0.03, + verticalOffsetRatio: -0.4, + symbolCountToWaitFor: 5 + ) + case .mouthTop: + SymbolArtElement( + symbol: "􀦪", + name: "mouth.fill", + initialPosition: .third(.third), + primaryColor: .red, + widthRatio: 0.06, + heightRatio: 0.02, + verticalOffsetRatio: -0.32, + symbolCountToWaitFor: 6 + ) + case .mouthBottom: + SymbolArtElement( + symbol: "􀦪", + name: "mouth.fill", + initialPosition: .third(.third), + primaryColor: .red, + widthRatio: 0.06, + heightRatio: 0.02, + verticalOffsetRatio: -0.33, + symbolCountToWaitFor: 6 + ) + case .teethRight: + SymbolArtElement( + symbol: "􁒀", + name: "window.casement.closed", + initialSecondaryColor: .clear, + initialPosition: .third(.fourth), + primaryColor: .black, + secondaryColor: .white, + fontWeight: .ultraLight, + widthRatio: 0.015, + heightRatio: 0.029, + rotationDegrees: 90, + horizontalOffsetRatio: 0.013, + verticalOffsetRatio: -0.328, + symbolCountToWaitFor: 7 + ) + case .teethLeft: + SymbolArtElement( + symbol: "􁒀", + name: "window.casement.closed", + initialSecondaryColor: .clear, + initialPosition: .third(.fourth), + primaryColor: .black, + secondaryColor: .white, + fontWeight: .ultraLight, + widthRatio: 0.015, + heightRatio: 0.029, + rotationDegrees: 90, + horizontalOffsetRatio: -0.014, + verticalOffsetRatio: -0.328, + symbolCountToWaitFor: 7 + ) + case .hairTop: + SymbolArtElement( + symbol: "􀲟", + name: "oval.fill", + initialPosition: .third(.fifth), + primaryColor: .black, + fontWeight: .ultraLight, + widthRatio: 0.14, + heightRatio: 0.057, + horizontalOffsetRatio: -0.001, + verticalOffsetRatio: -0.49, + symbolCountToWaitFor: 8 + ) + case .hairRight: + SymbolArtElement( + symbol: "􀠒", + name: "drop.fill", + initialPosition: .third(.sixth), + primaryColor: .black, + fontWeight: .ultraLight, + widthRatio: 0.05, + heightRatio: 0.06, + rotationDegrees: -65, + horizontalOffsetRatio: 0.04, + verticalOffsetRatio: -0.48, + symbolCountToWaitFor: 9 + ) + case .hairLeft: + SymbolArtElement( + symbol: "􀠒", + name: "drop.fill", + initialPosition: .third(.sixth), + primaryColor: .black, + fontWeight: .ultraLight, + widthRatio: 0.05, + heightRatio: 0.1, + rotationDegrees: 95, + horizontalOffsetRatio: -0.03, + verticalOffsetRatio: -0.47, + symbolCountToWaitFor: 9 + ) + } + } + + var isMusic: Bool { + switch self { + case .musicFirst, .musicSecond: + true + default: + false + } + } + } +} + +#Preview { + NavigationStack { + ImWearingPantsArtView() + .environment(ArtWorkModel.preview) + } +} + +#Preview { + ImWearingPantsArtView.CoverArt() + .environment(ArtWorkModel.preview) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ImWearingPants/ImWearingPantsArtView+FinishPoseElement.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ImWearingPants/ImWearingPantsArtView+FinishPoseElement.swift new file mode 100644 index 0000000..0515a40 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ImWearingPants/ImWearingPantsArtView+FinishPoseElement.swift @@ -0,0 +1,368 @@ +// +// ImWearingPantsArtView+FinishPoseElement.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension ImWearingPantsArtView { + + enum FinishPoseElement: String, CaseIterable, Identifiable { + case body + case chestShadowRight + case chestShadowLeft + case handConcealmentRight + case handConcealmentLeft + case neck + case neckShapingConcealmentRight + case neckShapingConcealmentLeft + case chestRight + case chestLeft + case armRight + case armLeft + case pants + case pantsHoleConcealment + case pantsPatternFirst + case pantsPatternSecond + case pantsPatternThird + case pantsPatternFourth + case pantsConcealmentRight + case pantsConcealmentLeft + case abdomen + case bellyButton + case nippleRight + case nippleLeft + + var id: String { rawValue } + + var value: SymbolArtElement { + switch self { + case .body: + SymbolArtElement( + symbol: "􁗅", + name: "figure.arms.open", + initialPosition: .none, + primaryColor: .yellow, + widthRatio: 0.6, + heightRatio: 1, + symbolCountToWaitFor: 0 + ) + case .chestShadowRight: + SymbolArtElement( + symbol: "􀆹", + name: "moon", + initialPosition: .none, + primaryColor: .black.opacity(0.6), + fontWeight: .ultraLight, + widthRatio: 0.06, + heightRatio: 0.015, + rotationDegrees: -10, + horizontalOffsetRatio: -0.09, + verticalOffsetRatio: -0.125, + symbolCountToWaitFor: 0 + ) + case .chestShadowLeft: + SymbolArtElement( + symbol: "􀆹", + name: "moon", + initialPosition: .none, + primaryColor: .black.opacity(0.6), + fontWeight: .ultraLight, + widthRatio: 0.06, + heightRatio: 0.015, + rotationDegrees: -10, + flip: .horizontal, + horizontalOffsetRatio: 0.085, + verticalOffsetRatio: -0.125, + symbolCountToWaitFor: 0 + ) + case .handConcealmentRight: + SymbolArtElement( + symbol: "􀏄", + name: "rectangle.fill", + initialPosition: .none, + primaryColor: .systemBackground, + fontWeight: .black, + widthRatio: 0.3, + heightRatio: 0.4, + horizontalOffsetRatio: -0.25, + verticalOffsetRatio: -0.1, + symbolCountToWaitFor: 0 + ) + case .handConcealmentLeft: + SymbolArtElement( + symbol: "􀏄", + name: "rectangle.fill", + initialPosition: .none, + primaryColor: .systemBackground, + fontWeight: .black, + widthRatio: 0.3, + heightRatio: 0.4, + horizontalOffsetRatio: 0.25, + verticalOffsetRatio: -0.1, + symbolCountToWaitFor: 0 + ) + case .neck: + SymbolArtElement( + symbol: "􀊡", + name: "speaker.fill", + initialPosition: .none, + primaryColor: .yellow, + widthRatio: 0.2, + heightRatio: 0.38, + rotationDegrees: 90, + horizontalOffsetRatio: -0.005, + verticalOffsetRatio: -0.27, + symbolCountToWaitFor: 0 + ) + case .neckShapingConcealmentRight: + SymbolArtElement( + symbol: "􀂓", + name: "square.fill", + initialPosition: .none, + primaryColor: .systemBackground, + widthRatio: 0.2, + heightRatio: 0.2, + rotationDegrees: 90, + horizontalOffsetRatio: 0.14, + verticalOffsetRatio: -0.385, + symbolCountToWaitFor: 0 + ) + case .neckShapingConcealmentLeft: + SymbolArtElement( + symbol: "􀂓", + name: "square.fill", + initialPosition: .none, + primaryColor: .systemBackground, + widthRatio: 0.2, + heightRatio: 0.2, + rotationDegrees: 90, + horizontalOffsetRatio: -0.14, + verticalOffsetRatio: -0.385, + symbolCountToWaitFor: 0 + ) + case .chestRight: + SymbolArtElement( + symbol: "􀆺", + name: "moon.fill", + initialPosition: .none, + primaryColor: .yellow, + widthRatio: 0.06, + heightRatio: 0.04, + rotationDegrees: -10, + horizontalOffsetRatio: -0.09, + verticalOffsetRatio: -0.138, + symbolCountToWaitFor: 0 + ) + case .chestLeft: + SymbolArtElement( + symbol: "􀆺", + name: "moon.fill", + initialPosition: .none, + primaryColor: .yellow, + widthRatio: 0.06, + heightRatio: 0.04, + rotationDegrees: -10, + flip: .horizontal, + horizontalOffsetRatio: 0.085, + verticalOffsetRatio: -0.138, + symbolCountToWaitFor: 0 + ) + case .armRight: + SymbolArtElement( + symbol: "􀆊", + name: "chevron.right", + initialPosition: .none, + primaryColor: .yellow, + fontWeight: .black, + widthRatio: 0.2, + heightRatio: 0.3, + horizontalOffsetRatio: 0.2, + verticalOffsetRatio: -0.08, + symbolCountToWaitFor: 0 + ) + case .armLeft: + SymbolArtElement( + symbol: "􀆉", + name: "chevron.left", + initialPosition: .none, + primaryColor: .yellow, + fontWeight: .black, + widthRatio: 0.2, + heightRatio: 0.3, + horizontalOffsetRatio: -0.2, + verticalOffsetRatio: -0.08, + symbolCountToWaitFor: 0 + ) + // UnderLayer + case .pants: + SymbolArtElement( + symbol: "􁉨", + name: "parkingsign.steeringwheel", + initialPosition: .third(.first), + primaryColor: .palePink, + fontWeight: .ultraLight, + widthRatio: 0.35, + heightRatio: 0.2, + horizontalOffsetRatio: -0.07, + verticalOffsetRatio: 0.03, + symbolCountToWaitFor: 16 + ) + case .pantsHoleConcealment: + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .none, + primaryColor: .palePink, + widthRatio: 0.06, + heightRatio: 0.06, + horizontalOffsetRatio: -0.01, + verticalOffsetRatio: 0.04, + symbolCountToWaitFor: 0 + ) + case .pantsPatternFirst: + SymbolArtElement( + symbol: "􁁌", + name: "fan.fill", + initialPosition: .none, + primaryColor: .white, + widthRatio: 0.04, + heightRatio: 0.04, + horizontalOffsetRatio: -0.01, + verticalOffsetRatio: 0.04, + symbolCountToWaitFor: 0 + ) + case .pantsPatternSecond: + SymbolArtElement( + symbol: "􁁌", + name: "fan.fill", + initialPosition: .none, + primaryColor: .white, + widthRatio: 0.04, + heightRatio: 0.04, + horizontalOffsetRatio: -0.08, + verticalOffsetRatio: 0.02, + symbolCountToWaitFor: 0 + ) + case .pantsPatternThird: + SymbolArtElement( + symbol: "􁁌", + name: "fan.fill", + initialPosition: .none, + primaryColor: .white, + widthRatio: 0.04, + heightRatio: 0.04, + horizontalOffsetRatio: 0.08, + verticalOffsetRatio: 0.02, + symbolCountToWaitFor: 0 + ) + case .pantsPatternFourth: + SymbolArtElement( + symbol: "􁁌", + name: "fan.fill", + initialPosition: .none, + primaryColor: .white, + widthRatio: 0.04, + heightRatio: 0.04, + verticalOffsetRatio: 0.099, + symbolCountToWaitFor: 0 + ) + case .pantsConcealmentRight: + SymbolArtElement( + symbol: "􀲟", + name: "oval.fill", + initialPosition: .none, + primaryColor: .yellow, + widthRatio: 0.11, + heightRatio: 0.03, + rotationDegrees: 45, + horizontalOffsetRatio: -0.07, + verticalOffsetRatio: 0.09, + symbolCountToWaitFor: 0 + ) + case .pantsConcealmentLeft: + SymbolArtElement( + symbol: "􀲟", + name: "oval.fill", + initialPosition: .none, + primaryColor: .yellow, + widthRatio: 0.11, + heightRatio: 0.03, + rotationDegrees: -47, + horizontalOffsetRatio: 0.06, + verticalOffsetRatio: 0.089, + symbolCountToWaitFor: 0 + ) + case .abdomen: + SymbolArtElement( + symbol: "􁎘", + name: "visionpro.fill", + initialPosition: .none, + primaryColor: .yellow, + fontWeight: .ultraLight, + widthRatio: 0.25, + heightRatio: 0.15, + rotationDegrees: 180, + verticalOffsetRatio: -0.045, + symbolCountToWaitFor: 0 + ) + case .bellyButton: + SymbolArtElement( + symbol: "􀥤", + name: "poweron", + initialPosition: .none, + primaryColor: .black, + fontWeight: .ultraLight, + widthRatio: 0.02, + heightRatio: 0.002, + rotationDegrees: 180, + symbolCountToWaitFor: 0 + ) + case .nippleRight: + SymbolArtElement( + symbol: "􀕩", + name: "smallcircle.filled.circle.fill", + initialPosition: .none, + primaryColor: .yellow, + secondaryColor: .brown, + fontWeight: .ultraLight, + widthRatio: 0.02, + heightRatio: 0.01, + rotationDegrees: 15, + horizontalOffsetRatio: 0.09, + verticalOffsetRatio: -0.138, + symbolCountToWaitFor: 0 + ) + case .nippleLeft: + SymbolArtElement( + symbol: "􀕩", + name: "smallcircle.filled.circle.fill", + initialPosition: .none, + primaryColor: .yellow, + secondaryColor: .brown, + fontWeight: .ultraLight, + widthRatio: 0.02, + heightRatio: 0.01, + rotationDegrees: -15, + horizontalOffsetRatio: -0.09, + verticalOffsetRatio: -0.14, + symbolCountToWaitFor: 0 + ) + } + } + } +} + +#Preview { + NavigationStack { + ImWearingPantsArtView() + .environment(ArtWorkModel.preview) + } +} + +#Preview { + ImWearingPantsArtView.CoverArt() + .environment(ArtWorkModel.preview) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ImWearingPants/ImWearingPantsArtView+Pose.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ImWearingPants/ImWearingPantsArtView+Pose.swift new file mode 100644 index 0000000..2781d84 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ImWearingPants/ImWearingPantsArtView+Pose.swift @@ -0,0 +1,100 @@ +// +// ImWearingPantsArtView+Pose.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension ImWearingPantsArtView { + + enum Pose: String { + case walk = "figure.walk" + case discSport = "figure.disc.sports" + case martialArts = "figure.martial.arts" + case strengthTraining = "figure.strengthtraining.traditional" + case football = "figure.australian.football" + case intervalTraining = "figure.highintensity.intervaltraining" + case finish = "" + + var element: SymbolArtElement { + SymbolArtElement( + symbol: symbol, + name: rawValue, + initialPosition: .third(.second), + primaryColor: .yellow, + widthRatio: 0.6, + heightRatio: 1, + symbolCountToWaitFor: 10 + ) + } + + var symbol: String { + switch self { + case .walk: + "􀝢" + case .discSport: + "􁔣" + case .martialArts: + "􁔳" + case .strengthTraining: + "􁐃" + case .football: + "􁒒" + case .intervalTraining: + "􁌎" + case .finish: + "" + } + } + + var next: Pose { + switch self { + case .walk: + .discSport + case .discSport: + .martialArts + case .martialArts: + .strengthTraining + case .strengthTraining: + .football + case .football: + .intervalTraining + case .intervalTraining: + .finish + case .finish: + .finish + } + } + + var isFinished: Bool { + self == .finish + } + + var offsetXRatio: CGFloat { + switch self { + case .walk, .discSport, .strengthTraining, .finish: + 0 + case .martialArts: + 0.04 + case .football: + -0.1 + case .intervalTraining: + -0.01 + } + } + } +} + +#Preview { + NavigationStack { + ImWearingPantsArtView() + .environment(ArtWorkModel.preview) + } +} + +#Preview { + ImWearingPantsArtView.CoverArt() + .environment(ArtWorkModel.preview) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ImWearingPants/ImWearingPantsArtView.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ImWearingPants/ImWearingPantsArtView.swift new file mode 100644 index 0000000..aceca1c --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/ImWearingPants/ImWearingPantsArtView.swift @@ -0,0 +1,95 @@ +// +// ImWearingPantsArtView.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +struct ImWearingPantsArtView: View { + + @Environment(ArtWorkModel.self) var model + @State private var isAnimating = false + @State private var isChangingPose = false + @State private var musicCount = 0 + @State private var musicTimer: Timer? + @State private var currentPose: Pose = .walk + @State private var poseTimer: Timer? + + var body: some View { + + ZStack { + + // MARK: - Current pose + AnimatableSymbolView(element: currentPose.element, isAnimating: isAnimating) + .contentTransition(isChangingPose ? .symbolEffect(.replace) : .identity) + .offset(x: model.calculatingProportionalValue(withRatio: currentPose.offsetXRatio)) + + ForEach(FinishPoseElement.allCases) { + + if $0 == .pants { + AnimatableSymbolView(element: $0.value, isAnimating: isAnimating) + } else if currentPose.isFinished { + SymbolArtDisplayView(shouldResizeForCoverArt: false, element: $0.value) + .transition(.symbolEffect(.appear)) + } + } + + ForEach(FaceElement.allCases) { + AnimatableSymbolView(element: $0.value, isAnimating: isAnimating) + .symbolEffect(.bounce, value: $0.isMusic ? musicCount : 0) + } + } + .toolbar(content: { + ToolbarItemGroup(placement: .bottomBar) { + Spacer() + + PlayButton { + isAnimating = true + } + .font(.system(size: 32)) + .disabled(isAnimating) + } + }) + .onChange(of: isAnimating) { _, newValue in + if newValue { + Timer.scheduledTimer( + withTimeInterval: model.waitingTime(forCount: 11), + repeats: false + ) { _ in + isChangingPose = true + } + } + } + .onChange(of: isChangingPose) { _, newValue in + if newValue { + poseTimer = Timer.scheduledTimer( + withTimeInterval: model.waitingTime(forCount: 1), + repeats: true + ) { _ in + currentPose = currentPose.next + + if currentPose == .finish { + poseTimer?.invalidate() + musicTimer?.invalidate() + } + } + + musicTimer = Timer.scheduledTimer( + withTimeInterval: 0.4, + repeats: true + ) { _ in + musicCount += 1 + } + } + } + } +} + +#Preview { + NavigationStack { + ImWearingPantsArtView() + .environment(ArtWorkModel.preview) + } +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Magician/MagicianArtView+CoverArt.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Magician/MagicianArtView+CoverArt.swift new file mode 100644 index 0000000..4676d34 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Magician/MagicianArtView+CoverArt.swift @@ -0,0 +1,27 @@ +// +// MagicianArtView+CoverArt.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension MagicianArtView { + + struct CoverArt: View { + + var body: some View { + ZStack { + ForEach(Element.allCases) { + SymbolArtDisplayView(element: $0.value) + } + } + } + } +} + +#Preview { + MagicianArtView.CoverArt() + .environment(ArtWorkModel.preview) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Magician/MagicianArtView+Element.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Magician/MagicianArtView+Element.swift new file mode 100644 index 0000000..25549c3 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Magician/MagicianArtView+Element.swift @@ -0,0 +1,221 @@ +// +// MagicianArtView+Element.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension MagicianArtView { + + enum Element: String, CaseIterable, Identifiable { + case outline + case hatBand + case hat + case hatBrim + case eyeBrowRight + case eyeBrowLeft + case sunGlassesFrameLeading + case sunGlassesFrameCenter + case sunGlassesFrameTrailing + case sunGlassesLensRight + case sunGlassesLensLeft + case nose + case mouth + case tongue + + var id: String { rawValue } + + var value: SymbolArtElement { + switch self { + case .outline: + SymbolArtElement( + symbol: "􀠒", + name: "drop.fill", + initialPosition: .second(.first), + primaryColor: .paleOrange, + widthRatio: 0.5, + heightRatio: 0.75, + rotationDegrees: 180, + verticalOffsetRatio: 0.15, + symbolCountToWaitFor: 0 + ) + case .hatBand: + SymbolArtElement( + symbol: "􀏄", + name: "rectangle.fill", + initialPosition: .second(.second), + primaryColor: .red, + widthRatio: 0.446, + heightRatio: 0.1, + horizontalOffsetRatio: 0.01, + verticalOffsetRatio: -0.15, + symbolCountToWaitFor: 1 + ) + case .hat: + SymbolArtElement( + symbol: "􀈮", + name: "archivebox.fill", + initialPosition: .third(.first), + primaryColor: .black, + widthRatio: 0.525, + heightRatio: 0.525, + rotationDegrees: 180, + verticalOffsetRatio: -0.25, + symbolCountToWaitFor: 2 + ) + case .hatBrim: + SymbolArtElement( + symbol: "􀏄", + name: "rectangle.fill", + initialPosition: .second(.second), + primaryColor: .black, + widthRatio: 0.625, + heightRatio: 0.125, + verticalOffsetRatio: -0.05, + symbolCountToWaitFor: 3 + ) + case .eyeBrowRight: + SymbolArtElement( + symbol: "􀆐", + name: "chevron.compact.up", + initialPosition: .third(.second), + primaryColor: .black, + fontWeight: .thin, + widthRatio: 0.1, + heightRatio: 0.04, + horizontalOffsetRatio: 0.1, + verticalOffsetRatio: 0.03, + symbolCountToWaitFor: 4 + ) + case .eyeBrowLeft: + SymbolArtElement( + symbol: "􀆐", + name: "chevron.compact.up", + initialPosition: .third(.second), + primaryColor: .black, + fontWeight: .thin, + widthRatio: 0.1, + heightRatio: 0.04, + horizontalOffsetRatio: -0.1, + verticalOffsetRatio: 0.03, + symbolCountToWaitFor: 4 + ) + case .sunGlassesFrameLeading: + SymbolArtElement( + symbol: "􀅽", + name: "minus", + initialPosition: .third(.third), + primaryColor: .black, + fontWeight: .thin, + widthRatio: 0.06, + heightRatio: 0.0125, + verticalOffsetRatio: 0.12, + symbolCountToWaitFor: 5 + ) + case .sunGlassesFrameCenter: + SymbolArtElement( + symbol: "􀅽", + name: "minus", + initialPosition: .third(.third), + primaryColor: .black, + fontWeight: .thin, + widthRatio: 0.06, + heightRatio: 0.0125, + horizontalOffsetRatio: 0.2, + verticalOffsetRatio: 0.12, + symbolCountToWaitFor: 5 + ) + case .sunGlassesFrameTrailing: + SymbolArtElement( + symbol: "􀅽", + name: "minus", + initialPosition: .third(.third), + primaryColor: .black, + fontWeight: .thin, + widthRatio: 0.04, + heightRatio: 0.0125, + horizontalOffsetRatio: -0.2, + verticalOffsetRatio: 0.12, + symbolCountToWaitFor: 5 + ) + case .sunGlassesLensRight: + SymbolArtElement( + symbol: "􀆼", + name: "moon.circle.fill", + initialPrimaryColor: .white, + initialPosition: .third(.fourth), + primaryColor: .white, + widthRatio: 0.125, + heightRatio: 0.125, + horizontalOffsetRatio: 0.1, + verticalOffsetRatio: 0.12, + symbolCountToWaitFor: 6 + ) + case .sunGlassesLensLeft: + SymbolArtElement( + symbol: "􀆼", + name: "moon.circle.fill", + initialPrimaryColor: .white, + initialPosition: .third(.fourth), + primaryColor: .white, + widthRatio: 0.125, + heightRatio: 0.125, + horizontalOffsetRatio: -0.1, + verticalOffsetRatio: 0.12, + symbolCountToWaitFor: 6 + ) + case .nose: + SymbolArtElement( + symbol: "􀇈", + name: "cloud.heavyrain", + initialPosition: .third(.fifth), + primaryColor: .black, + fontWeight: .light, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: 0.01, + verticalOffsetRatio: 0.27, + symbolCountToWaitFor: 7 + ) + case .mouth: + SymbolArtElement( + symbol: "􀩻", + name: "button.roundedbottom.horizontal.fill", + initialPosition: .third(.sixth), + primaryColor: .red, + widthRatio: 0.15, + heightRatio: 0.075, + horizontalOffsetRatio: 0.01, + verticalOffsetRatio: 0.4, + symbolCountToWaitFor: 8 + ) + case .tongue: + SymbolArtElement( + symbol: "􀝷", + name: "capsule.fill", + initialPosition: .third(.seventh), + primaryColor: .orange, + widthRatio: 0.145, + heightRatio: 0.025, + horizontalOffsetRatio: 0.01, + verticalOffsetRatio: 0.424, + symbolCountToWaitFor: 9 + ) + } + } + } +} + +#Preview { + NavigationStack { + MagicianArtView() + .environment(ArtWorkModel.preview) + } +} + +#Preview { + MagicianArtView.CoverArt() + .environment(ArtWorkModel.preview) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Magician/MagicianArtView.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Magician/MagicianArtView.swift new file mode 100644 index 0000000..2000b35 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Magician/MagicianArtView.swift @@ -0,0 +1,40 @@ +// +// MagicianArtView.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +struct MagicianArtView: View { + + @State private var isAnimating = false + + var body: some View { + ZStack { + ForEach(Element.allCases) { + AnimatableSymbolView(element: $0.value, + isAnimating: isAnimating) + } + } + .toolbar(content: { + ToolbarItemGroup(placement: .bottomBar) { + Spacer() + + PlayButton { + isAnimating = true + } + .font(.system(size: 32)) + .disabled(isAnimating) + } + }) + } +} + +#Preview { + NavigationStack { + MagicianArtView() + .environment(ArtWorkModel.preview) + } +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Nosebleed/NosebleedArtView+CoverArt.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Nosebleed/NosebleedArtView+CoverArt.swift new file mode 100644 index 0000000..e4d50ad --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Nosebleed/NosebleedArtView+CoverArt.swift @@ -0,0 +1,28 @@ +// +// NosebleedArtView+CoverArt.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension NosebleedArtView { + + struct CoverArt: View { + + var body: some View { + + ZStack { + ForEach(Element.allCases) { + SymbolArtDisplayView(element: $0.value) + } + } + } + } +} + +#Preview { + NosebleedArtView.CoverArt() + .environment(ArtWorkModel.preview) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Nosebleed/NosebleedArtView+Element.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Nosebleed/NosebleedArtView+Element.swift new file mode 100644 index 0000000..b750ecc --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Nosebleed/NosebleedArtView+Element.swift @@ -0,0 +1,235 @@ +// +// NosebleedArtView+Element.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension NosebleedArtView { + + enum Element: String, CaseIterable, Identifiable { + case outline + case nosebleedBottom + case nosebleedBottomConcealment + case mouth + case mouthConcealment + case nosebleedTop + case nosebleedTopConcealmentRight + case nosebleedTopConcealmentLeft + case eyeRight + case eyeLeft + case tissue + case tissueFrame + case nose + case noseConcealment + + var id: String { rawValue } + + var value: SymbolArtElement { + switch self { + case .outline: + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .third(.first), + primaryColor: .awesomeYellow, + widthRatio: 0.65, + heightRatio: 0.65, + symbolCountToWaitFor: 3 + ) + case .nosebleedBottom: + SymbolArtElement( + symbol: "􀭧", + name: "cellularbars", + initialPosition: .third(.second), + primaryColor: .red, + fontWeight: .ultraLight, + widthRatio: 0.2, + heightRatio: 0.5, + rotationDegrees: 180, + horizontalOffsetRatio: 0.09, + verticalOffsetRatio: 0.074, + symbolCountToWaitFor: 1 + ) + case .nosebleedBottomConcealment: + SymbolArtElement( + symbol: "􀏄", + name: "rectangle.fill", + initialPosition: .third(.third), + primaryColor: .awesomeYellow, + widthRatio: 0.1, + heightRatio: 0.14, + horizontalOffsetRatio: 0.09, + verticalOffsetRatio: 0.15, + symbolCountToWaitFor: 2 + ) + case .mouth: + SymbolArtElement( + symbol: "􀓩", + name: "lasso", + initialPosition: .third(.fourth), + primaryColor: .black, + fontWeight: .ultraLight, + widthRatio: 0.4, + heightRatio: 0.3, + rotationDegrees: 170, + horizontalOffsetRatio: 0.01, + verticalOffsetRatio: 0.05, + symbolCountToWaitFor: 0 + ) + case .mouthConcealment: + SymbolArtElement( + symbol: "􀏄", + name: "rectangle.fill", + initialPosition: .third(.third), + primaryColor: .awesomeYellow, + widthRatio: 0.5, + heightRatio: 0.3, + rotationDegrees: 176, + verticalOffsetRatio: -0.03, + symbolCountToWaitFor: 2 + ) + case .nosebleedTop: + SymbolArtElement( + symbol: "􀭧", + name: "cellularbars", + initialPosition: .third(.second), + primaryColor: .red, + fontWeight: .ultraLight, + widthRatio: 0.2, + heightRatio: 0.12, + rotationDegrees: 180, + horizontalOffsetRatio: 0.033, + verticalOffsetRatio: 0.096, + symbolCountToWaitFor: 1 + ) + case .nosebleedTopConcealmentRight: + SymbolArtElement( + symbol: "􀏄", + name: "rectangle.fill", + initialPosition: .third(.third), + primaryColor: .awesomeYellow, + widthRatio: 0.1, + heightRatio: 0.1, + horizontalOffsetRatio: 0.09, + verticalOffsetRatio: 0.06, + symbolCountToWaitFor: 2 + ) + case .nosebleedTopConcealmentLeft: + SymbolArtElement( + symbol: "􀏄", + name: "rectangle.fill", + initialPosition: .third(.third), + primaryColor: .awesomeYellow, + widthRatio: 0.04, + heightRatio: 0.14, + horizontalOffsetRatio: -0.047, + verticalOffsetRatio: 0.09, + symbolCountToWaitFor: 2 + ) + case .eyeRight: + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .third(.first), + primaryColor: .black, + widthRatio: 0.06, + heightRatio: 0.06, + horizontalOffsetRatio: 0.117, + verticalOffsetRatio: -0.176, + symbolCountToWaitFor: 3 + ) + case .eyeLeft: + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .third(.first), + primaryColor: .black, + widthRatio: 0.06, + heightRatio: 0.06, + horizontalOffsetRatio: -0.113, + verticalOffsetRatio: -0.17, + symbolCountToWaitFor: 3 + ) + case .tissue: + SymbolArtElement( + symbol: "􀥨", + name: "doc.plaintext.fill", + initialPosition: .third(.fifth), + primaryColor: .white, + fontWeight: .ultraLight, + widthRatio: 0.04, + heightRatio: 0.08, + rotationDegrees: 188, + horizontalOffsetRatio: -0.052, + verticalOffsetRatio: 0.083, + symbolCountToWaitFor: 6 + ) + case .tissueFrame: + SymbolArtElement( + symbol: "􀉆", + name: "doc.plaintext", + initialPosition: .third(.sixth), + primaryColor: .black, + fontWeight: .light, + widthRatio: 0.04, + heightRatio: 0.08, + rotationDegrees: 188, + horizontalOffsetRatio: -0.052, + verticalOffsetRatio: 0.083, + symbolCountToWaitFor: 6 + ) + case .nose: + SymbolArtElement( + symbol: "􀥰", + name: "triangleshape", + initialPosition: .third(.seventh), + primaryColor: .black, + fontWeight: .light, + widthRatio: 0.15, + heightRatio: 0.14, + rotationDegrees: -4, + horizontalOffsetRatio: -0.013, + verticalOffsetRatio: -0.02, + symbolCountToWaitFor: 4 + ) + case .noseConcealment: + SymbolArtElement( + symbol: "􀏄", + name: "rectangle.fill", + initialPosition: .third(.third), + primaryColor: .awesomeYellow, + widthRatio: 0.02, + heightRatio: 0.13, + rotationDegrees: 148, + horizontalOffsetRatio: 0.007, + verticalOffsetRatio: -0.046, + symbolCountToWaitFor: 5 + ) + } + } + + var isNosebleed: Bool { + switch self { + case .nosebleedBottom, .nosebleedTop: + true + default: + false + } + } + } +} + +#Preview { + NavigationStack { + NosebleedArtView() + .environment(ArtWorkModel.preview) + } +} + +#Preview { + NosebleedArtView.CoverArt() + .environment(ArtWorkModel.preview) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Nosebleed/NosebleedArtView.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Nosebleed/NosebleedArtView.swift new file mode 100644 index 0000000..ae99545 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/Nosebleed/NosebleedArtView.swift @@ -0,0 +1,55 @@ +// +// NosebleedArtView.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +struct NosebleedArtView: View { + + @Environment(ArtWorkModel.self) var model + @State private var isAnimating = false + @State private var isEffectActivated = false + + var body: some View { + + ZStack { + ForEach(Element.allCases) { + AnimatableSymbolView(element: $0.value, isAnimating: isAnimating) + .symbolEffect(.variableColor.hideInactiveLayers, + options: .speed(0.6).repeating, + isActive: $0.isNosebleed ? isEffectActivated : false) + } + } + .toolbar(content: { + ToolbarItemGroup(placement: .bottomBar) { + Spacer() + + PlayButton { + isAnimating = true + } + .font(.system(size: 32)) + .disabled(isAnimating) + } + }) + .onChange(of: isAnimating) { _, newValue in + if newValue { + Timer.scheduledTimer( + withTimeInterval: model.waitingTime(forCount: 7), + repeats: false + ) { _ in + isEffectActivated = true + } + } + } + } +} + +#Preview { + NavigationStack { + NosebleedArtView() + .environment(ArtWorkModel.preview) + } +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/PartyAnimals/PartyAnimalsArtView+CoverArt.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/PartyAnimals/PartyAnimalsArtView+CoverArt.swift new file mode 100644 index 0000000..3483625 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/PartyAnimals/PartyAnimalsArtView+CoverArt.swift @@ -0,0 +1,27 @@ +// +// PartyAnimalsArtView+CoverArt.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension PartyAnimalsArtView { + + struct CoverArt: View { + + var body: some View { + ZStack { + ForEach(Element.allCases) { + SymbolArtDisplayView(element: $0.value) + } + } + } + } +} + +#Preview { + PartyAnimalsArtView.CoverArt() + .environment(ArtWorkModel.preview) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/PartyAnimals/PartyAnimalsArtView+Element.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/PartyAnimals/PartyAnimalsArtView+Element.swift new file mode 100644 index 0000000..1908358 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/PartyAnimals/PartyAnimalsArtView+Element.swift @@ -0,0 +1,456 @@ +// +// PartyAnimalsArtView+Element.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension PartyAnimalsArtView { + + enum Element: String, CaseIterable, Identifiable { + case bearEarRight + case bearEarLeft + case bearEarInsideRight + case bearEarInsideLeft + case bearOutline + case bearEyeRight + case bearEyeLeft + case bearMouth + case bearNose + case flogEyeOutlineRight + case flogEyeOutlineLeft + case flogEyeRight + case flogEyeLeft + case flogOutline + case flogMouth + case lionManeFirst + case lionManeSecond + case lionEarRight + case lionEarLeft + case lionOutline + case lionEyeRight + case lionEyeLeft + case lionWhiskersRight + case lionWhiskersLeft + case lionMouth + case lionNose + case pawFirst + case pawSecond + case pawThird + case pawFourth + + var id: String { rawValue } + + var value: SymbolArtElement { + switch self { + case .bearEarRight: + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .third(.third), + primaryColor: .brown, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: 0.08, + verticalOffsetRatio: -0.37, + symbolCountToWaitFor: 1 + ) + case .bearEarLeft: + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .third(.third), + primaryColor: .brown, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: 0.32, + verticalOffsetRatio: -0.37, + symbolCountToWaitFor: 1 + ) + case .bearEarInsideRight: + SymbolArtElement( + symbol: "􀩹", + name: "button.roundedtop.horizontal.fill", + initialPosition: .third(.fourth), + primaryColor: .palePink, + widthRatio: 0.06, + heightRatio: 0.06, + rotationDegrees: -20, + horizontalOffsetRatio: 0.08, + verticalOffsetRatio: -0.37, + symbolCountToWaitFor: 0 + ) + case .bearEarInsideLeft: + SymbolArtElement( + symbol: "􀩹", + name: "button.roundedtop.horizontal.fill", + initialPosition: .third(.fourth), + primaryColor: .palePink, + widthRatio: 0.06, + heightRatio: 0.06, + rotationDegrees: 20, + horizontalOffsetRatio: 0.32, + verticalOffsetRatio: -0.37, + symbolCountToWaitFor: 0 + ) + case .bearOutline: + SymbolArtElement( + symbol: "􀲟", + name: "oval.fill", + initialPosition: .third(.fifth), + primaryColor: .brown, + widthRatio: 0.4, + heightRatio: 0.325, + horizontalOffsetRatio: 0.2, + verticalOffsetRatio: -0.2, + symbolCountToWaitFor: 8 + ) + case .bearEyeRight: + SymbolArtElement( + symbol: "􀢚", + name: "record.circle.fill", + initialPrimaryColor: .systemBackground, + initialPosition: .third(.sixth), + primaryColor: .white, + secondaryColor: .darkBrown, + widthRatio: 0.05, + heightRatio: 0.05, + horizontalOffsetRatio: 0.13, + verticalOffsetRatio: -0.23, + symbolCountToWaitFor: 7 + ) + + case .bearEyeLeft: + SymbolArtElement( + symbol: "􀢚", + name: "record.circle.fill", + initialPrimaryColor: .systemBackground, + initialPosition: .third(.sixth), + primaryColor: .white, + secondaryColor: .darkBrown, + widthRatio: 0.05, + heightRatio: 0.05, + horizontalOffsetRatio: 0.27, + verticalOffsetRatio: -0.23, + symbolCountToWaitFor: 7 + ) + case .bearMouth: + SymbolArtElement( + symbol: "􀁹", + name: "arrow.down.circle.fill", + initialPrimaryColor: .systemBackground, + initialPosition: .second(.third), + primaryColor: .black, + secondaryColor: .white, + widthRatio: 0.125, + heightRatio: 0.125, + horizontalOffsetRatio: 0.2, + verticalOffsetRatio: -0.15, + symbolCountToWaitFor: 5 + ) + case .bearNose: + SymbolArtElement( + symbol: "􀆼", + name: "moon.circle.fill", + initialPrimaryColor: .systemBackground, + initialPosition: .third(.seventh), + primaryColor: .white, + secondaryColor: .red, + widthRatio: 0.04, + heightRatio: 0.04, + rotationDegrees: 170, + horizontalOffsetRatio: 0.2, + verticalOffsetRatio: -0.17, + symbolCountToWaitFor: 6 + ) + case .flogEyeOutlineRight: + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .third(.third), + primaryColor: .green, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: -0.32, + verticalOffsetRatio: -0.18, + symbolCountToWaitFor: 1 + ) + case .flogEyeOutlineLeft: + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .third(.third), + primaryColor: .green, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: -0.08, + verticalOffsetRatio: -0.18, + symbolCountToWaitFor: 1 + ) + case .flogEyeRight: + SymbolArtElement( + symbol: "􀢚", + name: "record.circle.fill", + initialPrimaryColor: .systemBackground, + initialPosition: .third(.sixth), + primaryColor: .white, + widthRatio: 0.05, + heightRatio: 0.05, + horizontalOffsetRatio: -0.32, + verticalOffsetRatio: -0.18, + symbolCountToWaitFor: 7 + ) + case .flogEyeLeft: + SymbolArtElement( + symbol: "􀢚", + name: "record.circle.fill", + initialPrimaryColor: .systemBackground, + initialPosition: .third(.sixth), + primaryColor: .white, + widthRatio: 0.05, + heightRatio: 0.05, + horizontalOffsetRatio: -0.08, + verticalOffsetRatio: -0.18, + symbolCountToWaitFor: 7 + ) + case .flogOutline: + SymbolArtElement( + symbol: "􀲟", + name: "oval.fill", + initialPosition: .third(.fifth), + primaryColor: .green, + widthRatio: 0.4, + heightRatio: 0.325, + horizontalOffsetRatio: -0.2, + symbolCountToWaitFor: 8 + ) + case .flogMouth: + SymbolArtElement( + symbol: "􀆈", + name: "chevron.down", + initialPosition: .second(.first), + primaryColor: .black, + fontWeight: .bold, + widthRatio: 0.1, + heightRatio: 0.05, + horizontalOffsetRatio: -0.2, + verticalOffsetRatio: 0.025, + symbolCountToWaitFor: 3 + ) + case .lionManeFirst: + // MARK: - Lion mane + SymbolArtElement( + symbol: "􀟇", + name: "seal.fill", + initialPosition: .third(.second), + primaryColor: .orange, + fontWeight: .ultraLight, + widthRatio: 0.52, + heightRatio: 0.52, + rotationDegrees: 20, + horizontalOffsetRatio: 0.2, + verticalOffsetRatio: 0.26, + symbolCountToWaitFor: 9 + ) + case .lionManeSecond: + SymbolArtElement( + symbol: "􀟇", + name: "seal.fill", + initialPosition: .third(.second), + primaryColor: .orange, + fontWeight: .ultraLight, + widthRatio: 0.52, + heightRatio: 0.52, + horizontalOffsetRatio: 0.2, + verticalOffsetRatio: 0.26, + symbolCountToWaitFor: 9 + ) + case .lionEarRight: + // MARK: - 􀀁 Lion ear + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .third(.third), + primaryColor: .yellow, + widthRatio: 0.12, + heightRatio: 0.12, + horizontalOffsetRatio: 0.08, + verticalOffsetRatio: 0.17, + symbolCountToWaitFor: 1 + ) + case .lionEarLeft: + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .third(.third), + primaryColor: .yellow, + widthRatio: 0.12, + heightRatio: 0.12, + horizontalOffsetRatio: 0.32, + verticalOffsetRatio: 0.17, + symbolCountToWaitFor: 1 + ) + case .lionOutline: + // MARK: - Lion outline + SymbolArtElement( + symbol: "􀲟", + name: "oval.fill", + initialPosition: .third(.fifth), + primaryColor: .yellow, + widthRatio: 0.3, + heightRatio: 0.26, + horizontalOffsetRatio: 0.2, + verticalOffsetRatio: 0.29, + symbolCountToWaitFor: 8 + ) + case .lionEyeRight: + SymbolArtElement( + symbol: "􀢚", + name: "record.circle.fill", + initialPrimaryColor: .systemBackground, + initialPosition: .third(.sixth), + primaryColor: .white, + secondaryColor: .darkBrown, + widthRatio: 0.05, + heightRatio: 0.05, + horizontalOffsetRatio: 0.13, + verticalOffsetRatio: 0.26, + symbolCountToWaitFor: 7 + ) + case .lionEyeLeft: + SymbolArtElement( + symbol: "􀢚", + name: "record.circle.fill", + initialPrimaryColor: .systemBackground, + initialPosition: .third(.sixth), + primaryColor: .white, + secondaryColor: .darkBrown, + widthRatio: 0.05, + heightRatio: 0.05, + horizontalOffsetRatio: 0.27, + verticalOffsetRatio: 0.26, + symbolCountToWaitFor: 7 + ) + case .lionWhiskersRight: + SymbolArtElement( + symbol: "􀇯", + name: "rays", + initialPosition: .second(.second), + primaryColor: .darkBrown, + widthRatio: 0.175, + heightRatio: 0.06, + horizontalOffsetRatio: 0.235, + verticalOffsetRatio: 0.33, + symbolCountToWaitFor: 4 + ) + case .lionWhiskersLeft: + SymbolArtElement( + symbol: "􀇯", + name: "rays", + initialPosition: .second(.second), + primaryColor: .darkBrown, + widthRatio: 0.175, + heightRatio: 0.06, + horizontalOffsetRatio: 0.165, + verticalOffsetRatio: 0.33, + symbolCountToWaitFor: 4 + ) + case .lionMouth: + SymbolArtElement( + symbol: "􀁹", + name: "arrow.down.circle.fill", + initialPrimaryColor: .systemBackground, + initialPosition: .second(.third), + primaryColor: .black, + secondaryColor: .white, + widthRatio: 0.125, + heightRatio: 0.11, + horizontalOffsetRatio: 0.2, + verticalOffsetRatio: 0.34, + symbolCountToWaitFor: 5 + ) + case .lionNose: + SymbolArtElement( + symbol: "􀆼", + name: "moon.circle.fill", + initialPrimaryColor: .systemBackground, + initialPosition: .third(.seventh), + primaryColor: .white, + secondaryColor: .darkBrown, + widthRatio: 0.04, + heightRatio: 0.04, + rotationDegrees: 170, + horizontalOffsetRatio: 0.2, + verticalOffsetRatio: 0.32, + symbolCountToWaitFor: 6 + ) + case .pawFirst: + SymbolArtElement( + symbol: "􀾟", + name: "pawprint.fill", + initialPosition: .third(.first), + primaryColor: .red, + widthRatio: 0.13, + heightRatio: 0.13, + rotationDegrees: 24, + horizontalOffsetRatio: -0.34, + verticalOffsetRatio: -0.5, + symbolCountToWaitFor: 2 + ) + case .pawSecond: + SymbolArtElement( + symbol: "􀾟", + name: "pawprint.fill", + initialPosition: .third(.first), + primaryColor: .orange, + widthRatio: 0.13, + heightRatio: 0.13, + rotationDegrees: -24, + horizontalOffsetRatio: -0.14, + verticalOffsetRatio: -0.36, + symbolCountToWaitFor: 2 + ) + case .pawThird: + SymbolArtElement( + symbol: "􀾟", + name: "pawprint.fill", + initialPosition: .third(.first), + primaryColor: .teal, + widthRatio: 0.13, + heightRatio: 0.13, + rotationDegrees: 30, + horizontalOffsetRatio: -0.3, + verticalOffsetRatio: 0.26, + symbolCountToWaitFor: 2 + ) + case .pawFourth: + SymbolArtElement( + symbol: "􀾟", + name: "pawprint.fill", + initialPosition: .third(.first), + primaryColor: .blue, + widthRatio: 0.13, + heightRatio: 0.13, + rotationDegrees: -14, + horizontalOffsetRatio: -0.14, + verticalOffsetRatio: 0.44, + symbolCountToWaitFor: 2 + ) + } + } + } +} + +#Preview { + NavigationStack { + PartyAnimalsArtView() + .environment(ArtWorkModel.preview) + } +} + +#Preview { + PartyAnimalsArtView.CoverArt() + .environment(ArtWorkModel.preview) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/PartyAnimals/PartyAnimalsArtView.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/PartyAnimals/PartyAnimalsArtView.swift new file mode 100644 index 0000000..36d94de --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/PartyAnimals/PartyAnimalsArtView.swift @@ -0,0 +1,40 @@ +// +// PartyAnimalsArtView.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +struct PartyAnimalsArtView: View { + + @State private var isAnimating = false + + var body: some View { + + ZStack { + ForEach(Element.allCases) { + AnimatableSymbolView(element: $0.value, isAnimating: isAnimating) + } + } + .toolbar(content: { + ToolbarItemGroup(placement: .bottomBar) { + Spacer() + + PlayButton { + isAnimating = true + } + .font(.system(size: 32)) + .disabled(isAnimating) + } + }) + } +} + +#Preview { + NavigationStack { + PartyAnimalsArtView() + .environment(ArtWorkModel.preview) + } +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/SweetBeanBunMan/SweetBeanBunManArtView.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/SweetBeanBunMan/SweetBeanBunManArtView.swift new file mode 100644 index 0000000..ba7efbe --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/SweetBeanBunMan/SweetBeanBunManArtView.swift @@ -0,0 +1,39 @@ +// +// SweetBeanBunManArtView.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +struct SweetBeanBunManArtView: View { + + @State private var isAnimating = false + + var body: some View { + ZStack { + ForEach(Element.allCases) { + AnimatableSymbolView(element: $0.value, isAnimating: isAnimating) + } + } + .toolbar(content: { + ToolbarItemGroup(placement: .bottomBar) { + Spacer() + + PlayButton { + isAnimating = true + } + .font(.system(size: 32)) + .disabled(isAnimating) + } + }) + } +} + +#Preview { + NavigationStack { + SweetBeanBunManArtView() + .environment(ArtWorkModel.preview) + } +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/SweetBeanBunMan/SweetBeanBunManArtWork+CoverArt.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/SweetBeanBunMan/SweetBeanBunManArtWork+CoverArt.swift new file mode 100644 index 0000000..b038da7 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/SweetBeanBunMan/SweetBeanBunManArtWork+CoverArt.swift @@ -0,0 +1,70 @@ +// +// SweetBeanBunManArtWork+CoverArt.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension SweetBeanBunManArtView { + + struct CoverArt: View { + + @Environment(ArtWorkModel.self) var model + + var body: some View { + ZStack { + ForEach(Element.allCases) { + SymbolArtDisplayView(element: $0.value) + } + + Image(systemName: "circle.fill") + .resizable() + .foregroundStyle(.black.opacity(0.9)) + .frame( + width: model.calculatingProportionalValue( + withRatio: 0.7, + shouldResizeForCoverArt: true + ), + height: model.calculatingProportionalValue( + withRatio: 0.7, + shouldResizeForCoverArt: true + ) + ) + + Image(systemName: "ev.plug.ac.gb.t.fill") + .resizable() + .foregroundStyle(.black.opacity(0.9)) + .frame( + width: model.calculatingProportionalValue( + withRatio: 0.8, + shouldResizeForCoverArt: true + ), + height: model.calculatingProportionalValue( + withRatio: 0.7, + shouldResizeForCoverArt: true + ) + ) + .offset(y: model.calculatingProportionalValue( + withRatio: 0.05, + shouldResizeForCoverArt: true + )) + + Image(systemName: "questionmark.app.fill") + .foregroundStyle(.white, .black.opacity(0.9)) + .font(.system(size: model.calculatingProportionalValue( + withRatio: 0.4, + shouldResizeForCoverArt: true + ))) + .bold() + } + } + } +} + +#Preview { + SweetBeanBunManArtView.CoverArt() + .environment(ArtWorkModel.preview) +} + diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/SweetBeanBunMan/SweetBeanBunManArtWork+Element.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/SweetBeanBunMan/SweetBeanBunManArtWork+Element.swift new file mode 100644 index 0000000..143ab97 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/SweetBeanBunMan/SweetBeanBunManArtWork+Element.swift @@ -0,0 +1,246 @@ +// +// SweetBeanBunManArtWork+Element.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension SweetBeanBunManArtView { + + enum Element: String, CaseIterable, Identifiable { + case sweetBeans + case face + case eyeConcealmentRight + case eyeConcealmentLeft + case mouthConcealmentRight + case mouthConcealmentLeft + case eyebrowRight + case eyebrowLeft + case eyebrowConcealmentRight + case eyebrowConcealmentLeft + case eyeRight + case eyeLeft + case mouth + case centerNose + case eyeMinusRight + case eyeMinusLeft + + var id: String { rawValue } + + var value: SymbolArtElement { + switch self { + case .sweetBeans: + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .third(.first), + primaryColor: .darkBrown, + widthRatio: 0.7, + heightRatio: 0.7, + symbolCountToWaitFor: 0 + ) + case .face: + SymbolArtElement( + symbol: "􁺱", + name: "ev.plug.ac.gb.t.fill", + initialPrimaryColor: .systemBackground, + initialPosition: .third(.second), + primaryColor: .orange, + secondaryColor: .paleOrange, + widthRatio: 0.8, + heightRatio: 0.7, + verticalOffsetRatio: 0.05, + symbolCountToWaitFor: 1 + ) + case .eyeConcealmentRight: + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .third(.first), + primaryColor: .paleOrange, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: 0.1, + verticalOffsetRatio: -0.14, + symbolCountToWaitFor: 2 + ) + case .eyeConcealmentLeft: + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .third(.first), + primaryColor: .paleOrange, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: -0.1, + verticalOffsetRatio: -0.14, + symbolCountToWaitFor: 2 + ) + case .mouthConcealmentRight: + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .third(.first), + primaryColor: .paleOrange, + widthRatio: 0.175, + heightRatio: 0.175, + horizontalOffsetRatio: 0.1, + verticalOffsetRatio: 0.19, + symbolCountToWaitFor: 2 + ) + case .mouthConcealmentLeft: + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .third(.first), + primaryColor: .paleOrange, + widthRatio: 0.175, + heightRatio: 0.175, + horizontalOffsetRatio: -0.11, + verticalOffsetRatio: 0.19, + symbolCountToWaitFor: 2 + ) + case .eyebrowRight: + SymbolArtElement( + symbol: "􀙱", + name: "wave.3.left", + initialPosition: .third(.third), + primaryColor: .black, + widthRatio: 0.1, + heightRatio: 0.2, + rotationDegrees: 115, + horizontalOffsetRatio: 0.12, + verticalOffsetRatio: -0.19, + symbolCountToWaitFor: 3 + ) + + case .eyebrowLeft: + SymbolArtElement( + symbol: "􀙱", + name: "wave.3.left", + initialPosition: .third(.third), + primaryColor: .black, + widthRatio: 0.1, + heightRatio: 0.2, + rotationDegrees: 65, + horizontalOffsetRatio: -0.12, + verticalOffsetRatio: -0.19, + symbolCountToWaitFor: 3 + ) + case .eyebrowConcealmentRight: + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .third(.first), + primaryColor: .paleOrange, + widthRatio: 0.18, + heightRatio: 0.1, + rotationDegrees: 30, + horizontalOffsetRatio: 0.12, + verticalOffsetRatio: -0.17, + symbolCountToWaitFor: 4 + ) + case .eyebrowConcealmentLeft: + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .third(.first), + primaryColor: .paleOrange, + widthRatio: 0.18, + heightRatio: 0.1, + rotationDegrees: -30, + horizontalOffsetRatio: -0.12, + verticalOffsetRatio: -0.17, + symbolCountToWaitFor: 4 + ) + case .eyeRight: + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .third(.first), + primaryColor: .black, + widthRatio: 0.05, + heightRatio: 0.1, + horizontalOffsetRatio: 0.12, + verticalOffsetRatio: -0.15, + symbolCountToWaitFor: 5 + ) + case .eyeLeft: + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .third(.first), + primaryColor: .black, + widthRatio: 0.05, + heightRatio: 0.1, + horizontalOffsetRatio: -0.12, + verticalOffsetRatio: -0.15, + symbolCountToWaitFor: 5 + ) + case .mouth: + SymbolArtElement( + symbol: "􁕋", + name: "stairs", + initialPosition: .third(.fourth), + primaryColor: .black, + widthRatio: 0.3, + heightRatio: 0.2, + rotationDegrees: 30, + verticalOffsetRatio: 0.23, + symbolCountToWaitFor: 6 + ) + case .centerNose: + SymbolArtElement( + symbol: "􀜫", + name: "stop.circle.fill", + initialPrimaryColor: .white, + initialPosition: .third(.fifth), + primaryColor: .white, + secondaryColor: .red, + widthRatio: 0.2, + heightRatio: 0.2, + verticalOffsetRatio: 0.01, + symbolCountToWaitFor: 7 + ) + case .eyeMinusRight: + SymbolArtElement( + symbol: "􀅽", + name: "minus", + initialPosition: .third(.sixth), + primaryColor: .black, + widthRatio: 0.07, + heightRatio: 0.01, + horizontalOffsetRatio: 0.12, + verticalOffsetRatio: -0.15, + symbolCountToWaitFor: 8 + ) + case .eyeMinusLeft: + SymbolArtElement( + symbol: "􀅽", + name: "minus", + initialPosition: .third(.sixth), + primaryColor: .black, + widthRatio: 0.07, + heightRatio: 0.01, + horizontalOffsetRatio: -0.12, + verticalOffsetRatio: -0.15, + symbolCountToWaitFor: 8 + ) + } + } + } +} + +#Preview { + NavigationStack { + SweetBeanBunManArtView() + .environment(ArtWorkModel.preview) + } +} + +#Preview { + SweetBeanBunManArtView.CoverArt() + .environment(ArtWorkModel.preview) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/WorldPeace/WorldPeaceArtView+CoverArt.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/WorldPeace/WorldPeaceArtView+CoverArt.swift new file mode 100644 index 0000000..782dc58 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/WorldPeace/WorldPeaceArtView+CoverArt.swift @@ -0,0 +1,28 @@ +// +// WorldPeaceArtView+CoverArt.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension WorldPeaceArtView { + + struct CoverArt: View { + + var body: some View { + + ZStack { + ForEach(Element.allCases) { + SymbolArtDisplayView(element: $0.value) + } + } + } + } +} + +#Preview { + WorldPeaceArtView.CoverArt() + .environment(ArtWorkModel.preview) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/WorldPeace/WorldPeaceArtView+Element.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/WorldPeace/WorldPeaceArtView+Element.swift new file mode 100644 index 0000000..3a3ec4e --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/WorldPeace/WorldPeaceArtView+Element.swift @@ -0,0 +1,360 @@ +// +// WorldPeaceArtView+Element.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension WorldPeaceArtView { + + enum Element: String, CaseIterable, Identifiable { + case shadowForW + case shadowForO + case shadowForR + case shadowForL + case shadowForD + case shadowForP + case shadowForFirstE + case shadowForA + case shadowForC + case shadowForSecondE + case characterW + case characterO + case characterR + case characterL + case characterD + case characterP + case characterFirstE + case characterA + case characterC + case characterSecondE + case sea + case earth + case earthFrame + case peaceSign + + var id: String { rawValue } + + var value: SymbolArtElement { + switch self { + case .shadowForW: + SymbolArtElement( + symbol: "􀀰", + name: "w.circle", + initialPosition: .second(.second), + primaryColor: .black, + secondaryColor: .systemBackground, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: -0.34, + verticalOffsetRatio: -0.4, + symbolCountToWaitFor: 4 + ) + case .shadowForO: + SymbolArtElement( + symbol: "􀀠", + name: "o.circle", + initialPosition: .third(.sixth), + primaryColor: .black, + secondaryColor: .systemBackground, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: -0.17, + verticalOffsetRatio: -0.4, + symbolCountToWaitFor: 4 + ) + case .shadowForR: + SymbolArtElement( + symbol: "􀀦", + name: "r.circle", + initialPosition: .second(.first), + primaryColor: .black, + secondaryColor: .systemBackground, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: 0, + verticalOffsetRatio: -0.4, + symbolCountToWaitFor: 4 + ) + case .shadowForL: + SymbolArtElement( + symbol: "􀀚", + name: "l.circle", + initialPosition: .third(.fifth), + primaryColor: .black, + secondaryColor: .systemBackground, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: 0.17, + verticalOffsetRatio: -0.4, + symbolCountToWaitFor: 4 + ) + case .shadowForD: + SymbolArtElement( + symbol: "􀀊", + name: "d.circle", + initialPosition: .third(.third), + primaryColor: .black, + secondaryColor: .systemBackground, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: 0.34, + verticalOffsetRatio: -0.4, + symbolCountToWaitFor: 4 + ) + case .shadowForP: + SymbolArtElement( + symbol: "􀀢", + name: "p.circle", + initialPosition: .third(.seventh), + primaryColor: .black, + secondaryColor: .systemBackground, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: -0.34, + verticalOffsetRatio: 0.4, + symbolCountToWaitFor: 4 + ) + case .shadowForFirstE: + SymbolArtElement( + symbol: "􀀌", + name: "e.circle", + initialPosition: .third(.fourth), + primaryColor: .black, + secondaryColor: .systemBackground, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: -0.17, + verticalOffsetRatio: 0.4, + symbolCountToWaitFor: 4 + ) + case .shadowForA: + SymbolArtElement( + symbol: "􀀄", + name: "a.circle", + initialPosition: .third(.first), + primaryColor: .black, + secondaryColor: .systemBackground, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: 0, + verticalOffsetRatio: 0.4, + symbolCountToWaitFor: 5 + ) + case .shadowForC: + SymbolArtElement( + symbol: "􀀈", + name: "c.circle", + initialPosition: .third(.second), + primaryColor: .black, + secondaryColor: .systemBackground, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: 0.17, + verticalOffsetRatio: 0.4, + symbolCountToWaitFor: 4 + ) + case .shadowForSecondE: + SymbolArtElement( + symbol: "􀀌", + name: "e.circle", + initialPosition: .third(.fourth), + primaryColor: .black, + secondaryColor: .systemBackground, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: 0.34, + verticalOffsetRatio: 0.4, + symbolCountToWaitFor: 4 + ) + case .characterW: + SymbolArtElement( + symbol: "􀀰", + name: "w.circle", + initialPosition: .second(.second), + primaryColor: .red, + secondaryColor: .systemBackground, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: -0.345, + verticalOffsetRatio: -0.4, + symbolCountToWaitFor: 5 + ) + case .characterO: + SymbolArtElement( + symbol: "􀀠", + name: "o.circle", + initialPosition: .third(.sixth), + primaryColor: .yellow, + secondaryColor: .systemBackground, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: -0.175, + verticalOffsetRatio: -0.4, + symbolCountToWaitFor: 5 + ) + case .characterR: + SymbolArtElement( + symbol: "􀀦", + name: "r.circle", + initialPosition: .second(.first), + primaryColor: .green, + secondaryColor: .systemBackground, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: -0.005, + verticalOffsetRatio: -0.4, + symbolCountToWaitFor: 5 + ) + case .characterL: + SymbolArtElement( + symbol: "􀀚", + name: "l.circle", + initialPosition: .third(.fifth), + primaryColor: .blue, + secondaryColor: .systemBackground, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: 0.165, + verticalOffsetRatio: -0.4, + symbolCountToWaitFor: 5 + ) + case .characterD: + SymbolArtElement( + symbol: "􀀊", + name: "d.circle", + initialPosition: .third(.third), + primaryColor: .purple, + secondaryColor: .systemBackground, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: 0.335, + verticalOffsetRatio: -0.4, + symbolCountToWaitFor: 5 + ) + case .characterP: + SymbolArtElement( + symbol: "􀀢", + name: "p.circle", + initialPosition: .third(.seventh), + primaryColor: .teal, + secondaryColor: .systemBackground, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: -0.345, + verticalOffsetRatio: 0.4, + symbolCountToWaitFor: 5 + ) + case .characterFirstE: + SymbolArtElement( + symbol: "􀀌", + name: "e.circle", + initialPosition: .third(.fourth), + primaryColor: .pink, + secondaryColor: .systemBackground, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: -0.175, + verticalOffsetRatio: 0.4, + symbolCountToWaitFor: 5 + ) + case .characterA: + SymbolArtElement( + symbol: "􀀄", + name: "a.circle", + initialPosition: .third(.first), + primaryColor: .mint, + secondaryColor: .systemBackground, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: -0.005, + verticalOffsetRatio: 0.4, + symbolCountToWaitFor: 5 + ) + case .characterC: + SymbolArtElement( + symbol: "􀀈", + name: "c.circle", + initialPosition: .third(.second), + primaryColor: .indigo, + secondaryColor: .systemBackground, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: 0.165, + verticalOffsetRatio: 0.4, + symbolCountToWaitFor: 5 + ) + case .characterSecondE: + SymbolArtElement( + symbol: "􀀌", + name: "e.circle", + initialPosition: .third(.fourth), + primaryColor: .pink, + secondaryColor: .systemBackground, + widthRatio: 0.15, + heightRatio: 0.15, + horizontalOffsetRatio: 0.335, + verticalOffsetRatio: 0.4, + symbolCountToWaitFor: 5 + ) + case .sea: + SymbolArtElement( + symbol: "􀀁", + name: "circle.fill", + initialPosition: .second(.third), + primaryColor: .cyan, + widthRatio: 0.55, + heightRatio: 0.55, + symbolCountToWaitFor: 0 + ) + case .earth: + SymbolArtElement( + symbol: "􀵶", + name: "globe.asia.australia.fill", + initialPosition: .second(.fourth), + primaryColor: .green, + fontWeight: .ultraLight, + widthRatio: 0.55, + heightRatio: 0.55, + symbolCountToWaitFor: 1 + ) + case .earthFrame: + SymbolArtElement( + symbol: "􀵵", + name: "globe.asia.australia", + initialPosition: .second(.fifth), + primaryColor: .black, + fontWeight: .ultraLight, + widthRatio: 0.57, + heightRatio: 0.57, + symbolCountToWaitFor: 2 + ) + case .peaceSign: + SymbolArtElement( + symbol: "􀺎", + name: "peacesign", + initialPosition: .second(.sixth), + primaryColor: .white, + fontWeight: .thin, + widthRatio: 0.535, + heightRatio: 0.535, + symbolCountToWaitFor: 3 + ) + } + } + } +} + +#Preview { + NavigationStack { + WorldPeaceArtView() + .environment(ArtWorkModel.preview) + } +} + +#Preview { + WorldPeaceArtView.CoverArt() + .environment(ArtWorkModel.preview) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/WorldPeace/WorldPeaceArtView.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/WorldPeace/WorldPeaceArtView.swift new file mode 100644 index 0000000..d482224 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/ArtWorks/WorldPeace/WorldPeaceArtView.swift @@ -0,0 +1,40 @@ +// +// WorldPeaceArtView.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +struct WorldPeaceArtView: View { + + @State private var isAnimating = false + + var body: some View { + + ZStack { + ForEach(Element.allCases) { + AnimatableSymbolView(element: $0.value, isAnimating: isAnimating) + } + } + .toolbar(content: { + ToolbarItemGroup(placement: .bottomBar) { + Spacer() + + PlayButton { + isAnimating = true + } + .font(.system(size: 32)) + .disabled(isAnimating) + } + }) + } +} + +#Preview { + NavigationStack { + WorldPeaceArtView() + .environment(ArtWorkModel.preview) + } +} diff --git a/SFSymbolsArtCollection/Common/Enum/FlipType.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Enums/FlipType.swift similarity index 93% rename from SFSymbolsArtCollection/Common/Enum/FlipType.swift rename to SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Enums/FlipType.swift index 710c3aa..c93c50c 100644 --- a/SFSymbolsArtCollection/Common/Enum/FlipType.swift +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Enums/FlipType.swift @@ -2,7 +2,7 @@ // FlipType.swift // SFSymbolsArtCollection // -// Created by 平岡修 on 2022/07/29. +// Created by Lil Ossa // import CoreGraphics diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Models/AnimationValues.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Models/AnimationValues.swift new file mode 100644 index 0000000..fbd7609 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Models/AnimationValues.swift @@ -0,0 +1,51 @@ +// +// AnimationValues.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +struct AnimationValues { + + init( + primaryColor: Color = .black, + secondaryColor: Color = .black, + fontWeight: Font.Weight = .regular, + width: CGFloat, + height: CGFloat, + symbolNameVisibleValue: CGFloat = 1, + rotationDegrees: CGFloat = 0, + rotationAxis: (x: CGFloat, y: CGFloat, z: CGFloat) = (x: 0, y: 0, z: 0), + offsetX: CGFloat = 0, + offsetY: CGFloat = 0, + opacity: CGFloat = 1 + ) { + self.primaryColor = primaryColor.resolve(in: .init()) + self.secondaryColor = secondaryColor.resolve(in: .init()) + self.fontWeightValue = fontWeight.animatableValue + self.width = width + self.height = height + self.symbolNameVisibleValue = symbolNameVisibleValue + self.rotationDegrees = rotationDegrees + self.rotationAxis = rotationAxis + self.offset = .init(width: offsetX, height: offsetY) + self.opacity = opacity + } + + var primaryColor: Color.Resolved + var secondaryColor: Color.Resolved + var fontWeightValue: CGFloat + var width: CGFloat + var height: CGFloat + var symbolNameVisibleValue: CGFloat + var rotationDegrees: CGFloat + var rotationAxis: (x: CGFloat, y: CGFloat, z: CGFloat) + var offset: CGSize + var opacity: CGFloat + + var fontWeight: Font.Weight { + return .init(animatableValue: fontWeightValue) + } +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Models/ArtWorkModel/ArtWorkModel+InitialSymbolRow.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Models/ArtWorkModel/ArtWorkModel+InitialSymbolRow.swift new file mode 100644 index 0000000..6c5ccfd --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Models/ArtWorkModel/ArtWorkModel+InitialSymbolRow.swift @@ -0,0 +1,90 @@ +// +// ArtWorkModel+InitialSymbolRow.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +// MARK: - BottomColumnSymbol +extension ArtWorkModel { + + enum InitialSymbolRow { + case none + case first(InitialSymbolColumn) + case second(InitialSymbolColumn) + case third(InitialSymbolColumn) + + enum InitialSymbolColumn { + case first + case second + case third + case fourth + case fifth + case sixth + case seventh + + var offsetXRatio: CGFloat { + switch self { + case .first: + -0.42 + case .second: + -0.28 + case .third: + -0.14 + case .fourth: + 0 + case .fifth: + 0.14 + case .sixth: + 0.28 + case .seventh: + 0.42 + } + } + } + + var offsetYRatio: CGFloat { + switch self { + case .none: + 0 + case .first: + 0.18 + case .second: + 0.34 + case .third: + 0.5 + } + } + } + + enum BottomColumnSymbol { + case first + case second + case third + case forth + case fifth + case sixth + case seventh + + var offsetXRatio: CGFloat { + switch self { + case .first: + -0.42 + case .second: + -0.28 + case .third: + -0.14 + case .forth: + 0 + case .fifth: + 0.14 + case .sixth: + 0.28 + case .seventh: + 0.42 + } + } + } +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Models/ArtWorkModel/ArtWorkModel.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Models/ArtWorkModel/ArtWorkModel.swift new file mode 100644 index 0000000..3e74fd9 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Models/ArtWorkModel/ArtWorkModel.swift @@ -0,0 +1,81 @@ +// +// ArtWorkModel.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +@Observable +class ArtWorkModel { + + /// this model is for Xcode preview that provides base length for iPad Pro 12.9. + static let preview = ArtWorkModel(screenSize: CGSize(width: 1024, height: 1024)) + + init(screenSize: CGSize) { + let width = screenSize.width + let height = screenSize.height + self.baseLength = width < height ? width : height + } + + private let baseLength: CGFloat + + let animationDurationPerSymbol: Double = 1.5 + let galleryColumnSpacing: CGFloat = 32 + + /// Art works column count in gallery + var galleryColumnCount: Int { + if UIDevice.current.isPad { + return 4 + } + return 2 + } + + var galleryColumnLength: CGFloat { + let columnCount = CGFloat(galleryColumnCount) + let padding = galleryColumnSpacing + return (baseLength / columnCount - padding) + } + + var initialSymbolLength: Double { + return baseLength * 0.06 + } + + func calculatingInitialOffsetX(forPosition symbolRow: InitialSymbolRow) -> CGFloat { + let ratio: CGFloat + switch symbolRow { + case .none: + ratio = 0 + case let .first(symbolColumn): + ratio = symbolColumn.offsetXRatio + case let .second(symbolColumn): + ratio = symbolColumn.offsetXRatio + case let .third(symbolColumn): + ratio = symbolColumn.offsetXRatio + } + return calculatingProportionalValue(withRatio: ratio) + } + + func calculatingInitialOffsetY(forPosition symbolRow: InitialSymbolRow) -> CGFloat { + return calculatingProportionalValue(withRatio: symbolRow.offsetYRatio) + } + + /// Calculates and returns the proportional value based on the provided ratio. + /// + /// - Parameters: + /// - ratio: The ratio used for calculation. + /// - shouldResizeForCoverImage: A Boolean value indicating whether the value should be adjusted for cover arts. Default is false. + /// - Returns: The calculated proportional value. + func calculatingProportionalValue(withRatio ratio: CGFloat, shouldResizeForCoverArt: Bool = false) -> CGFloat { + + if shouldResizeForCoverArt { + return (galleryColumnLength - galleryColumnSpacing) * ratio + } + return baseLength * ratio + } + + func waitingTime(forCount count: Int) -> Double { + return animationDurationPerSymbol * Double(count) + } +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Models/SymbolArtElement.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Models/SymbolArtElement.swift new file mode 100644 index 0000000..8884900 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Models/SymbolArtElement.swift @@ -0,0 +1,64 @@ +// +// SymbolArtElement.swift +// SFSymbolsArtCollection +// +// Created Lil Ossa +// + +import SwiftUI + +struct SymbolArtElement { + + let symbol: String + let name: String + let initialPrimaryColor: Color + let initialSecondaryColor: Color + let initialPosition: ArtWorkModel.InitialSymbolRow + let primaryColor: Color + let secondaryColor: Color + let fontWeight: Font.Weight + let widthRatio: CGFloat + let heightRatio: CGFloat + let rotationDegrees: CGFloat + var flip: FlipType + let horizontalOffsetRatio: CGFloat + let verticalOffsetRatio: CGFloat + let symbolCountToWaitFor: Int + let zIndex: CGFloat + + init( + symbol: String, + name: String, + initialPrimaryColor: Color = .black, + initialSecondaryColor: Color = .black, + initialPosition: ArtWorkModel.InitialSymbolRow, + primaryColor: Color, + secondaryColor: Color = .black, + fontWeight: Font.Weight = .regular, + widthRatio: CGFloat, + heightRatio: CGFloat, + rotationDegrees: CGFloat = 0, + flip: FlipType = .none, + horizontalOffsetRatio: CGFloat = 0, + verticalOffsetRatio: CGFloat = 0, + symbolCountToWaitFor: Int, + zIndex: CGFloat = 0 + ) { + self.symbol = symbol + self.name = name + self.initialPrimaryColor = initialPrimaryColor + self.initialSecondaryColor = initialSecondaryColor + self.initialPosition = initialPosition + self.primaryColor = primaryColor + self.secondaryColor = secondaryColor + self.fontWeight = fontWeight + self.widthRatio = widthRatio + self.heightRatio = heightRatio + self.rotationDegrees = rotationDegrees + self.flip = flip + self.horizontalOffsetRatio = horizontalOffsetRatio + self.verticalOffsetRatio = verticalOffsetRatio + self.symbolCountToWaitFor = symbolCountToWaitFor + self.zIndex = zIndex + } +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Views/AnimatableSymbolView/AnimatableSymbolView.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Views/AnimatableSymbolView/AnimatableSymbolView.swift new file mode 100644 index 0000000..87486fd --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Views/AnimatableSymbolView/AnimatableSymbolView.swift @@ -0,0 +1,184 @@ +// +// AnimatableSymbolView.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +struct AnimatableSymbolView: View { + + init(element: SymbolArtElement, isAnimating: Bool) { + self.name = element.name + self.initialPrimaryColor = element.initialPrimaryColor + self.initialSecondaryColor = element.initialSecondaryColor + self.initialPosition = element.initialPosition + self.primaryColor = element.primaryColor + self.secondaryColor = element.secondaryColor + self.fontWeight = element.fontWeight + self.widthRatio = element.widthRatio + self.heightRatio = element.heightRatio + self.rotationDegrees = element.rotationDegrees + self.rotationAxis = element.flip.axis + self.horizontalOffsetRatio = element.horizontalOffsetRatio + self.verticalOffsetRatio = element.verticalOffsetRatio + self.isAnimating = isAnimating + self.symbolCountToWaitFor = element.symbolCountToWaitFor + } + + @Environment(ArtWorkModel.self) var model + let name: String + let initialPrimaryColor: Color + let initialSecondaryColor: Color + let initialPosition: ArtWorkModel.InitialSymbolRow + let primaryColor: Color + let secondaryColor: Color + let fontWeight: Font.Weight + let widthRatio: CGFloat + let heightRatio: CGFloat + let rotationDegrees: CGFloat + var rotationAxis: (x: CGFloat, y: CGFloat, z: CGFloat) + let horizontalOffsetRatio: CGFloat + let verticalOffsetRatio: CGFloat + let isAnimating: Bool + let symbolCountToWaitFor: Int + + private var initialValue: AnimationValues { + return .init( + primaryColor: initialPrimaryColor, + secondaryColor: initialSecondaryColor, + width: model.initialSymbolLength, + height: model.initialSymbolLength, + offsetX: model.calculatingInitialOffsetX(forPosition: initialPosition), + offsetY: model.calculatingInitialOffsetY(forPosition: initialPosition) + ) + } + + private var finalValue: AnimationValues { + return .init( + primaryColor: primaryColor, + secondaryColor: secondaryColor, + fontWeight: fontWeight, + width: model.calculatingProportionalValue(withRatio: widthRatio), + height: model.calculatingProportionalValue(withRatio: heightRatio), + rotationDegrees: rotationDegrees, + rotationAxis: rotationAxis, + offsetX: model.calculatingProportionalValue(withRatio: horizontalOffsetRatio), + offsetY: model.calculatingProportionalValue(withRatio: verticalOffsetRatio) + ) + } + + private var waitingTime: Double { + if symbolCountToWaitFor <= 0 { + // In case of setting it to 0, the symbols disappear from the view. + return 0.001 + } + return model.waitingTime(forCount: symbolCountToWaitFor) + } + + var body: some View { + Image(systemName: name) + .resizable() + .keyframeAnimator( + initialValue: initialValue, + trigger: isAnimating + ) { content, value in + + SymbolNameFrameView( + name: name, + length: initialValue.width, + frameOpacity: value.symbolNameVisibleValue + ) { + + Group { + if value.symbolNameVisibleValue == 1 { + content + .scaledToFit() + } else { + content + } + } + .foregroundStyle( + value.primaryColor, + value.secondaryColor + ) + .fontWeight(value.fontWeight) + .frame( + width: value.width, + height: value.height + ) + .rotationEffect(.degrees(value.rotationDegrees)) + .rotation3DEffect(.degrees(180), + axis: value.rotationAxis, + anchorZ: 0) + } + .offset(value.offset) + + } keyframes: { value in + + KeyframeTrack(\.primaryColor) { + LinearKeyframe(value.primaryColor, duration: waitingTime) + CubicKeyframe(finalValue.primaryColor, duration: model.animationDurationPerSymbol) + } + + KeyframeTrack(\.secondaryColor) { + LinearKeyframe(value.secondaryColor, duration: waitingTime) + CubicKeyframe(finalValue.secondaryColor, duration: model.animationDurationPerSymbol) + } + + KeyframeTrack(\.fontWeightValue) { + LinearKeyframe(value.fontWeightValue, duration: waitingTime) + CubicKeyframe(finalValue.fontWeightValue, duration: model.animationDurationPerSymbol) + } + + KeyframeTrack(\.width) { + LinearKeyframe(value.width, duration: waitingTime) + CubicKeyframe(finalValue.width, duration: model.animationDurationPerSymbol) + } + + KeyframeTrack(\.height) { + LinearKeyframe(value.height, duration: waitingTime) + CubicKeyframe(finalValue.height, duration: model.animationDurationPerSymbol) + } + + KeyframeTrack(\.rotationDegrees) { + LinearKeyframe(value.rotationDegrees, duration: waitingTime) + CubicKeyframe(finalValue.rotationDegrees, duration: model.animationDurationPerSymbol) + } + + KeyframeTrack(\.rotationAxis.x) { + LinearKeyframe(value.rotationAxis.x, duration: waitingTime) + CubicKeyframe(finalValue.rotationAxis.x, duration: model.animationDurationPerSymbol) + } + + KeyframeTrack(\.rotationAxis.y) { + LinearKeyframe(value.rotationAxis.y, duration: waitingTime) + CubicKeyframe(finalValue.rotationAxis.y, duration: model.animationDurationPerSymbol) + } + + KeyframeTrack(\.rotationAxis.z) { + LinearKeyframe(value.rotationAxis.z, duration: waitingTime) + CubicKeyframe(finalValue.rotationAxis.z, duration: model.animationDurationPerSymbol) + } + + KeyframeTrack(\.offset) { + LinearKeyframe(value.offset, duration: waitingTime) + CubicKeyframe(finalValue.offset, duration: model.animationDurationPerSymbol) + } + + KeyframeTrack(\.symbolNameVisibleValue) { + LinearKeyframe(1, duration: waitingTime) + CubicKeyframe(0, duration: model.animationDurationPerSymbol * 0.2) + } + } + } +} + +#Preview { + AnimatableSymbolView( + element: AfroBoyArtView.Element.hair.value, + isAnimating: true + ) + .environment(ArtWorkModel.preview) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Views/AnimatableSymbolView/SymbolArtDisplayView.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Views/AnimatableSymbolView/SymbolArtDisplayView.swift new file mode 100644 index 0000000..25c9dcf --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Views/AnimatableSymbolView/SymbolArtDisplayView.swift @@ -0,0 +1,62 @@ +// +// SymbolArtPreviewView.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +struct SymbolArtDisplayView: View { + + @Environment(ArtWorkModel.self) var model + let shouldResizeForCoverArt: Bool + let element: SymbolArtElement + + init(shouldResizeForCoverArt: Bool = true, element: SymbolArtElement) { + self.shouldResizeForCoverArt = shouldResizeForCoverArt + self.element = element + } + + var body: some View { + Image(systemName: element.name) + .resizable() + .foregroundStyle(element.primaryColor, element.secondaryColor) + .fontWeight(element.fontWeight) + .frame( + width: model.calculatingProportionalValue( + withRatio: element.widthRatio, + shouldResizeForCoverArt: shouldResizeForCoverArt + ), + height: model.calculatingProportionalValue( + withRatio: element.heightRatio, + shouldResizeForCoverArt: shouldResizeForCoverArt + ) + ) + .rotationEffect(.degrees(element.rotationDegrees)) + .rotation3DEffect(.degrees(180), axis: element.flip.axis) + .offset( + x: model.calculatingProportionalValue( + withRatio: element.horizontalOffsetRatio, + shouldResizeForCoverArt: shouldResizeForCoverArt + ), + y: model.calculatingProportionalValue( + withRatio: element.verticalOffsetRatio, + shouldResizeForCoverArt: shouldResizeForCoverArt + ) + ) + .zIndex(element.zIndex) + } +} + +#Preview { + VStack { + SymbolArtDisplayView(element: AfroBoyArtView.Element.face.value) + + SymbolArtDisplayView( + shouldResizeForCoverArt: false, + element: AfroBoyArtView.Element.face.value + ) + } + .environment(ArtWorkModel.preview) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Views/AnimatableSymbolView/SymbolNameFrameView.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Views/AnimatableSymbolView/SymbolNameFrameView.swift new file mode 100644 index 0000000..ddf2277 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Views/AnimatableSymbolView/SymbolNameFrameView.swift @@ -0,0 +1,88 @@ +// +// SymbolNameFrameView.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +struct SymbolNameFrameView: View { + + init(name: String, + length: CGFloat, + frameOpacity: CGFloat, + @ViewBuilder content: () -> Content){ + self.name = name + self.length = length + self.frameOpacity = frameOpacity + self.content = content() + } + + let name: String + let length: CGFloat + let frameOpacity: CGFloat + let content: Content + + var isFrameVisible: Bool { + frameOpacity != 0 + } + + var body: some View { + ZStack { + if isFrameVisible { + RoundedRectangle(cornerRadius: 12) + .stroke(lineWidth: 2) + .frame(width: length * 2, + height: length * 2.2) + .opacity(frameOpacity) + .offset(y: UIDevice.current.isPad ? length * 0.35 : 0) + } + + content + + VStack(spacing: 32) { + + content + .opacity(0) + + if isFrameVisible, + UIDevice.current.isPad { + Text(name) + .font(.system(size: length * 0.25)) + .opacity(frameOpacity) + .frame(width: length * 1.8) + .fixedSize(horizontal: false, vertical: true) + .multilineTextAlignment(.center) + .offset(y: length * 0.2) + } + } + } + } +} + +#Preview { + HStack { + SymbolNameFrameView( + name: "circle.fill", + length: 61.44, + frameOpacity: 1 + ) { + Image(systemName: "circle.fill") + .resizable() + .frame(width: 61.4, + height: 61.4) + } + + SymbolNameFrameView( + name: "doc.plaintext.fill", + length: 61.44, + frameOpacity: 1 + ) { + Image(systemName: "doc.plaintext.fill") + .resizable() + .frame(width: 61.4, + height: 61.4) + } + } +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Views/GalleryGridView.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Views/GalleryGridView.swift new file mode 100644 index 0000000..d0396c1 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Views/GalleryGridView.swift @@ -0,0 +1,59 @@ +// +// GalleryGridView.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension View { + + func galleryGridItemView(backgroundColor: Color = .white, length: CGFloat) -> some View { + GalleryGridItemView(backgroundColor: backgroundColor, length: length) { + self + } + } +} + +struct GalleryGridItemView: View { + + init(backgroundColor: Color = .white, length: CGFloat, @ViewBuilder content: () -> Content) { + self.backgroundColor = backgroundColor + self.length = length + self.content = content() + } + + let backgroundColor: Color + let length: CGFloat + let content: Content + + var body: some View { + + ZStack { + content + + VStack(alignment: .trailing) { + Spacer() + + Image(systemName: "chevron.right") + .foregroundStyle(.gray) + .imageScale(.large) + .padding() + } + .frame(width: length, + height: length, + alignment: .bottomTrailing) + } + .frame(width: length, + height: length) + .background(RoundedRectangle(cornerRadius: 12).fill(backgroundColor).shadow(radius: 4)) + .padding(.top, 16) + } +} + +#Preview { + AfroBoyArtView.CoverArt() + .environment(ArtWorkModel.preview) + .galleryGridItemView(length: 1024 / 4) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Views/PlayButton.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Views/PlayButton.swift new file mode 100644 index 0000000..72a63e1 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Common/Views/PlayButton.swift @@ -0,0 +1,28 @@ +// +// PlayButton.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +struct PlayButton: View { + + let action: () -> Void + + var body: some View { + Button { + action() + } label: { + HStack { + Image(systemName: "play.circle.fill") + Text("Play") + } + } + } +} + +#Preview { + PlayButton {} +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Extensions/Color+.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Extensions/Color+.swift new file mode 100644 index 0000000..5631093 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Extensions/Color+.swift @@ -0,0 +1,13 @@ +// +// Color+.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension Color { + static let systemBackground: Color = .init(uiColor: .systemBackground) + static let lightGray: Color = .init(uiColor: .lightGray) +} diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Extensions/Font.Weight+.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Extensions/Font.Weight+.swift new file mode 100644 index 0000000..06fa785 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Extensions/Font.Weight+.swift @@ -0,0 +1,62 @@ +// +// Font.Weight+.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension Font.Weight { + + var animatableValue: CGFloat { + switch self { + case .ultraLight: + return 0 + case .thin: + return 1 + case .light: + return 2 + case .regular: + return 3 + case .medium: + return 4 + case .semibold: + return 5 + case .bold: + return 6 + case .heavy: + return 7 + case .black: + return 8 + default: + fatalError("\(self) is not defined") + } + } + + init(animatableValue value: CGFloat) { + switch value { + case 0..<1: + self = .ultraLight + case 1..<2: + self = .thin + case 2..<3: + self = .light + case 3..<4: + self = .regular + case 4..<5: + self = .medium + case 5..<6: + self = .semibold + case 6..<7: + self = .bold + case 7..<8: + self = .heavy + case 8: + self = .black + default: + print("💣: \(value) is not defined") + self = .regular + } + } +} diff --git a/SFSymbolsArtCollection/Common/Extensions/GeometryProxy+Extensions.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Extensions/GeometryProxy+.swift similarity index 72% rename from SFSymbolsArtCollection/Common/Extensions/GeometryProxy+Extensions.swift rename to SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Extensions/GeometryProxy+.swift index 8bb582f..fb921f3 100644 --- a/SFSymbolsArtCollection/Common/Extensions/GeometryProxy+Extensions.swift +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Extensions/GeometryProxy+.swift @@ -2,7 +2,7 @@ // GeometryProxy+Extensions.swift // SFSymbolsArtCollection // -// Created by 平岡修 on 2022/09/04. +// Created by Lil Ossa // import SwiftUI @@ -12,9 +12,9 @@ extension GeometryProxy { var baseLength: CGFloat { let width = self.size.width - let halfHeight = self.size.height / 2 + let height = self.size.height - let baseLength = width < halfHeight ? width : halfHeight + let baseLength = width < height ? width : height return baseLength } diff --git a/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Extensions/UIDevice+.swift b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Extensions/UIDevice+.swift new file mode 100644 index 0000000..52fde53 --- /dev/null +++ b/SFSymbolsArtCollection/ArtisticWorldOfSFSymbols/Extensions/UIDevice+.swift @@ -0,0 +1,15 @@ +// +// UIDevice+.swift +// SFSymbolsArtCollection +// +// Created by Lil Ossa +// + +import SwiftUI + +extension UIDevice { + + var isPad: Bool { + return userInterfaceIdiom == .pad + } +} diff --git a/SFSymbolsArtCollection/Assets.xcassets/AppIcon.appiconset/Contents.json b/SFSymbolsArtCollection/Assets.xcassets/AppIcon.appiconset/Contents.json index 9221b9b..a657e33 100644 --- a/SFSymbolsArtCollection/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/SFSymbolsArtCollection/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,93 +1,9 @@ { "images" : [ { - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" - }, - { - "idiom" : "ios-marketing", - "scale" : "1x", + "filename" : "icon.png", + "idiom" : "universal", + "platform" : "ios", "size" : "1024x1024" } ], diff --git a/SFSymbolsArtCollection/Assets.xcassets/AppIcon.appiconset/icon.png b/SFSymbolsArtCollection/Assets.xcassets/AppIcon.appiconset/icon.png new file mode 100644 index 0000000..06bae03 Binary files /dev/null and b/SFSymbolsArtCollection/Assets.xcassets/AppIcon.appiconset/icon.png differ diff --git a/SFSymbolsArtCollection/Assets.xcassets/AwesomeYellow.colorset/Contents.json b/SFSymbolsArtCollection/Assets.xcassets/AwesomeYellow.colorset/Contents.json new file mode 100644 index 0000000..9647112 --- /dev/null +++ b/SFSymbolsArtCollection/Assets.xcassets/AwesomeYellow.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "blue" : "0.306", + "green" : "0.918", + "red" : "0.984" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SFSymbolsArtCollection/Common/Extensions/Color+Extensions.swift b/SFSymbolsArtCollection/Common/Extensions/Color+Extensions.swift deleted file mode 100644 index ba11e2e..0000000 --- a/SFSymbolsArtCollection/Common/Extensions/Color+Extensions.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// Color+Extensions.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/04/27. -// - -import SwiftUI - -extension Color { - static let paleOrange = Color("PaleOrange") - static let palePink = Color("PalePink") - static let darkBrown = Color("DarkBrown") - static let midnightNavy = Color("MidnightNavy") - static let lemonYellow = Color(uiColor: .yellow) -} diff --git a/SFSymbolsArtCollection/Common/ViewModifiers/ArrangeShapeWithFont.swift b/SFSymbolsArtCollection/Common/ViewModifiers/ArrangeShapeWithFont.swift deleted file mode 100644 index 54f2c7e..0000000 --- a/SFSymbolsArtCollection/Common/ViewModifiers/ArrangeShapeWithFont.swift +++ /dev/null @@ -1,54 +0,0 @@ -// -// ArrangeShape.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/09/03. -// - -import SwiftUI - -struct ArrangeShapeWithFontModifier: ViewModifier { - - let color: Color - let fontSize: CGFloat - let fontWeight: Font.Weight - let flipType: FlipType - let rotationDegrees: CGFloat - let offsetX: CGFloat - let offsetY: CGFloat - - func body(content: Content) -> some View { - content - .font(.system(size: fontSize, - weight: fontWeight, - design: .default)) - .rotation3DEffect(.degrees(180), - axis: flipType.axis, - anchorZ: 1) - .rotation3DEffect(.degrees(rotationDegrees), - axis: (x: 0, y: 0, z: -1), - anchorZ: 1) - .offset(x: offsetX, y: offsetY) - .foregroundColor(color) - } -} - -extension Image { - - func arrangeShape(color: Color = .black, - fontSize: CGFloat, - fontWeight: Font.Weight = .regular, - flipType: FlipType = .none, - rotationDegrees: CGFloat = 0, - offsetX: CGFloat = 0, - offsetY: CGFloat = 0) -> some View { - - self.modifier(ArrangeShapeWithFontModifier(color: color, - fontSize: fontSize, - fontWeight: fontWeight, - flipType: flipType, - rotationDegrees: rotationDegrees, - offsetX: offsetX, - offsetY: offsetY)) - } -} diff --git a/SFSymbolsArtCollection/Common/ViewModifiers/ArrangeShapeWithWidthAndHeight.swift b/SFSymbolsArtCollection/Common/ViewModifiers/ArrangeShapeWithWidthAndHeight.swift deleted file mode 100644 index 273ccbd..0000000 --- a/SFSymbolsArtCollection/Common/ViewModifiers/ArrangeShapeWithWidthAndHeight.swift +++ /dev/null @@ -1,62 +0,0 @@ -// -// ArrangeShapeWidthAndHeight.swift -// SFSymbolsArtCollection -// -// Created by 平岡修 on 2022/09/03. -// - -import Foundation - -import SwiftUI - -struct ArrangeShapeWithWidthAndHeightModifier: ViewModifier { - - let color: Color - let width: CGFloat? - let height: CGFloat? - let fontWeight: Font.Weight - let flipType: FlipType - let rotationDegrees: CGFloat - let offsetX: CGFloat - let offsetY: CGFloat - - func body(content: Content) -> some View { - content - .frame(width: width, - height: height) - .font(.body.weight(fontWeight)) - .rotation3DEffect(.degrees(180), - axis: flipType.axis, - anchorZ: 1) - .rotation3DEffect(.degrees(rotationDegrees), - axis: (x: 0, y: 0, z: -1), - anchorZ: 1) - .offset(x: offsetX, y: offsetY) - .foregroundColor(color) - - } -} - -extension Image { - - func arrangeShape(color: Color = .black, - width: CGFloat? = nil, - height: CGFloat? = nil, - fontWeight: Font.Weight = .regular, - flipType: FlipType = .none, - rotationDegrees: CGFloat = 0, - offsetX: CGFloat = 0, - offsetY: CGFloat = 0) -> some View { - - self - .resizable() - .modifier(ArrangeShapeWithWidthAndHeightModifier(color: color, - width: width, - height: height, - fontWeight: fontWeight, - flipType: flipType, - rotationDegrees: rotationDegrees, - offsetX: offsetX, - offsetY: offsetY)) - } -} diff --git a/SFSymbolsArtCollection/ContentView.swift b/SFSymbolsArtCollection/ContentView.swift deleted file mode 100644 index b604465..0000000 --- a/SFSymbolsArtCollection/ContentView.swift +++ /dev/null @@ -1,48 +0,0 @@ -// -// ContentView.swift -// SFSymbolsArtCollection -// -// - -import SwiftUI - -struct ContentView: View { - - @State private var isPresented = false - @State private var selectedArtWork: ArtWork = .crayonBoy - - var body: some View { - - VStack { - - iOSDCJapan2022Logo() - - List { - ForEach(ArtWork.allCases) { artwork in - Button { - selectedArtWork = artwork - isPresented = true - } label: { - HStack { - Text(artwork.title) - - Spacer() - - Image(symbol: .chevronForward) - .font(.caption.bold()) - } - } - } - } - } - .sheet(isPresented: $isPresented, content: { - ArtWorkView(artwork: $selectedArtWork) - }) - } -} - -struct ContentView_Previews: PreviewProvider { - static var previews: some View { - ContentView() - } -} diff --git a/SFSymbolsArtCollection/SFSymbolsArtCollectionApp.swift b/SFSymbolsArtCollection/SFSymbolsArtCollectionApp.swift index e70804e..d3c7eca 100644 --- a/SFSymbolsArtCollection/SFSymbolsArtCollectionApp.swift +++ b/SFSymbolsArtCollection/SFSymbolsArtCollectionApp.swift @@ -2,16 +2,20 @@ // SFSymbolsArtCollectionApp.swift // SFSymbolsArtCollection // -// Created by 平岡修 on 2022/04/26. +// Created by Lil Ossa // import SwiftUI @main struct SFSymbolsArtCollectionApp: App { + var body: some Scene { WindowGroup { - ContentView() + GeometryReader { geometry in + ArtGalleryView(screenSize: geometry.size) + .preferredColorScheme(.light) + } } } }