User-facing Rebrand:
- LoginView Heading (war schon in v0.8.5)
- NotificationManager.title (war schon in v0.8.5)
- ShareEditorView Footer-Text: "...in der Cards-App" → "...in der Cardecky-App"
- StudyAppIntents Description: "Öffnet Cards" → "Öffnet Cardecky"
- Localizable.xcstrings: "Cards" key → "Cardecky"
- NSPhotoLibraryUsageDescription: "Cards greift..." → "Cardecky greift..."
- Log.app.info("Cards starting") → "Cardecky starting"
- MARKETING_COPY.md: alle "Cards"-Treffer in DE + EN auf Cardecky
- RELEASE_CHECKLIST: App-Name "Cards" → "Cardecky"
Build-Nummer 2 → 3 (Apple lehnt doppelte Build-Nummern ab, Code-
Hash hat sich geändert).
Code-Identifier bleiben: CardsAPI, CardsTheme, CardsNativeApp,
CardsWidgetExtension, CardsShareExtension — interne Symbol-Namen,
nicht user-facing.
Archive verifiziert: CFBundleDisplayName=Cardecky, Build=3.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
60 lines
1.9 KiB
Swift
60 lines
1.9 KiB
Swift
import SwiftUI
|
|
|
|
/// Mini-Editor in der Share-Extension. User kann den Text noch
|
|
/// anpassen, dann "Speichern" → PendingShare landet in der Haupt-App.
|
|
struct ShareEditorView: View {
|
|
let initialText: String
|
|
let sourceURL: String?
|
|
let onSave: (String) -> Void
|
|
let onCancel: () -> Void
|
|
|
|
@State private var text: String
|
|
|
|
init(
|
|
text: String,
|
|
sourceURL: String?,
|
|
onSave: @escaping (String) -> Void,
|
|
onCancel: @escaping () -> Void
|
|
) {
|
|
initialText = text
|
|
self.sourceURL = sourceURL
|
|
self.onSave = onSave
|
|
self.onCancel = onCancel
|
|
_text = State(initialValue: text)
|
|
}
|
|
|
|
var body: some View {
|
|
NavigationStack {
|
|
Form {
|
|
Section("Vorderseite") {
|
|
TextField("Text", text: $text, axis: .vertical)
|
|
.lineLimit(4 ... 10)
|
|
}
|
|
if let sourceURL {
|
|
Section("Quelle") {
|
|
Text(sourceURL)
|
|
.font(.caption)
|
|
.foregroundStyle(.secondary)
|
|
.lineLimit(1)
|
|
}
|
|
}
|
|
Section {
|
|
Text("Wähle das Ziel-Deck in der Cardecky-App.")
|
|
.font(.caption)
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
}
|
|
.navigationTitle("Als Karte speichern")
|
|
.navigationBarTitleDisplayMode(.inline)
|
|
.toolbar {
|
|
ToolbarItem(placement: .cancellationAction) {
|
|
Button("Abbrechen", action: onCancel)
|
|
}
|
|
ToolbarItem(placement: .confirmationAction) {
|
|
Button("Speichern") { onSave(text) }
|
|
.disabled(text.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|