Skip to content

Repository files navigation

ThreeColumnLayout

A flexible and customizable three-column layout framework for macOS SwiftUI applications.

Overview

ThreeColumnLayout provides a reusable solution for implementing the common three-column layout pattern found in many macOS applications (like Xcode, Finder, etc.). It offers:

  • Navigator Column: Typically used for navigation, file browsers, or content lists
  • Canvas Column: Main content area for editing, viewing, or primary interactions
  • Inspector Column: Properties panel, settings, or additional information

Features

  • ✅ Flexible Configuration: Customize column widths, visibility, and behavior
  • ✅ Theme Support: Built-in themes with support for light/dark mode
  • ✅ Responsive Layout: Automatic adaptation to window size changes
  • ✅ Smooth Animations: Fluid column show/hide transitions
  • ✅ Toolbar Integration: Built-in toolbar support with customizable items
  • ✅ SwiftUI Native: Pure SwiftUI implementation using NavigationSplitView
  • ✅ macOS 13+: Optimized for modern macOS versions

Installation

Swift Package Manager

Add the following to your Package.swift file:

dependencies: [
    .package(url: "https://github.com/yourusername/ThreeColumnLayout.git", from: "1.0.0")
]

Or add it through Xcode:

  1. File → Add Package Dependencies
  2. Enter the repository URL
  3. Select the version and add to your target

Quick Start

Basic Usage

import SwiftUI
import ThreeColumnLayout

struct ContentView: View {
    var body: some View {
        ThreeColumnLayoutView(
            navigator: {
                NavigatorView()
            },
            canvas: {
                CanvasView()
            },
            inspector: {
                InspectorView()
            }
        )
    }
}

With Custom Configuration

import SwiftUI
import ThreeColumnLayout

struct ContentView: View {
    let configuration = ThreeColumnLayoutConfiguration(
        navigatorColumn: ColumnConfiguration(
            minWidth: 200,
            defaultWidth: 250,
            maxWidth: 400
        ),
        inspectorColumn: ColumnConfiguration(
            minWidth: 250,
            defaultWidth: 300,
            maxWidth: 500
        ),
        theme: .minimal,
        showsToolbar: true
    )
    
    var body: some View {
        ThreeColumnLayoutView(configuration: configuration) {
            // Navigator content
            List(items) { item in
                NavigationLink(item.name, value: item)
            }
        } canvas: {
            // Canvas content
            if let selectedItem = selectedItem {
                ItemDetailView(item: selectedItem)
            } else {
                Text("Select an item")
                    .foregroundColor(.secondary)
            }
        } inspector: {
            // Inspector content
            if let selectedItem = selectedItem {
                ItemInspectorView(item: selectedItem)
            }
        }
    }
}

Configuration Options

Column Configuration

let columnConfig = ColumnConfiguration(
    minWidth: 200,           // Minimum column width
    maxWidth: 400,           // Maximum column width (nil for unlimited)
    defaultWidth: 250,       // Default/ideal column width
    isResizable: true,       // Whether column can be resized
    isCollapsible: true      // Whether column can be collapsed
)

Theme Configuration

let themeConfig = ThemeConfiguration(
    backgroundColor: Color(NSColor.controlBackgroundColor),
    dividerColor: Color(NSColor.separatorColor),
    toolbarBackgroundColor: Color(NSColor.windowBackgroundColor),
    cornerRadius: 8,
    dividerWidth: 1
)

Predefined Configurations

// Column configurations
ColumnConfiguration.navigator  // Optimized for navigation
ColumnConfiguration.canvas     // Optimized for main content
ColumnConfiguration.inspector  // Optimized for properties panel

// Theme configurations
ThemeConfiguration.default     // Standard macOS appearance
ThemeConfiguration.minimal     // Clean, minimal appearance

Advanced Usage

Visibility Management

struct ContentView: View {
    @StateObject private var visibilityManager = ColumnVisibilityManager()
    
    var body: some View {
        ThreeColumnLayoutView(
            visibilityManager: visibilityManager,
            navigator: { NavigatorView() },
            canvas: { CanvasView() },
            inspector: { InspectorView() }
        )
        .toolbar {
            ToolbarItem(placement: .navigation) {
                Button("Toggle Navigator") {
                    visibilityManager.toggleNavigator()
                }
            }
        }
    }
}

Custom Delegate

class MyLayoutDelegate: ThreeColumnLayoutDelegate {
    func columnVisibilityDidChange(column: ColumnType, isVisible: Bool) {
        print("\(column.displayName) visibility changed: \(isVisible)")
    }
    
    func toolbarItems(for layout: ThreeColumnLayoutView) -> [ToolbarItem] {
        return [
            ToolbarItem(placement: .primaryAction) {
                Button("Custom Action") {
                    // Custom action
                }
            }
        ]
    }
}

Builder Pattern

let configuration = ThreeColumnLayoutBuilder()
    .navigator(.navigator)
    .canvas(.canvas)
    .inspector(.inspector)
    .theme(.minimal)
    .toolbar(true)
    .animationDuration(0.25)
    .build()

Requirements

  • macOS 13.0+
  • Swift 5.7+
  • Xcode 14.0+

License

MIT License - see LICENSE file for details.

Contributing

Contributions are welcome! Please read the contributing guidelines before submitting pull requests.

Support

About

A flexible and customizable three-column layout framework for macOS SwiftUI applications.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages