import SwiftUI // 分享引导界面的状态:文件数(nil=仍在准备)。@MainActor,UI 线程更新。 @MainActor final class ShareModel: ObservableObject { @Published var fileCount: Int? } // 分享扩展引导界面(取代「白窗一闪即关」):吉祥物 + 字标 + 已就绪文件数 + 醒目「打开 Commilitia // Drop」按钮——iOS 不可靠地允许扩展自动拉起宿主 app,故改为明确引导用户回到 app(点按尝试唤起;即便 // 唤起失败,文件已落 App Group,回到 app 即弹发送预览)。吉祥物抱着飞散的纸恰好呼应「文件已接住、待 drop」。 struct ShareGuideView: View { @ObservedObject var model: ShareModel let onOpen: () -> Void let onCancel: () -> Void var body: some View { VStack(spacing: 18) { Spacer() ZStack { Circle() .fill(Color.cdropAccent.opacity(0.10)) .frame(width: 168, height: 168) BrandMark(size: 112) } Wordmark(size: 24) VStack(spacing: 6) { Text(titleText) .font(.headline) Text(t("ios.share.guide.hint")) .font(.subheadline) .foregroundStyle(.secondary) } .multilineTextAlignment(.center) Spacer() VStack(spacing: 12) { Button(action: onOpen) { Text(t("ios.share.guide.open")) .fontWeight(.semibold) .frame(maxWidth: .infinity) } .buttonStyle(.borderedProminent) .controlSize(.large) .tint(.cdropAccent) .disabled((model.fileCount ?? 0) == 0) Button(t("common.cancel"), role: .cancel, action: onCancel) .controlSize(.large) } } .padding(28) .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color(.systemBackground)) } private var titleText: String { guard let n = model.fileCount else { return t("ios.share.guide.preparing") } if n == 0 { return t("ios.share.guide.empty") } return t("ios.share.guide.ready", [ "n": String(n) ]) } }