summaryrefslogtreecommitdiff
path: root/DomainDig/WatchlistView.swift
diff options
context:
space:
mode:
Diffstat (limited to 'DomainDig/WatchlistView.swift')
-rw-r--r--DomainDig/WatchlistView.swift65
1 files changed, 44 insertions, 21 deletions
diff --git a/DomainDig/WatchlistView.swift b/DomainDig/WatchlistView.swift
index db79b0b..eb934e6 100644
--- a/DomainDig/WatchlistView.swift
+++ b/DomainDig/WatchlistView.swift
@@ -435,19 +435,20 @@ struct WatchlistRowView: View {
var body: some View {
VStack(alignment: .leading, spacing: appDensity.metrics.rowSpacing + 1) {
- HStack(alignment: .firstTextBaseline, spacing: 8) {
- if trackedDomain.isPinned {
- Image(systemName: "pin.fill")
- .font(.caption2)
- .foregroundStyle(Color(.statusWarning))
- }
- Text(trackedDomain.domain)
- .font(appDensity.font(.callout))
- .foregroundStyle(.primary)
- .lineLimit(2)
- .multilineTextAlignment(.leading)
- Spacer(minLength: 8)
- statusBadge
+ // Side-by-side while it fits; at accessibility sizes the badge drops
+ // below the domain instead of squeezing it into "hea lt…" while the
+ // badge letter-wraps down the screen. ViewThatFits picks the wide
+ // layout whenever it genuinely fits, so default sizes keep density.
+ ViewThatFits(in: .horizontal) {
+ HStack(alignment: .firstTextBaseline, spacing: 8) {
+ domainTitle
+ Spacer(minLength: 8)
+ statusBadge
+ }
+ VStack(alignment: .leading, spacing: 6) {
+ domainTitle
+ statusBadge
+ }
}
Text("Updated \(trackedDomain.updatedAt.formatted(date: .abbreviated, time: .shortened))")
@@ -460,14 +461,9 @@ struct WatchlistRowView: View {
.foregroundStyle(Color(.appTextSecondary))
}
- HStack(spacing: 8) {
- Text(trackedDomain.monitoringEnabled ? "Monitoring on" : "Monitoring off")
- if let lastMonitoredAt = trackedDomain.lastMonitoredAt {
- Text("Checked \(lastMonitoredAt.formatted(date: .omitted, time: .shortened))")
- }
- if let lastAlertAt = trackedDomain.lastAlertAt {
- Text("Alert \(lastAlertAt.formatted(date: .omitted, time: .shortened))")
- }
+ ViewThatFits(in: .horizontal) {
+ HStack(spacing: 8) { monitoringMetadata }
+ VStack(alignment: .leading, spacing: 2) { monitoringMetadata }
}
.font(appDensity.font(.caption2))
.foregroundStyle(Color(.appTextSecondary))
@@ -491,6 +487,33 @@ struct WatchlistRowView: View {
.modifier(WatchlistRowAccessibility(trackedDomain: trackedDomain, isRefreshing: isRefreshing))
}
+ @ViewBuilder
+ private var monitoringMetadata: some View {
+ Text(trackedDomain.monitoringEnabled ? "Monitoring on" : "Monitoring off")
+ if let lastMonitoredAt = trackedDomain.lastMonitoredAt {
+ Text("Checked \(lastMonitoredAt.formatted(date: .omitted, time: .shortened))")
+ }
+ if let lastAlertAt = trackedDomain.lastAlertAt {
+ Text("Alert \(lastAlertAt.formatted(date: .omitted, time: .shortened))")
+ }
+ }
+
+ private var domainTitle: some View {
+ HStack(alignment: .firstTextBaseline, spacing: 8) {
+ if trackedDomain.isPinned {
+ Image(systemName: "pin.fill")
+ .font(.caption2)
+ .foregroundStyle(Color(.statusWarning))
+ }
+ Text(trackedDomain.domain)
+ .font(appDensity.font(.callout))
+ .foregroundStyle(.primary)
+ .lineLimit(3)
+ .multilineTextAlignment(.leading)
+ .fixedSize(horizontal: false, vertical: true)
+ }
+ }
+
private func availabilityLabel(_ status: DomainAvailabilityStatus?) -> String {
switch status {
case .available: