import SwiftUI // All backport view/scene modifiers go as an extension on this. We use this // so we can easily track and centralize all backports. struct Backport { let content: Content } extension View { var backport: Backport { Backport(content: self) } } extension Scene { var backport: Backport { Backport(content: self) } } extension Backport where Content: Scene { func defaultSize(width: CGFloat, height: CGFloat) -> some Scene { if #available(macOS 13, *) { return content.defaultSize(width: width, height: height) } else { return content } } } extension Backport where Content: View { func pointerVisibility(_ v: BackportVisibility) -> some View { if #available(macOS 15, *) { return content.pointerVisibility(v.official) } else { return content } } func pointerStyle(_ style: BackportPointerStyle?) -> some View { if #available(macOS 15, *) { return content.pointerStyle(style?.official) } else { return content } } } enum BackportVisibility { case automatic case visible case hidden @available(macOS 15, *) var official: Visibility { switch self { case .automatic: return .automatic case .visible: return .visible case .hidden: return .hidden } } } enum BackportPointerStyle { case `default` case grabIdle case grabActive case horizontalText case verticalText case link case resizeLeft case resizeRight case resizeUp case resizeDown case resizeUpDown case resizeLeftRight @available(macOS 15, *) var official: PointerStyle { switch self { case .default: return .default case .grabIdle: return .grabIdle case .grabActive: return .grabActive case .horizontalText: return .horizontalText case .verticalText: return .verticalText case .link: return .link case .resizeLeft: return .frameResize(position: .trailing, directions: [.inward]) case .resizeRight: return .frameResize(position: .leading, directions: [.inward]) case .resizeUp: return .frameResize(position: .bottom, directions: [.inward]) case .resizeDown: return .frameResize(position: .top, directions: [.inward]) case .resizeUpDown: return .frameResize(position: .top) case .resizeLeftRight: return .frameResize(position: .trailing) } } }