Swiftui Ui Patterns
by @dimillian
Best practices and example-driven guidance for building SwiftUI views and components. Use when creating or refactoring SwiftUI UI, designing tab architecture with TabView, composing screens, or needing component-specific patterns and examples.
clawhub install swiftui-ui-patternsπ About This Skill
name: swiftui-ui-patterns description: Best practices and example-driven guidance for building SwiftUI views and components. Use when creating or refactoring SwiftUI UI, designing tab architecture with TabView, composing screens, or needing component-specific patterns and examples.
SwiftUI UI Patterns
Quick start
Choose a track based on your goal:
Existing project
rg "TabView\(" or similar, then read the closest SwiftUI view.references/components-index.md and follow its guidance.New project scaffolding
references/app-scaffolding-wiring.md to wire TabView + NavigationStack + sheets.AppTab and RouterPath based on the provided skeletons.General rules to follow
@State, @Binding, @Observable, @Environment) and avoid unnecessary view models..task and explicit loading/error states..sheet(item:) over .sheet(isPresented:) when state represents a selected model. Avoid if let inside a sheet body. Sheets should own their actions and call dismiss() internally instead of forwarding onCancel/onConfirm closures.Workflow for a new SwiftUI view
1. Define the view's state and its ownership location.
2. Identify dependencies to inject via @Environment.
3. Sketch the view hierarchy and extract repeated parts into subviews.
4. Implement async loading with .task and explicit state enum if needed.
5. Add accessibility labels or identifiers when the UI is interactive.
6. Validate with a build and update usage callsites if needed.
Component references
Use references/components-index.md as the entry point. Each component reference should include:
Sheet patterns
Item-driven sheet (preferred)
@State private var selectedItem: Item?.sheet(item: $selectedItem) { item in
EditItemSheet(item: item)
}
Sheet owns its actions
struct EditItemSheet: View {
@Environment(\.dismiss) private var dismiss
@Environment(Store.self) private var store let item: Item
@State private var isSaving = false
var body: some View {
VStack {
Button(isSaving ? "Savingβ¦" : "Save") {
Task { await save() }
}
}
}
private func save() async {
isSaving = true
await store.save(item)
dismiss()
}
}
Adding a new component reference
references/.md .references/components-index.md with the new entry.π‘ Examples
Choose a track based on your goal:
Existing project
rg "TabView\(" or similar, then read the closest SwiftUI view.references/components-index.md and follow its guidance.New project scaffolding
references/app-scaffolding-wiring.md to wire TabView + NavigationStack + sheets.AppTab and RouterPath based on the provided skeletons.