# Cable

Cable is a SwiftUI app for laying out low voltage electrical systems. It helps you size conductors, manage saved loads, and browse the VoltPlan component library so you can assemble accurate bills of materials for off-grid or mobile installs.

## Requirements
- macOS with Xcode 15 or newer
- iOS 17 simulator (iPhone 15 target used in CI)
- SwiftData and SwiftUI are bundled with the Xcode toolchain; no additional dependencies are required

## Getting Started
- `open Cable.xcodeproj` launches the project with the correct scheme configuration
- Alternatively run `xed Cable.xcodeproj` from Terminal to open the project in Xcode
- Select the **Cable** scheme and the **iPhone 15** simulator, then press **Run**

## Build & Test from the Command Line
- Build: `xcodebuild -scheme Cable -destination 'platform=iOS Simulator,name=iPhone 15' build`
- Test (unit + UI bundles): `xcodebuild -scheme Cable -destination 'platform=iOS Simulator,name=iPhone 15' test`
- Clean derived data if Xcode caches cause issues: `xcodebuild -scheme Cable clean`

## Project Layout
- `Cable/` – SwiftUI source, models, and assets (`CableApp.swift`, `CalculatorView`, `SystemEditorView`, `ComponentLibraryView`, etc.)
- `CableTests/` – Focused XCTest coverage for calculator logic, unit conversions, and persistence helpers
- `CableUITests/` – UI automation flows that exercise onboarding, load editing, and the component browser
- `fastlane/` – Automation scripts for screenshots and releases
- `Cable.xcodeproj` – Project configuration targeting iOS 17

## Core Features
- Interactive cable sizing calculator with support for metric and imperial unit systems
- SwiftData-backed storage for electrical systems and saved loads
- Remote VoltPlan component library with searchable affiliate links
- Onboarding flows that guide new users through system setup and load entry

## Development Tips
- Stick to idiomatic Swift style: four-space indentation, trailing commas on multiline collections, and `UpperCamelCase`/`lowerCamelCase` naming
- Keep SwiftUI view files focused on a single primary view; extract helpers when logic grows
- Run the test targets before opening a pull request to maintain coverage
- Commit messages should be short, imperative phrases (e.g., `Update library paging`)
