Code + Identity-Rename zur Vorbereitung auf Apple-Dev-Portal-Aktion (Bundle ev.mana.wordeck, App-Group group.ev.mana.wordeck, AASA applinks:wordeck.com). Build bleibt funktional, aber gegen die neue text-only-API können image-occlusion-Creates 422 zurückgeben — das wird mit der Wordeck-Native v1.0-Welle (parallele Apple-Aktion) sauber gemacht. Umbenennung: - 41 Files: cardecky/Cardecky → wordeck/Wordeck (Display, Strings, Kommentare) - 57 Files: CardsNative → WordeckNative, CardsAPI → WordeckAPI, CardsTheme → WordeckTheme, CardsBrand → WordeckBrand, CardsWidget → WordeckWidget, CardsDueWidget → WordeckDueWidget - Bundle-ID ev.mana.cardecky → ev.mana.wordeck (project.yml, Info.plist, entitlements, Keychain-Service, App-Group) - AASA applinks:cardecky.mana.how → applinks:wordeck.com - API-Base cardecky-api.mana.how → api.wordeck.com - 10 Files renamed (App-Entry, API-Extensions, Theme, Widget, Entitlements, Tests) - xcodeproj regenerated via xcodegen → WordeckNative.xcodeproj - MaskRegionsTests.swift gelöscht (image-occlusion entfällt mit Wordeck text-only) Forgejo-Repo git.mana.how/till/cards-native → wordeck-native umbenannt (Auto-Redirect aktiv). Lokales Verzeichnis Code/cards-native/ bleibt vorerst — wird beim nächsten Apple-Setup mit Bundle-Test umbenannt. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
85 lines
2.7 KiB
Swift
85 lines
2.7 KiB
Swift
import SwiftUI
|
|
|
|
/// Tile für eigene Decks in der Decks-Liste. Nutzt `DeckCoverTile` als
|
|
/// Basis (Fan-Stack-Visual + Card-Content). Footer: Karten-Count,
|
|
/// Due-Capsule, Marketplace-Globe, Edit-Button.
|
|
/// Tap auf die Tile triggert `onTap` (Study-Mode), Tap auf den Edit-
|
|
/// Button triggert `onEdit` (Deck-Detail).
|
|
struct DeckStackTile: View {
|
|
let deck: CachedDeck
|
|
let onTap: () -> Void
|
|
let onEdit: () -> Void
|
|
|
|
var body: some View {
|
|
DeckCoverTile(
|
|
title: deck.name,
|
|
description: deck.deckDescription,
|
|
category: deck.category,
|
|
seed: deck.id,
|
|
colorAccentHex: deck.color,
|
|
isFeatured: false
|
|
) {
|
|
footerContent
|
|
}
|
|
.contentShape(Rectangle())
|
|
.onTapGesture { onTap() }
|
|
}
|
|
|
|
private var footerContent: some View {
|
|
HStack(spacing: 8) {
|
|
Label("\(deck.cardCount)", systemImage: "rectangle.stack")
|
|
.font(.caption2)
|
|
.foregroundStyle(WordeckTheme.mutedForeground)
|
|
if deck.dueCount > 0 {
|
|
Text("\(deck.dueCount) fällig")
|
|
.font(.caption2.weight(.semibold))
|
|
.padding(.horizontal, 8)
|
|
.padding(.vertical, 3)
|
|
.background(WordeckTheme.primary.opacity(0.15), in: Capsule())
|
|
.foregroundStyle(WordeckTheme.primary)
|
|
}
|
|
if deck.isFromMarketplace {
|
|
Image(systemName: "globe")
|
|
.font(.caption2)
|
|
.foregroundStyle(WordeckTheme.mutedForeground)
|
|
}
|
|
Spacer()
|
|
editButton
|
|
}
|
|
}
|
|
|
|
private var editButton: some View {
|
|
Button {
|
|
onEdit()
|
|
} label: {
|
|
Image(systemName: "pencil")
|
|
.font(.footnote.weight(.semibold))
|
|
.foregroundStyle(WordeckTheme.mutedForeground)
|
|
.frame(width: 30, height: 30)
|
|
.background(WordeckTheme.muted.opacity(0.7), in: Circle())
|
|
.overlay(
|
|
Circle().stroke(WordeckTheme.border, lineWidth: 1)
|
|
)
|
|
}
|
|
.buttonStyle(.plain)
|
|
.accessibilityLabel("Deck bearbeiten")
|
|
}
|
|
}
|
|
|
|
extension DeckCategory {
|
|
var systemImageName: String {
|
|
switch self {
|
|
case .language: "character.book.closed"
|
|
case .medicine: "cross.case"
|
|
case .science: "atom"
|
|
case .math: "function"
|
|
case .history: "scroll"
|
|
case .law: "scale.3d"
|
|
case .technology: "cpu"
|
|
case .arts: "paintbrush"
|
|
case .music: "music.note"
|
|
case .sport: "figure.run"
|
|
case .other: "rectangle.stack"
|
|
}
|
|
}
|
|
}
|