feat(app): a card browser to search, filter, sort and change many cards at once

Browse beside the flashcards' tab opens the studyset's cards over the
tabs (with everything inside it when it has sub-studysets), laid out as
the older design had it:
- a grid of tiles (each card's two sides) or one card at a time beside
  the list (on a phone above a strip of them, swiped through), as last
  left for the studyset on this device;
- a search over front, back, reading, meanings, hints, explanation and
  tag names, katakana found as hiragana and kana by romaji;
- sorting by own order, newest, oldest, A–Z (words by reading), due
  first; a filter sheet by kind, tag and state (new, learning, due,
  buried, reported);
- choosing cards (a toggle; shift-click or long-press for a range,
  select all) to move into another or a new studyset, add or remove
  tags, start afresh, or delete with Undo; the actions in the row on
  wide windows, in a bar at the foot below.

Moving cards between studysets is new in the card repository and its
gateway (studysetId and position written, named columns).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-09 14:21:01 +02:00
commit 42c57bd40a
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -1393,5 +1393,97 @@
"pathImportMalformedSource": "a source must be an object or text, and its parts text.",
"pomodoroTopBarHint": "The timer can count down in GNOME's top bar, with its buttons, once the AppIndicator extension is on.",
"pomodoroTopBarSetUp": "Set up",
"pomodoroTopBarDismiss": "Don't suggest again"
"pomodoroTopBarDismiss": "Don't suggest again",
"cardBrowserTitle": "Flashcards",
"cardBrowserTitleWithName": "{title} — flashcards",
"@cardBrowserTitleWithName": {"placeholders": {"title": {"type": "String"}}},
"cardBrowserTitleSubtree": "{title} (incl. sub-studysets)",
"@cardBrowserTitleSubtree": {"placeholders": {"title": {"type": "String"}}},
"cardBrowserBrowse": "Browse",
"cardBrowserBrowseTooltip": "Browse flashcards",
"cardBrowserStudy": "Study",
"cardBrowserEditor": "Editor",
"cardBrowserMore": "More",
"cardBrowserImport": "Import flashcards",
"cardBrowserGrid": "Grid",
"cardBrowserDetail": "Detail",
"cardBrowserSearch": "Search",
"cardBrowserSort": "Sort",
"cardBrowserFilter": "Filter",
"cardBrowserSelect": "Select",
"cardBrowserSortManual": "Manual order",
"cardBrowserSortNewest": "Newest first",
"cardBrowserSortOldest": "Oldest first",
"cardBrowserSortAlphabetical": "A–Z (front)",
"cardBrowserSortDue": "Due first",
"cardBrowserSearchHint": "Search flashcards",
"cardBrowserCloseSearch": "Close search",
"cardBrowserClearQuery": "Clear query",
"cardBrowserFilterTitle": "Filter flashcards",
"cardBrowserFilterType": "Type",
"cardBrowserTypeAll": "All cards",
"cardBrowserTypeFrontBack": "Q&A only",
"cardBrowserTypeMultipleChoice": "Multiple-choice only",
"cardBrowserTypeVocabulary": "Words only",
"cardBrowserTypeMatching": "Matching only",
"cardBrowserTypeMap": "Maps only",
"cardBrowserFilterTag": "Tag",
"cardBrowserAllTags": "All tags",
"cardBrowserFilterStatus": "Status",
"cardBrowserStatusNew": "New",
"cardBrowserStatusLearning": "Learning",
"cardBrowserStatusDue": "Due",
"cardBrowserStatusBuried": "Buried",
"cardBrowserStatusReported": "Reported",
"cardBrowserClearAll": "Clear all",
"cardBrowserApply": "Apply",
"cardBrowserEmptyTitle": "No flashcards yet",
"cardBrowserEmptyHint": "Create some to browse them here.",
"cardBrowserCreate": "Create flashcards",
"cardBrowserNoMatches": "No flashcards match",
"cardBrowserNoMatchesHint": "Try a different search or filter.",
"cardBrowserClearFilters": "Clear search & filters",
"cardBrowserRetry": "Retry",
"cardBrowserPrevious": "Previous",
"cardBrowserNext": "Next",
"cardBrowserBuried": "Buried",
"cardBrowserSelectAll": "Select all",
"cardBrowserDeselectAll": "Deselect all",
"cardBrowserSelected": "{count} selected",
"@cardBrowserSelected": {"placeholders": {"count": {"type": "int"}}},
"cardBrowserRangeHintTouch": "Long-press another card to select everything in between.",
"cardBrowserRangeHintPointer": "Shift-click another card to select everything in between.",
"cardBrowserMove": "Move",
"cardBrowserAddTags": "Add tags",
"cardBrowserRemoveTags": "Remove tags",
"cardBrowserResetProgress": "Reset progress",
"cardBrowserDelete": "Delete",
"cardBrowserMoreActions": "More actions",
"cardBrowserDone": "Done",
"cardBrowserDeleted": "{count, plural, =1{1 flashcard deleted} other{{count} flashcards deleted}}",
"@cardBrowserDeleted": {"placeholders": {"count": {"type": "int"}}},
"cardBrowserMoveTitle": "{count, plural, =1{Move 1 flashcard to} other{Move {count} flashcards to}}",
"@cardBrowserMoveTitle": {"placeholders": {"count": {"type": "int"}}},
"cardBrowserMoved": "{count, plural, =1{Moved 1 flashcard to “{title}”} other{Moved {count} flashcards to “{title}”}}",
"@cardBrowserMoved": {"placeholders": {"count": {"type": "int"}, "title": {"type": "String"}}},
"cardBrowserAddTagsTitle": "{count, plural, =1{Add tags to 1 flashcard} other{Add tags to {count} flashcards}}",
"@cardBrowserAddTagsTitle": {"placeholders": {"count": {"type": "int"}}},
"cardBrowserAddTo": "{count, plural, =1{Add to 1 flashcard} other{Add to {count} flashcards}}",
"@cardBrowserAddTo": {"placeholders": {"count": {"type": "int"}}},
"cardBrowserRemoveTagsTitle": "{count, plural, =1{Remove tags from 1 flashcard} other{Remove tags from {count} flashcards}}",
"@cardBrowserRemoveTagsTitle": {"placeholders": {"count": {"type": "int"}}},
"cardBrowserRemoveFrom": "{count, plural, =1{Remove from 1 flashcard} other{Remove from {count} flashcards}}",
"@cardBrowserRemoveFrom": {"placeholders": {"count": {"type": "int"}}},
"cardBrowserNoTags": "No tags yet. Create tags from a flashcard's editor, then apply them here.",
"cardBrowserNoTagsOnCards": "The flashcards chosen have no tags.",
"cardBrowserTagsAdded": "{tags, plural, =1{Added 1 tag to {count, plural, =1{1 flashcard} other{{count} flashcards}}} other{Added {tags} tags to {count, plural, =1{1 flashcard} other{{count} flashcards}}}}",
"@cardBrowserTagsAdded": {"placeholders": {"tags": {"type": "int"}, "count": {"type": "int"}}},
"cardBrowserTagsRemoved": "{tags, plural, =1{Removed 1 tag from {count, plural, =1{1 flashcard} other{{count} flashcards}}} other{Removed {tags} tags from {count, plural, =1{1 flashcard} other{{count} flashcards}}}}",
"@cardBrowserTagsRemoved": {"placeholders": {"tags": {"type": "int"}, "count": {"type": "int"}}},
"cardBrowserResetTitle": "{count, plural, =1{Start 1 flashcard afresh?} other{Start {count} flashcards afresh?}}",
"@cardBrowserResetTitle": {"placeholders": {"count": {"type": "int"}}},
"cardBrowserResetMessage": "They count as new again. Their reviews stay in your history and streaks.",
"cardBrowserResetConfirm": "Reset",
"cardBrowserReset": "{count, plural, =1{1 flashcard starts afresh} other{{count} flashcards start afresh}}",
"@cardBrowserReset": {"placeholders": {"count": {"type": "int"}}}
}