UI-Refactor angelehnt an cards/apps/web. Drei Killer-Patterns
übernommen:
1. CardSurface (Sources/Core/Theme/CardSurface.swift)
- Drei Sizes md/lg/hero mit identischem Border-Radius 14pt,
1pt Border, layered Shadows je nach Elevation
- Aspect-Ratio 5:7 für md/hero, 12:16.8 für lg
- Optional Color-Accent-Stripe links (6pt, deck.color)
2. DeckStackTile (Sources/Features/Decks/DeckStackTile.swift)
- Spielkarten-Stack-Visual: 3 gestaffelt-rotierte
Hintergrund-Layer hinter der CardSurface
- Layer-Offsets + Tilts deterministisch aus Deck-ID gehasht
(gleiches Deck = gleiche Asymmetrie)
- Inhalt: Category-Icon oben rechts, Titel + Description
zentriert, Counts unten als Pill für dueCount
3. RatingBar mit Good-Emphasis (Features/Study/RatingBar.swift)
- "Good" als full primary background (hero action)
- again/hard/easy mit subtle border-tint + opacity-08-Background
- Keyboard-Shortcut im Button-Label als kbd-Style-Pill
DeckListView komplett umgebaut:
- Horizontale ScrollView mit scrollTransition + viewAligned-Snap
- Zwei Sektionen: "Eigene Decks" und "Abonniert"
- Inbox-Banner als highlight (primary opacity 0.08 mit border)
- Pending-Share-Banner mit warning-Tint
- Section-Headers mit Icon + Title + Count
StudySessionView.cardSurface nutzt jetzt CardSurface(.hero, .raised).
Build 6 → 7. Drei native Targets bauen, 35 Tests grün.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
204 lines
6.3 KiB
YAML
204 lines
6.3 KiB
YAML
name: CardsNative
|
|
|
|
options:
|
|
bundleIdPrefix: ev.mana
|
|
createIntermediateGroups: true
|
|
xcodeVersion: "16.0"
|
|
deploymentTarget:
|
|
iOS: "18.0"
|
|
macOS: "15.0"
|
|
developmentLanguage: de
|
|
groupSortPosition: top
|
|
generateEmptyDirectories: true
|
|
|
|
packages:
|
|
ManaSwiftCore:
|
|
path: ../mana-swift-core
|
|
|
|
settings:
|
|
base:
|
|
SWIFT_VERSION: "6.0"
|
|
SWIFT_STRICT_CONCURRENCY: complete
|
|
CURRENT_PROJECT_VERSION: "1"
|
|
MARKETING_VERSION: "0.1.0"
|
|
GENERATE_INFOPLIST_FILE: "NO"
|
|
ENABLE_USER_SCRIPT_SANDBOXING: "YES"
|
|
DEAD_CODE_STRIPPING: "YES"
|
|
CLANG_ENABLE_MODULES: "YES"
|
|
# mana e.V. Apple-Developer-Team-ID. Muss matchen mit dem AASA-
|
|
# Eintrag auf https://cardecky.mana.how/.well-known/apple-app-site-association
|
|
# (siehe cards/infrastructure/docker-compose.production.yml).
|
|
DEVELOPMENT_TEAM: QP3GLU8PH3
|
|
|
|
targets:
|
|
CardsNative:
|
|
type: application
|
|
supportedDestinations: [iOS, macOS]
|
|
dependencies:
|
|
- package: ManaSwiftCore
|
|
product: ManaCore
|
|
- package: ManaSwiftCore
|
|
product: ManaTokens
|
|
- target: CardsWidgetExtension
|
|
embed: true
|
|
- target: CardsShareExtension
|
|
embed: true
|
|
sources:
|
|
- path: Sources/App
|
|
- path: Sources/Features
|
|
- path: Sources/Core
|
|
- path: Sources/Resources
|
|
excludes:
|
|
- "Info.plist"
|
|
- "CardsNative.entitlements"
|
|
info:
|
|
path: Sources/Resources/Info.plist
|
|
properties:
|
|
CFBundleShortVersionString: "0.1.0"
|
|
CFBundleVersion: "7"
|
|
CFBundleDevelopmentRegion: de
|
|
CFBundleDisplayName: Cardecky
|
|
LSApplicationCategoryType: "public.app-category.education"
|
|
UILaunchScreen: {}
|
|
UISupportedInterfaceOrientations:
|
|
- UIInterfaceOrientationPortrait
|
|
- UIInterfaceOrientationLandscapeLeft
|
|
- UIInterfaceOrientationLandscapeRight
|
|
UISupportedInterfaceOrientations~ipad:
|
|
- UIInterfaceOrientationPortrait
|
|
- UIInterfaceOrientationPortraitUpsideDown
|
|
- UIInterfaceOrientationLandscapeLeft
|
|
- UIInterfaceOrientationLandscapeRight
|
|
CFBundleURLTypes:
|
|
- CFBundleURLName: ev.mana.cardecky
|
|
CFBundleURLSchemes:
|
|
- cards
|
|
NSUserActivityTypes:
|
|
- NSUserActivityTypeBrowsingWeb
|
|
NSPhotoLibraryUsageDescription: "Cardecky greift auf deine Fotos zu, damit du Bilder zu Image-Occlusion-Karten hinzufügen kannst."
|
|
ITSAppUsesNonExemptEncryption: false
|
|
entitlements:
|
|
path: Sources/Resources/CardsNative.entitlements
|
|
properties:
|
|
com.apple.security.app-sandbox: true
|
|
com.apple.security.network.client: true
|
|
com.apple.security.files.user-selected.read-write: true
|
|
keychain-access-groups:
|
|
- $(AppIdentifierPrefix)ev.mana.cardecky
|
|
com.apple.developer.associated-domains:
|
|
- applinks:cardecky.mana.how
|
|
com.apple.security.application-groups:
|
|
- group.ev.mana.cardecky
|
|
settings:
|
|
base:
|
|
PRODUCT_BUNDLE_IDENTIFIER: ev.mana.cardecky
|
|
CODE_SIGN_STYLE: Automatic
|
|
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
|
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME: AccentColor
|
|
ENABLE_PREVIEWS: "YES"
|
|
|
|
CardsShareExtension:
|
|
type: app-extension
|
|
supportedDestinations: [iOS]
|
|
sources:
|
|
- path: ShareExtension
|
|
excludes:
|
|
- "Resources/Info.plist"
|
|
- "Resources/CardsShareExtension.entitlements"
|
|
- path: Sources/Core/Sync/PendingShareStore.swift
|
|
info:
|
|
path: ShareExtension/Resources/Info.plist
|
|
properties:
|
|
CFBundleDisplayName: Als Karte speichern
|
|
CFBundleShortVersionString: "0.1.0"
|
|
CFBundleVersion: "7"
|
|
NSExtension:
|
|
NSExtensionPointIdentifier: com.apple.share-services
|
|
NSExtensionPrincipalClass: $(PRODUCT_MODULE_NAME).ShareViewController
|
|
NSExtensionAttributes:
|
|
NSExtensionActivationRule:
|
|
NSExtensionActivationSupportsText: true
|
|
NSExtensionActivationSupportsWebURLWithMaxCount: 1
|
|
entitlements:
|
|
path: ShareExtension/Resources/CardsShareExtension.entitlements
|
|
properties:
|
|
com.apple.security.application-groups:
|
|
- group.ev.mana.cardecky
|
|
settings:
|
|
base:
|
|
PRODUCT_BUNDLE_IDENTIFIER: ev.mana.cardecky.share
|
|
CODE_SIGN_STYLE: Automatic
|
|
SKIP_INSTALL: "YES"
|
|
|
|
CardsWidgetExtension:
|
|
type: app-extension
|
|
supportedDestinations: [iOS]
|
|
sources:
|
|
- path: Widgets/CardsWidget
|
|
excludes:
|
|
- "Resources/Info.plist"
|
|
- "Resources/CardsWidgetExtension.entitlements"
|
|
- path: Sources/Core/Sync/WidgetSnapshot.swift
|
|
info:
|
|
path: Widgets/CardsWidget/Resources/Info.plist
|
|
properties:
|
|
CFBundleDisplayName: Cardecky Widget
|
|
CFBundleShortVersionString: "0.1.0"
|
|
CFBundleVersion: "7"
|
|
NSExtension:
|
|
NSExtensionPointIdentifier: com.apple.widgetkit-extension
|
|
entitlements:
|
|
path: Widgets/CardsWidget/Resources/CardsWidgetExtension.entitlements
|
|
properties:
|
|
com.apple.security.application-groups:
|
|
- group.ev.mana.cardecky
|
|
dependencies:
|
|
- sdk: WidgetKit.framework
|
|
- sdk: SwiftUI.framework
|
|
settings:
|
|
base:
|
|
PRODUCT_BUNDLE_IDENTIFIER: ev.mana.cardecky.widget
|
|
CODE_SIGN_STYLE: Automatic
|
|
SKIP_INSTALL: "YES"
|
|
INFOPLIST_KEY_CFBundleDisplayName: Cardecky Widget
|
|
|
|
CardsNativeTests:
|
|
type: bundle.unit-test
|
|
supportedDestinations: [iOS, macOS]
|
|
sources:
|
|
- Tests/UnitTests
|
|
dependencies:
|
|
- target: CardsNative
|
|
settings:
|
|
base:
|
|
PRODUCT_BUNDLE_IDENTIFIER: ev.mana.cardecky.tests
|
|
GENERATE_INFOPLIST_FILE: "YES"
|
|
|
|
CardsNativeUITests:
|
|
type: bundle.ui-testing
|
|
supportedDestinations: [iOS, macOS]
|
|
sources:
|
|
- Tests/UITests
|
|
dependencies:
|
|
- target: CardsNative
|
|
settings:
|
|
base:
|
|
PRODUCT_BUNDLE_IDENTIFIER: ev.mana.cardecky.uitests
|
|
GENERATE_INFOPLIST_FILE: "YES"
|
|
|
|
schemes:
|
|
CardsNative:
|
|
build:
|
|
targets:
|
|
CardsNative: all
|
|
CardsNativeTests: [test]
|
|
CardsNativeUITests: [test]
|
|
test:
|
|
targets:
|
|
- CardsNativeTests
|
|
- CardsNativeUITests
|
|
gatherCoverageData: false
|
|
run:
|
|
config: Debug
|
|
archive:
|
|
config: Release
|