From 864d4bf47c41120da2f1aa09630756c5814c31b7 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 17 May 2026 06:25:13 +0000 Subject: [PATCH 01/25] docs: move design docs to docs/ and add an index MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La racine devient lisible : seul README.md reste comme point d'entrée. Les 15 documents de design, stack et user stories vivent désormais dans docs/, avec docs/INDEX.md pour la navigation thématique. Les liens du README et l'arborescence projet sont mis à jour, et le lien cassé vers IMPLEMENTATION_SUMMARY.md est corrigé vers rust-backend/IMPLEMENTATION_SUMMARY.md. --- README.md | 39 +++++++++++-------- ARCHITECTURE.md => docs/ARCHITECTURE.md | 0 .../ARCHITECTURE_EXPLAINED.md | 0 FINAL_DECISIONS.md => docs/FINAL_DECISIONS.md | 0 .../IMPLEMENTATION_GUIDE.md | 0 docs/INDEX.md | 32 +++++++++++++++ RUST_OPTION.md => docs/RUST_OPTION.md | 0 .../TAURI_BACKEND_CLARIFICATION.md | 0 .../TAURI_FRONTEND_LINK.md | 0 .../TAURI_INTEGRATION_COMPLETE.md | 0 TECH_CHOICES.md => docs/TECH_CHOICES.md | 0 .../TECH_STACK_FINAL.md | 0 .../TRANSLATION_PHONETIC_STRATEGY.md | 0 UI_LIBRARIES.md => docs/UI_LIBRARIES.md | 0 USER_STORIES.md => docs/USER_STORIES.md | 0 USER_STORIES_V2.md => docs/USER_STORIES_V2.md | 0 VUE_TAURI_GUIDE.md => docs/VUE_TAURI_GUIDE.md | 0 17 files changed, 54 insertions(+), 17 deletions(-) rename ARCHITECTURE.md => docs/ARCHITECTURE.md (100%) rename ARCHITECTURE_EXPLAINED.md => docs/ARCHITECTURE_EXPLAINED.md (100%) rename FINAL_DECISIONS.md => docs/FINAL_DECISIONS.md (100%) rename IMPLEMENTATION_GUIDE.md => docs/IMPLEMENTATION_GUIDE.md (100%) create mode 100644 docs/INDEX.md rename RUST_OPTION.md => docs/RUST_OPTION.md (100%) rename TAURI_BACKEND_CLARIFICATION.md => docs/TAURI_BACKEND_CLARIFICATION.md (100%) rename TAURI_FRONTEND_LINK.md => docs/TAURI_FRONTEND_LINK.md (100%) rename TAURI_INTEGRATION_COMPLETE.md => docs/TAURI_INTEGRATION_COMPLETE.md (100%) rename TECH_CHOICES.md => docs/TECH_CHOICES.md (100%) rename TECH_STACK_FINAL.md => docs/TECH_STACK_FINAL.md (100%) rename TRANSLATION_PHONETIC_STRATEGY.md => docs/TRANSLATION_PHONETIC_STRATEGY.md (100%) rename UI_LIBRARIES.md => docs/UI_LIBRARIES.md (100%) rename USER_STORIES.md => docs/USER_STORIES.md (100%) rename USER_STORIES_V2.md => docs/USER_STORIES_V2.md (100%) rename VUE_TAURI_GUIDE.md => docs/VUE_TAURI_GUIDE.md (100%) diff --git a/README.md b/README.md index 3cea25e..91bd257 100644 --- a/README.md +++ b/README.md @@ -105,26 +105,28 @@ lyremember-app/ ## 📚 Documentation Complète +Toute la documentation détaillée vit dans [`docs/`](docs/) — voir [`docs/INDEX.md`](docs/INDEX.md) pour un sommaire complet. + ### Planning & Décisions -- [FINAL_DECISIONS.md](FINAL_DECISIONS.md) - Résumé de toutes les décisions techniques -- [USER_STORIES_V2.md](USER_STORIES_V2.md) - 29 user stories détaillées (8 epics, 105 story points) -- [TECH_CHOICES.md](TECH_CHOICES.md) - Comparaison des technologies (PWA, Tauri, Flutter, etc.) +- [docs/FINAL_DECISIONS.md](docs/FINAL_DECISIONS.md) - Résumé de toutes les décisions techniques +- [docs/USER_STORIES_V2.md](docs/USER_STORIES_V2.md) - 29 user stories détaillées (8 epics, 105 story points) +- [docs/TECH_CHOICES.md](docs/TECH_CHOICES.md) - Comparaison des technologies (PWA, Tauri, Flutter, etc.) ### Architecture & Technique -- [TAURI_INTEGRATION_COMPLETE.md](TAURI_INTEGRATION_COMPLETE.md) - 📖 **START HERE** - Guide complet intégration -- [VUE_TAURI_GUIDE.md](VUE_TAURI_GUIDE.md) - Guide Vue + Tauri avec exemples -- [ARCHITECTURE_EXPLAINED.md](ARCHITECTURE_EXPLAINED.md) - Un codebase, plusieurs plateformes -- [TAURI_FRONTEND_LINK.md](TAURI_FRONTEND_LINK.md) - Comment Tauri et Vue interagissent -- [TAURI_BACKEND_CLARIFICATION.md](TAURI_BACKEND_CLARIFICATION.md) - Rôle de Tauri vs votre code +- [docs/TAURI_INTEGRATION_COMPLETE.md](docs/TAURI_INTEGRATION_COMPLETE.md) - 📖 **START HERE** - Guide complet intégration +- [docs/VUE_TAURI_GUIDE.md](docs/VUE_TAURI_GUIDE.md) - Guide Vue + Tauri avec exemples +- [docs/ARCHITECTURE_EXPLAINED.md](docs/ARCHITECTURE_EXPLAINED.md) - Un codebase, plusieurs plateformes +- [docs/TAURI_FRONTEND_LINK.md](docs/TAURI_FRONTEND_LINK.md) - Comment Tauri et Vue interagissent +- [docs/TAURI_BACKEND_CLARIFICATION.md](docs/TAURI_BACKEND_CLARIFICATION.md) - Rôle de Tauri vs votre code ### Stratégies -- [TRANSLATION_PHONETIC_STRATEGY.md](TRANSLATION_PHONETIC_STRATEGY.md) - Stratégie "Generate Once, Store Forever" -- [UI_LIBRARIES.md](UI_LIBRARIES.md) - Comparaison Shadcn-vue, Material, etc. -- [RUST_OPTION.md](RUST_OPTION.md) - Analyse Rust/Tauri vs alternatives +- [docs/TRANSLATION_PHONETIC_STRATEGY.md](docs/TRANSLATION_PHONETIC_STRATEGY.md) - Stratégie "Generate Once, Store Forever" +- [docs/UI_LIBRARIES.md](docs/UI_LIBRARIES.md) - Comparaison Shadcn-vue, Material, etc. +- [docs/RUST_OPTION.md](docs/RUST_OPTION.md) - Analyse Rust/Tauri vs alternatives ### Implementation -- [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md) - Guide step-by-step création projet -- [IMPLEMENTATION_SUMMARY.md](IMPLEMENTATION_SUMMARY.md) - Résumé de l'implémentation backend +- [docs/IMPLEMENTATION_GUIDE.md](docs/IMPLEMENTATION_GUIDE.md) - Guide step-by-step création projet +- [rust-backend/IMPLEMENTATION_SUMMARY.md](rust-backend/IMPLEMENTATION_SUMMARY.md) - Résumé de l'implémentation backend ## ✨ Fonctionnalités Principales @@ -461,8 +463,11 @@ All your data is stored locally in the `data/` directory: ``` lyremember/ ├── README.md # This file -├── USER_STORIES.md # User stories and requirements -├── ARCHITECTURE.md # Technical architecture +├── docs/ # All design & strategy docs +│ ├── INDEX.md # Documentation index +│ ├── USER_STORIES.md # User stories and requirements +│ ├── ARCHITECTURE.md # Technical architecture +│ └── ... # see docs/INDEX.md ├── requirements.txt # Python dependencies ├── setup.py # Package setup ├── lyremember/ # Main application package @@ -479,11 +484,11 @@ lyremember/ ## User Stories -See [USER_STORIES.md](USER_STORIES.md) for detailed user stories and feature roadmap. +See [docs/USER_STORIES.md](docs/USER_STORIES.md) for detailed user stories and feature roadmap. ## Architecture -See [ARCHITECTURE.md](ARCHITECTURE.md) for technical architecture and design decisions. +See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for technical architecture and design decisions. ## Contributing diff --git a/ARCHITECTURE.md b/docs/ARCHITECTURE.md similarity index 100% rename from ARCHITECTURE.md rename to docs/ARCHITECTURE.md diff --git a/ARCHITECTURE_EXPLAINED.md b/docs/ARCHITECTURE_EXPLAINED.md similarity index 100% rename from ARCHITECTURE_EXPLAINED.md rename to docs/ARCHITECTURE_EXPLAINED.md diff --git a/FINAL_DECISIONS.md b/docs/FINAL_DECISIONS.md similarity index 100% rename from FINAL_DECISIONS.md rename to docs/FINAL_DECISIONS.md diff --git a/IMPLEMENTATION_GUIDE.md b/docs/IMPLEMENTATION_GUIDE.md similarity index 100% rename from IMPLEMENTATION_GUIDE.md rename to docs/IMPLEMENTATION_GUIDE.md diff --git a/docs/INDEX.md b/docs/INDEX.md new file mode 100644 index 0000000..b760b65 --- /dev/null +++ b/docs/INDEX.md @@ -0,0 +1,32 @@ +# Documentation Index + +Documentation organisée par thème. Le README à la racine en référence les principales entrées. + +## Démarrage +- [TAURI_INTEGRATION_COMPLETE.md](TAURI_INTEGRATION_COMPLETE.md) — guide complet d'intégration Tauri (point d'entrée recommandé) +- [usage_guide.md](usage_guide.md) — guide d'utilisation de l'app CLI + +## Planning & Décisions produit +- [FINAL_DECISIONS.md](FINAL_DECISIONS.md) — synthèse de toutes les décisions techniques +- [TECH_CHOICES.md](TECH_CHOICES.md) — comparatif des stacks envisagées +- [TECH_STACK_FINAL.md](TECH_STACK_FINAL.md) — stack retenue +- [USER_STORIES.md](USER_STORIES.md) — user stories initiales +- [USER_STORIES_V2.md](USER_STORIES_V2.md) — 29 user stories (8 epics, 105 SP) + +## Architecture +- [ARCHITECTURE.md](ARCHITECTURE.md) — architecture technique +- [ARCHITECTURE_EXPLAINED.md](ARCHITECTURE_EXPLAINED.md) — un codebase, plusieurs plateformes +- [RUST_OPTION.md](RUST_OPTION.md) — analyse Rust/Tauri vs alternatives + +## Tauri & Frontend +- [VUE_TAURI_GUIDE.md](VUE_TAURI_GUIDE.md) — guide Vue 3 + Tauri +- [TAURI_FRONTEND_LINK.md](TAURI_FRONTEND_LINK.md) — interactions Tauri ↔ Vue +- [TAURI_BACKEND_CLARIFICATION.md](TAURI_BACKEND_CLARIFICATION.md) — rôle de Tauri vs code applicatif +- [UI_LIBRARIES.md](UI_LIBRARIES.md) — comparatif librairies UI (Shadcn-vue, Material, …) + +## Stratégies & features +- [TRANSLATION_PHONETIC_STRATEGY.md](TRANSLATION_PHONETIC_STRATEGY.md) — stratégie traduction & phonétique + +## Implémentation +- [IMPLEMENTATION_GUIDE.md](IMPLEMENTATION_GUIDE.md) — guide step-by-step +- [../rust-backend/IMPLEMENTATION_SUMMARY.md](../rust-backend/IMPLEMENTATION_SUMMARY.md) — résumé d'implémentation du backend Rust diff --git a/RUST_OPTION.md b/docs/RUST_OPTION.md similarity index 100% rename from RUST_OPTION.md rename to docs/RUST_OPTION.md diff --git a/TAURI_BACKEND_CLARIFICATION.md b/docs/TAURI_BACKEND_CLARIFICATION.md similarity index 100% rename from TAURI_BACKEND_CLARIFICATION.md rename to docs/TAURI_BACKEND_CLARIFICATION.md diff --git a/TAURI_FRONTEND_LINK.md b/docs/TAURI_FRONTEND_LINK.md similarity index 100% rename from TAURI_FRONTEND_LINK.md rename to docs/TAURI_FRONTEND_LINK.md diff --git a/TAURI_INTEGRATION_COMPLETE.md b/docs/TAURI_INTEGRATION_COMPLETE.md similarity index 100% rename from TAURI_INTEGRATION_COMPLETE.md rename to docs/TAURI_INTEGRATION_COMPLETE.md diff --git a/TECH_CHOICES.md b/docs/TECH_CHOICES.md similarity index 100% rename from TECH_CHOICES.md rename to docs/TECH_CHOICES.md diff --git a/TECH_STACK_FINAL.md b/docs/TECH_STACK_FINAL.md similarity index 100% rename from TECH_STACK_FINAL.md rename to docs/TECH_STACK_FINAL.md diff --git a/TRANSLATION_PHONETIC_STRATEGY.md b/docs/TRANSLATION_PHONETIC_STRATEGY.md similarity index 100% rename from TRANSLATION_PHONETIC_STRATEGY.md rename to docs/TRANSLATION_PHONETIC_STRATEGY.md diff --git a/UI_LIBRARIES.md b/docs/UI_LIBRARIES.md similarity index 100% rename from UI_LIBRARIES.md rename to docs/UI_LIBRARIES.md diff --git a/USER_STORIES.md b/docs/USER_STORIES.md similarity index 100% rename from USER_STORIES.md rename to docs/USER_STORIES.md diff --git a/USER_STORIES_V2.md b/docs/USER_STORIES_V2.md similarity index 100% rename from USER_STORIES_V2.md rename to docs/USER_STORIES_V2.md diff --git a/VUE_TAURI_GUIDE.md b/docs/VUE_TAURI_GUIDE.md similarity index 100% rename from VUE_TAURI_GUIDE.md rename to docs/VUE_TAURI_GUIDE.md From e9e6b34029a9b9a7cc12990aa9a0a6b5933ec85a Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 17 May 2026 06:29:32 +0000 Subject: [PATCH 02/25] chore: add LICENSE (MIT), CONTRIBUTING and CHANGELOG MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le README annonçait déjà la licence MIT mais le fichier manquait. On ajoute : - LICENSE : texte MIT complet (2026, LyRemember Team) - CONTRIBUTING.md : workflow contrib, stacks (Python/Rust/Vue), TDD, conventional commits, tests par stack - CHANGELOG.md : Keep a Changelog, section Unreleased seedée à partir de l'historique récent (refonte UI, mode invité, CI, build Android, réorganisation docs, etc.) Le README pointe désormais vers ces fichiers depuis ses sections Contributing / Changelog / License. --- CHANGELOG.md | 35 ++++++++++++++++++++++++++ CONTRIBUTING.md | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ LICENSE | 21 ++++++++++++++++ README.md | 8 ++++-- 4 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..202461e --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,35 @@ +# Changelog + +Format basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/), versionnage suivant [SemVer](https://semver.org/lang/fr/). + +## [Unreleased] + +### Added +- Index documentaire `docs/INDEX.md` regroupant les 16 fichiers de design par thème. +- Mode invité : utiliser l'application sans créer de compte. +- Tests e2e WebDriverIO avec le driver Tauri. +- Suite de tests Rust complète sur le backend (77 tests). +- Workflows CI/CD pour frontend, Python et Rust (lint, build, release multi-plateforme). +- Build Android (APK debug installable) et release Windows + Android. +- Internationalisation (i18n) sur les vues principales, page Settings, intégration UI Genius API. +- Refonte UI : thème dark gold aligné sur le site, navigation mobile en bas. +- Modes de pratique : Karaoke, Fill-blank, MCQ, Oral (UI Phase 4). + +### Changed +- Réorganisation de la documentation : les 15 fichiers `.md` de design sont passés de la racine à `docs/` ; seul `README.md` reste à la racine. +- Polish `SongDetailView` : layout des paroles et états hover affinés. +- PyO3 rendu optionnel pour faciliter les builds cross-platform. +- `reqwest` basculé d'OpenSSL vers rustls pour la compatibilité Android. + +### Fixed +- Lien cassé vers `IMPLEMENTATION_SUMMARY.md` dans le `README.md` (pointe désormais vers `rust-backend/`). +- Erreurs de lint TypeScript : imports et paramètres inutilisés retirés. +- Warnings clippy : closures redondantes remplacées par des références de fonction. +- Couleurs grises résiduelles dans les vues et le mode karaoké. +- Signatures de Tauri commands alignées sur l'API backend réelle. +- Compilation cross-Android des commandes Tauri. +- Installation APK via `termux-open` et création de chanson (#5). + +## Notes + +Ce changelog est introduit en cours de route ; l'historique complet est accessible via `git log`. Les prochaines releases déclencheront des sections versionnées dédiées. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..12c45be --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,66 @@ +# Contributing to LyRemember + +Merci de votre intérêt ! Ce document explique comment proposer une contribution. + +## Avant de commencer + +- Lire le [README](README.md) et l'index docs ([docs/INDEX.md](docs/INDEX.md)). +- Vérifier les [issues ouvertes](https://github.com/RebelliousSmile/lyremember/issues) et la roadmap dans [docs/USER_STORIES_V2.md](docs/USER_STORIES_V2.md). +- Pour une feature non triviale, ouvrir une issue de discussion avant d'écrire du code. + +## Stack + +Trois bases de code coexistent dans le repo — choisir la bonne selon le sujet : + +| Dossier | Stack | Domaine | +|---|---|---| +| `lyremember/` + `tests/` | Python 3.8+ | CLI / proof of concept | +| `rust-backend/` | Rust + SQLite + PyO3 | Backend Tauri | +| `lyremember-app/` | Vue 3 + TypeScript + Tauri | Desktop / Mobile UI | + +## Workflow + +1. Forker le repo et créer une branche depuis `main` : `feat/`, `fix/`, `docs/`, `refactor/`. +2. Écrire les tests **avant** le code (TDD red → green → refactor). +3. Lancer la suite de tests locale (voir ci-dessous) et s'assurer qu'elle est verte. +4. Commit en [Conventional Commits](https://www.conventionalcommits.org/) : `feat:`, `fix:`, `docs:`, `refactor:`, `test:`, `chore:`. Inclure `(#NN)` si une issue est liée. +5. Pousser la branche et ouvrir une Pull Request claire : contexte, changements, sortie observable, tests joués. + +## Lancer les tests + +```bash +# Python CLI +pip install -r requirements.txt pytest +python -m pytest tests/ -q + +# Rust backend +cd rust-backend && cargo test + +# Frontend Vue + Tauri +cd lyremember-app && npm install && npm run test +``` + +## Style & conventions + +- **Python** : respecter les patterns existants (Click, pyyaml, type hints quand utile). Pas d'`except Exception` nu. +- **Rust** : `cargo fmt`, `cargo clippy --all-targets -- -D warnings` avant push. +- **TypeScript/Vue** : ESLint et conventions Vue 3 ` From bf306d9633ba87c8a884f95056e16e1bf006db18 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 17 May 2026 07:22:45 +0000 Subject: [PATCH 14/25] feat(practice): PracticeView accepte ?songId= et SongDetailView pointe vers le hub (#19) PracticeView etait deja le hub d'apprentissage (liste chansons + 4 modes, route vers /songs/:id?mode=... pour monter le mode dans SongDetailView). On finalise le pattern de navigation : - PracticeView : lit route.query.songId au montage et pre-deplie la chanson correspondante dans la liste si elle est dans le repertoire utilisateur. Validation defensive : on verifie que la chanson existe dans songsStore.songs avant de selectionner. - SongDetailView : ajout d'un bouton "Ouvrir dans Practice ->" a cote de la section "Practice Modes" qui route vers /practice?songId=. Les 4 raccourcis directs vers les modes restent sur la fiche pour ne pas regresser l'UX existante. - i18n FR/EN : nouvelle cle songDetail.practiceHubShortcut. Roles confirmes (decision #10) : - PracticeView = hub APPRENDRE (selection chanson + mode + lancement) - SongDetailView = gestion LYRICS + raccourcis directs vers les modes --- CHANGELOG.md | 3 +++ lyremember-app/src/i18n/locales/en.json | 3 ++- lyremember-app/src/i18n/locales/fr.json | 1 + lyremember-app/src/views/PracticeView.vue | 7 ++++++- lyremember-app/src/views/SongDetailView.vue | 10 +++++++++- 5 files changed, 21 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 45dac48..fcc70be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,9 @@ Format basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/), versi ### Removed - `SettingsView.vue` : section "Genius API" supprimée (token, sauvegarde localStorage, recherche, import). L'interface laissait croire à un import de paroles alors que ce n'est pas légalement faisable. Clés i18n `settings.integrations`, `settings.geniusApi`, `settings.geniusToken*`, `settings.geniusDesc`, `settings.geniusHelp`, `settings.tokenSaved`, `settings.searchSongs`, `settings.searchPlaceholder`, `settings.search`, `settings.import`, `settings.noResults` retirées de FR/EN (#18). + +### Improved +- `PracticeView.vue` accepte désormais un query param `?songId=` qui pré-sélectionne (déplie) la chanson dans la liste. `SongDetailView.vue` expose un raccourci "Ouvrir dans Practice →" à côté de la section Modes qui route vers `/practice?songId=...`. Confirme la séparation des rôles : Practice = hub d'apprentissage, SongDetail = gestion lyrics + raccourcis directs vers les modes (#19). - Le CLI Python (proof of concept) est archivé dans `legacy/python-cli/` (#6) : `lyremember/`, `tests/`, `data/`, `demo.py`, `setup.py`, `requirements.txt` y vivent désormais. La stack canonique est Rust + Tauri + Vue 3. Le workflow `ci-python` cible ce nouveau chemin. - Polish `SongDetailView` : layout des paroles et états hover affinés. - PyO3 rendu optionnel pour faciliter les builds cross-platform. diff --git a/lyremember-app/src/i18n/locales/en.json b/lyremember-app/src/i18n/locales/en.json index 6cea444..1f146f9 100644 --- a/lyremember-app/src/i18n/locales/en.json +++ b/lyremember-app/src/i18n/locales/en.json @@ -76,7 +76,8 @@ "oralPractice": "Oral Practice", "songNotFound": "Song not found", "loadingSong": "Loading song...", - "openOnGenius": "Open on Genius ↗" + "openOnGenius": "Open on Genius ↗", + "practiceHubShortcut": "Open in Practice hub →" }, "addSong": { "title": "Add New Song", diff --git a/lyremember-app/src/i18n/locales/fr.json b/lyremember-app/src/i18n/locales/fr.json index 1a4f8f0..b05757e 100644 --- a/lyremember-app/src/i18n/locales/fr.json +++ b/lyremember-app/src/i18n/locales/fr.json @@ -75,6 +75,7 @@ "mcq": "Choix multiples", "oralPractice": "Pratique orale", "openOnGenius": "Ouvrir sur Genius ↗", + "practiceHubShortcut": "Ouvrir dans Practice →", "songNotFound": "Chanson introuvable", "loadingSong": "Chargement de la chanson..." }, diff --git a/lyremember-app/src/views/PracticeView.vue b/lyremember-app/src/views/PracticeView.vue index 7d6f06b..4441226 100644 --- a/lyremember-app/src/views/PracticeView.vue +++ b/lyremember-app/src/views/PracticeView.vue @@ -152,7 +152,7 @@