Apply Warm Organic design system to all iOS views

- Full-screen views: Added WarmGradientBackground() to CompleteTaskView,
  ContractorDetailView, DocumentDetailView, DocumentFormView,
  FeatureComparisonView, TaskTemplatesBrowserView, ManageUsersView,
  ContractorPickerView

- Onboarding: Redesigned all 8 screens with organic styling including
  animated hero sections, gradient buttons, decorative blobs

- Components: Updated ErrorView, EmptyStateView, EmptyResidencesView,
  EmptyTasksView, TaskSuggestionsView, StatView, SummaryStatView,
  CompletionCardView, DynamicTaskColumnView with organic styling

- Applied consistent patterns: OrganicSpacing, naturalShadow modifier,
  RoundedRectangle with .continuous style, rounded font designs

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Trey t
2025-12-17 09:05:47 -06:00
parent c3a9494b0f
commit b05e52521f
37 changed files with 5009 additions and 2759 deletions
+17 -9
View File
@@ -259,7 +259,7 @@ struct CompleteTaskView: View {
}
.listStyle(.plain)
.scrollContentBackground(.hidden)
.background(Color.appBackgroundPrimary)
.background(WarmGradientBackground())
.navigationTitle(L10n.Tasks.completeTask)
.navigationBarTitleDisplayMode(.inline)
.toolbar {
@@ -389,30 +389,34 @@ struct ContractorPickerView: View {
HStack {
VStack(alignment: .leading) {
Text(L10n.Tasks.noneManual)
.foregroundStyle(.primary)
.foregroundColor(Color.appTextPrimary)
Text(L10n.Tasks.enterManually)
.font(.caption)
.foregroundStyle(.secondary)
.foregroundColor(Color.appTextSecondary)
}
Spacer()
if selectedContractor == nil {
Image(systemName: "checkmark")
.foregroundStyle(Color.appPrimary)
.foregroundColor(Color.appPrimary)
}
}
}
.listRowBackground(Color.appBackgroundSecondary)
// Contractors list
if contractorViewModel.isLoading {
HStack {
Spacer()
ProgressView()
.tint(Color.appPrimary)
Spacer()
}
.listRowBackground(Color.appBackgroundSecondary)
} else if let errorMessage = contractorViewModel.errorMessage {
Text(errorMessage)
.foregroundStyle(Color.appError)
.foregroundColor(Color.appError)
.font(.caption)
.listRowBackground(Color.appBackgroundSecondary)
} else {
ForEach(contractorViewModel.contractors, id: \.id) { contractor in
Button(action: {
@@ -422,12 +426,12 @@ struct ContractorPickerView: View {
HStack {
VStack(alignment: .leading, spacing: 4) {
Text(contractor.name)
.foregroundStyle(.primary)
.foregroundColor(Color.appTextPrimary)
if let company = contractor.company {
Text(company)
.font(.caption)
.foregroundStyle(.secondary)
.foregroundColor(Color.appTextSecondary)
}
if let firstSpecialty = contractor.specialties.first {
@@ -437,7 +441,7 @@ struct ContractorPickerView: View {
Text(firstSpecialty.name)
.font(.caption2)
}
.foregroundStyle(.tertiary)
.foregroundColor(Color.appTextSecondary.opacity(0.7))
}
}
@@ -445,13 +449,17 @@ struct ContractorPickerView: View {
if selectedContractor?.id == contractor.id {
Image(systemName: "checkmark")
.foregroundStyle(Color.appPrimary)
.foregroundColor(Color.appPrimary)
}
}
}
.listRowBackground(Color.appBackgroundSecondary)
}
}
}
.listStyle(.plain)
.scrollContentBackground(.hidden)
.background(WarmGradientBackground())
.navigationTitle(L10n.Tasks.selectContractor)
.navigationBarTitleDisplayMode(.inline)
.toolbar {