swiftship/internal/skills/data/always-visionos/components/SKILL.md
visionOS UI components: glass backgrounds, hover effects, ornaments, 3D content views. Use when working on visionOS component patterns, spatial UI, or Vision Pro interactions. Triggers: Button, glass, hover, ornament, RealityView, Model3D, component.
npx skillsauth add abdullah4ai/apple-developer-toolkit componentsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
visionOS windows use system glass material by default. The glass auto-adapts brightness based on the physical environment. Custom opaque backgrounds destroy this adaptive behavior.
BANNED on visionOS:
.background(AppTheme.Colors.background)).foregroundStyle(AppTheme.Colors.primary) on body text) — use white/system text on glass.glassBackgroundEffect() on list row backgrounds — creates glass-on-glass, text becomes invisible.scrollContentBackground(.hidden) on Lists — removes contrast needed for text visibilityREQUIRED on visionOS:
.glassBackgroundEffect() for custom container backgrounds (sidebars, cards, panels).primary, .secondary, .tertiary)// CORRECT — glass container, system text
VStack {
Text("Settings")
.font(AppTheme.Fonts.title)
.foregroundStyle(.primary) // system vibrancy — auto-adapts
Text("Configure your preferences")
.font(AppTheme.Fonts.body)
.foregroundStyle(.secondary) // dimmer vibrancy level
}
.padding(AppTheme.Spacing.lg)
.glassBackgroundEffect()
// BANNED — opaque colored background
VStack { content }
.background(AppTheme.Colors.background) // NO — destroys glass
.foregroundStyle(AppTheme.Colors.primary) // NO — colored body text
AppTheme colors are ONLY for:
.borderedProminent button tint (accent color)AppTheme colors must NEVER be used for:
.glassBackgroundEffect()).foregroundStyle(.primary) / .secondary / .tertiary)ALL interactive elements MUST have .hoverEffect() for eye tracking feedback:
Button("Play") {
play()
}
.hoverEffect()
// Custom hover effect
Button { } label: {
Image(systemName: "star")
.font(AppTheme.Fonts.title)
}
.hoverEffect(.highlight)
// Bordered prominent (primary action — accent color tint is appropriate here)
Button("Start", systemImage: "play.fill") {
start()
}
.buttonStyle(.borderedProminent)
.buttonBorderShape(.capsule)
.hoverEffect()
// Bordered (secondary action)
Button("Settings", systemImage: "gear") {
openSettings()
}
.buttonStyle(.bordered)
.buttonBorderShape(.roundedRectangle)
.hoverEffect()
BUTTON HIERARCHY:
| Level | Style | Use Case |
|-------|-------|----------|
| Primary action | .borderedProminent | Start, Play, Confirm |
| Secondary | .bordered | Settings, More Info |
| Tertiary | .borderless | Dismiss, Cancel |
Ornaments attach supplementary controls to windows:
.ornament(attachmentAnchor: .scene(.bottom)) {
HStack(spacing: 20) {
Button("Previous", systemImage: "backward.fill") {
previous()
}
Button("Play", systemImage: "play.fill") {
play()
}
Button("Next", systemImage: "forward.fill") {
next()
}
}
.padding()
.glassBackgroundEffect()
}
For interactive 3D content:
import RealityKit
RealityView { content in
if let entity = try? await Entity(named: "Scene", in: realityKitContentBundle) {
content.add(entity)
}
}
For simple 3D model display (no interaction):
import RealityKit
Model3D(named: "Globe") { model in
model
.resizable()
.scaledToFit()
} placeholder: {
ProgressView()
}
visionOS List views have built-in glass-compatible styling. Do NOT add custom glass backgrounds to list rows — this creates glass-on-glass rendering where text becomes invisible.
// CORRECT — let the system handle list row backgrounds
List {
Section("General") {
NavigationLink("Profile") { ProfileView() }
Toggle("Notifications", isOn: $notifications)
}
}
.listStyle(.insetGrouped)
// BANNED — glass on list rows causes invisible text
List {
ForEach(items) { item in
ItemRow(item: item)
.listRowBackground( // NO
RoundedRectangle(cornerRadius: 12)
.fill(.clear)
.glassBackgroundEffect() // glass-on-glass = invisible text
)
}
}
.scrollContentBackground(.hidden) // NO — removes default list contrast
Key rules for Lists on visionOS:
.listStyle(.insetGrouped) — it provides proper visionOS styling.scrollContentBackground(.hidden) — it removes the contrast needed for text visibility.glassBackgroundEffect() to .listRowBackground() — glass-on-glass makes text invisible.listRowBackground() with custom glass shapes — the system handles row backgroundsContentUnavailableView(
"No Results",
systemImage: "magnifyingglass",
description: Text("Try a different search term")
)
UIScreen.main.bounds — use GeometryReader or window sizing.glassBackgroundEffect() for custom container backgrounds (sidebars, cards, panels) — but NEVER on list rows.scrollContentBackground(.hidden) or .listRowBackground() with glass — creates invisible text.listStyle(.insetGrouped) for Lists — system handles row styling.hoverEffect() for eye tracking.primary, .secondary, .tertiary) for text — not AppTheme color tokens.buttonBorderShape() for spatial-appropriate button shapes.borderedProminent per visible areatools
Apple platform skill for docs, WWDC lookup, App Store Connect work, and SwiftUI app generation. Use repo-local `node cli.js` for Apple docs and WWDC search, `appledev store` for App Store Connect workflows, and `appledev build` for app scaffolding or fix loops on macOS. USE WHEN: Apple APIs, WWDC sessions, TestFlight/App Store tasks, or building/fixing Apple-platform apps. DON'T USE WHEN: non-Apple platforms, generic backend work, or general web research. EDGE CASES: docs-only queries use `node cli.js` in this repo, not `appledev`; release workflows use `appledev store`; app scaffolding uses `appledev build`; rules-only requests can read `references/ios-rules/` or `references/swiftui-guides/` progressively without invoking binaries.
tools
All-in-one Apple developer skill with three integrated tools shipped as a single unified binary. (1) Documentation search across Apple frameworks, symbols, and 1,267 WWDC sessions from 2014-2025. No credentials needed. (2) App Store Connect CLI with 120+ commands covering builds (find/wait/upload), TestFlight, pre-submission validate, submissions, signing, subscriptions (family-sharable), IAP, analytics, Xcode Cloud, metadata workflows, release pipeline dashboard, insights, win-back offers, promoted purchases, product pages, nominations, accessibility declarations, pre-orders, pricing filters, localizations update, diff, webhooks with local receiver, workflow automation, and more. Requires App Store Connect API key. (3) Multi-platform app builder (iOS/watchOS/tvOS/iPad/macOS/visionOS) that generates complete Swift/SwiftUI apps from natural language with auto-fix, simulator launch, interactive chat mode, and open-in-Xcode. Requires an LLM API key and Xcode. Includes 38 iOS development rules and 12 SwiftUI best practice guides for Liquid Glass, navigation, state management, and modern APIs. All three tools ship as one binary (appledev). USE WHEN: Apple API docs, App Store Connect management, WWDC lookup, or building iOS/watchOS/tvOS/macOS/visionOS apps from scratch. DON'T USE WHEN: non-Apple platforms or general coding.
testing
watchOS complications: WidgetKit complication families, accessory sizes, timeline providers for watch face. Use when implementing watchOS-specific patterns related to widgets.
development
watchOS haptic feedback: WKInterfaceDevice preset haptic types for wrist-based feedback. Use when implementing watchOS-specific patterns related to haptics.