Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 0 additions & 21 deletions Example/AppDelegate.swift

This file was deleted.

11 changes: 11 additions & 0 deletions Example/Assets.xcassets/AccentColor.colorset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
119 changes: 28 additions & 91 deletions Example/Assets.xcassets/AppIcon.appiconset/Contents.json
Original file line number Diff line number Diff line change
@@ -1,98 +1,35 @@
{
"images" : [
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "3x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "83.5x83.5",
"scale" : "2x"
},
{
"idiom" : "ios-marketing",
"size" : "1024x1024",
"scale" : "1x"
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
Comment on lines +4 to +7
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Use ios-marketing for the 1024px entry and include scale.

The 1024×1024 App Store icon should use idiom "ios-marketing" with "scale": "1x". Using "universal" + "platform" isn’t standard for app icons.

Apply this diff to fix the marketing icon slot:

     {
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
+      "idiom" : "ios-marketing",
+      "size" : "1024x1024",
+      "scale" : "1x"
     },
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"idiom" : "ios-marketing",
"size" : "1024x1024",
"scale" : "1x"
},
🤖 Prompt for AI Agents
In Example/Assets.xcassets/AppIcon.appiconset/Contents.json around lines 4 to 7,
the 1024×1024 entry currently uses "idiom": "universal" and includes "platform":
"ios"; change that entry to use "idiom": "ios-marketing", remove the "platform"
key, and add "scale": "1x" (keeping "size": "1024x1024" and any other existing
keys intact) so the App Store marketing icon conforms to the expected spec.

{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
Comment on lines +9 to +14
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

⚠️ Potential issue

Remove unsupported “appearances” entries from AppIcon.

App icon sets don’t support Dark/Light (or “tinted”) variants via the “appearances” key. Keeping these will make the asset invalid in Xcode.

Apply this diff to drop the unsupported appearance blocks:

     {
-      "appearances" : [
-        {
-          "appearance" : "luminosity",
-          "value" : "dark"
-        }
-      ],
       "idiom" : "universal",
       "platform" : "ios",
       "size" : "1024x1024"
     },
     {
-      "appearances" : [
-        {
-          "appearance" : "luminosity",
-          "value" : "tinted"
-        }
-      ],
       "idiom" : "universal",
       "platform" : "ios",
       "size" : "1024x1024"
     }

Also applies to: 20-25

🤖 Prompt for AI Agents
In Example/Assets.xcassets/AppIcon.appiconset/Contents.json around lines 9-14
(and also lines 20-25), remove the entire "appearances" objects for the AppIcon
entries so the file no longer contains unsupported "appearances" blocks; make
sure to also adjust surrounding commas so the JSON remains valid (no trailing
commas) after removal and re-save the file.

"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "tinted"
}
],
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
Comment on lines 3 to 29
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Missing required iPhone/iPad app icon slots and filenames; build/App Store submission will fail.

The current images array only defines 1024px entries and omits the required device sizes (20, 29, 40, 60, 76, 83.5 points at appropriate scales) and filenames. Xcode will flag “AppIcon.appiconset is missing required icons.” This breaks validation.

Replace the images array with the standard iOS set (filenames are placeholders; update them to match your actual PNGs):

-  "images" : [
-    {
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    }
-  ],
+  "images" : [
+    { "size": "20x20",   "idiom": "iphone", "scale": "2x", "filename": "Icon-20@2x.png" },
+    { "size": "20x20",   "idiom": "iphone", "scale": "3x", "filename": "Icon-20@3x.png" },
+    { "size": "29x29",   "idiom": "iphone", "scale": "2x", "filename": "Icon-29@2x.png" },
+    { "size": "29x29",   "idiom": "iphone", "scale": "3x", "filename": "Icon-29@3x.png" },
+    { "size": "40x40",   "idiom": "iphone", "scale": "2x", "filename": "Icon-40@2x.png" },
+    { "size": "40x40",   "idiom": "iphone", "scale": "3x", "filename": "Icon-40@3x.png" },
+    { "size": "60x60",   "idiom": "iphone", "scale": "2x", "filename": "Icon-60@2x.png" },
+    { "size": "60x60",   "idiom": "iphone", "scale": "3x", "filename": "Icon-60@3x.png" },
+
+    { "size": "20x20",   "idiom": "ipad",   "scale": "1x", "filename": "Icon-20.png" },
+    { "size": "20x20",   "idiom": "ipad",   "scale": "2x", "filename": "Icon-20@2x.png" },
+    { "size": "29x29",   "idiom": "ipad",   "scale": "1x", "filename": "Icon-29.png" },
+    { "size": "29x29",   "idiom": "ipad",   "scale": "2x", "filename": "Icon-29@2x.png" },
+    { "size": "40x40",   "idiom": "ipad",   "scale": "1x", "filename": "Icon-40.png" },
+    { "size": "40x40",   "idiom": "ipad",   "scale": "2x", "filename": "Icon-40@2x.png" },
+    { "size": "76x76",   "idiom": "ipad",   "scale": "1x", "filename": "Icon-76.png" },
+    { "size": "76x76",   "idiom": "ipad",   "scale": "2x", "filename": "Icon-76@2x.png" },
+    { "size": "83.5x83.5","idiom": "ipad",  "scale": "2x", "filename": "Icon-83.5@2x.png" },
+
+    { "size": "1024x1024","idiom": "ios-marketing", "scale": "1x", "filename": "Icon-1024.png" }
+  ],

Action to verify locally in Xcode:

  • Open the asset catalog and ensure there are no yellow warnings on the AppIcon set.
  • Archive the Example app; the Organizer should not report missing icon sizes.

🏁 Script executed:

#!/bin/bash
set -euo pipefail

file="Example/Assets.xcassets/AppIcon.appiconset/Contents.json"
if [[ ! -f "$file" ]]; then
  echo "FILE_NOT_FOUND: $file"
  echo "Searching for Contents.json files..."
  fd -HI --hidden --type f -d 4 --exclude node_modules --exclude build 'Contents.json' || true
  exit 0
fi

echo "FOUND: $file"
echo "---- raw contents (first 200 lines) ----"
sed -n '1,200p' "$file" || true
echo
echo "---- parsed summary ----"
python - <<'PY'
import json,sys
p="Example/Assets.xcassets/AppIcon.appiconset/Contents.json"
with open(p) as f:
    data=json.load(f)
images=data.get('images',[])
print("images_count:", len(images))
for i,img in enumerate(images,1):
    size=img.get('size')
    idiom=img.get('idiom')
    scale=img.get('scale') or "1x"
    filename=img.get('filename')
    appearances=img.get('appearances')
    print(f"{i}. size={size!s}, idiom={idiom!s}, scale={scale!s}, filename={filename!s}, appearances={appearances!s}")

# required entries (common iOS AppIcon requirements)
required=[]
def add(size,idiom,scale):
    required.append((str(size),idiom,str(scale)))
# iPhone
add("20x20","iphone","2x"); add("20x20","iphone","3x")
add("29x29","iphone","2x"); add("29x29","iphone","3x")
add("40x40","iphone","2x"); add("40x40","iphone","3x")
add("60x60","iphone","2x"); add("60x60","iphone","3x")
# iPad
add("20x20","ipad","1x"); add("20x20","ipad","2x")
add("29x29","ipad","1x"); add("29x29","ipad","2x")
add("40x40","ipad","1x"); add("40x40","ipad","2x")
add("76x76","ipad","1x"); add("76x76","ipad","2x")
add("83.5x83.5","ipad","2x")
# marketing
add("1024x1024","ios-marketing","1x")

# build list of image entries for matching
entries=[]
for img in images:
    s=str(img.get('size'))
    idiom=img.get('idiom')
    scale=str(img.get('scale')) if img.get('scale') is not None else "1x"
    entries.append((s,idiom,scale))

def matches(req, entry):
    rs,ri,rr = req
    es,ei,er = entry
    # idiom 'universal' matches any required idiom
    if es != rs: return False
    if ei != ri and ei != "universal": return False
    if er != rr: return False
    return True

missing=[]
for r in required:
    ok=any(matches(r,e) for e in entries)
    if not ok:
        missing.append(r)

print("missing_count:", len(missing))
for m in missing:
    print("MISSING:", m)
PY

Length of output: 2076


Missing required iPhone/iPad app icon slots — build/App Store submission will fail

Verified: Example/Assets.xcassets/AppIcon.appiconset/Contents.json defines only three 1024x1024 "universal" entries (images_count: 3); 17 standard icon slots are missing (missing sizes: 20, 29, 40, 60, 76, 83.5 at required scales + ios-marketing 1024).

  • File: Example/Assets.xcassets/AppIcon.appiconset/Contents.json (images array, lines ~3–29)

Replace the images array with the standard iOS set (filenames are placeholders; update to your actual PNGs):

-  "images" : [
-    {
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    },
-    {
-      "idiom" : "universal",
-      "platform" : "ios",
-      "size" : "1024x1024"
-    }
-  ],
+  "images" : [
+    { "size": "20x20",   "idiom": "iphone", "scale": "2x", "filename": "Icon-20@2x.png" },
+    { "size": "20x20",   "idiom": "iphone", "scale": "3x", "filename": "Icon-20@3x.png" },
+    { "size": "29x29",   "idiom": "iphone", "scale": "2x", "filename": "Icon-29@2x.png" },
+    { "size": "29x29",   "idiom": "iphone", "scale": "3x", "filename": "Icon-29@3x.png" },
+    { "size": "40x40",   "idiom": "iphone", "scale": "2x", "filename": "Icon-40@2x.png" },
+    { "size": "40x40",   "idiom": "iphone", "scale": "3x", "filename": "Icon-40@3x.png" },
+    { "size": "60x60",   "idiom": "iphone", "scale": "2x", "filename": "Icon-60@2x.png" },
+    { "size": "60x60",   "idiom": "iphone", "scale": "3x", "filename": "Icon-60@3x.png" },
+
+    { "size": "20x20",   "idiom": "ipad",   "scale": "1x", "filename": "Icon-20.png" },
+    { "size": "20x20",   "idiom": "ipad",   "scale": "2x", "filename": "Icon-20@2x.png" },
+    { "size": "29x29",   "idiom": "ipad",   "scale": "1x", "filename": "Icon-29.png" },
+    { "size": "29x29",   "idiom": "ipad",   "scale": "2x", "filename": "Icon-29@2x.png" },
+    { "size": "40x40",   "idiom": "ipad",   "scale": "1x", "filename": "Icon-40.png" },
+    { "size": "40x40",   "idiom": "ipad",   "scale": "2x", "filename": "Icon-40@2x.png" },
+    { "size": "76x76",   "idiom": "ipad",   "scale": "1x", "filename": "Icon-76.png" },
+    { "size": "76x76",   "idiom": "ipad",   "scale": "2x", "filename": "Icon-76@2x.png" },
+    { "size": "83.5x83.5","idiom": "ipad",  "scale": "2x", "filename": "Icon-83.5@2x.png" },
+
+    { "size": "1024x1024","idiom": "ios-marketing", "scale": "1x", "filename": "Icon-1024.png" }
+  ],

Local verification:

  • Open Example/Assets.xcassets in Xcode and confirm no warnings on AppIcon.
  • Archive the Example app and ensure Organizer reports no missing icons.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "3x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "83.5x83.5",
"scale" : "2x"
},
{
"idiom" : "ios-marketing",
"size" : "1024x1024",
"scale" : "1x"
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "tinted"
}
],
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
"images" : [
{ "size" : "20x20", "idiom" : "iphone", "scale" : "2x", "filename" : "Icon-20@2x.png" },
{ "size" : "20x20", "idiom" : "iphone", "scale" : "3x", "filename" : "Icon-20@3x.png" },
{ "size" : "29x29", "idiom" : "iphone", "scale" : "2x", "filename" : "Icon-29@2x.png" },
{ "size" : "29x29", "idiom" : "iphone", "scale" : "3x", "filename" : "Icon-29@3x.png" },
{ "size" : "40x40", "idiom" : "iphone", "scale" : "2x", "filename" : "Icon-40@2x.png" },
{ "size" : "40x40", "idiom" : "iphone", "scale" : "3x", "filename" : "Icon-40@3x.png" },
{ "size" : "60x60", "idiom" : "iphone", "scale" : "2x", "filename" : "Icon-60@2x.png" },
{ "size" : "60x60", "idiom" : "iphone", "scale" : "3x", "filename" : "Icon-60@3x.png" },
{ "size" : "20x20", "idiom" : "ipad", "scale" : "1x", "filename" : "Icon-20.png" },
{ "size" : "20x20", "idiom" : "ipad", "scale" : "2x", "filename" : "Icon-20@2x.png" },
{ "size" : "29x29", "idiom" : "ipad", "scale" : "1x", "filename" : "Icon-29.png" },
{ "size" : "29x29", "idiom" : "ipad", "scale" : "2x", "filename" : "Icon-29@2x.png" },
{ "size" : "40x40", "idiom" : "ipad", "scale" : "1x", "filename" : "Icon-40.png" },
{ "size" : "40x40", "idiom" : "ipad", "scale" : "2x", "filename" : "Icon-40@2x.png" },
{ "size" : "76x76", "idiom" : "ipad", "scale" : "1x", "filename" : "Icon-76.png" },
{ "size" : "76x76", "idiom" : "ipad", "scale" : "2x", "filename" : "Icon-76@2x.png" },
{ "size" : "83.5x83.5", "idiom" : "ipad", "scale" : "2x", "filename" : "Icon-83.5@2x.png" },
{ "size" : "1024x1024", "idiom" : "ios-marketing", "scale" : "1x", "filename" : "Icon-1024.png" }
],
🤖 Prompt for AI Agents
In Example/Assets.xcassets/AppIcon.appiconset/Contents.json around lines 3 to 29
you only have three 1024x1024 "universal" entries and are missing the full set
of iPhone/iPad icon slots (sizes 20, 29, 40, 60, 76, 83.5 with required scales
plus the ios-marketing 1024), so replace the current images array with the
standard iOS App Icon image entries: add entries for each required size and
scale (20@1/@2/@3, 29@1/@2/@3, 40@1/@2/@3, 60@2/@3, 76@1/@2, 83.5@2) using
appropriate idioms (iphone/ipad/universal) and include the ios-marketing 1024
entry, set proper filename placeholders (update to your actual PNG filenames),
and verify in Xcode that the AppIcon asset shows no missing icons and that an
Archive passes Organizer checks.

],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}
}
6 changes: 3 additions & 3 deletions Example/Assets.xcassets/Contents.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}
}
15 changes: 0 additions & 15 deletions Example/Assets.xcassets/swift.imageset/Contents.json

This file was deleted.

Binary file removed Example/Assets.xcassets/swift.imageset/swift.pdf
Binary file not shown.
27 changes: 0 additions & 27 deletions Example/Base.lproj/LaunchScreen.storyboard

This file was deleted.

108 changes: 0 additions & 108 deletions Example/Base.lproj/Main.storyboard

This file was deleted.

55 changes: 55 additions & 0 deletions Example/ContentView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
//
// ContentView.swift
// Example
//
// Created by Lasha Efremidze on 8/14/25.
// Copyright © 2025 Lasha Efremidze. All rights reserved.
//

import SwiftUI
import VisualEffectView

struct ContentView: View {
@State private var blurRadius: CGFloat = 0
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix Slider binding type mismatch (CGFloat vs Double) — current code won’t compile

SwiftUI’s Slider expects Binding, but blurRadius is a CGFloat. Switch the state to Double.

-    @State private var blurRadius: CGFloat = 0
+    @State private var blurRadius: Double = 0

Also update the VisualEffect call to pass a CGFloat (see suggested change on Lines 26–30).

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In Example/ContentView.swift around line 13 (and update usages near lines
26–30), the Slider binding fails because @State blurRadius is a CGFloat while
Slider requires Binding<Double>; change the state to @State private var
blurRadius: Double = 0 and keep the Slider bound to $blurRadius, then where
VisualEffect (or any API expecting CGFloat) is called convert the value to
CGFloat by passing CGFloat(blurRadius) so types match.


var body: some View {
ZStack(alignment: .bottom) {
LazyVGrid(columns: [GridItem(.flexible()), GridItem(.flexible())], spacing: 16) {
ForEach(Color.colors, id: \.self) { color in
ZStack {
Image(systemName: "swift")
Copy link

Copilot AI Aug 14, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The code references a system image named "swift" which does not exist in SF Symbols. This will cause the image to not display. Consider using an existing SF Symbol like "swift" from a custom bundle or a valid system symbol like "star.fill".

Suggested change
Image(systemName: "swift")
Image(systemName: "star.fill")

Copilot uses AI. Check for mistakes.
.resizable()
.scaledToFit()
.frame(width: 50, height: 100)
.foregroundStyle(.black)

VisualEffect(
colorTint: color,
colorTintAlpha: 0.5,
blurRadius: blurRadius
)
Comment on lines +26 to +30
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Cast blurRadius to CGFloat for VisualEffect API

Assuming VisualEffect expects a CGFloat for blurRadius, cast the Double state before passing.

                         VisualEffect(
                             colorTint: color,
                             colorTintAlpha: 0.5,
-                            blurRadius: blurRadius
+                            blurRadius: CGFloat(blurRadius)
                         )
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
VisualEffect(
colorTint: color,
colorTintAlpha: 0.5,
blurRadius: blurRadius
)
VisualEffect(
colorTint: color,
colorTintAlpha: 0.5,
blurRadius: CGFloat(blurRadius)
)
🤖 Prompt for AI Agents
In Example/ContentView.swift around lines 26 to 30, the blurRadius state is a
Double but VisualEffect's blurRadius parameter expects a CGFloat; fix by casting
the Double to CGFloat when passing it (e.g., use CGFloat(blurRadius)) so the
call matches the API signature and avoids type mismatch.

}
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)

VStack {
Slider(value: $blurRadius, in: 0...20)

Text("Slide to blur")
.font(.caption)
.foregroundStyle(.secondary)
}
.padding(.horizontal, 32)
.padding(.bottom, 32)
}
}
}

private extension Color {
static let colors = [red, orange, yellow, green, teal, blue, purple, pink]
}

#Preview {
ContentView()
}
Loading
Loading