feat(ui): replace loading indicators with Apple-style LoadingSpinner

- Add LoadingSpinner component with small/medium/large sizes using system gray color
- Add LoadingPlaceholder for skeleton loading states
- Add LoadingSheet for full-screen blocking overlays
- Replace ThemedSpinner/ThemedSpinnerCompact across all views
- Remove deprecated loading components from AnimatedComponents.swift
- Delete LoadingTextGenerator.swift
- Fix PhotoImportView layout to fill full width

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-01-12 22:43:33 -06:00
parent f8204007e6
commit c0f1645434
21 changed files with 544 additions and 460 deletions

View File

@@ -0,0 +1,47 @@
//
// LoadingSpinnerTests.swift
// SportsTimeTests
//
import Testing
import SwiftUI
@testable import SportsTime
struct LoadingSpinnerTests {
@Test func smallSizeHasCorrectDimensions() {
let config = LoadingSpinner.Size.small
#expect(config.diameter == 16)
#expect(config.strokeWidth == 2)
}
@Test func mediumSizeHasCorrectDimensions() {
let config = LoadingSpinner.Size.medium
#expect(config.diameter == 24)
#expect(config.strokeWidth == 3)
}
@Test func largeSizeHasCorrectDimensions() {
let config = LoadingSpinner.Size.large
#expect(config.diameter == 40)
#expect(config.strokeWidth == 4)
}
@Test func spinnerCanBeCreatedWithAllSizes() {
let small = LoadingSpinner(size: .small)
let medium = LoadingSpinner(size: .medium)
let large = LoadingSpinner(size: .large)
#expect(small.size == .small)
#expect(medium.size == .medium)
#expect(large.size == .large)
}
@Test func spinnerCanHaveOptionalLabel() {
let withLabel = LoadingSpinner(size: .medium, label: "Loading...")
let withoutLabel = LoadingSpinner(size: .medium)
#expect(withLabel.label == "Loading...")
#expect(withoutLabel.label == nil)
}
}