Use when implementing iOS 26 SwiftUI features - covers Liquid Glass design system, performance improvements, @Animatable macro, 3D spatial layout, scene bridging, WebView/WebPage, AttributedString rich text editing, drag and drop enhancements, and visionOS integration for iOS 26+
Implements iOS 26 SwiftUI features including Liquid Glass, WebView, rich text editing, and 3D charts.
npx claudepluginhub charleswiltgen/axiomThis skill inherits all available tools. When active, it can use any tool Claude has access to.
Comprehensive guide to new SwiftUI features in iOS 26, iPadOS 26, macOS Tahoe, watchOS 26, and visionOS 26. From the Liquid Glass design system to rich text editing, these enhancements make SwiftUI more powerful across all Apple platforms.
Core principle From low level performance improvements all the way up through the buttons in your user interface, there are some major improvements across the system.
enabledBoundsFor comprehensive coverage, see axiom-liquid-glass (design principles, variants, review pressure) and axiom-liquid-glass-ref (app-wide adoption guide). This section covers WWDC 256-specific APIs only.
Recompile with iOS 26 SDK — navigation containers, tab bars, toolbars, toggles, segmented pickers, and sliders automatically adopt the new design. Bordered buttons default to capsule shape. Sheets get Liquid Glass background (remove any presentationBackground customizations).
.toolbar {
ToolbarItem(placement: .bottomBar) { Button("Archive", systemImage: "archivebox") { } }
ToolbarSpacer(.flexible, placement: .bottomBar) // Push items apart
ToolbarItem(placement: .bottomBar) { Button("Compose", systemImage: "square.and.pencil") { } }
}
// .fixed separates groups visually; .flexible pushes apart (like Spacer in HStack)
Items in a ToolbarItemGroup share a single glass background "pill". ToolbarItemPlacement controls visual appearance: confirmationAction → glassProminent styling, cancellationAction → standard glass. Use .sharedBackgroundVisibility(.hidden) to exclude items (e.g., avatars) from group background.
Attach .toolbar {} to individual views inside NavigationStack (not to NavigationStack itself). iOS 26 morphs between per-view toolbars during push/pop. Use toolbar(id:) with matching ToolbarItem(id:) across screens for items that should stay stable (no bounce):
// MailboxList
.toolbar(id: "main") {
ToolbarItem(id: "filter", placement: .bottomBar) { Button("Filter") { } }
ToolbarSpacer(.flexible, placement: .bottomBar)
ToolbarItem(id: "compose", placement: .bottomBar) { Button("New Message") { } }
}
// MessageList — "filter" absent (animates out), "compose" stays stable
.toolbar(id: "main") {
ToolbarSpacer(.flexible, placement: .bottomBar)
ToolbarItem(id: "compose", placement: .bottomBar) { Button("New Message") { } }
}
#1 gotcha: Toolbar on NavigationStack = nothing to morph between.
Reposition system-provided items (like search) within your toolbar layout:
DefaultToolbarItem(kind: .search, placement: .bottomBar)
// Replaces system's default placement of matching kind
Use in collapsed NavigationSplitView sidebar to specify which column shows search on iPhone. Wrap in if #available(iOS 26.0, *) for backward compatibility.
toolbar(id:) enables user customization (rearrange, show/hide). Only .secondaryAction items support customization on iPadOS. Use showsByDefault: false for optional items. Add ToolbarCommands() for macOS menu item.
.navigationSubtitle("3 unread") — Secondary line below title.badge(3) on toolbar items — Notification countsFoundational search APIs: See axiom-swiftui-search-ref. This section covers iOS 26 refinements only.
NavigationSplitView {
List { }.searchable(text: $searchText)
}
// Bottom-aligned on iPhone, top trailing on iPad (automatic)
// Use placement: .sidebar to restore sidebar-embedded search on iPad
searchToolbarBehavior(.minimize) — Compact search that expands on tapTab(role: .search) — Dedicated search tab; search field replaces tab bar. See swiftui-nav-ref Section 5.7Button("To Top", systemImage: "chevron.up") { scrollToTop() }
.padding()
.glassEffect() // Add .interactive for custom controls on iOS
GlassEffectContainer — Required when multiple glass elements are nearby (glass can't sample glass)glassEffectID(_:in:) — Fluid morphing transitions between glass elements using a namespace.matchedTransitionSource + .navigationTransition(.zoom(...)) to morph sheets from buttons.buttonBorderShape(.roundedRectangle)).controlSize(.extraLarge) — New extra-large button size.controlSize(.small) on containers — Preserve pre-iOS 26 densityGlassButtonStyle(.clear/.glass/.tint) — Glass button variants (iOS 26.1+).buttonSizing(.fit/.stretch/.flexible) — Control button layout behaviorButton(role: .close) / Button(role: .confirm) — System-styled close/confirm.clipShape(.rect(cornerRadius: 12, style: .containerConcentric)) — Corner concentricityiOS 26 adds custom tick marks, constrained selection ranges, current value labels, and thumb visibility control.
Core types: SliderTick<V>, SliderTickContentForEach, SliderTickBuilder
// Static ticks with labels
Slider(value: $value, in: 0...10) {
Text("Rating")
} ticks: {
SliderTick(0) { Text("Min") }
SliderTick(5) { Text("Mid") }
SliderTick(10) { Text("Max") }
}
// Dynamic ticks from collection
SliderTickContentForEach(stops, id: \.self) { value in
SliderTick(value) { Text("\(Int(value))°").font(.caption2) }
}
// Step-based ticks (called for each step value)
Slider(value: $volume, in: 0...10, step: 2, label: { Text("Volume") }, tick: { value in
SliderTick(value) { Text("\(Int(value))") }
})
API constraint: SliderTickContentForEach requires Data.Element to match SliderTick<V> value type. For custom structs, extract numeric values: chapters.map(\.time) then look up labels via chapters.first(where: { $0.time == time }).
Slider(
value: $rating, in: 0...100,
neutralValue: 50, // Starting point / center value
enabledBounds: 20...80, // Restrict selectable range
label: { Text("Rating") },
currentValueLabel: { Text("\(Int(rating))") },
minimumValueLabel: { Text("0") },
maximumValueLabel: { Text("100") },
ticks: { SliderTick(50) { Text("Mid") } },
onEditingChanged: { editing in print(editing ? "Started" : "Ended") }
)
.sliderThumbVisibility(.hidden) — Hide thumb for media progress indicators and minimal UI. Options: .automatic, .visible, .hidden. Always visible on watchOS.
Sticky bars with integrated progressive blur:
List { ForEach(1...20, id: \.self) { Text("\($0). Item") } }
.safeAreaBar(edge: .bottom) {
Text("Bottom Action Bar").padding(.vertical, 15)
}
.scrollEdgeEffectStyle(.soft, for: .bottom) // or .hard
Works like safeAreaInset but with blur. Bar remains fixed while content scrolls beneath.
@Environment(\.openURL) var openURL
// openURL(url, prefersInApp: true) — Opens in SFSafariViewController-style in-app browser
// Default Link opens in Safari; prefersInApp keeps users in your app
See axiom-swiftui-search-ref for foundational .searchable APIs. iOS 26 adds:
.searchable(text: $searchText)
.searchToolbarBehavior(.minimize) // Compact button, expands on tap
Also: .searchPresentationToolbarBehavior(.avoidHidingContent) (iOS 17.1+) keeps title visible during search.
Backward-compatible wrapper for apps targeting iOS 18+26:
extension View {
@ViewBuilder func minimizedSearch() -> some View {
if #available(iOS 26.0, *) {
self.searchToolbarBehavior(.minimize)
} else { self }
}
}
// Usage
.searchable(text: $searchText)
.minimizedSearch()
Availability pattern for toolbar items:
.toolbar {
if #available(iOS 26.0, *) {
DefaultToolbarItem(kind: .search, placement: .bottomBar)
ToolbarSpacer(.flexible, placement: .bottomBar)
}
ToolbarItem(placement: .bottomBar) {
NewNoteButton()
}
}
.searchable(text: $searchText)
Button roles, GlassButtonStyle, buttonSizing — See Liquid Glass Design System section above.
.commands {
TextEditingCommands() // Same API as macOS menu bar
CommandGroup(after: .newItem) {
Button("Add Note") {
addNote()
}
.keyboardShortcut("n", modifiers: [.command, .shift])
}
}
// Creates menu bar on iPad when people swipe down
// MIGRATION REQUIRED:
// Remove deprecated property list key in iPadOS 26:
// UIRequiresFullscreen (entire key deprecated, all values)
// For split view navigation, system automatically shows/hides columns
// based on available space during resize
NavigationSplitView {
Sidebar()
} detail: {
Detail()
}
// Adapts to resizing automatically
Reference "Elevate the design of your iPad app" (WWDC 2025)
.windowResizeAnchor(.topLeading) // Tailor where animation originates
// SwiftUI now synchronizes animation between content view size changes
// and window resizing - great for preserving continuity when switching tabs
List(trips) { trip in // 100k+ items
TripRow(trip: trip)
}
// Loads 6x faster, updates 16x faster on macOS (iOS 26+)
SwiftUI has improved scheduling of user interface updates on iOS and macOS. This improves responsiveness and lets SwiftUI do even more work to prepare for upcoming frames. All in all, it reduces the chance of your app dropping a frame while scrolling quickly at high frame rates.
ScrollView(.horizontal) {
LazyHStack {
ForEach(photoSets) { photoSet in
ScrollView(.vertical) {
LazyVStack {
ForEach(photoSet.photos) { photo in
PhotoView(photo: photo)
}
}
}
}
}
}
// Nested scrollviews now properly delay loading with lazy stacks
// Great for building photo carousels
Available lanes:
Reference "Optimize SwiftUI performance with instruments" (WWDC 2025)
Cross-reference SwiftUI Performance — Master the SwiftUI Instrument
@Observable
class TripStore {
var trips: [Trip] = []
func loadTrips() async {
trips = await TripService.fetchTrips()
// Swift 6 verifies data race safety at compile time
}
}
Benefits Find bugs in concurrent code before they affect your app
Cross-reference Swift Concurrency — Swift 6 strict concurrency patterns
Simplifies custom animations by automatically synthesizing animatableData property.
struct HikingRouteShape: Shape {
var startPoint: CGPoint
var endPoint: CGPoint
var elevation: Double
var drawingDirection: Bool // Don't want to animate this
// Tedious manual animatableData declaration
var animatableData: AnimatablePair<CGPoint.AnimatableData,
AnimatablePair<Double, CGPoint.AnimatableData>> {
get {
AnimatablePair(startPoint.animatableData,
AnimatablePair(elevation, endPoint.animatableData))
}
set {
startPoint.animatableData = newValue.first
elevation = newValue.second.first
endPoint.animatableData = newValue.second.second
}
}
}
@Animatable
struct HikingRouteShape: Shape {
var startPoint: CGPoint
var endPoint: CGPoint
var elevation: Double
@AnimatableIgnored
var drawingDirection: Bool // Excluded from animation
// animatableData automatically synthesized!
}
animatableData property@AnimatableIgnored for properties to excludeCross-reference SwiftUI Animation (swiftui-animation-ref skill) — Comprehensive animation guide covering VectorArithmetic, Animatable protocol, @Animatable macro, animation types, Transaction system, and performance optimization
struct SunPositionView: View {
@State private var timeOfDay: Double = 12.0
var body: some View {
HikingRouteView()
.overlay(alignment: sunAlignment) {
SunView()
.spatialOverlay(alignment: sunAlignment)
}
}
var sunAlignment: Alignment3D {
// Align sun in 3D space based on time of day
Alignment3D(
horizontal: .center,
vertical: .top,
depth: .back
)
}
}
Model3D(named: "WaterBottle")
.manipulable() // People can pick up and move the object
@Environment(\.surfaceSnappingInfo) var snappingInfo: SurfaceSnappingInfo
var body: some View {
VStackLayout().depthAlignment(.center) {
Model3D(named: "waterBottle")
.manipulable()
Pedestal()
.opacity(snappingInfo.classification == .table ? 1.0 : 0.0)
}
}
Scene bridging allows your UIKit and AppKit lifecycle apps to interoperate with SwiftUI scenes. Apps can use it to open SwiftUI-only scene types or use SwiftUI-exclusive features right from UIKit or AppKit code.
MenuBarExtra (macOS)ImmersiveSpace (visionOS)RemoteImmersiveSpace (macOS → Vision Pro)AssistiveAccess (iOS 26)Works with scene modifiers like:
.windowStyle().immersiveEnvironmentBehavior()// In your macOS app
@main
struct MyMacApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
RemoteImmersiveSpace(id: "stereoView") {
// Render stereo content on Apple Vision Pro
// Uses CompositorServices
}
}
}
Reference "What's new in Metal rendering for immersive apps" (WWDC 2025)
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
AssistiveAccessScene {
SimplifiedUI() // UI shown when iPhone is in AssistiveAccess mode
}
}
}
Reference "Customize your app for Assistive Access" (WWDC 2025)
// Show SwiftUI view in AppKit sheet
let hostingController = NSHostingController(rootView: SwiftUISettingsView())
presentAsSheet(hostingController)
// Great for incremental SwiftUI adoption
// Bridge AppKit gestures to SwiftUI
struct AppKitPanGesture: NSGestureRecognizerRepresentable {
func makeNSGestureRecognizer(context: Context) -> NSPanGestureRecognizer {
NSPanGestureRecognizer()
}
func updateNSGestureRecognizer(_ recognizer: NSPanGestureRecognizer, context: Context) {
// Update configuration
}
}
NSHostingView can now be used directly in Interface Builder for gradual SwiftUI adoption.
@Observable
class RealityEntity {
var position: SIMD3<Float>
var rotation: simd_quatf
}
struct MyView: View {
@State private var entity = RealityEntity()
var body: some View {
// SwiftUI views automatically observe changes
Text("Position: \(entity.position.x)")
}
}
Present SwiftUI popovers, alerts, and sheets directly from RealityKit entities.
// Present SwiftUI popovers from RealityKit entities
let popover = Entity()
mapEntity.addChild(popover)
popover.components[PresentationComponent.self] = PresentationComponent(
isPresented: $popoverPresented,
configuration: .popover(arrowEdge: .bottom),
content: DetailsView()
)
ViewAttachmentComponent — add SwiftUI views to entitiesGestureComponent — entity touch and gesture responsivenessReference "Better Together: SwiftUI & RealityKit" (WWDC 2025)
WebKit now provides full SwiftUI APIs for embedding web content, eliminating the need to drop down to UIKit.
import WebKit
struct ArticleView: View {
let articleURL: URL
var body: some View {
WebView(url: articleURL)
}
}
import WebKit
struct InAppBrowser: View {
@State private var page = WebPage()
var body: some View {
VStack {
Text(page.title ?? "Loading...")
WebView(page)
.ignoresSafeArea()
.onAppear {
page.load(URLRequest(url: articleURL))
}
HStack {
Button("Back") { page.goBack() }
.disabled(!page.canGoBack)
Button("Forward") { page.goForward() }
.disabled(!page.canGoForward)
}
}
}
}
goBack(), goForward())title, url, canGoBack, canGoForward)tvOS: WebView and WebPage are not available on tvOS. tvOS has no WKWebView at all. For web content parsing on tvOS, use JavaScriptCore. See axiom-tvos for alternatives.
Reference "Meet WebKit for SwiftUI" (WWDC 2025)
SwiftUI's new support for rich text editing is great for experiences like commenting on photos. TextView now supports AttributedString!
Note The WWDC transcript uses "TextView" as editorial language. The actual SwiftUI API is TextEditor which now supports AttributedString binding for rich text editing.
struct CommentView: View {
@State private var comment = AttributedString("Enter your comment")
var body: some View {
TextEditor(text: $comment)
// Built-in text formatting controls included
// Users can apply bold, italic, underline, etc.
}
}
AttributedString preserves formattingReference "Cook up a rich text experience in SwiftUI with AttributedString" (WWDC 2025)
Cross-reference App Intents Integration (app-intents-ref skill) — AttributedString for Apple Intelligence Use Model action
struct PhotoGrid: View {
@State private var selectedPhotos: [Photo.ID] = []
var body: some View {
ScrollView {
LazyVGrid(columns: gridColumns) {
ForEach(model.photos) { photo in
view(photo: photo)
.draggable(containerItemID: photo.id)
}
}
}
.dragContainer(for: Photo.self, selection: selectedPhotos) { draggedIDs in
photos(ids: draggedIDs)
}
}
}
Key APIs:
.draggable(containerItemID:containerNamespace:) marks each item as part of a drag container (namespace defaults to nil).dragContainer(for:selection:) provides the typed items lazily when a drop occurs.dragConfiguration(DragConfiguration(allowMove: false, allowDelete: true))
.onDragSessionUpdated { session in
let ids = session.draggedItemIDs(for: Photo.ID.self)
if session.phase == .ended(.delete) {
trash(ids)
deletePhotos(ids)
}
}
.dragPreviewsFormation(.stack) // Items stack nicely on top of one another
// Other formations:
// - .default
// - .grid
// - .stack
Combine all modifiers (.dragContainer, .dragConfiguration, .dragPreviewsFormation, .onDragSessionUpdated) on the same scroll view for a complete multi-item drag experience.
Swift Charts supports three-dimensional plotting with Chart3D. Key components: Chart3D (container), SurfacePlot (continuous surfaces), Chart3DPose (camera control), Chart3DSurfaceStyle (surface appearance).
import Charts
Chart3D {
SurfacePlot(x: "x", y: "y", z: "z") { x, y in
sin(x) * cos(y)
}
.foregroundStyle(Gradient(colors: [.orange, .pink]))
}
.chartXScale(domain: -3...3)
.chartYScale(domain: -3...3)
.chartZScale(domain: -3...3)
Chart3D also accepts data collections:
Chart3D(dataPoints) { point in
// 3D mark for each data point
}
Renders continuous surfaces from a mathematical function mapping (x, y) to z values.
SurfacePlot(x: "X Axis", y: "Y Axis", z: "Z Axis") { x, y in
sin(sqrt(x * x + y * y))
}
SurfacePlot(x: "X", y: "Y", z: "Z") { x, y in sin(x) * cos(y) }
.foregroundStyle(.blue) // Solid color
.roughness(0.3) // 0 = smooth, 1 = rough
// Height-based coloring (color maps to z-value)
.foregroundStyle(Chart3DSurfaceStyle.heightBased(yRange: -1.0...1.0))
// Custom gradient mapped to height
.foregroundStyle(Chart3DSurfaceStyle.heightBased(
Gradient(colors: [.blue, .green, .yellow, .red]),
yRange: -1.0...1.0
))
Available surface styles: .heightBased (color by z-value), .normalBased (color by surface normal direction).
Chart3D {
SurfacePlot(x: "X", y: "Y", z: "Z") { x, y in sin(x) * cos(y) }
SurfacePlot(x: "X", y: "Y", z: "Z") { x, y in cos(x) * sin(y) + 2 }
}
Controls the viewing angle. Pass as value for static positioning, or bind for interactive rotation.
@State private var chartPose: Chart3DPose = .default
Chart3D { /* ... */ }
.chart3DPose(chartPose) // Static — read-only
.chart3DPose($chartPose) // Binding — enables drag-to-rotate
Predefined poses: .default, .front, .back, .top, .bottom, .left, .right
Custom pose with specific angles:
Chart3DPose(azimuth: .degrees(45), inclination: .degrees(30))
Animate between poses:
Button("Top View") { withAnimation { chartPose = .top } }
Controls how 3D depth is projected to 2D.
Chart3D { /* ... */ }
.chart3DCameraProjection(.perspective) // Objects shrink with distance
.chart3DCameraProjection(.orthographic) // Objects maintain size regardless of depth
.chart3DCameraProjection(.automatic) // System decides
All existing chart axis modifiers have z-axis equivalents:
.chartZScale(domain:) — Set z-axis range.chartZAxis() — Configure z-axis labels and grid linesReference "Bring Swift Charts to the third dimension" (WWDC 2025)
struct FavoriteLocationControl: ControlWidget {
var body: some ControlWidgetConfiguration {
StaticControlConfiguration(kind: "FavoriteLocation") {
ControlWidgetButton(action: MarkFavoriteIntent()) {
Label("Mark Favorite", systemImage: "star")
}
}
}
}
// Access from watch face or Shortcuts
Controls now appear in Control Center on Mac.
struct CountdownWidget: Widget {
var body: some WidgetConfiguration {
StaticConfiguration(kind: "Countdown") { entry in
CountdownView(entry: entry)
}
}
}
struct PhotoCountdownView: View {
@Environment(\.levelOfDetail) var levelOfDetail: LevelOfDetail
var body: some View {
switch levelOfDetail {
case .default:
RecentPhotosView() // Full detail when close
case .simplified:
CountdownView() // Simplified when further away
default:
CountdownView()
}
}
}
Live Activities now appear on CarPlay displays for glanceable information while driving.
Reference "What's new in widgets" (WWDC 2025)
<key>UIRequiresFullscreen</key>
<!-- Entire property list key is deprecated (all values) -->
Apps must support resizable windows on iPad.
✅ Liquid Glass design for navigation, tab bars, toolbars ✅ Bottom-aligned search on iPhone ✅ List performance improvements (6x loading, 16x updating) ✅ Scrolling performance improvements ✅ System controls (toggles, pickers, sliders) new appearance ✅ Bordered buttons default to capsule shape ✅ Updated control heights (slightly taller on macOS) ✅ Monochrome icon rendering in toolbars ✅ Menus: icons on leading edge, consistent across iOS and macOS ✅ Sheets morph out of dialogs automatically ✅ Scroll edge blur/fade under system toolbars
⚠️ Remove presentationBackground from sheets (let Liquid Glass material shine)
⚠️ Remove extra backgrounds/darkening effects behind toolbar areas
⚠️ Remove hard-coded control heights (use automatic sizing)
⚠️ Update section headers to title-style capitalization (no longer auto-uppercased)
🔧 Toolbar spacers (.fixed)
🔧 Tinted prominent buttons in toolbars
🔧 Glass effect for custom views (.glassEffect())
🔧 glassEffectID for morphing transitions between glass elements
🔧 GlassEffectContainer for multiple nearby glass elements
🔧 sharedBackgroundVisibility(.hidden) to remove toolbar item from group background
🔧 Sheet morphing from buttons (navigationZoomTransition)
🔧 Search tab role (Tab(role: .search))
🔧 Compact search toolbar (.searchToolbarBehavior(.minimize))
🔧 Extra large buttons (.controlSize(.extraLarge))
🔧 Concentric rectangle shape (.containerConcentric)
🔧 iPad menu bar (.commands)
🔧 Window resize anchor (.windowResizeAnchor())
🔧 @Animatable macro for custom shapes/modifiers
🔧 WebView for web content
🔧 TextEditor with AttributedString binding
🔧 Enhanced drag and drop with .dragContainer
🔧 Slider ticks (SliderTick, SliderTickContentForEach)
🔧 Slider thumb visibility (.sliderThumbVisibility())
🔧 Safe area bars with blur (.safeAreaBar() + .scrollEdgeEffectStyle())
🔧 In-app URL opening (openURL(url, prefersInApp: true))
🔧 Close and confirm button roles (Button(role: .close))
🔧 Glass button styles (GlassButtonStyle — iOS 26.1+)
🔧 Button sizing control (.buttonSizing())
🔧 Toolbar morphing transitions (per-view .toolbar {} inside NavigationStack)
🔧 DefaultToolbarItem for system components in toolbars
🔧 Stable toolbar items (toolbar(id:) with matched IDs across screens)
🔧 User-customizable toolbars (toolbar(id:) with CustomizableToolbarContent)
🔧 Tab bar minimization (.tabBarMinimizeBehavior(.onScrollDown))
🔧 Tab view bottom accessory (.tabViewBottomAccessory(isEnabled:content:) — iOS 26.1+)
.toolbar {} to individual views (not NavigationStack); remove presentationBackground from sheets; use GlassEffectContainer for nearby glass elements.safeAreaPadding() for edge-to-edge (not .padding()). See axiom-swiftui-layout-ref for full guideAttributedString to TextEditor; constrain attributes for your UXAlignment3D for depth; .manipulable() only where it makes sense| Symptom | Fix |
|---|---|
| Old design after updating to iOS 26 SDK | Clean build (Shift-Cmd-K), rebuild targeting iOS 26 SDK, check deployment target |
| Search remains at top on iPhone | Place .searchable on NavigationSplitView, not on List directly |
| @Animatable "does not conform" | All properties must be VectorArithmetic or marked @AnimatableIgnored |
| Rich text formatting lost in TextEditor | Bind AttributedString, not String |
| Drag delete not working | Enable .dragConfiguration(allowDelete: true) AND observe .onDragSessionUpdated |
| SliderTickContentForEach won't compile | Iterate over numeric values (chapters.map(\.time)), not custom structs — see Slider section |
| Toolbar not morphing during navigation | Move .toolbar {} from NavigationStack to each view inside it — see Liquid Glass section |
WWDC: 2025-256, 2025-278 (What's new in widgets), 2025-287 (Meet WebKit for SwiftUI), 2025-310 (Optimize SwiftUI performance with instruments), 2025-323 (Build a SwiftUI app with the new design), 2025-325 (Bring Swift Charts to the third dimension), 2025-341 (Cook up a rich text experience in SwiftUI with AttributedString)
Docs: /swiftui, /swiftui/defaulttoolbaritem, /swiftui/toolbarspacer, /swiftui/searchtoolbarbehavior, /swiftui/view/toolbar(id:content:), /swiftui/view/tabbarminimizebehavior(_:), /swiftui/view/tabviewbottomaccessory(isenabled:content:), /swiftui/slider, /swiftui/slidertick, /swiftui/slidertickcontentforeach, /webkit, /foundation/attributedstring, /charts, /charts/chart3d, /charts/surfaceplot, /charts/chart3dpose, /charts/chart3dcameraprojection, /charts/chart3dsurfacestyle, /realitykit/presentationcomponent
Skills: axiom-swiftui-performance, axiom-liquid-glass, axiom-swift-concurrency, axiom-app-intents-ref, axiom-swiftui-search-ref
Primary source WWDC 2025-256 "What's new in SwiftUI". Additional content from 2025-323 (Build a SwiftUI app with the new design), 2025-287 (Meet WebKit for SwiftUI), and Apple documentation. Version iOS 26+, iPadOS 26+, macOS Tahoe+, watchOS 26+, visionOS 26+
Activates when the user asks about AI prompts, needs prompt templates, wants to search for prompts, or mentions prompts.chat. Use for discovering, retrieving, and improving prompts.
Search, retrieve, and install Agent Skills from the prompts.chat registry using MCP tools. Use when the user asks to find skills, browse skill catalogs, install a skill for Claude, or extend Claude's capabilities with reusable AI agent components.
Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.