feat(app): the card composer, for many cards in one sitting
Create flashcards, and tapping a card, open the composer: the stack of cards on the left (New flashcard on top, the new ones, then the stored ones; collapsible), the card being written on the right, saved as the person leaves it (another card, the pane, the screen, the app). The title says how saving stands; leaving with cards that couldn't be saved asks first. A card has its tags and their pin, an action menu (duplicate, clear, delete), the type switch (flashcard, vocabulary, matching), the front, and below a line its answer side: one answer or several to mark right or wrong, the reading and meanings, or categories and items. Fields changed differently on two devices show every version to keep one. The single-card editor goes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
parent
a5515c13f7
commit
0afc22d454
1 changed files with 2701 additions and 735 deletions
|
|
@ -970,6 +970,420 @@ abstract class AppLocalizations {
|
|||
/// **'Manage tags'**
|
||||
String get cardListManageTags;
|
||||
|
||||
/// No description provided for @composerTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Create flashcards'**
|
||||
String get composerTitle;
|
||||
|
||||
/// No description provided for @composerTitleFor.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Create flashcards for \"{title}\"'**
|
||||
String composerTitleFor(String title);
|
||||
|
||||
/// No description provided for @composerSaving.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Saving…'**
|
||||
String get composerSaving;
|
||||
|
||||
/// No description provided for @composerSaveFailed.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Save failed — retry'**
|
||||
String get composerSaveFailed;
|
||||
|
||||
/// No description provided for @composerAllSaved.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'All changes saved'**
|
||||
String get composerAllSaved;
|
||||
|
||||
/// No description provided for @composerNewFlashcard.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'New flashcard'**
|
||||
String get composerNewFlashcard;
|
||||
|
||||
/// No description provided for @composerCollapseStack.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Collapse stack'**
|
||||
String get composerCollapseStack;
|
||||
|
||||
/// No description provided for @composerExpandStack.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Expand stack'**
|
||||
String get composerExpandStack;
|
||||
|
||||
/// No description provided for @composerStatusSaving.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Saving'**
|
||||
String get composerStatusSaving;
|
||||
|
||||
/// No description provided for @composerStatusSaved.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Saved'**
|
||||
String get composerStatusSaved;
|
||||
|
||||
/// No description provided for @composerStatusFailed.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Save failed'**
|
||||
String get composerStatusFailed;
|
||||
|
||||
/// No description provided for @composerSaveFailedInline.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Save failed.'**
|
||||
String get composerSaveFailedInline;
|
||||
|
||||
/// No description provided for @composerRetry.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Retry'**
|
||||
String get composerRetry;
|
||||
|
||||
/// No description provided for @composerEmptyPane.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Add a flashcard to get started.'**
|
||||
String get composerEmptyPane;
|
||||
|
||||
/// No description provided for @composerKindFlashcard.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Flashcard'**
|
||||
String get composerKindFlashcard;
|
||||
|
||||
/// No description provided for @composerKindVocabulary.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Vocabulary'**
|
||||
String get composerKindVocabulary;
|
||||
|
||||
/// No description provided for @composerKindMatching.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Matching'**
|
||||
String get composerKindMatching;
|
||||
|
||||
/// No description provided for @composerKindMap.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Map'**
|
||||
String get composerKindMap;
|
||||
|
||||
/// No description provided for @composerLabelFront.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Front'**
|
||||
String get composerLabelFront;
|
||||
|
||||
/// No description provided for @composerLabelQuestion.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Question'**
|
||||
String get composerLabelQuestion;
|
||||
|
||||
/// No description provided for @composerLabelExpression.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Expression'**
|
||||
String get composerLabelExpression;
|
||||
|
||||
/// No description provided for @composerLabelPrompt.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Prompt'**
|
||||
String get composerLabelPrompt;
|
||||
|
||||
/// No description provided for @composerLabelBack.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Back'**
|
||||
String get composerLabelBack;
|
||||
|
||||
/// No description provided for @composerLabelAnswers.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Answers'**
|
||||
String get composerLabelAnswers;
|
||||
|
||||
/// No description provided for @composerLabelAnswer.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Answer'**
|
||||
String get composerLabelAnswer;
|
||||
|
||||
/// No description provided for @composerPlaceholderFront.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Add question'**
|
||||
String get composerPlaceholderFront;
|
||||
|
||||
/// No description provided for @composerPlaceholderExpression.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Add expression'**
|
||||
String get composerPlaceholderExpression;
|
||||
|
||||
/// No description provided for @composerPlaceholderPrompt.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Add prompt'**
|
||||
String get composerPlaceholderPrompt;
|
||||
|
||||
/// No description provided for @composerAddAnswer.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Add answer'**
|
||||
String get composerAddAnswer;
|
||||
|
||||
/// No description provided for @composerCorrectAnswer.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Correct answer'**
|
||||
String get composerCorrectAnswer;
|
||||
|
||||
/// No description provided for @composerWrongAnswer.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Wrong answer'**
|
||||
String get composerWrongAnswer;
|
||||
|
||||
/// No description provided for @composerRemoveAnswer.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Remove answer'**
|
||||
String get composerRemoveAnswer;
|
||||
|
||||
/// No description provided for @composerPin.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Pin {field}: keep it for the next card'**
|
||||
String composerPin(String field);
|
||||
|
||||
/// No description provided for @composerUnpin.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Unpin {field}: clear it for the next card'**
|
||||
String composerUnpin(String field);
|
||||
|
||||
/// No description provided for @composerTags.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Tags'**
|
||||
String get composerTags;
|
||||
|
||||
/// No description provided for @composerAddTags.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Add tags'**
|
||||
String get composerAddTags;
|
||||
|
||||
/// No description provided for @composerMoreActions.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'More actions'**
|
||||
String get composerMoreActions;
|
||||
|
||||
/// No description provided for @composerDuplicate.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Duplicate'**
|
||||
String get composerDuplicate;
|
||||
|
||||
/// No description provided for @composerClearFields.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Clear fields'**
|
||||
String get composerClearFields;
|
||||
|
||||
/// No description provided for @composerDelete.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Delete'**
|
||||
String get composerDelete;
|
||||
|
||||
/// No description provided for @composerDeleteTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Delete this flashcard?'**
|
||||
String get composerDeleteTitle;
|
||||
|
||||
/// No description provided for @composerDeleteDraftMessage.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'The draft will be removed from this session. It has not been saved.'**
|
||||
String get composerDeleteDraftMessage;
|
||||
|
||||
/// No description provided for @composerDeleteSavedMessage.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'The flashcard will be removed from the studyset, on all your devices.'**
|
||||
String get composerDeleteSavedMessage;
|
||||
|
||||
/// No description provided for @composerDiscardTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'{count, plural, =1{Discard unsaved flashcard?} other{Discard unsaved flashcards?}}'**
|
||||
String composerDiscardTitle(int count);
|
||||
|
||||
/// No description provided for @composerDiscardMessage.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'{count, plural, =1{1 flashcard hasn\'t been saved yet. Leaving now will discard it.} other{{count} flashcards haven\'t been saved yet. Leaving now will discard them.}}'**
|
||||
String composerDiscardMessage(int count);
|
||||
|
||||
/// No description provided for @composerDiscardConfirm.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Discard'**
|
||||
String get composerDiscardConfirm;
|
||||
|
||||
/// No description provided for @composerConflict.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'This flashcard was changed differently on two devices. Choose the version to keep of each part below.'**
|
||||
String get composerConflict;
|
||||
|
||||
/// No description provided for @composerKeepThis.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Keep this'**
|
||||
String get composerKeepThis;
|
||||
|
||||
/// No description provided for @vocabularyReading.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Reading'**
|
||||
String get vocabularyReading;
|
||||
|
||||
/// No description provided for @vocabularyReadingHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Kana reading'**
|
||||
String get vocabularyReadingHint;
|
||||
|
||||
/// No description provided for @vocabularyMeanings.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Meanings'**
|
||||
String get vocabularyMeanings;
|
||||
|
||||
/// No description provided for @vocabularyPrimaryMeaningHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Primary meaning'**
|
||||
String get vocabularyPrimaryMeaningHint;
|
||||
|
||||
/// No description provided for @vocabularyMeaningHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Meaning'**
|
||||
String get vocabularyMeaningHint;
|
||||
|
||||
/// No description provided for @vocabularyAddMeaning.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Add meaning'**
|
||||
String get vocabularyAddMeaning;
|
||||
|
||||
/// No description provided for @vocabularyRemoveMeaning.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Remove meaning'**
|
||||
String get vocabularyRemoveMeaning;
|
||||
|
||||
/// No description provided for @matchingCategories.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Categories'**
|
||||
String get matchingCategories;
|
||||
|
||||
/// No description provided for @matchingCategoriesHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'The drop-zone cards learners drag items onto. Each category needs at least one item, so a card can\'t have more categories than items.'**
|
||||
String get matchingCategoriesHint;
|
||||
|
||||
/// No description provided for @matchingCategory.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Category {number}'**
|
||||
String matchingCategory(int number);
|
||||
|
||||
/// No description provided for @matchingAddCategory.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Add category'**
|
||||
String get matchingAddCategory;
|
||||
|
||||
/// No description provided for @matchingAddCategoryBlocked.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Add an item first: a card can\'t have more categories than items'**
|
||||
String get matchingAddCategoryBlocked;
|
||||
|
||||
/// No description provided for @matchingRemoveCategory.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Remove category'**
|
||||
String get matchingRemoveCategory;
|
||||
|
||||
/// No description provided for @matchingMinCategories.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'At least two categories required'**
|
||||
String get matchingMinCategories;
|
||||
|
||||
/// No description provided for @matchingItems.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Items'**
|
||||
String get matchingItems;
|
||||
|
||||
/// No description provided for @matchingItemsHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'The draggable items. Assign every item to its correct category: an unassigned item can never be placed right.'**
|
||||
String get matchingItemsHint;
|
||||
|
||||
/// No description provided for @matchingItem.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Item {number}'**
|
||||
String matchingItem(int number);
|
||||
|
||||
/// No description provided for @matchingAddItem.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Add item'**
|
||||
String get matchingAddItem;
|
||||
|
||||
/// No description provided for @matchingUnassigned.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Unassigned'**
|
||||
String get matchingUnassigned;
|
||||
|
||||
/// No description provided for @matchingRemoveItem.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Remove item'**
|
||||
String get matchingRemoveItem;
|
||||
|
||||
/// No description provided for @matchingMinItems.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'At least two items required'**
|
||||
String get matchingMinItems;
|
||||
|
||||
/// No description provided for @commonCancel.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
|
|
|
|||
Loading…
Reference in a new issue