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)
+ }
}
}
}