feat(widget): #Preview-Macros fuer Small/Medium/Large

Sample-Daten mit 4 Decks und totalDueCount=23. Small-Preview zeigt
zusätzlich den Empty-State als zweiten Timeline-Entry.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-05-17 23:44:06 +02:00
parent ba856bbea8
commit 73d95aeecc
32 changed files with 657 additions and 2 deletions

View file

@ -17,9 +17,9 @@
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleShortVersionString</key>
<string>0.1.0</string>
<string>1.0.0</string>
<key>CFBundleVersion</key>
<string>11</string>
<string>1</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>

View file

@ -22,3 +22,36 @@ struct WordeckDueWidget: Widget {
])
}
}
// MARK: - Previews
private let demoEntry = DueEntry(
date: .now,
totalDueCount: 23,
topDecks: [
WidgetSnapshot.Entry(id: "d1", name: "Italienisch — Verben", dueCount: 12, colorHex: nil),
WidgetSnapshot.Entry(id: "d2", name: "iOS-Snippets", dueCount: 7, colorHex: nil),
WidgetSnapshot.Entry(id: "d3", name: "Anatomie", dueCount: 4, colorHex: nil),
WidgetSnapshot.Entry(id: "d4", name: "Sterne am Nordhimmel", dueCount: 2, colorHex: nil),
],
isPlaceholder: false
)
#Preview("Klein", as: .systemSmall) {
WordeckDueWidget()
} timeline: {
demoEntry
DueEntry.placeholder
}
#Preview("Mittel", as: .systemMedium) {
WordeckDueWidget()
} timeline: {
demoEntry
}
#Preview("Groß", as: .systemLarge) {
WordeckDueWidget()
} timeline: {
demoEntry
}

View file

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ApplicationProperties</key>
<dict>
<key>ApplicationPath</key>
<string>Applications/WordeckNative.app</string>
<key>Architectures</key>
<array>
<string>arm64</string>
</array>
<key>CFBundleIdentifier</key>
<string>ev.mana.wordeck</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>SigningIdentity</key>
<string>Apple Development: Till Schneider (RQ922MW3LR)</string>
<key>Team</key>
<string>QP3GLU8PH3</string>
</dict>
<key>ArchiveVersion</key>
<integer>2</integer>
<key>CreationDate</key>
<date>2026-05-17T21:33:26Z</date>
<key>Name</key>
<string>WordeckNative</string>
<key>SchemeName</key>
<string>WordeckNative</string>
</dict>
</plist>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

View file

@ -0,0 +1 @@
{"actions":{"StudyCardsIntent":{"assistantDefinedSchemaTraits":[],"assistantDefinedSchemas":[],"authenticationPolicy":0,"availabilityAnnotations":{"LNPlatformNameWildcard":{"introducedVersion":"*"}},"descriptionMetadata":{"categoryName":{"title":{"alternatives":[],"key":"Lernen"}},"descriptionText":{"alternatives":[],"key":"Öffnet Wordeck und zeigt deine Decks mit fälligen Karten."},"searchKeywords":[]},"effectiveBundleIdentifiers":[],"fullyQualifiedTypeName":"WordeckNative.StudyCardsIntent","identifier":"StudyCardsIntent","isAuthPolExplicit":false,"isDiscoverable":true,"mangledTypeName":"13WordeckNative16StudyCardsIntentV","mangledTypeNameByBundleIdentifier":{},"mangledTypeNameByBundleIdentifierV2":{},"mangledTypeNameV2":"13WordeckNative16StudyCardsIntentV","openAppWhenRun":true,"outputFlags":0,"parameters":[],"presentationStyle":0,"requiredCapabilities":[],"supportedModes":2,"systemProtocolMetadata":[],"systemProtocolMetadataV2":[],"systemProtocols":[],"title":{"alternatives":[],"key":"Karten lernen"},"typeSpecificMetadata":[],"visibilityMetadata":{"assistantOnly":false,"isDiscoverable":true}}},"assistantEntities":[],"assistantIntentNegativePhrases":[],"assistantIntents":[],"autoShortcutProviderMangledName":"13WordeckNative17CardsAppShortcutsV","autoShortcuts":[{"actionIdentifier":"StudyCardsIntent","availabilityAnnotations":{"LNPlatformNameWildcard":{"introducedVersion":"*"}},"phraseTemplates":[{"alternatives":[],"key":"Karten lernen mit ${applicationName}"},{"alternatives":[],"key":"Mit ${applicationName} lernen"},{"alternatives":[],"key":"${applicationName} öffnen"}],"shortTitle":{"alternatives":[],"key":"Karten lernen"},"systemImageName":"rectangle.stack"}],"entities":{},"enums":[],"generator":{"name":"xcode-tools","version":"17C529"},"negativePhrases":[],"queries":{},"shortcutTileColor":14,"version":1}

View file

@ -0,0 +1,4 @@
{
"version" : "3.0",
"toolsVersion" : "17C529"
}

View file

@ -0,0 +1,113 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Info.plist</key>
<data>
lLR+D6Gipz9JB4x/LHO0ECi2JX8=
</data>
<key>embedded.mobileprovision</key>
<data>
xLw+ZkFwGOHYcc247Qfc1KcpyQk=
</data>
</dict>
<key>files2</key>
<dict>
<key>embedded.mobileprovision</key>
<dict>
<key>hash2</key>
<data>
Swk7dD5XR2/V1dEJ6vUBPdPLkLc8wzD3C7VeC0cvD4U=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,113 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Info.plist</key>
<data>
8g5w8G0xSQYK3ZieYe7vKtexWH8=
</data>
<key>embedded.mobileprovision</key>
<data>
HPEj0FbTqU8xLSZmn3bLPwo06xg=
</data>
</dict>
<key>files2</key>
<dict>
<key>embedded.mobileprovision</key>
<dict>
<key>hash2</key>
<data>
gboOGo4FEEuxanbNxwFu2lCiE9IZmTAuLBNmN1KjEGU=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,282 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>AppIcon60x60@2x.png</key>
<data>
R7rm1AeZ7LU0PE0HKjsuTykD/Yk=
</data>
<key>AppIcon76x76@2x~ipad.png</key>
<data>
2+pbE+a+TW4Nl8uEiwiw97TkTvE=
</data>
<key>Assets.car</key>
<data>
xQXfOOODEAEDbuAbwfsgrwKFFvM=
</data>
<key>Info.plist</key>
<data>
Edbt1UfXZhVBn/KxqJPpSO19LCQ=
</data>
<key>Metadata.appintents/extract.actionsdata</key>
<data>
RO4EUDgnjiRbbUiMtsynUaqc1D8=
</data>
<key>Metadata.appintents/nlu/85e13f29d3b6d5f1f150765ea672ce76.version</key>
<data>
W6k8nbDP+T9StSHXQg5D9u2ieE8=
</data>
<key>Metadata.appintents/nlu/nlu.lzfse</key>
<data>
vqsfZdMnwC1krM/B9ntN8UNhpCg=
</data>
<key>Metadata.appintents/version.json</key>
<data>
NPlRq15GZra++9v4rEBA76D/YIs=
</data>
<key>PkgInfo</key>
<data>
n57qDP4tZfLD1rCS43W0B4LQjzE=
</data>
<key>PlugIns/WordeckShareExtension.appex/Info.plist</key>
<data>
lLR+D6Gipz9JB4x/LHO0ECi2JX8=
</data>
<key>PlugIns/WordeckShareExtension.appex/WordeckShareExtension</key>
<data>
hpwvwxj7D5Qv+Z0BpSpzU1MvDIs=
</data>
<key>PlugIns/WordeckShareExtension.appex/_CodeSignature/CodeResources</key>
<data>
b2IvaTJk276RYDJiGZXwUHbO0Zc=
</data>
<key>PlugIns/WordeckShareExtension.appex/embedded.mobileprovision</key>
<data>
xLw+ZkFwGOHYcc247Qfc1KcpyQk=
</data>
<key>PlugIns/WordeckWidgetExtension.appex/Info.plist</key>
<data>
8g5w8G0xSQYK3ZieYe7vKtexWH8=
</data>
<key>PlugIns/WordeckWidgetExtension.appex/WordeckWidgetExtension</key>
<data>
dYqsslc2qeOeLUIHecVWvGe/JmA=
</data>
<key>PlugIns/WordeckWidgetExtension.appex/_CodeSignature/CodeResources</key>
<data>
gt7F7mie64mzKyKSkt+lwEzT6+E=
</data>
<key>PlugIns/WordeckWidgetExtension.appex/embedded.mobileprovision</key>
<data>
HPEj0FbTqU8xLSZmn3bLPwo06xg=
</data>
<key>embedded.mobileprovision</key>
<data>
/gVa6Lt6Rxt4sVgKDk9QN5Dgo+8=
</data>
</dict>
<key>files2</key>
<dict>
<key>AppIcon60x60@2x.png</key>
<dict>
<key>hash2</key>
<data>
R182TAxUAhkm0riXPrrSd3Lu35TJ19Z55fJ+/nwKGOw=
</data>
</dict>
<key>AppIcon76x76@2x~ipad.png</key>
<dict>
<key>hash2</key>
<data>
OrZzUAuy5dcMH2UZa5YZuqPNg4e83pZ4LjF43GsYdrQ=
</data>
</dict>
<key>Assets.car</key>
<dict>
<key>hash2</key>
<data>
WvgKD0FKTWsWUM0hK0sGjdbdnJmdPTAZD/3q45u4fpU=
</data>
</dict>
<key>Metadata.appintents/extract.actionsdata</key>
<dict>
<key>hash2</key>
<data>
M2sOiAnvEZ6VQhpQB8PPVlgExZzkOTpUz5Fs5+/IEaM=
</data>
</dict>
<key>Metadata.appintents/nlu/85e13f29d3b6d5f1f150765ea672ce76.version</key>
<dict>
<key>hash2</key>
<data>
bjQLnP+zepicpUTmu3gKLHiQHT+zNzh2hRGjBhevoB0=
</data>
</dict>
<key>Metadata.appintents/nlu/nlu.lzfse</key>
<dict>
<key>hash2</key>
<data>
SPZbUz24MgmndYeWHe6VvvxPgCpcaiqozFEzOMg11Co=
</data>
</dict>
<key>Metadata.appintents/version.json</key>
<dict>
<key>hash2</key>
<data>
urRgqhLYJepnd5JrqAEXNLT1v7JyHj/jyDPVFH0iHf0=
</data>
</dict>
<key>PlugIns/WordeckShareExtension.appex/Info.plist</key>
<dict>
<key>hash2</key>
<data>
NoQi18wB0gWRWhFCIQKO4fnQx72F4IFC7EIYFrcuXdU=
</data>
</dict>
<key>PlugIns/WordeckShareExtension.appex/WordeckShareExtension</key>
<dict>
<key>hash2</key>
<data>
kXVjmhN9xR9RlT/TZwT4MNPMS8z1a/VPgdR4hdIY+RA=
</data>
</dict>
<key>PlugIns/WordeckShareExtension.appex/_CodeSignature/CodeResources</key>
<dict>
<key>hash2</key>
<data>
WQx/gPPuwesyhQ21UUdwB0TSD2wUwPBddzewtkEUQ0M=
</data>
</dict>
<key>PlugIns/WordeckShareExtension.appex/embedded.mobileprovision</key>
<dict>
<key>hash2</key>
<data>
Swk7dD5XR2/V1dEJ6vUBPdPLkLc8wzD3C7VeC0cvD4U=
</data>
</dict>
<key>PlugIns/WordeckWidgetExtension.appex/Info.plist</key>
<dict>
<key>hash2</key>
<data>
JdpsSiuAaLTynxJHG7kb1fs68mPsYwH+Ve0fMkdsFwY=
</data>
</dict>
<key>PlugIns/WordeckWidgetExtension.appex/WordeckWidgetExtension</key>
<dict>
<key>hash2</key>
<data>
HBOQC2rTXp9n8HHdjsLnLxQ+tXST8Cqlm18GM2FGT/k=
</data>
</dict>
<key>PlugIns/WordeckWidgetExtension.appex/_CodeSignature/CodeResources</key>
<dict>
<key>hash2</key>
<data>
Xlkl4JhI8HaHOiNXpWcLQIAHoGK54KwOJxB37D+LHKU=
</data>
</dict>
<key>PlugIns/WordeckWidgetExtension.appex/embedded.mobileprovision</key>
<dict>
<key>hash2</key>
<data>
gboOGo4FEEuxanbNxwFu2lCiE9IZmTAuLBNmN1KjEGU=
</data>
</dict>
<key>embedded.mobileprovision</key>
<dict>
<key>hash2</key>
<data>
lw89OSbOGcN7ksnEPQMINVn4pv/pyLarO/vz8ogGWlc=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.ev.mana.wordeck</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

View file

@ -0,0 +1,5 @@
---
triple: 'arm64-apple-darwin'
binary-path: '/Users/till/Library/Developer/Xcode/DerivedData/WordeckNative-azicozvcfbbcztgnipvpobekgaxa/Build/Intermediates.noindex/ArchiveIntermediates/WordeckNative/InstallationBuildProductsLocation/Applications/WordeckNative.app/WordeckNative'
relocations: []
...

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.ev.mana.wordeck.share</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

View file

@ -0,0 +1,5 @@
---
triple: 'arm64-apple-darwin'
binary-path: '/Users/till/Library/Developer/Xcode/DerivedData/WordeckNative-azicozvcfbbcztgnipvpobekgaxa/Build/Intermediates.noindex/ArchiveIntermediates/WordeckNative/IntermediateBuildFilesPath/UninstalledProducts/iphoneos/WordeckShareExtension.appex/WordeckShareExtension'
relocations: []
...

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.ev.mana.wordeck.widget</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

View file

@ -0,0 +1,5 @@
---
triple: 'arm64-apple-darwin'
binary-path: '/Users/till/Library/Developer/Xcode/DerivedData/WordeckNative-azicozvcfbbcztgnipvpobekgaxa/Build/Intermediates.noindex/ArchiveIntermediates/WordeckNative/IntermediateBuildFilesPath/UninstalledProducts/iphoneos/WordeckWidgetExtension.appex/WordeckWidgetExtension'
relocations: []
...