swift-focusengine-pro
Reviews, writes, and fixes focus management code for all Apple platforms (tvOS, iOS/iPadOS, watchOS, visionOS, macOS), covering SwiftUI, UIKit, AppKit, and RealityKit. Use when reading, writing, or reviewing apps that handle focus, hover, key view loops, or Digital Crown navigation.
What this skill does
Review focus management code for correctness, modern API usage, and adherence to Apple's focus engine rules. Covers all Apple platforms. Report only genuine problems — do not nitpick or invent issues.
Review process:
1. Check for critical anti-patterns using `references/anti-patterns.md`.
2. Determine the target platform and load the appropriate references:
- **tvOS**: `references/swiftui-focus.md` and `references/uikit-focus.md`.
- **iOS/iPadOS**: `references/ios-focus.md` (focus groups, halo, keyboard nav).
- **watchOS**: `references/watchos-focus.md` (Digital Crown, sequential focus).
- **visionOS**: `references/visionos-focus.md` (gaze, hover effects) and `references/realitykit-focus.md` (RealityKit entities, gestures, volumes).
- **macOS**: `references/macos-focus.md` (key view loop, focus ring, NSView focus, focusedValue for menus, Mac Catalyst).
- For cross-platform: load all relevant references.
3. Check focus styling and visual feedback using `references/focus-styling.md`.
4. Verify focus restoration and data reload handling using `references/focus-restoration.md`.
5. Audit layout patterns for focus section isolation using `references/layout-patterns.md`.
6. Check async/await and data loading focus patterns using `references/async-focus.md`.
7. Verify accessibility integration using `references/accessibility-focus.md`.
8. Check debugging and testing practices using `references/debugging.md`.
If doing a partial review, load only the relevant reference files.
## Core Instructions
### tvOS
- tvOS uses a focus-based navigation model — every interactive element must be reachable via the Siri Remote's directional pad.
- Focus movement is purely geometric — the focus engine draws a rectangle from the currently focused view in the swipe direction and picks the nearest focusable view in that rectangle.
- If nothing is in the geometric path, focus does not move. Period. Use `.focusSection()` (SwiftUI) or `UIFocusGuide` (UIKit) to bridge gaps.
- Never use `.disabled()` on tvOS to toggle interactivity — it removes views from the focus chain entirely. `.allowsHitTesting(false)` is **unreliable** on tvOS (may map to `isUserInteractionEnabled = false`). Preferred: gate the action inside the button closure, or use the dual `@FocusState` + `.disabled()` gating pattern for lists (anti-pattern #25).
- `prefersDefaultFocus(_:in:)` does NOT work inside `ScrollView` on tvOS — use `defaultFocus(_:_:priority:)` instead. Note: `defaultFocus` with `.userInitiated` only fires on initial appearance, NOT on every re-entry.
- Prefer `ScrollPosition` over `ScrollViewReader.scrollTo()` — imperative scrollTo creates feedback loops with the focus engine (anti-pattern #26).
- Always test on real Apple TV hardware — Simulator focus behavior differs.
### iOS/iPadOS
- Focus is a secondary interaction model — it only activates with a hardware keyboard connected.
- Tab moves between focus groups; arrow keys move within a group. This two-level model does NOT exist on tvOS.
- Use `focusGroupIdentifier` (iOS 15+, UIKit) to define custom focus groups — this API is NOT available on tvOS.
- Use `UIFocusHaloEffect` to customize the system focus ring — NOT available on tvOS.
- Set `allowsFocus = true` and `selectionFollowsFocus = true` on collection/table views for keyboard navigation.
- Your app must work perfectly without keyboard focus — always test with touch only.
### watchOS
- Focus routes **Digital Crown input** to the correct view — shown by a green border.
- Focus is sequential (layout order), NOT spatial/directional.
- `.focusSection()` is NOT available on watchOS.
- `.focusable()` MUST come BEFORE `.digitalCrownRotation()` — reversing silently breaks crown input.
- Do NOT add `.focusable()` to system controls (Picker, Stepper, Toggle) — they already handle it.
### visionOS
- Eye gaze = hover targeting, NOT focus. `onHover(perform:)` does NOT fire from gaze — only from pointer devices.
- Use `.hoverEffect()` for gaze visual feedback. System controls get it automatically; custom views need it explicitly.
- `@FocusState` only activates with keyboard (Magic Keyboard), VoiceOver, or Switch Control.
- RealityKit entities need `InputTargetComponent` + `CollisionComponent` + `HoverEffectComponent` for gaze interaction.
- `.focusEffectDisabled()` hides keyboard focus ring; `.hoverEffectDisabled()` disables gaze hover — they are different.
### macOS
- macOS uses a key view loop — Tab/Shift-Tab moves between views in a defined sequence. This is NOT spatial like tvOS.
- Custom NSView subclasses must override `acceptsFirstResponder` to return `true` — the default is `false`, making the view invisible to Tab navigation.
- `recalculatesKeyViewLoop = true` on NSWindow overwrites all manual `nextKeyView` connections. Pick one approach.
- Focus ring customization: override `focusRingType`, `focusRingMaskBounds`, and `drawFocusRingMask()` on NSView.
- `focusedValue` / `focusedSceneValue` are critical on macOS for making menu bar commands respond to the current selection.
- Mac Catalyst: inherits iPad `UIFocusSystem`. If the iPad app doesn't support keyboard focus, the Catalyst app won't either.
- Full Keyboard Access is OFF by default — most users only Tab between text fields and lists, not all controls.
### All Platforms
- Never add `.focusable()` to Buttons or NavigationLinks — they are already focusable. Adding it creates a double-focus wrapper.
- Do not mix `@FocusState` (SwiftUI) and UIKit focus APIs (`setNeedsFocusUpdate`) on the same view hierarchy branch.
- VoiceOver focus (`@AccessibilityFocusState`) is completely separate from UI focus (`@FocusState`).
## Output Format
Organize findings by file. For each issue:
1. State the file and relevant line(s).
2. Name the rule being violated (e.g., "Use `.allowsHitTesting(false)` instead of `.disabled()`").
3. Show a brief before/after code fix.
Skip files with no issues. End with a prioritized summary of the most impactful changes to make first.
Example output:
### TopicsView.swift
**Line 49: `.disabled()` removes view from tvOS focus chain (anti-pattern #1).**
```swift
// Before
TopicClipsGridView(...)
.disabled(!wrapper.isGridFocusable)
// After — gate the action, not the view
TopicClipsGridView(...)
.opacity(wrapper.isGridFocusable ? 1.0 : 0.5)
// Move the guard inside the button/action closures instead
```
**Line 72: Missing `.focusSection()` on horizontal ScrollView in vertical layout.**
```swift
// Before
ScrollView(.horizontal) {
HStack { /* row items */ }
}
// After
ScrollView(.horizontal) {
HStack { /* row items */ }
}
.focusSection()
```
### Summary
1. **Focus breakage (critical):** `.disabled()` on line 49 removes grid from focus chain entirely.
2. **Focus jumping (high):** Missing `.focusSection()` causes cross-row focus jumps.
End of example.
## References
- `references/anti-patterns.md` — Critical mistakes that break focus navigation: 14 tvOS + 7 macOS-specific anti-patterns.
- `references/swiftui-focus.md` — SwiftUI focus APIs: @FocusState, focusSection, prefersDefaultFocus, focused, defaultFocus, onMoveCommand.
- `references/uikit-focus.md` — UIKit focus APIs: UIFocusEnvironment, UIFocusGuide, shouldUpdateFocus, didUpdateFocus, preferredFocusEnvironments, UIFocusDebugger.
- `references/focus-styling.md` — Focus visual feedback: ButtonStyle with isFocused, FocusBorder, hover effects, scale/shadow animations, macOS focus ring styling.
- `references/focus-restoration.md` — Handling focus after data reloads, navigation, and async updates.
- `references/layout-patterns.md` — Common tvOS layouts: table-of-collections, sidebar+content, tab bar, horizontal shelves.
- `references/ios-focus.md` — iOS/iPadOS-specific: focus groups, focusGroupIdentifier, UIFocusHaloEffect, keyboard navigation, allowsFocus, selectionFollowsFocus.
- `references/watchos-focus.md` — watchOS-specific: Digital Crown routing, sequential focus, digitalCrownRotation, focusable ordering.
- `references/Related in Writing & Docs
jax-development
IncludedUse this skill when the user is writing, debugging, profiling, refactoring, reviewing, benchmarking, parallelising, exporting, or explaining JAX code, or when they mention JAX, jax.numpy, jit, grad, value_and_grad, vmap, scan, lax, random keys, pytrees, jax.Array, sharding, Mesh, PartitionSpec, NamedSharding, pmap, shard_map, Pallas, XLA, StableHLO, checkify, profiler, or the JAX repo. It helps turn NumPy or PyTorch-style code into pure functional JAX, fix tracer/control-flow/shape/PRNG bugs, remove recompiles and host-device syncs, choose transforms and sharding strategies, inspect jaxpr/lowering/IR, and benchmark compiled code correctly.
nature-article-writer
IncludedDrafts, rewrites, diagnostically critiques, and style-calibrates primary research manuscripts for Nature and Nature Portfolio journals. Use when the user wants a Nature-style title, summary paragraph or abstract, introduction, results, discussion, methods, figure legends, presubmission enquiry, cover letter, reviewer response, or when a scientific draft sounds generic, jargon-heavy, structurally weak, or AI-ish and needs precise, broad-reader-friendly prose without inventing data, analyses, or references. Best for primary research articles and letters rather than reviews or press releases unless explicitly adapting one.
deckrd
IncludedDocument-driven framework that derives requirements, specifications, implementation plans, and executable tasks from goals through structured AI dialogue. Use when user says "write requirements", "create spec", "plan implementation", "derive tasks", "structure this feature", "break down into tasks", or "document this module". Also use for reverse engineering existing code into docs (/deckrd rev). Do NOT use for direct code writing — use /deckrd-coder after tasks are generated. Do NOT use when the user only wants to run or fix existing code without planning.
clinical-decision-support
IncludedGenerate professional clinical decision support (CDS) documents for pharmaceutical and clinical research settings, including patient cohort analyses (biomarker-stratified with outcomes) and treatment recommendation reports (evidence-based guidelines with decision algorithms). Supports GRADE evidence grading, statistical analysis (hazard ratios, survival curves, waterfall plots), biomarker integration, and regulatory compliance. Outputs publication-ready LaTeX/PDF format optimized for drug development, clinical research, and evidence synthesis.
handling-sf-data
IncludedSalesforce data operations with 130-point scoring. Use this skill to create, update, delete, bulk import/export, generate test data, and clean up org records using sf CLI and anonymous Apex. TRIGGER when: user creates test data, performs bulk import/export, uses sf data CLI commands, needs data factory patterns for Apex tests, or needs to seed/clean records in a Salesforce org. DO NOT TRIGGER when: SOQL query writing only (use querying-soql), Apex test execution (use running-apex-tests), or metadata deployment (use deploying-metadata).
accelint-ac-to-playwright
IncludedConvert and validate acceptance criteria for Playwright test automation. Use when user asks to (1) review/evaluate/check if AC are ready for automation, (2) assess if AC can be converted as-is, (3) validate AC quality for Playwright, (4) turn AC into tests, (5) generate tests from acceptance criteria, (6) convert .md bullets or .feature Gherkin files to Playwright specs, (7) create test automation from requirements. Handles both bullet-style markdown and Gherkin syntax with JSON test plan generation and validation.