diff --git a/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift b/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift index 0c6c60a..8247caf 100644 --- a/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift +++ b/NucleicRemote/NucleicRemote/Views/SessionDetailView.swift @@ -375,6 +375,28 @@ struct SessionDetailView: View { } } + /// The placeholder shown while an approval's details are still loading — mirrors the approval + /// card's frame (orange warning header, glass surface) so the real `ApprovalCardView` swaps in + /// without a jump. Non-actionable: the real approval id isn't known yet, so there's nothing to + /// Allow/Deny until the snapshot lands. + private var approvalLoadingCard: some View { + VStack(alignment: .leading, spacing: 10) { + HStack(spacing: 6) { + Image(systemName: "exclamationmark.triangle.fill").foregroundStyle(.orange) + Text("Permission requested").font(.subheadline.weight(.semibold)) + } + HStack(spacing: 8) { + ProgressView().controlSize(.small) + Text("Connecting to your Mac to load this approval…") + .font(.footnote).foregroundStyle(.secondary) + Spacer(minLength: 0) + } + } + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.horizontal, 14).padding(.vertical, 12) + .glassSurface(cornerRadius: 26) + } + /// A queued follow-up shown above the composer: its text (or attachment names) with the /// attachments as chips, and — at control scope — a ✕ that cancels just this message. @ViewBuilder