Conversation
Replaces the SDK boilerplate with the full Study Stacks flashcard app: decks (user + ecosystem scope), flip/quiz/sprint study modes, mastery tracking, streaks, badges, results, and CSV/TSV card import. Recent feature work included here: - Optional per-card front image (URL) with editor preview, import column, and rendering on flip/quiz cards - Subject-themed app background applied while a deck is selected - Optional "Show hint" button instead of always displaying card hints Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…nd assorted fixes Type system - Rename exported interfaces/aliases to *Type suffix (Deck → DeckType, Card → CardType, etc.) across client + server + shared - Drop unused createdAt/updatedAt on DeckType - Scope createdByProfileId/createdByDisplayName/grades to ecosystem decks only (optional fields) - Add DeckGrades sentinel union with ALL_GRADES_SENTINEL = "all"; helpers expandGrades, normalizeGrades, isAllGrades - Add DeckResultsRowType + parseDeckResultsValue/formatDeckResultsValue for pipe-string per-deck results Per-deck leaderboards - Move results from a separate top-level field into deck.results[profileId] = "displayName|sessions" - New DeckResultsModal with sortable per-deck table - New openResultsInNewTab util (self-contained printable HTML) replaces CSV download — canonical pattern going forward - Drop AssetResultsRow, fetchResults, updateResultsRow, EcosystemDataObjectType.studyStacksResults - handleCompleteSession writes per-deck leaderboard only for ecosystem scope Mode picker as modal - Lift mode-pick state up to Home (pickingDeckId, playingMode); render ModePicker as a portal-mounted modal over Library - Study no longer owns the "picking-mode" phase; accepts mode prop and starts session on mount - onChangeMode callback used by "Study Again" to re-open the picker - ModePicker owns Delete pipeline: ConfirmationModal + backendAPI.delete + dispatch SET_DECKS (matches DecksList) - canEdit(deck) helper gates Edit + Delete in both ModePicker and DecksList DecksList refresh - Collapse AdminView to one-line <DecksList /> (no tabs) - Icon buttons with tooltips: View Results, Edit, Duplicate, Delete Save guards - Reject saving a deck with zero cards (client + server) - Reject saving any incomplete card via isCardComplete (client + server) - Pluralized error messages on EditDeck Bug fixes - Quiz distractor dedup: case-insensitive trim against correct answer + sibling collisions (fixes "4+4 = 8" double-option) - Prune null deck slots in fetchDecks (Topia's delete-by-null leaves null entries); defensive `d &&` guard in findDeckById to prevent "Cannot read 'id' of null" after delete Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Rolls up all
devwork since the last main merge into a single release intomain.4311e3d)6a64f83)35d17b6)07a9a8d,4b248aa)f141594)f70a83f)0b3bc49,e499120)d62ae28,8701195,dd8a26e)e507a1d)Test plan
🤖 Generated with Claude Code