import SwiftUI extension SplitView { /// The split divider that is rendered and can be used to resize a split view. struct Divider: View { let direction: SplitViewDirection let visibleSize: CGFloat let invisibleSize: CGFloat let color: Color private var visibleWidth: CGFloat? { switch (direction) { case .horizontal: return visibleSize case .vertical: return nil } } private var visibleHeight: CGFloat? { switch (direction) { case .horizontal: return nil case .vertical: return visibleSize } } private var invisibleWidth: CGFloat? { switch (direction) { case .horizontal: return visibleSize + invisibleSize case .vertical: return nil } } private var invisibleHeight: CGFloat? { switch (direction) { case .horizontal: return nil case .vertical: return visibleSize + invisibleSize } } private var pointerStyle: BackportPointerStyle { return switch (direction) { case .horizontal: .resizeLeftRight case .vertical: .resizeUpDown } } var body: some View { ZStack { Color.clear .frame(width: invisibleWidth, height: invisibleHeight) .contentShape(Rectangle()) // Makes it hit testable for pointerStyle Rectangle() .fill(color) .frame(width: visibleWidth, height: visibleHeight) } .backport.pointerStyle(pointerStyle) .onHover { isHovered in // macOS 15+ we use the pointerStyle helper which is much less // error-prone versus manual NSCursor push/pop if #available(macOS 15, *) { return } if (isHovered) { switch (direction) { case .horizontal: NSCursor.resizeLeftRight.push() case .vertical: NSCursor.resizeUpDown.push() } } else { NSCursor.pop() } } } } }