diff --git a/components.json b/components.json new file mode 100644 index 00000000..d357f6bd --- /dev/null +++ b/components.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "src/app/[locale]/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + } +} \ No newline at end of file diff --git a/messages/bn.json b/messages/bn.json index bd4649dc..224d36ec 100644 --- a/messages/bn.json +++ b/messages/bn.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "টাইমার", "hint": "ইঙ্গিত", "optimal-yellow-layer": "সেরা হলুদ স্তর", "solving": "সমাধান হচ্ছে...", @@ -23,36 +22,57 @@ }, "SolvesPage": { "title": "সমাধান", - "search-by-time": "⏱︎ সময় দ্বারা খুঁজুন", - "finalize-session": "সেশন চূড়ান্ত করুন", - "eliminate-session": "সেশন বাদ দিন", - "archive-sessions-legend": "এই ক্রিয়া একই বিভাগের সব চলমান সেশন আর্কাইভ করবে।", - "delete-session-legend": "এই ক্রিয়া শুধুমাত্র নির্বাচিত কিউব সহ আপনার বর্তমান সমাধানগুলি মুছে ফেলবে।", - "archive": "আর্কাইভ", - "unarchive": "আনআর্কাইভ", - "copy": "কপি", - "remove": "অপসারণ", - "enter-a-comment": "একটি মন্তব্য প্রবেশ করুন", "session": "সেশন", "all": "সব", - "no-cube-selection": "কোনও কিউব নির্বাচিত হয়নি, একটি বেছে নিন...", - "no-solves": "দেখানোর জন্য কোনও সমাধান নেই!" + "alert": { + "empty-cubes": "কোন ঘনক্ষেত্র নির্বাচন করা হয়নি. \nএকটি চয়ন করুন.", + "title": "মনোযোগ!" + }, + "ascending": "আরোহী", + "date": "তারিখ", + "descending": "অবরোহী", + "dialogs": { + "move-to-history": "সরানো ইতিহাস সমাধান?", + "move-to-history-para": "আপনি ইতিহাস সুইচ আলতো চাপ দিয়ে সেগুলি অ্যাক্সেস করতে সক্ষম হবেন৷" + }, + "empty-solves": "এখানে এখনো কিছুই নেই!", + "empty-solves-description": "আপনার ইতিহাস দেখতে স্ক্রিনের শীর্ষে থাকা সুইচটিতে আলতো চাপুন৷", + "filter-by-time": "সময় অনুযায়ী ফিল্টার করুন", + "historial": "ঐতিহাসিক", + "last": "শেষ", + "order": "অর্ডার", + "share": "শেয়ার করুন", + "share-clipboard": { + "average": "গড়", + "header": "NexusTimer দ্বারা উত্পন্ন", + "list-of-times": "সময়ের তালিকা" + }, + "sort": "সাজান", + "time": "সময়", + "toast": { + "success-copy": "সফলভাবে অনুলিপি করা হয়েছে৷", + "success-copy-description": "আপনার ক্লিপবোর্ডে কপি করা হয়েছে।", + "unable-action": "অক্ষম কর্ম", + "warning-select-cube": "আগে একটি ঘনক নির্বাচন করুন." + }, + "tooltips": { + "move-to-history": "সরানো ইতিহাস সমাধান" + } }, "StatsPage": { "title": "পরিসংখ্যান", - "total": "মোট", - "category": "বিভাগ", "global": "গ্লোবাল", "sessions": "সেশন", "best-time": "সেরা সময়", "average": "গড়", "time-spent": "ব্যয়িত সময়", "success-rate": "সাফল্যের হার", - "counter": "কাউন্টার" + "counter": "কাউন্টার", + "advanced": "উন্নত", + "overall": "সামগ্রিকভাবে" }, "CubesPage": { "title": "কিউব", - "cube": "কিউব", "no-cubes-for-display": "প্রদর্শনের জন্য কোনও কিউব নেই।", "favorite": "প্রিয়", "category": "বিভাগ", @@ -61,30 +81,35 @@ "status": "অবস্থা", "using": "ব্যবহার করা হচ্ছে", "idle": "নিষ্ক্রিয়", - "filter-cubes": "আপনার কিউবগুলি ফিল্টার করুন" + "find-your-cube": "আপনার ঘনক্ষেত্র খুঁজুন", + "name": "নাম", + "new-collection": "নতুন সংগ্রহ", + "options": "অপশন" }, "Cubes-modal": { - "title-editing": "কিউব সম্পাদনা করুন", - "title-creating": "নতুন কিউব", - "error-name": "কিউবের নাম অনুপস্থিত", - "error-duplicate": "কিউবের নাম ইতিমধ্যে ব্যবহৃত হচ্ছে", - "current-select": "বর্তমান নির্বাচন:", - "question-delete": "আপনি কি নিশ্চিত যে আপনি মুছে ফেলতে চান?", - "warning-delete": "এই অপরিবর্তনীয় ক্রিয়া সমস্ত সমাধান ইতিহাস মুছে ফেলবে এবং আপনার পরিসংখ্যানে প্রভাব ফেলতে পারে।", - "placeholder": "ব্র্যান্ড | মডেল | সংস্করণ | চুম্বকীয়?" + "category": "শ্রেণী", + "current-selection": "বর্তমান নির্বাচন:", + "danger-msg": "সংগ্রহ বিভাগ পরিবর্তন করা সেই বিভাগের সাথে সম্পর্কিত সমাধানগুলিও পরিবর্তন করে।", + "delete-collection": "সংগ্রহ মুছুন", + "delete-collection-description": "এই ঘনক্ষেত্র সংগ্রহ মুছে ফেলা হবে, এর সমস্ত সমাধান, রেকর্ড এবং সেটিংস সহ।", + "edit-collection": "সংগ্রহ সম্পাদনা করুন", + "input-collection-name": "সংগ্রহের নাম লিখুন", + "name": "নাম", + "new-collection": "নতুন সংগ্রহ", + "new-collection-description": "কিউব সংগ্রহ আপনাকে সামগ্রিক বিভাগের পরিসংখ্যানকে প্রভাবিত না করে প্রতিটি ঘনকের ইতিহাসের ট্র্যাক রাখতে দেয়।", + "select-an-option": "একটি বিকল্প নির্বাচন করুন", + "to-continue": "চালিয়ে যেতে:", + "warning-alert": "সতর্কতা:", + "warning-msg": "এই ক্রিয়াটি বিপরীত করা যায় না।" }, "Inputs": { "select": "নির্বাচন করুন", - "add-cube": "কিউব যোগ করুন", "favorites": "প্রিয়", - "list": "তালিকা", - "trash-all": "সব মুছুন", - "move-all": "সব সরান", "create": "তৈরি করুন", - "confirm": "নিশ্চিত করুন", "cancel": "বাতিল করুন", - "save": "সংরক্ষণ করুন", - "delete": "মুছে ফেলুন" + "continue": "চালিয়ে যান", + "move": "সরান", + "none": "কোনোটিই নয়" }, "Settings-menu": { "title": "সেটিংস", @@ -116,7 +141,9 @@ "about": "সম্পর্কিত", "legend": "NexusTimer হল একটি নিরপেক্ষ, সংক্ষিপ্ত এবং ওপেন সোর্স ওয়েব টুল স্পিডকিউবিংয়ের জন্য।", "suggest": "পরিবর্তন প্রস্তাব করুন", - "report-bug": "বাগ রিপোর্ট করুন" + "report-bug": "বাগ রিপোর্ট করুন", + "auto-select": "স্টার্টআপে স্বয়ংক্রিয়ভাবে নির্বাচন করুন", + "preferences": "পছন্দসমূহ" }, "backup-modal": { "title": "বুদ্ধিমান ব্যাকআপ পুনরুদ্ধার", @@ -126,6 +153,17 @@ "loading-part-1": "এই ক্রিয়াটি এক মিনিটেরও কম সময় নেয়।", "loading-part-2": "অনুগ্রহ করে অপেক্ষা করুন, এই উইন্ডোটি বন্ধ করবেন না।", "welcome": "স্বাগতম:" + }, + "Errors": { + "empty-input": "অনুগ্রহ করে একটি মান লিখুন", + "not-match": "নামের সাথে মিল নেই।", + "repeated-name": "সেই নামের সংগ্রহ ইতিমধ্যেই বিদ্যমান।" + }, + "tooltips": { + "bookmark": "বুকমার্ক", + "copy": "কপি", + "delete": "মুছে দিন", + "plus-two": "2 শাস্তি" } }, "Metadata": { diff --git a/messages/cs.json b/messages/cs.json index c90d9928..4700f99e 100644 --- a/messages/cs.json +++ b/messages/cs.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "Časovač", "hint": "Nápověda", "optimal-yellow-layer": "Optimální žlutá vrstva", "solving": "Řešení...", @@ -23,36 +22,57 @@ }, "SolvesPage": { "title": "Řešení", - "search-by-time": "⏱︎ Hledat podle času", - "finalize-session": "Dokončit relaci", - "eliminate-session": "Odstranit relaci", - "archive-sessions-legend": "Tato akce archivuje všechny probíhající relace ve stejné kategorii.", - "delete-session-legend": "Tato akce odstraní pouze vaše aktuální řešení s vybranou kostkou.", - "archive": "Archivovat", - "unarchive": "Zrušit archivaci", - "copy": "Kopírovat", - "remove": "Odstranit", - "enter-a-comment": "Zadejte komentář", "session": "Relace", "all": "Vše", - "no-cube-selection": "Není vybrána žádná kostka, vyberte jednu...", - "no-solves": "Nejsou k dispozici žádná řešení!" + "alert": { + "empty-cubes": "Nebyla vybrána žádná kostka. \nVyberte prosím jednu.", + "title": "Pozor!" + }, + "ascending": "Vzestupně", + "date": "Datum", + "descending": "Klesající", + "dialogs": { + "move-to-history": "Přesun řeší historii?", + "move-to-history-para": "Budete k nim mít přístup klepnutím na přepínač historie." + }, + "empty-solves": "Tady zatím nic!", + "empty-solves-description": "Klepnutím na přepínač v horní části obrazovky zobrazíte svou historii.", + "filter-by-time": "Filtrujte podle času", + "historial": "Historický", + "last": "Poslední", + "order": "Objednávka", + "share": "Podíl", + "share-clipboard": { + "average": "Průměrný", + "header": "Generováno NexusTimer", + "list-of-times": "Seznam časů" + }, + "sort": "Seřadit", + "time": "Čas", + "toast": { + "success-copy": "Úspěšně zkopírováno", + "success-copy-description": "Byl zkopírován do vaší schránky.", + "unable-action": "Nemožná akce", + "warning-select-cube": "Vyberte prosím kostku předem." + }, + "tooltips": { + "move-to-history": "Move řeší historii" + } }, "StatsPage": { "title": "Statistiky", - "total": "Celkem", - "category": "Kategorie", "global": "Globální", "sessions": "Relace", "best-time": "Nejlepší čas", "average": "Průměr", "time-spent": "Strávený čas", "success-rate": "Úspěšnost", - "counter": "Počítadlo" + "counter": "Počítadlo", + "advanced": "Moderní", + "overall": "Celkově" }, "CubesPage": { "title": "Kostky", - "cube": "Kostka", "no-cubes-for-display": "Nejsou k dispozici žádné kostky.", "favorite": "Oblíbené", "category": "Kategorie", @@ -61,30 +81,35 @@ "status": "Stav", "using": "Používá se", "idle": "Nečinný", - "filter-cubes": "Filtrovat kostky" + "find-your-cube": "Najděte svou kostku", + "name": "Jméno", + "new-collection": "Nová kolekce", + "options": "Možnosti" }, "Cubes-modal": { - "title-editing": "Upravit kostku", - "title-creating": "Nová kostka", - "error-name": "Chybí název kostky", - "error-duplicate": "Název kostky je již použit", - "current-select": "Aktuální výběr:", - "question-delete": "Opravdu chcete smazat?", - "warning-delete": "Tato nevratná akce odstraní veškerou historii řešení pro tuto kostku a může ovlivnit vaše statistiky.", - "placeholder": "Značka | Model | Verze | Magnetická?" + "category": "Kategorie", + "current-selection": "Aktuální výběr:", + "danger-msg": "Úprava kategorie kolekce také změní řešení spojená s touto kategorií.", + "delete-collection": "Smazat sbírku", + "delete-collection-description": "Tato sbírka krychlí bude odstraněna spolu se všemi jejími řešeními, záznamy a nastaveními.", + "edit-collection": "Upravit sbírku", + "input-collection-name": "Zadejte název sbírky", + "name": "Jméno", + "new-collection": "Nová kolekce", + "new-collection-description": "Sbírky kostek vám umožňují sledovat historii každé kostky, aniž by to ovlivnilo celkové statistiky kategorií.", + "select-an-option": "Vyberte možnost", + "to-continue": "pokračovat:", + "warning-alert": "Varování:", + "warning-msg": "Tato akce není vratná." }, "Inputs": { "select": "Vybrat", - "add-cube": "Přidat kostku", "favorites": "Oblíbené", - "list": "Seznam", - "trash-all": "Smazat vše", - "move-all": "Přesunout vše", "create": "Vytvořit", - "confirm": "Potvrdit", "cancel": "Zrušit", - "save": "Uložit", - "delete": "Smazat" + "continue": "Pokračovat", + "move": "Pohyb", + "none": "Žádný" }, "Settings-menu": { "title": "Nastavení", @@ -116,7 +141,9 @@ "about": "O aplikaci", "legend": "NexusTimer je nezkreslený, minimalistický a open source webový nástroj pro SpeedCubing.", "suggest": "Navrhnout změnu", - "report-bug": "Nahlásit chybu" + "report-bug": "Nahlásit chybu", + "auto-select": "Automatický výběr při spuštění", + "preferences": "Předvolby" }, "backup-modal": { "title": "Inteligentní Obnova Zálohy", @@ -126,6 +153,17 @@ "loading-part-1": "Tato akce trvá méně než minutu.", "loading-part-2": "Prosím čekejte, nezavírejte toto okno.", "welcome": "Vítejte:" + }, + "Errors": { + "empty-input": "Zadejte hodnotu", + "not-match": "Název se neshoduje.", + "repeated-name": "Tato sbírka jmen již existuje." + }, + "tooltips": { + "bookmark": "Záložka", + "copy": "Kopie", + "delete": "Vymazat", + "plus-two": "2 Pokuta" } }, "Metadata": { diff --git a/messages/de.json b/messages/de.json index eaaee269..35f17842 100644 --- a/messages/de.json +++ b/messages/de.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "Timer", "hint": "Hinweis", "optimal-yellow-layer": "Optimale gelbe Schicht", "solving": "Löst...", @@ -23,36 +22,57 @@ }, "SolvesPage": { "title": "Lösungen", - "search-by-time": "⏱︎ Suche nach Zeit", - "finalize-session": "Sitzung abschließen", - "eliminate-session": "Sitzung löschen", - "archive-sessions-legend": "Diese Aktion archiviert alle laufenden Sitzungen derselben Kategorie.", - "delete-session-legend": "Diese Aktion löscht nur Ihre aktuellen Lösungen mit dem ausgewählten Würfel.", - "archive": "Archivieren", - "unarchive": "Archivierung aufheben", - "copy": "Kopieren", - "remove": "Entfernen", - "enter-a-comment": "Kommentar eingeben", "session": "Sitzung", "all": "Alle", - "no-cube-selection": "Kein Würfel ausgewählt, wählen Sie einen...", - "no-solves": "Es gibt keine Lösungen anzuzeigen!" + "alert": { + "empty-cubes": "Kein Würfel ausgewählt. \nBitte wählen Sie eines aus.", + "title": "Aufmerksamkeit!" + }, + "ascending": "Aufsteigend", + "date": "Datum", + "descending": "Absteigend", + "dialogs": { + "move-to-history": "Verschieben löst sich in den Verlauf auf?", + "move-to-history-para": "Sie können darauf zugreifen, indem Sie auf den Verlaufsschalter tippen." + }, + "empty-solves": "Hier ist noch nichts!", + "empty-solves-description": "Tippen Sie auf den Schalter oben auf dem Bildschirm, um Ihren Verlauf anzuzeigen.", + "filter-by-time": "Nach Zeit filtern", + "historial": "Historisch", + "last": "Zuletzt", + "order": "Befehl", + "share": "Aktie", + "share-clipboard": { + "average": "Durchschnitt", + "header": "Erstellt von NexusTimer", + "list-of-times": "Liste der Zeiten" + }, + "sort": "Sortieren", + "time": "Zeit", + "toast": { + "success-copy": "Erfolgreich kopiert", + "success-copy-description": "Wurde in Ihre Zwischenablage kopiert.", + "unable-action": "Aktion nicht möglich", + "warning-select-cube": "Bitte wählen Sie vorher einen Würfel aus." + }, + "tooltips": { + "move-to-history": "Verschieben löst den Verlauf" + } }, "StatsPage": { "title": "Statistiken", - "total": "Gesamt", - "category": "Kategorie", "global": "Global", "sessions": "Sitzungen", "best-time": "Beste Zeit", "average": "Durchschnitt", "time-spent": "Aufgewendete Zeit", "success-rate": "Erfolgsrate", - "counter": "Zähler" + "counter": "Zähler", + "advanced": "Fortschrittlich", + "overall": "Gesamt" }, "CubesPage": { "title": "Würfel", - "cube": "Würfel", "no-cubes-for-display": "Keine Würfel zur Anzeige.", "favorite": "Favorit", "category": "Kategorie", @@ -61,30 +81,35 @@ "status": "Status", "using": "Verwendet", "idle": "Leerlauf", - "filter-cubes": "Filtern Sie Ihre Würfel" + "find-your-cube": "Finden Sie Ihren Würfel", + "name": "Name", + "new-collection": "Neue Kollektion", + "options": "Optionen" }, "Cubes-modal": { - "title-editing": "Würfel bearbeiten", - "title-creating": "Neuer Würfel", - "error-name": "Würfelname fehlt", - "error-duplicate": "Würfelname bereits in Verwendung", - "current-select": "Aktuelle Auswahl:", - "question-delete": "Sind Sie sicher, dass Sie löschen möchten?", - "warning-delete": "Diese unumkehrbare Aktion löscht den gesamten Lösungshistorie für diesen Würfel und kann Ihre Statistiken beeinflussen.", - "placeholder": "Marke | Modell | Version | Magnetisch?" + "category": "Kategorie", + "current-selection": "Aktuelle Auswahl:", + "danger-msg": "Wenn Sie die Sammlungskategorie ändern, ändern sich auch die dieser Kategorie zugeordneten Lösungen.", + "delete-collection": "Sammlung löschen", + "delete-collection-description": "Diese Cube-Sammlung wird zusammen mit allen zugehörigen Lösungen, Datensätzen und Einstellungen gelöscht.", + "edit-collection": "Sammlung bearbeiten", + "input-collection-name": "Geben Sie den Sammlungsnamen ein", + "name": "Name", + "new-collection": "Neue Kollektion", + "new-collection-description": "Mit Cube-Sammlungen können Sie den Verlauf jedes Cubes verfolgen, ohne dass sich dies auf die allgemeinen Kategoriestatistiken auswirkt.", + "select-an-option": "Wählen Sie eine Option", + "to-continue": "um fortzufahren:", + "warning-alert": "Warnung:", + "warning-msg": "Diese Aktion ist nicht rückgängig zu machen." }, "Inputs": { "select": "Auswählen", - "add-cube": "Würfel hinzufügen", "favorites": "Favoriten", - "list": "Liste", - "trash-all": "Alles löschen", - "move-all": "Alles verschieben", "create": "Erstellen", - "confirm": "Bestätigen", "cancel": "Abbrechen", - "save": "Speichern", - "delete": "Löschen" + "continue": "Weitermachen", + "move": "Bewegen", + "none": "Keiner" }, "Settings-menu": { "title": "Einstellungen", @@ -116,7 +141,9 @@ "about": "Über", "legend": "NexusTimer ist ein unverfälschtes, minimalistisches und Open-Source-Webtool für SpeedCubing.", "suggest": "Änderung vorschlagen", - "report-bug": "Fehler melden" + "report-bug": "Fehler melden", + "auto-select": "Automatische Auswahl beim Start", + "preferences": "Präferenzen" }, "backup-modal": { "title": "Intelligente Backup-Wiederherstellung", @@ -126,6 +153,17 @@ "loading-part-1": "Diese Aktion dauert weniger als eine Minute.", "loading-part-2": "Bitte warten Sie, schließen Sie dieses Fenster nicht.", "welcome": "Willkommen:" + }, + "Errors": { + "empty-input": "Bitte geben Sie einen Wert ein", + "not-match": "Der Name stimmt nicht überein.", + "repeated-name": "Diese Namenssammlung existiert bereits." + }, + "tooltips": { + "bookmark": "Lesezeichen", + "copy": "Kopie", + "delete": "Löschen", + "plus-two": "2 Strafe" } }, "Metadata": { diff --git a/messages/en.json b/messages/en.json index 541d3a14..1157ca8d 100644 --- a/messages/en.json +++ b/messages/en.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "Timer", "hint": "Hint", "optimal-yellow-layer": "Optimal Yellow Layer", "solving": "Solving...", @@ -23,35 +22,47 @@ }, "SolvesPage": { "title": "Solves", - "search-by-time": "⏱︎ Search by time", - "finalize-session": "Finalize session", - "eliminate-session": "Eliminate session", - "archive-sessions-legend": "This action will archive all ongoing sessions from the same category.", - "delete-session-legend": "This action will delete only your current solves with the selected cube.", - "archive": "Archive", - "unarchive": "Unarchive", - "copy": "Copy", - "remove": "Remove", - "enter-a-comment": "Enter a comment", "session": "Session", - "all": "All", - "no-cube-selection": "No cube selected, choose one...", - "no-solves": "There's no solves to show!", + "historial": "Historial", + "filter-by-time": "Filter by time", + "tooltips": { + "move-to-history": "Move solves to history" + }, + "dialogs": { + "move-to-history": "Move solves to history?", + "move-to-history-para": "You will be able to access them by tapping the history switch." + }, + "toast": { + "unable-action": "Unable action", + "warning-select-cube": "Please select a cube before.", + "success-copy": "Copied successfully", + "success-copy-description": "Has been copied to your clipboard." + }, + "alert": { + "title": "Attention!", + "empty-cubes": "No cube selected. Please choose one." + }, + "empty-solves": "Nothing here yet!", + "empty-solves-description": "Tap the switch at the top of the screen to see your history.", + "sort": "Sort", "time": "Time", "date": "Date", + "order": "Order", "ascending": "Ascending", "descending": "Descending", - "sort-by": "Sort by...", - "share": "Share...", - "share-stats-title": "Generated by NexusTimer", - "average": "Average", - "list-of-times": "List of times", - "last": "Last" + "share": "Share", + "last": "Last", + "all": "All", + "share-clipboard": { + "header": "Generated by NexusTimer", + "average": "Average", + "list-of-times": "List of times" + } }, "StatsPage": { "title": "Stats", - "total": "Total", - "category": "Category", + "overall": "Overall", + "advanced": "Advanced", "global": "Global", "sessions": "Sessions", "best-time": "Best Time", @@ -62,7 +73,6 @@ }, "CubesPage": { "title": "Cubes", - "cube": "Cube", "no-cubes-for-display": "No cubes for display.", "favorite": "Favorite", "category": "Category", @@ -71,32 +81,47 @@ "status": "Status", "using": "Using", "idle": "Idle", - "filter-cubes": "Filter your cubes" + "find-your-cube": "Find your cube", + "new-collection": "New collection", + "name": "Name", + "options": "Options" }, "Cubes-modal": { - "title-editing": "Edit Cube", - "title-creating": "New Cube", - "error-name": "Cube name is missing", - "error-duplicate": "Cube name already in use", - "current-select": "Current selection:", - "question-delete": "Are you sure you want to delete?", - "warning-delete": "This irreversible action will delete all solve history for this cube and may impact your statistics.", - "placeholder": "Brand | Model | Version | Magnetic?" + "delete-collection": "Delete collection", + "delete-collection-description": "This cube collection will be deleted, along with all of its solves, records, and settings.", + "warning-alert": "Warning:", + "warning-msg": "This action is not reversible.", + "input-collection-name": "Enter the collection name", + "to-continue": "to continue:", + "edit-collection": "Edit collection", + "danger-msg": "Modifying the collection category also changes the solves associated with that category.", + "name": "Name", + "category": "Category", + "select-an-option": "Select an option", + "new-collection": "New collection", + "new-collection-description": "Cube collections allow you to keep track of each cube's history without affecting overall category stats.", + "current-selection": "Current selection:" + }, + "Errors": { + "not-match": "The name does not match.", + "repeated-name": "That name collection already exist.", + "empty-input": "Please enter a value" }, "Inputs": { + "continue": "Continue", "select": "Select", - "add-cube": "Add cube", "favorites": "Favorites", - "list": "List", - "trash-all": "Trash All", - "move-all": "Move All", + "move": "Move", "create": "Create", - "confirm": "Confirm", "cancel": "Cancel", - "save": "Save", - "delete": "Delete", "none": "None" }, + "tooltips": { + "plus-two": "+2 Penalty", + "delete": "Delete", + "bookmark": "Bookmark", + "copy": "Copy" + }, "Settings-menu": { "title": "Settings", "locale": "Region", @@ -123,7 +148,7 @@ "max-file-size": "Maximum file size allowed is", "data": "App Data", "preferences": "Preferences", - "default-cube": "Default cube", + "auto-select": "Auto-select at startup", "import-from-file": "Import from file", "export-to-file": "Export to file", "about": "About", diff --git a/messages/es.json b/messages/es.json index 2ad7df71..d56fe1c0 100644 --- a/messages/es.json +++ b/messages/es.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "Temporizador", "hint": "Consejo", "optimal-yellow-layer": "Capa Amarilla Óptima", "solving": "Resolviendo...", @@ -23,46 +22,57 @@ }, "SolvesPage": { "title": "Soluciones", - "search-by-time": "⏱︎ Buscar por tiempo", - "finalize-session": "Finalizar sesión", - "eliminate-session": "Eliminar sesión", - "archive-sessions-legend": "Esta acción archivará todas las sesiones en curso de la misma categoría.", - "delete-session-legend": "Esta acción eliminará solo tus soluciones actuales con el cubo seleccionado.", - "archive": "Archivar", - "unarchive": "Desarchivar", - "copy": "Copiar", - "remove": "Eliminar", - "enter-a-comment": "Introduce un comentario", "session": "Sesión", "all": "Todos", - "no-cube-selection": "No se ha seleccionado ningún cubo, elige uno...", - "no-solves": "¡No hay soluciones para mostrar!", "ascending": "Ascendente", "date": "Fecha", "descending": "Descendente", - "sort-by": "Ordenar por...", "time": "Tiempo", - "share-stats-title": "Generado por NexusTimer", - "average": "Promedio", "share": "Compartir...", - "list-of-times": "Lista de tiempos", - "last": "Último" + "last": "Último", + "alert": { + "empty-cubes": "No se seleccionó ningún cubo. \nPor favor elige uno.", + "title": "¡Atención!" + }, + "dialogs": { + "move-to-history": "¿Mover las soluciones al historial?", + "move-to-history-para": "Podrás acceder a ellos tocando el interruptor del historial." + }, + "empty-solves": "¡Nada aquí todavía!", + "empty-solves-description": "Toque el interruptor en la parte superior de la pantalla para ver su historial.", + "filter-by-time": "Filtrar por tiempo", + "historial": "histórico", + "order": "Orden", + "share-clipboard": { + "average": "Promedio", + "header": "Generado por NexusTimer", + "list-of-times": "Lista de tiempos" + }, + "sort": "Clasificar", + "toast": { + "success-copy": "Copiado exitosamente", + "success-copy-description": "Se ha copiado a su portapapeles.", + "unable-action": "Acción imposible", + "warning-select-cube": "Por favor seleccione un cubo antes." + }, + "tooltips": { + "move-to-history": "Mover soluciones al historial" + } }, "StatsPage": { "title": "Estadísticas", - "total": "Total", - "category": "Categoría", "global": "Global", "sessions": "Sesiones", "best-time": "Mejor Tiempo", "average": "Promedio", "time-spent": "Tiempo Gastado", "success-rate": "Tasa de Éxito", - "counter": "Contador" + "counter": "Contador", + "advanced": "Avanzado", + "overall": "En general" }, "CubesPage": { "title": "Cubos", - "cube": "Cubo", "no-cubes-for-display": "No hay cubos para mostrar.", "favorite": "Favorito", "category": "Categoría", @@ -71,30 +81,35 @@ "status": "Estado", "using": "Usando", "idle": "Inactivo", - "filter-cubes": "Filtrar tus cubos" + "find-your-cube": "Encuentra tu cubo", + "name": "Nombre", + "new-collection": "Nueva colección", + "options": "Opciones" }, "Cubes-modal": { - "title-editing": "Editar Cubo", - "title-creating": "Nuevo Cubo", - "error-name": "Falta el nombre del cubo", - "error-duplicate": "El nombre del cubo ya está en uso", - "current-select": "Selección actual:", - "question-delete": "¿Estás seguro de que deseas eliminar?", - "warning-delete": "Esta acción irreversible eliminará todo el historial de soluciones para este cubo y puede afectar tus estadísticas.", - "placeholder": "Marca | Modelo | Versión | ¿Magnético?" + "category": "Categoría", + "current-selection": "Selección actual:", + "danger-msg": "Modificar la categoría de la colección también cambia las soluciones asociadas con esa categoría.", + "delete-collection": "Eliminar colección", + "delete-collection-description": "Esta colección de cubos se eliminará, junto con todas sus soluciones, registros y configuraciones.", + "edit-collection": "Editar colección", + "input-collection-name": "Introduzca el nombre de la colección", + "name": "Nombre", + "new-collection": "Nueva colección", + "new-collection-description": "Las colecciones de cubos le permiten realizar un seguimiento del historial de cada cubo sin afectar las estadísticas generales de la categoría.", + "select-an-option": "Seleccione una opción", + "to-continue": "para continuar:", + "warning-alert": "Advertencia:", + "warning-msg": "Esta acción no es reversible." }, "Inputs": { "select": "Seleccionar", - "add-cube": "Agregar cubo", "favorites": "Favoritos", - "list": "Lista", - "trash-all": "Eliminar Todo", - "move-all": "Mover Todo", "create": "Crear", - "confirm": "Confirmar", "cancel": "Cancelar", - "save": "Guardar", - "delete": "Eliminar" + "continue": "Continuar", + "move": "Mover", + "none": "Ninguno" }, "Settings-menu": { "title": "Configuración", @@ -126,7 +141,9 @@ "about": "Acerca de", "legend": "NexusTimer es una herramienta web minimalista, de código abierto y sin opiniones para SpeedCubing.", "suggest": "Sugerir un cambio", - "report-bug": "Reportar un error" + "report-bug": "Reportar un error", + "auto-select": "Selección automática al inicio", + "preferences": "Preferencias" }, "backup-modal": { "title": "Restauración Inteligente de Respaldo", @@ -136,6 +153,17 @@ "loading-part-1": "Esta acción toma menos de un minuto.", "loading-part-2": "Por favor espera, no cierres esta ventana.", "welcome": "Bienvenido:" + }, + "Errors": { + "empty-input": "Por favor introduce un valor", + "not-match": "El nombre no coincide.", + "repeated-name": "Esa colección de nombres ya existe." + }, + "tooltips": { + "bookmark": "Marcador", + "copy": "Copiar", + "delete": "Borrar", + "plus-two": "2 Penalización" } }, "Metadata": { diff --git a/messages/et.json b/messages/et.json index 7c568c2a..973777f6 100644 --- a/messages/et.json +++ b/messages/et.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "Ajastin", "hint": "Vihje", "optimal-yellow-layer": "Optimaalne kollane kiht", "solving": "Lahendamine...", @@ -23,41 +22,57 @@ }, "SolvesPage": { "title": "Lahendused", - "search-by-time": "⏱︎ Otsi aja järgi", - "finalize-session": "Lõpeta sessioon", - "eliminate-session": "Kustuta sessioon", - "archive-sessions-legend": "See toiming arhiveerib kõik samast kategooriast pärinevad hetkel toimuvad sessioonid.", - "delete-session-legend": "See toiming kustutab ainult teie praegused lahendused valitud kuubiga.", - "archive": "Arhiveeri", - "unarchive": "Arhiivita", - "copy": "Kopeeri", - "remove": "Eemalda", - "enter-a-comment": "Sisesta kommentaar", "session": "Sessioon", "all": "Kõik", - "no-cube-selection": "Kuupi pole valitud, valige üks...", - "no-solves": "Lahendusi pole näidata!", "ascending": "Kasvav", "date": "Kuupäev", "descending": "Langevad", - "sort-by": "Sorteerima...", - "time": "Aeg" + "time": "Aeg", + "alert": { + "empty-cubes": "Kuubikut pole valitud. \nPalun valige üks.", + "title": "Tähelepanu!" + }, + "dialogs": { + "move-to-history": "Kas viia lahendused ajalukku?", + "move-to-history-para": "Pääsete neile juurde, kui puudutate ajaloo lülitit." + }, + "empty-solves": "Siin pole veel midagi!", + "empty-solves-description": "Puudutage oma ajaloo vaatamiseks ekraani ülaosas olevat lülitit.", + "filter-by-time": "Filtreerige aja järgi", + "historial": "Ajalooline", + "last": "Viimane", + "order": "Telli", + "share": "Jaga", + "share-clipboard": { + "average": "Keskmine", + "header": "NexusTimeri poolt loodud", + "list-of-times": "Aegade loend" + }, + "sort": "Sorteeri", + "toast": { + "success-copy": "Kopeerimine õnnestus", + "success-copy-description": "Kopeeriti teie lõikelauale.", + "unable-action": "Ei saa toimida", + "warning-select-cube": "Palun valige enne kuubik." + }, + "tooltips": { + "move-to-history": "Lahenduste teisaldamine ajalukku" + } }, "StatsPage": { "title": "Statistika", - "total": "Kokku", - "category": "Kategooria", "global": "Ülemaailmne", "sessions": "Sessioonid", "best-time": "Parim aeg", "average": "Keskmine", "time-spent": "Kulutatud aeg", "success-rate": "Edu määr", - "counter": "Lugeja" + "counter": "Lugeja", + "advanced": "Täpsemalt", + "overall": "Üldiselt" }, "CubesPage": { "title": "Kuubikud", - "cube": "Kuup", "no-cubes-for-display": "Kuubikuid pole kuvamiseks.", "favorite": "Lemmik", "category": "Kategooria", @@ -66,30 +81,35 @@ "status": "Staatus", "using": "Kasutamine", "idle": "Tööta", - "filter-cubes": "Filtreeri oma kuubikuid" + "find-your-cube": "Leia oma kuubik", + "name": "Nimi", + "new-collection": "Uus kollektsioon", + "options": "Valikud" }, "Cubes-modal": { - "title-editing": "Kuubi muutmine", - "title-creating": "Uus kuup", - "error-name": "Kuubi nimi puudub", - "error-duplicate": "Kuubi nimi on juba kasutusel", - "current-select": "Praegune valik:", - "question-delete": "Olete kindel, et soovite kustutada?", - "warning-delete": "See pöördumatu toiming kustutab kõik selle kuubi jaoks mineviku lahendused ja võib mõjutada teie statistikat.", - "placeholder": "Bränd | Mudel | Versioon | Magnetiline?" + "category": "Kategooria", + "current-selection": "Praegune valik:", + "danger-msg": "Kogu kategooria muutmine muudab ka selle kategooriaga seotud lahendusi.", + "delete-collection": "Kustuta kogu", + "delete-collection-description": "See kuubikukogu koos kõigi selle lahenduste, kirjete ja sätetega kustutatakse.", + "edit-collection": "Redigeeri kogu", + "input-collection-name": "Sisestage kogu nimi", + "name": "Nimi", + "new-collection": "Uus kollektsioon", + "new-collection-description": "Kuubikukogud võimaldavad teil jälgida iga kuubi ajalugu, ilma et see mõjutaks üldist kategooria statistikat.", + "select-an-option": "Valige suvand", + "to-continue": "jätkamiseks:", + "warning-alert": "Hoiatus:", + "warning-msg": "See toiming ei ole pöörduv." }, "Inputs": { "select": "Vali", - "add-cube": "Lisa kuup", "favorites": "Lemmikud", - "list": "Nimekiri", - "trash-all": "Prügikast kõik", - "move-all": "Liiguta kõik", "create": "Loo", - "confirm": "Kinnita", "cancel": "Tühista", - "save": "Salvesta", - "delete": "Kustuta" + "continue": "Jätka", + "move": "Liiguta", + "none": "Mitte ühtegi" }, "Settings-menu": { "title": "Sätted", @@ -121,7 +141,9 @@ "about": "Info", "legend": "NexusTimer on erapooletu, minimalistlik ja avatud lähtekoodiga veebiteenus SpeedCubingu jaoks.", "suggest": "Soovitage muudatust", - "report-bug": "Teata veast" + "report-bug": "Teata veast", + "auto-select": "Automaatne valimine käivitamisel", + "preferences": "Eelistused" }, "backup-modal": { "title": "Intelligentne varundamise taastamine", @@ -131,6 +153,17 @@ "loading-part-1": "See toiming võtab vähem kui minut.", "loading-part-2": "Palun oodake, ärge sulgege seda akent.", "welcome": "Tere tulemast:" + }, + "Errors": { + "empty-input": "Sisestage väärtus", + "not-match": "Nimi ei sobi.", + "repeated-name": "See nimekogu on juba olemas." + }, + "tooltips": { + "bookmark": "Järjehoidja", + "copy": "Kopeeri", + "delete": "Kustuta", + "plus-two": "2 Karistus" } }, "Metadata": { diff --git a/messages/fi.json b/messages/fi.json index e45ee120..bf5d8437 100644 --- a/messages/fi.json +++ b/messages/fi.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "Ajastin", "hint": "Vihje", "optimal-yellow-layer": "Optimaalinen keltainen kerros", "solving": "Ratkaiseminen...", @@ -23,41 +22,57 @@ }, "SolvesPage": { "title": "Ratkaisut", - "search-by-time": "⏱︎ Etsi ajan perusteella", - "finalize-session": "Päätä istunto", - "eliminate-session": "Poista istunto", - "archive-sessions-legend": "Tämä toiminto arkistoi kaikki saman luokan parhaillaan käynnissä olevat istunnot.", - "delete-session-legend": "Tämä toiminto poistaa vain nykyiset ratkaisusi valitulla kuutiolla.", - "archive": "Arkistoi", - "unarchive": "Poista arkisto", - "copy": "Kopioi", - "remove": "Poista", - "enter-a-comment": "Kirjoita kommentti", "session": "Istunto", "all": "Kaikki", - "no-cube-selection": "Ei valittua kuutiota, valitse yksi...", - "no-solves": "Ei ratkaisuja näytettäväksi!", "ascending": "Nouseva", "date": "Päivämäärä", "descending": "Laskeva", - "sort-by": "Järjestä...", - "time": "Aika" + "time": "Aika", + "alert": { + "empty-cubes": "Kuutiota ei ole valittu. \nValitse yksi.", + "title": "Huomio!" + }, + "dialogs": { + "move-to-history": "Siirretäänkö ratkaisut historiaan?", + "move-to-history-para": "Voit käyttää niitä napauttamalla historiakytkintä." + }, + "empty-solves": "Ei täällä vielä mitään!", + "empty-solves-description": "Näet historiasi napauttamalla näytön yläreunassa olevaa kytkintä.", + "filter-by-time": "Suodata ajan mukaan", + "historial": "Historiallinen", + "last": "Kestää", + "order": "Tilata", + "share": "Jakaa", + "share-clipboard": { + "average": "Keskimäärin", + "header": "Luonut NexusTimer", + "list-of-times": "Lista aikoja" + }, + "sort": "Järjestellä", + "toast": { + "success-copy": "Kopiointi onnistui", + "success-copy-description": "On kopioitu leikepöydällesi.", + "unable-action": "Toiminto ei onnistu", + "warning-select-cube": "Valitse kuutio ennen." + }, + "tooltips": { + "move-to-history": "Siirrä ratkaisut historiaan" + } }, "StatsPage": { "title": "Tilastot", - "total": "Yhteensä", - "category": "Kategoria", "global": "Maailmanlaajuinen", "sessions": "Istunnot", "best-time": "Paras aika", "average": "Keskiarvo", "time-spent": "Kulunut aika", "success-rate": "Onnistumisprosentti", - "counter": "Laskuri" + "counter": "Laskuri", + "advanced": "Edistynyt", + "overall": "Kaiken kaikkiaan" }, "CubesPage": { "title": "Kuutiot", - "cube": "Kuutio", "no-cubes-for-display": "Ei kuutioita näytettäväksi.", "favorite": "Suosikki", "category": "Kategoria", @@ -66,30 +81,35 @@ "status": "Tila", "using": "Käytössä", "idle": "Käyttämätön", - "filter-cubes": "Suodata kuutiosi" + "find-your-cube": "Etsi oma kuutiosi", + "name": "Nimi", + "new-collection": "Uusi kokoelma", + "options": "Vaihtoehdot" }, "Cubes-modal": { - "title-editing": "Muokkaa Kuutiota", - "title-creating": "Uusi Kuutio", - "error-name": "Kuution nimi puuttuu", - "error-duplicate": "Kuution nimi on jo käytössä", - "current-select": "Nykyinen valinta:", - "question-delete": "Haluatko varmasti poistaa?", - "warning-delete": "Tämä peruuttamaton toiminto poistaa kaiken ratkaisuhistorian tälle kuutiolle ja saattaa vaikuttaa tilastoihisi.", - "placeholder": "Brändi | Malli | Versio | Magneettinen?" + "category": "Luokka", + "current-selection": "Nykyinen valinta:", + "danger-msg": "Kokoelman luokan muokkaaminen muuttaa myös kyseiseen luokkaan liittyviä ratkaisuja.", + "delete-collection": "Poista kokoelma", + "delete-collection-description": "Tämä kuutiokokoelma sekä kaikki sen ratkaisut, tietueet ja asetukset poistetaan.", + "edit-collection": "Muokkaa kokoelmaa", + "input-collection-name": "Kirjoita kokoelman nimi", + "name": "Nimi", + "new-collection": "Uusi kokoelma", + "new-collection-description": "Kuutiokokoelmien avulla voit seurata kunkin kuution historiaa vaikuttamatta yleisiin luokkatilastoihin.", + "select-an-option": "Valitse vaihtoehto", + "to-continue": "jatkamaan:", + "warning-alert": "Varoitus:", + "warning-msg": "Tätä toimintoa ei voi peruuttaa." }, "Inputs": { "select": "Valitse", - "add-cube": "Lisää kuutio", "favorites": "Suosikit", - "list": "Lista", - "trash-all": "Roskakori kaikki", - "move-all": "Siirrä kaikki", "create": "Luo", - "confirm": "Vahvista", "cancel": "Peruuta", - "save": "Tallenna", - "delete": "Poista" + "continue": "Jatkaa", + "move": "Liikkua", + "none": "Ei mitään" }, "Settings-menu": { "title": "Asetukset", @@ -121,7 +141,9 @@ "about": "Tietoa", "legend": "NexusTimer on puolueeton, minimalistinen ja avoimen lähdekoodin verkkotyökalu SpeedCubingille.", "suggest": "Ehdota muutosta", - "report-bug": "Ilmoita virheestä" + "report-bug": "Ilmoita virheestä", + "auto-select": "Automaattinen valinta käynnistyksen yhteydessä", + "preferences": "Asetukset" }, "backup-modal": { "title": "Älykäs varmuuskopiointi ja palautus", @@ -131,6 +153,17 @@ "loading-part-1": "Tämä toiminto kestää alle minuutin.", "loading-part-2": "Odota hetki, älä sulje tätä ikkunaa.", "welcome": "Tervetuloa:" + }, + "Errors": { + "empty-input": "Anna arvo", + "not-match": "Nimi ei täsmää.", + "repeated-name": "Tämä nimikokoelma on jo olemassa." + }, + "tooltips": { + "bookmark": "Kirjanmerkki", + "copy": "Kopioida", + "delete": "Poistaa", + "plus-two": "2 Rangaistus" } }, "Metadata": { diff --git a/messages/fr.json b/messages/fr.json index 3f17fe8c..a8d479b4 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "Chronomètre", "hint": "Indice", "optimal-yellow-layer": "Couche jaune optimale", "solving": "Résolution...", @@ -23,41 +22,57 @@ }, "SolvesPage": { "title": "Résolutions", - "search-by-time": "⏱︎ Recherche par temps", - "finalize-session": "Finaliser la session", - "eliminate-session": "Éliminer la session", - "archive-sessions-legend": "Cette action archivera toutes les sessions en cours de la même catégorie.", - "delete-session-legend": "Cette action supprimera uniquement vos résolutions actuelles avec le cube sélectionné.", - "archive": "Archiver", - "unarchive": "Désarchiver", - "copy": "Copier", - "remove": "Supprimer", - "enter-a-comment": "Saisissez un commentaire", "session": "Session", "all": "Tout", - "no-cube-selection": "Aucun cube sélectionné, choisissez-en un...", - "no-solves": "Il n'y a pas de résolutions à afficher !", "ascending": "Ascendant", "date": "Date", "descending": "Descendant", - "sort-by": "Trier par...", - "time": "Temps" + "time": "Temps", + "alert": { + "empty-cubes": "Aucun cube sélectionné. \nVeuillez en choisir un.", + "title": "Attention!" + }, + "dialogs": { + "move-to-history": "Déplacer les résolutions vers l'historique ?", + "move-to-history-para": "Vous pourrez y accéder en appuyant sur le bouton Historique." + }, + "empty-solves": "Rien ici pour l'instant !", + "empty-solves-description": "Appuyez sur le commutateur en haut de l'écran pour voir votre historique.", + "filter-by-time": "Filtrer par heure", + "historial": "Historique", + "last": "Dernier", + "order": "Commande", + "share": "Partager", + "share-clipboard": { + "average": "Moyenne", + "header": "Généré par NexusTimer", + "list-of-times": "Liste des heures" + }, + "sort": "Trier", + "toast": { + "success-copy": "Copié avec succès", + "success-copy-description": "A été copié dans votre presse-papiers.", + "unable-action": "Action impossible", + "warning-select-cube": "Veuillez sélectionner un cube avant." + }, + "tooltips": { + "move-to-history": "Déplacer les résolutions vers l'historique" + } }, "StatsPage": { "title": "Statistiques", - "total": "Total", - "category": "Catégorie", "global": "Global", "sessions": "Sessions", "best-time": "Meilleur temps", "average": "Moyenne", "time-spent": "Temps passé", "success-rate": "Taux de réussite", - "counter": "Compteur" + "counter": "Compteur", + "advanced": "Avancé", + "overall": "Dans l'ensemble" }, "CubesPage": { "title": "Cubes", - "cube": "Cube", "no-cubes-for-display": "Aucun cube à afficher.", "favorite": "Favori", "category": "Catégorie", @@ -66,30 +81,35 @@ "status": "Statut", "using": "En cours d'utilisation", "idle": "Inactif", - "filter-cubes": "Filtrer vos cubes" + "find-your-cube": "Trouvez votre cube", + "name": "Nom", + "new-collection": "Nouvelle collection", + "options": "Possibilités" }, "Cubes-modal": { - "title-editing": "Modifier le Cube", - "title-creating": "Nouveau Cube", - "error-name": "Le nom du cube est manquant", - "error-duplicate": "Le nom du cube est déjà utilisé", - "current-select": "Sélection actuelle :", - "question-delete": "Êtes-vous sûr de vouloir supprimer ?", - "warning-delete": "Cette action irréversible supprimera tout l'historique des résolutions pour ce cube et pourrait affecter vos statistiques.", - "placeholder": "Marque | Modèle | Version | Magnétique ?" + "category": "Catégorie", + "current-selection": "Sélection actuelle :", + "danger-msg": "La modification de la catégorie de collection modifie également les résolutions associées à cette catégorie.", + "delete-collection": "Supprimer la collection", + "delete-collection-description": "Cette collection de cubes sera supprimée, ainsi que toutes ses résolutions, enregistrements et paramètres.", + "edit-collection": "Modifier la collection", + "input-collection-name": "Entrez le nom de la collection", + "name": "Nom", + "new-collection": "Nouvelle collection", + "new-collection-description": "Les collections de cubes vous permettent de suivre l'historique de chaque cube sans affecter les statistiques globales de la catégorie.", + "select-an-option": "Sélectionnez une option", + "to-continue": "pour continuer :", + "warning-alert": "Avertissement:", + "warning-msg": "Cette action n'est pas réversible." }, "Inputs": { "select": "Sélectionner", - "add-cube": "Ajouter un cube", "favorites": "Favoris", - "list": "Liste", - "trash-all": "Tout supprimer", - "move-all": "Tout déplacer", "create": "Créer", - "confirm": "Confirmer", "cancel": "Annuler", - "save": "Enregistrer", - "delete": "Supprimer" + "continue": "Continuer", + "move": "Se déplacer", + "none": "Aucun" }, "Settings-menu": { "title": "Paramètres", @@ -121,7 +141,9 @@ "about": "À propos", "legend": "NexusTimer est un outil Web minimaliste, impartial et open source pour le SpeedCubing.", "suggest": "Proposer un changement", - "report-bug": "Signaler un bug" + "report-bug": "Signaler un bug", + "auto-select": "Sélection automatique au démarrage", + "preferences": "Préférences" }, "backup-modal": { "title": "Restauration de sauvegarde intelligente", @@ -131,6 +153,17 @@ "loading-part-1": "Cette action prend moins d'une minute.", "loading-part-2": "Veuillez patienter, ne fermez pas cette fenêtre.", "welcome": "Bienvenue :" + }, + "Errors": { + "empty-input": "Veuillez saisir une valeur", + "not-match": "Le nom ne correspond pas.", + "repeated-name": "Cette collection de noms existe déjà." + }, + "tooltips": { + "bookmark": "Marque-page", + "copy": "Copie", + "delete": "Supprimer", + "plus-two": "2 Pénalité" } }, "Metadata": { diff --git a/messages/hi.json b/messages/hi.json index 8ef5a93a..591ee8a4 100644 --- a/messages/hi.json +++ b/messages/hi.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "टाइमर", "hint": "संकेत", "optimal-yellow-layer": "आदर्श पीला परत", "solving": "हल कर रहे हैं...", @@ -23,41 +22,57 @@ }, "SolvesPage": { "title": "समाधान", - "search-by-time": "समय द्वारा खोजें", - "finalize-session": "सत्ताकरण सत्र", - "eliminate-session": "सत्र को निकालें", - "archive-sessions-legend": "यह कार्रवाई एक ही श्रेणी की सभी चल रही सत्रों को संग्रहीत करेगी।", - "delete-session-legend": "यह कार्रवाई केवल चयनित क्यूब के साथ आपके वर्तमान समाधानों को हटा देगी।", - "archive": "संग्रहीत", - "unarchive": "संग्रह रद्द करें", - "copy": "प्रतिलिपि", - "remove": "हटाएं", - "enter-a-comment": "एक टिप्पणी दर्ज करें", "session": "सत्र", "all": "सभी", - "no-cube-selection": "कोई क्यूब चयनित नहीं है, कोई एक चुनें...", - "no-solves": "दिखाने के लिए कोई समाधान नहीं है!", "ascending": "आरोही", "date": "तारीख", "descending": "अवरोही", - "sort-by": "इसके अनुसार क्रमबद्ध करें...", - "time": "समय" + "time": "समय", + "alert": { + "empty-cubes": "कोई घन चयनित नहीं. \nएक का चयन करें।", + "title": "ध्यान!" + }, + "dialogs": { + "move-to-history": "समाधानों को इतिहास में ले जाएँ?", + "move-to-history-para": "आप इतिहास स्विच पर टैप करके उन तक पहुंच पाएंगे।" + }, + "empty-solves": "अभी तक यहाँ कुछ भी नहीं है!", + "empty-solves-description": "अपना इतिहास देखने के लिए स्क्रीन के शीर्ष पर स्थित स्विच को टैप करें।", + "filter-by-time": "समय के अनुसार फ़िल्टर करें", + "historial": "historial", + "last": "अंतिम", + "order": "आदेश", + "share": "शेयर करना", + "share-clipboard": { + "average": "औसत", + "header": "NexusTimer द्वारा जेनरेट किया गया", + "list-of-times": "समय की सूची" + }, + "sort": "क्रम से लगाना", + "toast": { + "success-copy": "सफलतापूर्वक कॉपी किया गया", + "success-copy-description": "आपके क्लिपबोर्ड पर कॉपी कर दिया गया है.", + "unable-action": "असमर्थ कार्रवाई", + "warning-select-cube": "कृपया पहले एक घन चुनें." + }, + "tooltips": { + "move-to-history": "समाधानों को इतिहास में ले जाएँ" + } }, "StatsPage": { "title": "आंकड़े", - "total": "कुल", - "category": "श्रेणी", "global": "वैश्विक", "sessions": "सत्र", "best-time": "सर्वोत्तम समय", "average": "औसत", "time-spent": "बिताया हुआ समय", "success-rate": "सफलता दर", - "counter": "काउंटर" + "counter": "काउंटर", + "advanced": "विकसित", + "overall": "कुल मिलाकर" }, "CubesPage": { "title": "क्यूब", - "cube": "क्यूब", "no-cubes-for-display": "प्रदर्शन के लिए कोई क्यूब नहीं।", "favorite": "पसंदीदा", "category": "श्रेणी", @@ -66,30 +81,35 @@ "status": "स्थिति", "using": "उपयोग करना", "idle": "आलसी", - "filter-cubes": "अपने क्यूब को फ़िल्टर करें" + "find-your-cube": "अपना घन खोजें", + "name": "नाम", + "new-collection": "नया संग्रह", + "options": "विकल्प" }, "Cubes-modal": { - "title-editing": "क्यूब संपादन", - "title-creating": "नया क्यूब", - "error-name": "क्यूब का नाम अनुपस्थित है", - "error-duplicate": "क्यूब का नाम पहले से ही उपयोग में है", - "current-select": "वर्तमान चयन:", - "question-delete": "क्या आप वाकई हटाना चाहते हैं?", - "warning-delete": "यह अनपेक्षित क्रिया इस क्यूब के लिए समाधान इतिहास को हटा देगी और आपके आंकड़ों पर प्रभाव डाल सकती है।", - "placeholder": "ब्रांड | मॉडल | संस्करण | चुंबकीय?" + "category": "वर्ग", + "current-selection": "वर्तमान चयन:", + "danger-msg": "संग्रह श्रेणी को संशोधित करने से उस श्रेणी से जुड़े समाधान भी बदल जाते हैं।", + "delete-collection": "संग्रह हटाएँ", + "delete-collection-description": "यह क्यूब संग्रह इसके सभी सॉल्व, रिकॉर्ड और सेटिंग्स के साथ हटा दिया जाएगा।", + "edit-collection": "संग्रह संपादित करें", + "input-collection-name": "संग्रह का नाम दर्ज करें", + "name": "नाम", + "new-collection": "नया संग्रह", + "new-collection-description": "क्यूब संग्रह आपको समग्र श्रेणी आँकड़ों को प्रभावित किए बिना प्रत्येक क्यूब के इतिहास पर नज़र रखने की अनुमति देता है।", + "select-an-option": "कोई विकल्प चुनें", + "to-continue": "जारी रखने के लिए:", + "warning-alert": "चेतावनी:", + "warning-msg": "यह क्रिया प्रतिवर्ती नहीं है." }, "Inputs": { "select": "चयन करें", - "add-cube": "क्यूब जोड़ें", "favorites": "पसंती", - "list": "सूची", - "trash-all": "सभी को अपशिष्ट करें", - "move-all": "सभी को हटाएं", "create": "बनाएं", - "confirm": "पुष्टि करें", "cancel": "रद्द करें", - "save": "सहेजें", - "delete": "हटाएं" + "continue": "जारी रखना", + "move": "कदम", + "none": "कोई नहीं" }, "Settings-menu": { "title": "सेटिंग्स", @@ -121,7 +141,9 @@ "about": "के बारे में", "legend": "NexusTimer एक तटस्थ, लोकप्रिय और ओपन सोर्स वेब उपकरण है जो SpeedCubing के लिए है।", "suggest": "परिवर्तन सुझाएं", - "report-bug": "बग रिपोर्ट करें" + "report-bug": "बग रिपोर्ट करें", + "auto-select": "स्टार्टअप पर स्वतः चयन करें", + "preferences": "प्राथमिकताएँ" }, "backup-modal": { "title": "बुद्धिमान बैकअप पुनर्स्थापन", @@ -131,6 +153,17 @@ "loading-part-1": "यह कार्रवाई एक मिनट से कम समय लेती है।", "loading-part-2": "कृपया प्रतीक्षा करें, इस विंडो को बंद न करें।", "welcome": "स्वागत है:" + }, + "Errors": { + "empty-input": "कृपया एक मान दर्ज करें", + "not-match": "नाम मेल नहीं खाता.", + "repeated-name": "वह नाम संग्रह पहले से मौजूद है." + }, + "tooltips": { + "bookmark": "बुकमार्क", + "copy": "प्रतिलिपि", + "delete": "मिटाना", + "plus-two": "2 जुर्माना" } }, "Metadata": { diff --git a/messages/hu.json b/messages/hu.json index a2e7db0c..cf7d5c5c 100644 --- a/messages/hu.json +++ b/messages/hu.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "Időmérő", "hint": "Tipp", "optimal-yellow-layer": "Optimális Sárga Réteg", "solving": "Megoldás...", @@ -23,41 +22,57 @@ }, "SolvesPage": { "title": "Megoldások", - "search-by-time": "⏱︎ Keresés idő szerint", - "finalize-session": "Munkamenet befejezése", - "eliminate-session": "Munkamenet törlése", - "archive-sessions-legend": "Ezzel az intézkedéssel minden azonos kategóriájú folyamatban lévő munkamenetet archivál.", - "delete-session-legend": "Ezzel az intézkedéssel csak az aktuális megoldások törlődnek a kiválasztott kockával.", - "archive": "Archiválás", - "unarchive": "Archiválás megszüntetése", - "copy": "Másolás", - "remove": "Eltávolítás", - "enter-a-comment": "Adjon meg egy megjegyzést", "session": "Munkamenet", "all": "Mind", - "no-cube-selection": "Nincs kiválasztott kocka, válasszon egyet...", - "no-solves": "Nincsenek megoldások megjelenítésre!", "ascending": "Emelkedő", "date": "Dátum", "descending": "Csökkenő", - "sort-by": "Rendezés...", - "time": "Idő" + "time": "Idő", + "alert": { + "empty-cubes": "Nincs kiválasztva kocka. \nKérjük, válasszon egyet.", + "title": "Figyelem!" + }, + "dialogs": { + "move-to-history": "Megoldásokat áthelyezni a történelembe?", + "move-to-history-para": "Az előzmények kapcsolójának megérintésével érheti el őket." + }, + "empty-solves": "Itt még semmi!", + "empty-solves-description": "Érintse meg a képernyő tetején lévő kapcsolót az előzmények megtekintéséhez.", + "filter-by-time": "Szűrés idő szerint", + "historial": "Történelmi", + "last": "Utolsó", + "order": "Rendelés", + "share": "Részesedés", + "share-clipboard": { + "average": "Átlagos", + "header": "A NexusTimer generálta", + "list-of-times": "Idők listája" + }, + "sort": "Fajta", + "toast": { + "success-copy": "Sikeres másolás", + "success-copy-description": "A vágólapra másolva.", + "unable-action": "A művelet nem lehetséges", + "warning-select-cube": "Kérjük, előbb válasszon egy kockát." + }, + "tooltips": { + "move-to-history": "Mozgás megoldja a történelem" + } }, "StatsPage": { "title": "Statisztikák", - "total": "Összesen", - "category": "Kategória", "global": "Globális", "sessions": "Munkamenetek", "best-time": "Legjobb Idő", "average": "Átlag", "time-spent": "Eltöltött Idő", "success-rate": "Sikerarány", - "counter": "Számláló" + "counter": "Számláló", + "advanced": "Fejlett", + "overall": "Átfogó" }, "CubesPage": { "title": "Kockák", - "cube": "Kocka", "no-cubes-for-display": "Nincsenek kockák megjelenítésre.", "favorite": "Kedvenc", "category": "Kategória", @@ -66,30 +81,35 @@ "status": "Állapot", "using": "Használ", "idle": "Tétlen", - "filter-cubes": "Szűrje kockáit" + "find-your-cube": "Keresse meg a kockáját", + "name": "Név", + "new-collection": "Új kollekció", + "options": "Opciók" }, "Cubes-modal": { - "title-editing": "Kocka szerkesztése", - "title-creating": "Új kocka", - "error-name": "A kocka neve hiányzik", - "error-duplicate": "A kocka neve már használatban van", - "current-select": "Jelenlegi kiválasztás:", - "question-delete": "Biztosan törölni szeretné?", - "warning-delete": "Ezzel a visszavonhatatlan művelettel törölni fogja az összes megoldási előzményt erre a kockára, és befolyásolhatja a statisztikáit.", - "placeholder": "Márka | Modell | Verzió | Mágneses?" + "category": "Kategória", + "current-selection": "Jelenlegi választék:", + "danger-msg": "A gyűjteménykategória módosítása módosítja az adott kategóriához tartozó megoldásokat is.", + "delete-collection": "Gyűjtemény törlése", + "delete-collection-description": "Ez a kockagyűjtemény az összes megoldásával, rekordjával és beállításával együtt törlődik.", + "edit-collection": "Gyűjtemény szerkesztése", + "input-collection-name": "Adja meg a gyűjtemény nevét", + "name": "Név", + "new-collection": "Új kollekció", + "new-collection-description": "A kockagyűjtemények lehetővé teszik az egyes kockák előzményeinek nyomon követését anélkül, hogy ez befolyásolná a kategória általános statisztikáit.", + "select-an-option": "Válasszon egy lehetőséget", + "to-continue": "a folytatáshoz:", + "warning-alert": "Figyelmeztetés:", + "warning-msg": "Ez a művelet nem visszafordítható." }, "Inputs": { "select": "Válasszon", - "add-cube": "Kocka hozzáadása", "favorites": "Kedvencek", - "list": "Lista", - "trash-all": "Összes kidobása", - "move-all": "Összes mozgatása", "create": "Létrehoz", - "confirm": "Megerősít", "cancel": "Mégse", - "save": "Mentés", - "delete": "Törlés" + "continue": "Folytatás", + "move": "Mozog", + "none": "Egyik sem" }, "Settings-menu": { "title": "Beállítások", @@ -121,7 +141,9 @@ "about": "Névjegy", "legend": "A NexusTimer egy véleményektől mentes, minimalista és nyílt forráskódú webes eszköz a SpeedCubing számára.", "suggest": "Javaslat küldése", - "report-bug": "Hiba bejelentése" + "report-bug": "Hiba bejelentése", + "auto-select": "Automatikus kiválasztás indításkor", + "preferences": "Preferences" }, "backup-modal": { "title": "Intelligens Biztonsági Mentés Visszaállítása", @@ -131,6 +153,17 @@ "loading-part-1": "Ez a művelet kevesebb mint egy percet vesz igénybe.", "loading-part-2": "Kérjük, várjon, ne zárja be ezt az ablakot.", "welcome": "Üdvözöljük:" + }, + "Errors": { + "empty-input": "Adjon meg egy értéket", + "not-match": "A név nem egyezik.", + "repeated-name": "Ez a névgyűjtemény már létezik." + }, + "tooltips": { + "bookmark": "Könyvjelző", + "copy": "Másolat", + "delete": "Töröl", + "plus-two": "2 Büntetés" } }, "Metadata": { diff --git a/messages/id.json b/messages/id.json index a8df4ee7..710408c5 100644 --- a/messages/id.json +++ b/messages/id.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "Pengatur Waktu", "hint": "Petunjuk", "optimal-yellow-layer": "Lapisan Kuning Optimal", "solving": "Menyelesaikan...", @@ -23,41 +22,57 @@ }, "SolvesPage": { "title": "Penyelesaian", - "search-by-time": "⏱︎ Cari berdasarkan waktu", - "finalize-session": "Selesaikan sesi", - "eliminate-session": "Hapus sesi", - "archive-sessions-legend": "Tindakan ini akan mengarsipkan semua sesi yang sedang berlangsung dari kategori yang sama.", - "delete-session-legend": "Tindakan ini hanya akan menghapus penyelesaian Anda saat ini dengan kubus yang dipilih.", - "archive": "Arsip", - "unarchive": "Buka arsip", - "copy": "Salin", - "remove": "Hapus", - "enter-a-comment": "Masukkan komentar", "session": "Sesi", "all": "Semua", - "no-cube-selection": "Tidak ada kubus yang dipilih, pilih satu...", - "no-solves": "Tidak ada penyelesaian untuk ditampilkan!", "time": "Waktu", - "sort-by": "Sortir dengan...", "descending": "Menurun", "ascending": "Naik", - "date": "Tanggal" + "date": "Tanggal", + "alert": { + "empty-cubes": "Tidak ada kubus yang dipilih. \nSilakan pilih salah satu.", + "title": "Perhatian!" + }, + "dialogs": { + "move-to-history": "Pindahkan penyelesaian ke sejarah?", + "move-to-history-para": "Anda akan dapat mengaksesnya dengan mengetuk tombol riwayat." + }, + "empty-solves": "Belum ada apa pun di sini!", + "empty-solves-description": "Ketuk tombol di bagian atas layar untuk melihat riwayat Anda.", + "filter-by-time": "Saring berdasarkan waktu", + "historial": "Sejarah", + "last": "Terakhir", + "order": "Memesan", + "share": "Membagikan", + "share-clipboard": { + "average": "Rata-rata", + "header": "Dihasilkan oleh NexusTimer", + "list-of-times": "Daftar waktu" + }, + "sort": "Menyortir", + "toast": { + "success-copy": "Berhasil disalin", + "success-copy-description": "Telah disalin ke clipboard Anda.", + "unable-action": "Tidak dapat melakukan tindakan", + "warning-select-cube": "Silakan pilih kubus sebelumnya." + }, + "tooltips": { + "move-to-history": "Pindahkan penyelesaian ke sejarah" + } }, "StatsPage": { "title": "Statistik", - "total": "Total", - "category": "Kategori", "global": "Global", "sessions": "Sesi", "best-time": "Waktu Terbaik", "average": "Rata-rata", "time-spent": "Waktu yang Dihabiskan", "success-rate": "Tingkat Keberhasilan", - "counter": "Penghitung" + "counter": "Penghitung", + "advanced": "Canggih", + "overall": "Keseluruhan" }, "CubesPage": { "title": "Kubus", - "cube": "Kubus", "no-cubes-for-display": "Tidak ada kubus untuk ditampilkan.", "favorite": "Favorit", "category": "Kategori", @@ -66,30 +81,35 @@ "status": "Status", "using": "Menggunakan", "idle": "Sedang Diam", - "filter-cubes": "Filter kubus Anda" + "find-your-cube": "Temukan kubus Anda", + "name": "Nama", + "new-collection": "Koleksi baru", + "options": "Pilihan" }, "Cubes-modal": { - "title-editing": "Edit Kubus", - "title-creating": "Kubus Baru", - "error-name": "Nama kubus hilang", - "error-duplicate": "Nama kubus sudah digunakan", - "current-select": "Pilihan saat ini:", - "question-delete": "Apakah Anda yakin ingin menghapus?", - "warning-delete": "Tindakan ini tidak dapat dibatalkan dan akan menghapus semua riwayat penyelesaian untuk kubus ini dan mungkin mempengaruhi statistik Anda.", - "placeholder": "Merek | Model | Versi | Magnetik?" + "category": "Kategori", + "current-selection": "Pilihan saat ini:", + "danger-msg": "Memodifikasi kategori koleksi juga mengubah penyelesaian yang terkait dengan kategori tersebut.", + "delete-collection": "Hapus koleksi", + "delete-collection-description": "Koleksi kubus ini akan dihapus, beserta semua penyelesaian, catatan, dan pengaturannya.", + "edit-collection": "Sunting koleksi", + "input-collection-name": "Masukkan nama koleksi", + "name": "Nama", + "new-collection": "Koleksi baru", + "new-collection-description": "Koleksi kubus memungkinkan Anda melacak riwayat setiap kubus tanpa memengaruhi statistik kategori secara keseluruhan.", + "select-an-option": "Pilih sebuah opsi", + "to-continue": "untuk melanjutkan:", + "warning-alert": "Peringatan:", + "warning-msg": "Tindakan ini tidak dapat dibatalkan." }, "Inputs": { "select": "Pilih", - "add-cube": "Tambahkan kubus", "favorites": "Favorit", - "list": "Daftar", - "trash-all": "Buang Semua", - "move-all": "Pindahkan Semua", "create": "Buat", - "confirm": "Konfirmasi", "cancel": "Batal", - "save": "Simpan", - "delete": "Hapus" + "continue": "Melanjutkan", + "move": "Bergerak", + "none": "Tidak ada" }, "Settings-menu": { "title": "Pengaturan", @@ -114,7 +134,16 @@ "custom-background-image": "Gambar Latar Belakang Kustom", "format": "Format", "allowed-file-types": "Hanya file gambar (JPEG, PNG, GIF) yang diizinkan.", - "max-file-size": "Ukuran file maksimum yang diizinkan" + "max-file-size": "Ukuran file maksimum yang diizinkan", + "about": "Tentang", + "auto-select": "Pilih otomatis saat startup", + "data": "Data Aplikasi", + "export-to-file": "Ekspor ke file", + "import-from-file": "Impor dari file", + "legend": "NexusTimer adalah alat web sumber terbuka, minimalis, dan terbuka untuk SpeedCubing.", + "preferences": "Preferensi", + "report-bug": "Laporkan bug", + "suggest": "Sarankan perubahan" }, "backup-modal": { "title": "Pemulihan Cadangan Cerdas", @@ -124,6 +153,17 @@ "loading-part-1": "Tindakan ini membutuhkan waktu kurang dari satu menit.", "loading-part-2": "Harap tunggu, jangan tutup jendela ini.", "welcome": "Selamat Datang:" + }, + "Errors": { + "empty-input": "Silakan masukkan nilai", + "not-match": "Namanya tidak cocok.", + "repeated-name": "Koleksi nama itu sudah ada." + }, + "tooltips": { + "bookmark": "Penanda buku", + "copy": "Menyalin", + "delete": "Menghapus", + "plus-two": "2 Penalti" } }, "Metadata": { diff --git a/messages/it.json b/messages/it.json index fac841b8..4888f8f6 100644 --- a/messages/it.json +++ b/messages/it.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "Cronometro", "hint": "Suggerimento", "optimal-yellow-layer": "Strato Giallo Ottimale", "solving": "Risoluzione...", @@ -23,41 +22,57 @@ }, "SolvesPage": { "title": "Risoluzioni", - "search-by-time": "⏱︎ Cerca per tempo", - "finalize-session": "Concludi sessione", - "eliminate-session": "Elimina sessione", - "archive-sessions-legend": "Questa azione archivierà tutte le sessioni in corso della stessa categoria.", - "delete-session-legend": "Questa azione eliminerà solo le tue risoluzioni attuali con il cubo selezionato.", - "archive": "Archivia", - "unarchive": "Rimuovi dall'archivio", - "copy": "Copia", - "remove": "Rimuovi", - "enter-a-comment": "Inserisci un commento", "session": "Sessione", "all": "Tutto", - "no-cube-selection": "Nessun cubo selezionato, scegline uno...", - "no-solves": "Non ci sono risoluzioni da mostrare!", "time": "Tempo", - "sort-by": "Ordina per...", "descending": "Discendente", "date": "Data", - "ascending": "Ascendente" + "ascending": "Ascendente", + "alert": { + "empty-cubes": "Nessun cubo selezionato. \nPer favore scegline uno.", + "title": "Attenzione!" + }, + "dialogs": { + "move-to-history": "Spostare le soluzioni nella storia?", + "move-to-history-para": "Potrai accedervi toccando l'interruttore della cronologia." + }, + "empty-solves": "Niente qui ancora!", + "empty-solves-description": "Tocca l'interruttore nella parte superiore dello schermo per visualizzare la cronologia.", + "filter-by-time": "Filtra per ora", + "historial": "Storico", + "last": "Scorso", + "order": "Ordine", + "share": "Condividere", + "share-clipboard": { + "average": "Media", + "header": "Generato da NexusTimer", + "list-of-times": "Elenco degli orari" + }, + "sort": "Ordinare", + "toast": { + "success-copy": "Copiato con successo", + "success-copy-description": "È stato copiato negli appunti.", + "unable-action": "Azione impossibile", + "warning-select-cube": "Seleziona prima un cubo." + }, + "tooltips": { + "move-to-history": "Lo spostamento risolve la storia" + } }, "StatsPage": { "title": "Statistiche", - "total": "Totale", - "category": "Categoria", "global": "Globale", "sessions": "Sessioni", "best-time": "Miglior Tempo", "average": "Media", "time-spent": "Tempo Trascorso", "success-rate": "Tasso di Successo", - "counter": "Contatore" + "counter": "Contatore", + "advanced": "Avanzato", + "overall": "Complessivamente" }, "CubesPage": { "title": "Cubi", - "cube": "Cubo", "no-cubes-for-display": "Nessun cubo da visualizzare.", "favorite": "Preferito", "category": "Categoria", @@ -66,30 +81,35 @@ "status": "Stato", "using": "Utilizzando", "idle": "Inattivo", - "filter-cubes": "Filtra i tuoi cubi" + "find-your-cube": "Trova il tuo cubo", + "name": "Nome", + "new-collection": "Nuova collezione", + "options": "Opzioni" }, "Cubes-modal": { - "title-editing": "Modifica Cubo", - "title-creating": "Nuovo Cubo", - "error-name": "Nome cubo mancante", - "error-duplicate": "Nome cubo già in uso", - "current-select": "Selezione attuale:", - "question-delete": "Sei sicuro di voler eliminare?", - "warning-delete": "Questa azione irreversibile eliminerà tutto lo storico delle risoluzioni per questo cubo e potrebbe influenzare le tue statistiche.", - "placeholder": "Marca | Modello | Versione | Magnetico?" + "category": "Categoria", + "current-selection": "Selezione attuale:", + "danger-msg": "La modifica della categoria di raccolta modifica anche le soluzioni associate a tale categoria.", + "delete-collection": "Elimina raccolta", + "delete-collection-description": "Questa raccolta di cubi verrà eliminata, insieme a tutte le relative soluzioni, record e impostazioni.", + "edit-collection": "Modifica raccolta", + "input-collection-name": "Inserisci il nome della raccolta", + "name": "Nome", + "new-collection": "Nuova collezione", + "new-collection-description": "Le raccolte di cubi ti consentono di tenere traccia della cronologia di ciascun cubo senza influire sulle statistiche generali della categoria.", + "select-an-option": "Seleziona un'opzione", + "to-continue": "per continuare:", + "warning-alert": "Avvertimento:", + "warning-msg": "Questa azione non è reversibile." }, "Inputs": { "select": "Seleziona", - "add-cube": "Aggiungi cubo", "favorites": "Preferiti", - "list": "Lista", - "trash-all": "Elimina tutto", - "move-all": "Sposta tutto", "create": "Crea", - "confirm": "Conferma", "cancel": "Annulla", - "save": "Salva", - "delete": "Elimina" + "continue": "Continuare", + "move": "Mossa", + "none": "Nessuno" }, "Settings-menu": { "title": "Impostazioni", @@ -114,7 +134,16 @@ "custom-background-image": "Immagine di sfondo personalizzata", "format": "Formato", "allowed-file-types": "Sono consentiti solo file immagine (JPEG, PNG, GIF).", - "max-file-size": "Dimensione massima del file consentita" + "max-file-size": "Dimensione massima del file consentita", + "about": "Di", + "auto-select": "Selezione automatica all'avvio", + "data": "Dati dell'app", + "export-to-file": "Esporta su file", + "import-from-file": "Importa da file", + "legend": "NexusTimer è uno strumento web senza opinione, minimalista e open source per SpeedCubing.", + "preferences": "Preferenze", + "report-bug": "Segnala un bug", + "suggest": "Suggerisci un cambiamento" }, "backup-modal": { "title": "Ripristino Backup Intelligente", @@ -124,6 +153,17 @@ "loading-part-1": "Questa azione richiede meno di un minuto.", "loading-part-2": "Attendere prego, non chiudere questa finestra.", "welcome": "Benvenuto:" + }, + "Errors": { + "empty-input": "Inserisci un valore", + "not-match": "Il nome non corrisponde.", + "repeated-name": "Quella raccolta di nomi esiste già." + }, + "tooltips": { + "bookmark": "Segnalibro", + "copy": "Copia", + "delete": "Eliminare", + "plus-two": "2 Penalità" } }, "Metadata": { diff --git a/messages/ja.json b/messages/ja.json index 88675e9f..2b1021b6 100644 --- a/messages/ja.json +++ b/messages/ja.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "タイマー", "hint": "ヒント", "optimal-yellow-layer": "最適なイエローレイヤー", "solving": "解く中...", @@ -23,41 +22,57 @@ }, "SolvesPage": { "title": "解答", - "search-by-time": "⏱︎ 時間で検索", - "finalize-session": "セッションを終了", - "eliminate-session": "セッションを削除", - "archive-sessions-legend": "この操作は同じカテゴリのすべての進行中のセッションをアーカイブします。", - "delete-session-legend": "この操作は選択したキューブの現在の解答のみを削除します。", - "archive": "アーカイブ", - "unarchive": "アーカイブ解除", - "copy": "コピー", - "remove": "削除", - "enter-a-comment": "コメントを入力", "session": "セッション", "all": "すべて", - "no-cube-selection": "キューブが選択されていません。選択してください...", - "no-solves": "表示する解答はありません!", "time": "時間", - "sort-by": "並べ替え...", "descending": "降順", "date": "日付", - "ascending": "上昇" + "ascending": "上昇", + "alert": { + "empty-cubes": "キューブが選択されていません。 \n1 つお選びください。", + "title": "注意!" + }, + "dialogs": { + "move-to-history": "ソルブを履歴に移動しますか?", + "move-to-history-para": "履歴スイッチをタップすると、それらにアクセスできるようになります。" + }, + "empty-solves": "ここにはまだ何もありません!", + "empty-solves-description": "画面上部のスイッチをタップすると、履歴が表示されます。", + "filter-by-time": "時間でフィルタリングする", + "historial": "歴史的", + "last": "最後", + "order": "注文", + "share": "共有", + "share-clipboard": { + "average": "平均", + "header": "NexusTimer によって生成", + "list-of-times": "時間のリスト" + }, + "sort": "選別", + "toast": { + "success-copy": "正常にコピーされました", + "success-copy-description": "クリップボードにコピーされました。", + "unable-action": "アクションが実行できません", + "warning-select-cube": "事前にキューブを選択してください。" + }, + "tooltips": { + "move-to-history": "ソルブを履歴に移動する" + } }, "StatsPage": { "title": "統計", - "total": "合計", - "category": "カテゴリー", "global": "グローバル", "sessions": "セッション", "best-time": "最速タイム", "average": "平均", "time-spent": "経過時間", "success-rate": "成功率", - "counter": "カウンター" + "counter": "カウンター", + "advanced": "高度な", + "overall": "全体" }, "CubesPage": { "title": "キューブ", - "cube": "キューブ", "no-cubes-for-display": "表示するキューブがありません。", "favorite": "お気に入り", "category": "カテゴリー", @@ -66,30 +81,35 @@ "status": "ステータス", "using": "使用中", "idle": "アイドル", - "filter-cubes": "キューブをフィルタリング" + "find-your-cube": "自分のキューブを見つけてください", + "name": "名前", + "new-collection": "新しいコレクション", + "options": "オプション" }, "Cubes-modal": { - "title-editing": "キューブを編集", - "title-creating": "新しいキューブ", - "error-name": "キューブ名がありません", - "error-duplicate": "キューブ名はすでに使用されています", - "current-select": "現在の選択:", - "question-delete": "削除してもよろしいですか?", - "warning-delete": "この操作は元に戻せません。このキューブのすべての解答履歴が削除され、統計に影響を与える可能性があります。", - "placeholder": "ブランド | モデル | バージョン | 磁石?" + "category": "カテゴリ", + "current-selection": "現在の選択:", + "danger-msg": "コレクション カテゴリを変更すると、そのカテゴリに関連付けられたソルブも変更されます。", + "delete-collection": "コレクションの削除", + "delete-collection-description": "このキューブ コレクションは、そのすべてのソルブ、レコード、設定とともに削除されます。", + "edit-collection": "コレクションの編集", + "input-collection-name": "コレクション名を入力してください", + "name": "名前", + "new-collection": "新しいコレクション", + "new-collection-description": "キューブ コレクションを使用すると、カテゴリ全体の統計に影響を与えることなく、各キューブの履歴を追跡できます。", + "select-an-option": "オプションを選択してください", + "to-continue": "続けるには:", + "warning-alert": "警告:", + "warning-msg": "この操作は元に戻すことはできません。" }, "Inputs": { "select": "選択", - "add-cube": "キューブを追加", "favorites": "お気に入り", - "list": "リスト", - "trash-all": "すべて削除", - "move-all": "すべて移動", "create": "作成", - "confirm": "確認", "cancel": "キャンセル", - "save": "保存", - "delete": "削除" + "continue": "続く", + "move": "動く", + "none": "なし" }, "Settings-menu": { "title": "設定", @@ -114,7 +134,16 @@ "custom-background-image": "カスタム背景画像", "format": "フォーマット", "allowed-file-types": "画像ファイル(JPEG、PNG、GIF)のみが許可されています。", - "max-file-size": "許可される最大ファイルサイズ" + "max-file-size": "許可される最大ファイルサイズ", + "about": "について", + "auto-select": "起動時に自動選択", + "data": "アプリデータ", + "export-to-file": "ファイルにエクスポート", + "import-from-file": "ファイルからインポート", + "legend": "NexusTimer は、SpeedCubing 用の、偏見にとらわれないミニマリストのオープンソース Web ツールです。", + "preferences": "設定", + "report-bug": "バグを報告する", + "suggest": "変更を提案する" }, "backup-modal": { "title": "インテリジェントバックアップの復元", @@ -124,6 +153,17 @@ "loading-part-1": "この操作には1分未満かかります。", "loading-part-2": "お待ちください。このウィンドウを閉じないでください。", "welcome": "ようこそ:" + }, + "Errors": { + "empty-input": "値を入力してください", + "not-match": "名前が一致しません。", + "repeated-name": "その名前のコレクションはすでに存在します。" + }, + "tooltips": { + "bookmark": "ブックマーク", + "copy": "コピー", + "delete": "消去", + "plus-two": "2 ペナルティ" } }, "Metadata": { diff --git a/messages/ko.json b/messages/ko.json index 54988a58..912931e6 100644 --- a/messages/ko.json +++ b/messages/ko.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "타이머", "hint": "힌트", "optimal-yellow-layer": "최적의 옐로우 레이어", "solving": "풀이 중...", @@ -23,41 +22,57 @@ }, "SolvesPage": { "title": "해결", - "search-by-time": "⏱︎ 시간별 검색", - "finalize-session": "세션 완료", - "eliminate-session": "세션 제거", - "archive-sessions-legend": "이 작업은 동일한 카테고리의 모든 진행 중인 세션을 아카이브합니다.", - "delete-session-legend": "이 작업은 선택한 큐브의 현재 해결만 삭제합니다.", - "archive": "아카이브", - "unarchive": "아카이브 해제", - "copy": "복사", - "remove": "제거", - "enter-a-comment": "코멘트 입력", "session": "세션", "all": "모두", - "no-cube-selection": "큐브가 선택되지 않았습니다. 하나를 선택하세요...", - "no-solves": "표시할 해결이 없습니다!", - "sort-by": "정렬 기준...", "descending": "내림차순", "date": "날짜", "ascending": "오름차순", - "time": "시간" + "time": "시간", + "alert": { + "empty-cubes": "선택한 큐브가 없습니다. \n하나를 선택해 주세요.", + "title": "주목!" + }, + "dialogs": { + "move-to-history": "이동은 역사로 해결됩니까?", + "move-to-history-para": "기록 스위치를 탭하여 액세스할 수 있습니다." + }, + "empty-solves": "아직 아무것도 없습니다!", + "empty-solves-description": "기록을 보려면 화면 상단의 스위치를 탭하세요.", + "filter-by-time": "시간별로 필터링", + "historial": "역사", + "last": "마지막", + "order": "주문하다", + "share": "공유하다", + "share-clipboard": { + "average": "평균", + "header": "NexusTimer에 의해 생성됨", + "list-of-times": "시간 목록" + }, + "sort": "종류", + "toast": { + "success-copy": "성공적으로 복사되었습니다", + "success-copy-description": "클립보드에 복사되었습니다.", + "unable-action": "조치할 수 없음", + "warning-select-cube": "먼저 큐브를 선택하세요." + }, + "tooltips": { + "move-to-history": "이동은 기록으로 해결됩니다." + } }, "StatsPage": { "title": "통계", - "total": "총", - "category": "카테고리", "global": "전체", "sessions": "세션", "best-time": "최고 시간", "average": "평균", "time-spent": "소요 시간", "success-rate": "성공률", - "counter": "카운터" + "counter": "카운터", + "advanced": "고급의", + "overall": "전반적인" }, "CubesPage": { "title": "큐브", - "cube": "큐브", "no-cubes-for-display": "표시할 큐브가 없습니다.", "favorite": "즐겨찾기", "category": "카테고리", @@ -66,30 +81,35 @@ "status": "상태", "using": "사용 중", "idle": "유휴", - "filter-cubes": "큐브 필터링" + "find-your-cube": "당신의 큐브를 찾아보세요", + "name": "이름", + "new-collection": "새로운 컬렉션", + "options": "옵션" }, "Cubes-modal": { - "title-editing": "큐브 수정", - "title-creating": "새로운 큐브", - "error-name": "큐브 이름이 없습니다", - "error-duplicate": "이미 사용 중인 큐브 이름입니다", - "current-select": "현재 선택:", - "question-delete": "정말로 삭제하시겠습니까?", - "warning-delete": "이 작업은 되돌릴 수 없습니다. 이 큐브의 모든 해결 기록이 삭제되며 통계에 영향을 줄 수 있습니다.", - "placeholder": "브랜드 | 모델 | 버전 | 자석?" + "category": "범주", + "current-selection": "현재 선택:", + "danger-msg": "컬렉션 카테고리를 수정하면 해당 카테고리와 관련된 해결도 변경됩니다.", + "delete-collection": "컬렉션 삭제", + "delete-collection-description": "이 큐브 컬렉션은 모든 해결, 기록 및 설정과 함께 삭제됩니다.", + "edit-collection": "컬렉션 수정", + "input-collection-name": "컬렉션 이름을 입력하세요.", + "name": "이름", + "new-collection": "새로운 컬렉션", + "new-collection-description": "큐브 컬렉션을 사용하면 전체 카테고리 통계에 영향을 주지 않고 각 큐브의 기록을 추적할 수 있습니다.", + "select-an-option": "옵션을 선택하세요", + "to-continue": "계속하려면:", + "warning-alert": "경고:", + "warning-msg": "이 작업은 되돌릴 수 없습니다." }, "Inputs": { "select": "선택", - "add-cube": "큐브 추가", "favorites": "즐겨찾기", - "list": "목록", - "trash-all": "모두 삭제", - "move-all": "모두 이동", "create": "생성", - "confirm": "확인", "cancel": "취소", - "save": "저장", - "delete": "삭제" + "continue": "계속하다", + "move": "이동하다", + "none": "없음" }, "Settings-menu": { "title": "설정", @@ -114,7 +134,16 @@ "custom-background-image": "사용자 지정 배경 이미지", "format": "형식", "allowed-file-types": "이미지 파일(JPEG, PNG, GIF)만 허용됩니다.", - "max-file-size": "허용되는 최대 파일 크기" + "max-file-size": "허용되는 최대 파일 크기", + "about": "에 대한", + "auto-select": "시작 시 자동 선택", + "data": "앱 데이터", + "export-to-file": "파일로 내보내기", + "import-from-file": "파일에서 가져오기", + "legend": "NexusTimer는 SpeedCubing을 위한 독립적이고 미니멀한 오픈 소스 웹 도구입니다.", + "preferences": "환경설정", + "report-bug": "버그 신고", + "suggest": "변경 제안" }, "backup-modal": { "title": "지능형 백업 복원", @@ -124,6 +153,17 @@ "loading-part-1": "이 작업은 1분 미만이 소요됩니다.", "loading-part-2": "기다려주세요. 이 창을 닫지 마세요.", "welcome": "환영합니다:" + }, + "Errors": { + "empty-input": "값을 입력하세요.", + "not-match": "이름이 일치하지 않습니다.", + "repeated-name": "해당 이름 컬렉션이 이미 존재합니다." + }, + "tooltips": { + "bookmark": "서표", + "copy": "복사", + "delete": "삭제", + "plus-two": "2 페널티" } }, "Metadata": { diff --git a/messages/ms.json b/messages/ms.json index 5c3649f0..f7ff9602 100644 --- a/messages/ms.json +++ b/messages/ms.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "Pemasa", "hint": "Petua", "optimal-yellow-layer": "Lapisan Kuning Optimum", "solving": "Menyelesaikan...", @@ -23,41 +22,57 @@ }, "SolvesPage": { "title": "Penyelesaian", - "search-by-time": "⏱︎ Cari mengikut masa", - "finalize-session": "Selesai sesi", - "eliminate-session": "Hapus sesi", - "archive-sessions-legend": "Tindakan ini akan mengarkibkan semua sesi yang sedang berlangsung dari kategori yang sama.", - "delete-session-legend": "Tindakan ini hanya akan memadam penyelesaian semasa anda dengan kubus yang dipilih.", - "archive": "Arkib", - "unarchive": "Buka arkib", - "copy": "Salin", - "remove": "Alih keluar", - "enter-a-comment": "Masukkan komen", "session": "Sesi", "all": "Semua", - "no-cube-selection": "Tiada pemilihan kubus, pilih satu...", - "no-solves": "Tiada penyelesaian untuk dipaparkan!", "time": "Masa", - "sort-by": "Disusun mengikut...", "descending": "Menurun", "date": "Tarikh", - "ascending": "Menaik" + "ascending": "Menaik", + "alert": { + "empty-cubes": "Tiada kiub dipilih. \nSila pilih satu.", + "title": "Perhatian!" + }, + "dialogs": { + "move-to-history": "Pindahkan penyelesaian kepada sejarah?", + "move-to-history-para": "Anda akan dapat mengaksesnya dengan mengetik suis sejarah." + }, + "empty-solves": "Tiada apa-apa lagi di sini!", + "empty-solves-description": "Ketik suis di bahagian atas skrin untuk melihat sejarah anda.", + "filter-by-time": "Tapis mengikut masa", + "historial": "sejarah", + "last": "Terakhir", + "order": "Pesanan", + "share": "Kongsi", + "share-clipboard": { + "average": "Purata", + "header": "Dijana oleh NexusTimer", + "list-of-times": "Senarai masa" + }, + "sort": "Isih", + "toast": { + "success-copy": "Berjaya disalin", + "success-copy-description": "Telah disalin ke papan keratan anda.", + "unable-action": "Tindakan tidak boleh", + "warning-select-cube": "Sila pilih kiub sebelum." + }, + "tooltips": { + "move-to-history": "Bergerak menyelesaikan sejarah" + } }, "StatsPage": { "title": "Statistik", - "total": "Jumlah", - "category": "Kategori", "global": "Global", "sessions": "Sesi", "best-time": "Masa Terbaik", "average": "Purata", "time-spent": "Masa Dibelanjakan", "success-rate": "Kadar Kejayaan", - "counter": "Pengira" + "counter": "Pengira", + "advanced": "Maju", + "overall": "Keseluruhannya" }, "CubesPage": { "title": "Kubus", - "cube": "Kubus", "no-cubes-for-display": "Tiada kubus untuk paparan.", "favorite": "Kegemaran", "category": "Kategori", @@ -66,30 +81,35 @@ "status": "Status", "using": "Menggunakan", "idle": "Beberapa masa", - "filter-cubes": "Penapis kubus anda" + "find-your-cube": "Cari kiub anda", + "name": "Nama", + "new-collection": "Koleksi baru", + "options": "Pilihan" }, "Cubes-modal": { - "title-editing": "Edit Kubus", - "title-creating": "Kubus Baru", - "error-name": "Nama kubus tidak ada", - "error-duplicate": "Nama kubus sudah digunakan", - "current-select": "Pilihan semasa:", - "question-delete": "Adakah anda pasti ingin memadam?", - "warning-delete": "Tindakan tidak dapat dikembalikan ini akan memadam semua sejarah penyelesaian untuk kubus ini dan mungkin memberi kesan kepada statistik anda.", - "placeholder": "Jenama | Model | Versi | Magnetik?" + "category": "kategori", + "current-selection": "Pilihan semasa:", + "danger-msg": "Mengubah suai kategori koleksi juga mengubah penyelesaian yang dikaitkan dengan kategori itu.", + "delete-collection": "Padamkan koleksi", + "delete-collection-description": "Koleksi kiub ini akan dipadamkan, bersama-sama dengan semua penyelesaian, rekod dan tetapannya.", + "edit-collection": "Edit koleksi", + "input-collection-name": "Masukkan nama koleksi", + "name": "Nama", + "new-collection": "Koleksi baru", + "new-collection-description": "Koleksi kiub membolehkan anda menjejaki sejarah setiap kiub tanpa menjejaskan statistik kategori keseluruhan.", + "select-an-option": "Pilih satu pilihan", + "to-continue": "untuk meneruskan:", + "warning-alert": "Amaran:", + "warning-msg": "Tindakan ini tidak boleh diterbalikkan." }, "Inputs": { "select": "Pilih", - "add-cube": "Tambah kubus", "favorites": "Kegemaran", - "list": "Senarai", - "trash-all": "Buang Semua", - "move-all": "Pindahkan Semua", "create": "Cipta", - "confirm": "Sahkan", "cancel": "Batal", - "save": "Simpan", - "delete": "Padam" + "continue": "teruskan", + "move": "Bergerak", + "none": "tiada" }, "Settings-menu": { "title": "Tetapan", @@ -114,7 +134,16 @@ "custom-background-image": "Gambar Latar Belakang Kustom", "format": "Format", "allowed-file-types": "Hanya fail imej (JPEG, PNG, GIF) yang dibenarkan.", - "max-file-size": "Saiz fail maksimum yang dibenarkan" + "max-file-size": "Saiz fail maksimum yang dibenarkan", + "about": "Tentang", + "auto-select": "Autopilih pada permulaan", + "data": "Data Apl", + "export-to-file": "Eksport ke fail", + "import-from-file": "Import daripada fail", + "legend": "NexusTimer ialah alat web tanpa pendapat, minimalis dan sumber terbuka untuk SpeedCubing.", + "preferences": "Keutamaan", + "report-bug": "Laporkan pepijat", + "suggest": "Cadangkan perubahan" }, "backup-modal": { "title": "Pemulihan Pencadangan Pintar", @@ -124,6 +153,17 @@ "loading-part-1": "Tindakan ini mengambil masa kurang dari satu minit.", "loading-part-2": "Sila tunggu, jangan tutup tetingkap ini.", "welcome": "Selamat Datang:" + }, + "Errors": { + "empty-input": "Sila masukkan nilai", + "not-match": "Nama tidak sepadan.", + "repeated-name": "Koleksi nama itu sudah wujud." + }, + "tooltips": { + "bookmark": "Penanda buku", + "copy": "salin", + "delete": "Padam", + "plus-two": "2 Penalti" } }, "Metadata": { diff --git a/messages/nl.json b/messages/nl.json index 37f5b4e0..fbc743bf 100644 --- a/messages/nl.json +++ b/messages/nl.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "Timer", "hint": "Hint", "optimal-yellow-layer": "Optimale Gele Laag", "solving": "Oplossen...", @@ -23,41 +22,57 @@ }, "SolvesPage": { "title": "Oplossingen", - "search-by-time": "⏱︎ Zoek op tijd", - "finalize-session": "Sessie afronden", - "eliminate-session": "Sessie verwijderen", - "archive-sessions-legend": "Deze actie zal alle lopende sessies van dezelfde categorie archiveren.", - "delete-session-legend": "Deze actie verwijdert alleen uw huidige oplossingen met de geselecteerde kubus.", - "archive": "Archiveren", - "unarchive": "De-archiveren", - "copy": "Kopiëren", - "remove": "Verwijderen", - "enter-a-comment": "Voer een opmerking in", "session": "Sessie", "all": "Alle", - "no-cube-selection": "Geen kubus geselecteerd, kies er een...", - "no-solves": "Er zijn geen oplossingen om te tonen!", "time": "Tijd", - "sort-by": "Sorteer op...", "descending": "Aflopend", "date": "Datum", - "ascending": "Oplopend" + "ascending": "Oplopend", + "alert": { + "empty-cubes": "Geen kubus geselecteerd. \nKies er alstublieft één.", + "title": "Aandacht!" + }, + "dialogs": { + "move-to-history": "Verplaats oplossingen naar de geschiedenis?", + "move-to-history-para": "Je kunt ze openen door op de geschiedenisschakelaar te tikken." + }, + "empty-solves": "Hier nog niets!", + "empty-solves-description": "Tik op de schakelaar bovenaan het scherm om je geschiedenis te bekijken.", + "filter-by-time": "Filter op tijd", + "historial": "Historisch", + "last": "Laatst", + "order": "Volgorde", + "share": "Deel", + "share-clipboard": { + "average": "Gemiddeld", + "header": "Gegenereerd door NexusTimer", + "list-of-times": "Lijst met tijden" + }, + "sort": "Soort", + "toast": { + "success-copy": "Gekopieerd", + "success-copy-description": "Is naar uw klembord gekopieerd.", + "unable-action": "Kan geen actie ondernemen", + "warning-select-cube": "Selecteer eerst een kubus." + }, + "tooltips": { + "move-to-history": "Verplaats oplossingen voor de geschiedenis" + } }, "StatsPage": { "title": "Statistieken", - "total": "Totaal", - "category": "Categorie", "global": "Globaal", "sessions": "Sessies", "best-time": "Beste Tijd", "average": "Gemiddelde", "time-spent": "Tijd besteed", "success-rate": "Succespercentage", - "counter": "Teller" + "counter": "Teller", + "advanced": "Geavanceerd", + "overall": "Algemeen" }, "CubesPage": { "title": "Kubussen", - "cube": "Kubus", "no-cubes-for-display": "Geen kubussen om weer te geven.", "favorite": "Favoriet", "category": "Categorie", @@ -66,30 +81,35 @@ "status": "Status", "using": "Gebruikend", "idle": "Inactief", - "filter-cubes": "Filter uw kubussen" + "find-your-cube": "Vind je kubus", + "name": "Naam", + "new-collection": "Nieuwe collectie", + "options": "Opties" }, "Cubes-modal": { - "title-editing": "Kubus Bewerken", - "title-creating": "Nieuwe Kubus", - "error-name": "Kubusnaam ontbreekt", - "error-duplicate": "Kubusnaam is al in gebruik", - "current-select": "Huidige selectie:", - "question-delete": "Weet u zeker dat u wilt verwijderen?", - "warning-delete": "Deze onomkeerbare actie zal alle oplossingsgeschiedenis voor deze kubus verwijderen en kan invloed hebben op uw statistieken.", - "placeholder": "Merk | Model | Versie | Magnetisch?" + "category": "Categorie", + "current-selection": "Huidige selectie:", + "danger-msg": "Het wijzigen van de verzamelingscategorie verandert ook de oplossingen die aan die categorie zijn gekoppeld.", + "delete-collection": "Verzameling verwijderen", + "delete-collection-description": "Deze kubusverzameling wordt verwijderd, samen met alle oplossingen, records en instellingen ervan.", + "edit-collection": "Verzameling bewerken", + "input-collection-name": "Voer de collectienaam in", + "name": "Naam", + "new-collection": "Nieuwe collectie", + "new-collection-description": "Met kubuscollecties kunt u de geschiedenis van elke kubus bijhouden zonder de algemene categoriestatistieken te beïnvloeden.", + "select-an-option": "Selecteer een optie", + "to-continue": "doorgaan:", + "warning-alert": "Waarschuwing:", + "warning-msg": "Deze actie is niet omkeerbaar." }, "Inputs": { "select": "Selecteer", - "add-cube": "Kubus Toevoegen", "favorites": "Favorieten", - "list": "Lijst", - "trash-all": "Alles Verwijderen", - "move-all": "Alles Verplaatsen", "create": "Creëren", - "confirm": "Bevestigen", "cancel": "Annuleren", - "save": "Opslaan", - "delete": "Verwijderen" + "continue": "Doorgaan", + "move": "Beweging", + "none": "Geen" }, "Settings-menu": { "title": "Instellingen", @@ -114,7 +134,16 @@ "custom-background-image": "Aangepaste achtergrondafbeelding", "format": "Formaat", "allowed-file-types": "Alleen afbeeldingsbestanden (JPEG, PNG, GIF) zijn toegestaan.", - "max-file-size": "Maximale bestandsgrootte toegestaan" + "max-file-size": "Maximale bestandsgrootte toegestaan", + "about": "Over", + "auto-select": "Automatische selectie bij opstarten", + "data": "App-gegevens", + "export-to-file": "Exporteren naar bestand", + "import-from-file": "Importeren uit bestand", + "legend": "NexusTimer is een meningloze, minimalistische en open source webtool voor SpeedCubing.", + "preferences": "Voorkeuren", + "report-bug": "Rapporteer een bug", + "suggest": "Stel een wijziging voor" }, "backup-modal": { "title": "Intelligente Back-up Herstel", @@ -124,6 +153,17 @@ "loading-part-1": "Deze actie duurt minder dan een minuut.", "loading-part-2": "Even geduld aub, sluit dit venster niet.", "welcome": "Welkom:" + }, + "Errors": { + "empty-input": "Voer een waarde in", + "not-match": "De naam komt niet overeen.", + "repeated-name": "Die naamverzameling bestaat al." + }, + "tooltips": { + "bookmark": "Bladwijzer", + "copy": "Kopiëren", + "delete": "Verwijderen", + "plus-two": "2 Straf" } }, "Metadata": { diff --git a/messages/no.json b/messages/no.json index 8b7128e5..e5cba0ae 100644 --- a/messages/no.json +++ b/messages/no.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "Timer", "hint": "Hint", "optimal-yellow-layer": "Optimal Gul Lag", "solving": "Løser...", @@ -23,41 +22,57 @@ }, "SolvesPage": { "title": "Løsninger", - "search-by-time": "⏱︎ Søk etter tid", - "finalize-session": "Fullfør økt", - "eliminate-session": "Fjern økt", - "archive-sessions-legend": "Denne handlingen vil arkivere alle pågående økter fra samme kategori.", - "delete-session-legend": "Denne handlingen vil bare slette dine gjeldende løsninger med den valgte kuben.", - "archive": "Arkiv", - "unarchive": "Avarkiv", - "copy": "Kopiere", - "remove": "Fjerne", - "enter-a-comment": "Skriv en kommentar", "session": "Økt", "all": "Alle", - "no-cube-selection": "Ingen kube valgt, velg en...", - "no-solves": "Det er ingen løsninger å vise!", "time": "Tid", - "sort-by": "Sorter etter...", "descending": "Synkende", "date": "Dato", - "ascending": "Stigende" + "ascending": "Stigende", + "alert": { + "empty-cubes": "Ingen kube valgt. \nVennligst velg en.", + "title": "Oppmerksomhet!" + }, + "dialogs": { + "move-to-history": "Flytte løsninger til historien?", + "move-to-history-para": "Du vil få tilgang til dem ved å trykke på historiebryteren." + }, + "empty-solves": "Ingenting her ennå!", + "empty-solves-description": "Trykk på bryteren øverst på skjermen for å se loggen din.", + "filter-by-time": "Filtrer etter tid", + "historial": "Historisk", + "last": "Siste", + "order": "Bestille", + "share": "Dele", + "share-clipboard": { + "average": "Gjennomsnittlig", + "header": "Generert av NexusTimer", + "list-of-times": "Liste over tider" + }, + "sort": "Sortere", + "toast": { + "success-copy": "Kopiert vellykket", + "success-copy-description": "Har blitt kopiert til utklippstavlen din.", + "unable-action": "Kan ikke gjøres", + "warning-select-cube": "Vennligst velg en kube før." + }, + "tooltips": { + "move-to-history": "Flytt løser til historien" + } }, "StatsPage": { "title": "Statistikk", - "total": "Total", - "category": "Kategori", "global": "Global", "sessions": "Økter", "best-time": "Beste Tid", "average": "Gjennomsnitt", "time-spent": "Tid Brukt", "success-rate": "Suksessrate", - "counter": "Tellende" + "counter": "Tellende", + "advanced": "Avansert", + "overall": "Totalt sett" }, "CubesPage": { "title": "Kuber", - "cube": "Kube", "no-cubes-for-display": "Ingen kuber å vise.", "favorite": "Favoritt", "category": "Kategori", @@ -66,30 +81,35 @@ "status": "Status", "using": "Bruker", "idle": "Inaktiv", - "filter-cubes": "Filtrer kubene dine" + "find-your-cube": "Finn kuben din", + "name": "Navn", + "new-collection": "Ny kolleksjon", + "options": "Alternativer" }, "Cubes-modal": { - "title-editing": "Rediger Kube", - "title-creating": "Ny Kube", - "error-name": "Kubenavn mangler", - "error-duplicate": "Kubenavn allerede i bruk", - "current-select": "Gjeldende valg:", - "question-delete": "Er du sikker på at du vil slette?", - "warning-delete": "Denne ugjenkallelige handlingen vil slette all løsningshistorikk for denne kuben og kan påvirke statistikken din.", - "placeholder": "Merk | Modell | Versjon | Magnetisk?" + "category": "Kategori", + "current-selection": "Gjeldende utvalg:", + "danger-msg": "Ved å endre samlingskategorien endres også løsningene knyttet til den kategorien.", + "delete-collection": "Slett samling", + "delete-collection-description": "Denne kubesamlingen vil bli slettet, sammen med alle dens løsninger, poster og innstillinger.", + "edit-collection": "Rediger samling", + "input-collection-name": "Skriv inn samlingsnavnet", + "name": "Navn", + "new-collection": "Ny kolleksjon", + "new-collection-description": "Kubesamlinger lar deg holde styr på hver kubes historie uten å påvirke den generelle kategoristatistikken.", + "select-an-option": "Velg et alternativ", + "to-continue": "for å fortsette:", + "warning-alert": "Advarsel:", + "warning-msg": "Denne handlingen er ikke reversibel." }, "Inputs": { "select": "Velg", - "add-cube": "Legg til kube", "favorites": "Favoritter", - "list": "Liste", - "trash-all": "Kast Alt", - "move-all": "Flytt Alt", "create": "Opprett", - "confirm": "Bekreft", "cancel": "Avbryt", - "save": "Lagre", - "delete": "Slett" + "continue": "Fortsette", + "move": "Flytte", + "none": "Ingen" }, "Settings-menu": { "title": "Innstillinger", @@ -114,7 +134,16 @@ "custom-background-image": "Tilpasset bakgrunnsbilde", "format": "Format", "allowed-file-types": "Bare bildefiler (JPEG, PNG, GIF) er tillatt.", - "max-file-size": "Maksimal filstørrelse tillatt" + "max-file-size": "Maksimal filstørrelse tillatt", + "about": "Om", + "auto-select": "Automatisk valg ved oppstart", + "data": "Appdata", + "export-to-file": "Eksporter til fil", + "import-from-file": "Importer fra fil", + "legend": "NexusTimer er et meningsløst, minimalistisk og åpen kildekode-nettverktøy for SpeedCubing.", + "preferences": "Preferanser", + "report-bug": "Rapporter en feil", + "suggest": "Foreslå en endring" }, "backup-modal": { "title": "Intelligent Sikkerhetskopiering Gjenoppretting", @@ -124,6 +153,17 @@ "loading-part-1": "Denne handlingen tar mindre enn ett minutt.", "loading-part-2": "Vennligst vent, ikke lukk dette vinduet.", "welcome": "Velkommen:" + }, + "Errors": { + "empty-input": "Vennligst skriv inn en verdi", + "not-match": "Navnet stemmer ikke.", + "repeated-name": "Den navnesamlingen finnes allerede." + }, + "tooltips": { + "bookmark": "Bokmerke", + "copy": "Kopiere", + "delete": "Slett", + "plus-two": "2 Straffe" } }, "Metadata": { diff --git a/messages/pl.json b/messages/pl.json index 7a533554..bf748af9 100644 --- a/messages/pl.json +++ b/messages/pl.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "Stoper", "hint": "Wskazówka", "optimal-yellow-layer": "Optymalna Żółta Warstwa", "solving": "Rozwiązywanie...", @@ -23,41 +22,57 @@ }, "SolvesPage": { "title": "Rozwiązania", - "search-by-time": "⏱︎ Szukaj według czasu", - "finalize-session": "Zakończ sesję", - "eliminate-session": "Usuń sesję", - "archive-sessions-legend": "Ta czynność spowoduje zarchiwizowanie wszystkich trwających sesji z tej samej kategorii.", - "delete-session-legend": "Ta czynność usunie tylko Twoje aktualne rozwiązania z wybranej kostki.", - "archive": "Archiwum", - "unarchive": "Usuń z archiwum", - "copy": "Kopiuj", - "remove": "Usuń", - "enter-a-comment": "Wprowadź komentarz", "session": "Sesja", "all": "Wszystkie", - "no-cube-selection": "Nie wybrano kostki, wybierz jedną...", - "no-solves": "Brak rozwiązań do wyświetlenia!", "time": "Czas", "descending": "Malejąco", "date": "Data", "ascending": "Rosnąco", - "sort-by": "Sortuj według..." + "alert": { + "empty-cubes": "Nie wybrano kostki. \nProszę wybrać jeden.", + "title": "Uwaga!" + }, + "dialogs": { + "move-to-history": "Przenieść rozwiązania do historii?", + "move-to-history-para": "Będziesz mieć do nich dostęp, dotykając przełącznika historii." + }, + "empty-solves": "Jeszcze nic tu nie ma!", + "empty-solves-description": "Kliknij przełącznik u góry ekranu, aby zobaczyć swoją historię.", + "filter-by-time": "Filtruj według czasu", + "historial": "Historyczny", + "last": "Ostatni", + "order": "Zamówienie", + "share": "Udział", + "share-clipboard": { + "average": "Przeciętny", + "header": "Wygenerowane przez NexusTimer", + "list-of-times": "Lista razy" + }, + "sort": "Sortować", + "toast": { + "success-copy": "Skopiowano pomyślnie", + "success-copy-description": "Został skopiowany do Twojego schowka.", + "unable-action": "Nie można wykonać działania", + "warning-select-cube": "Proszę wybrać kostkę wcześniej." + }, + "tooltips": { + "move-to-history": "Przenieś rozwiązania do historii" + } }, "StatsPage": { "title": "Statystyki", - "total": "Całkowity", - "category": "Kategoria", "global": "Globalne", "sessions": "Sesje", "best-time": "Najlepszy Czas", "average": "Średni", "time-spent": "Spędzony czas", "success-rate": "Wskaźnik sukcesu", - "counter": "Licznik" + "counter": "Licznik", + "advanced": "Zaawansowany", + "overall": "Ogólnie" }, "CubesPage": { "title": "Kostki", - "cube": "Kostka", "no-cubes-for-display": "Brak kostek do wyświetlenia.", "favorite": "Ulubione", "category": "Kategoria", @@ -66,30 +81,35 @@ "status": "Status", "using": "Używając", "idle": "Bezczynny", - "filter-cubes": "Filtruj swoje kostki" + "find-your-cube": "Znajdź swoją kostkę", + "name": "Nazwa", + "new-collection": "Nowa kolekcja", + "options": "Opcje" }, "Cubes-modal": { - "title-editing": "Edytuj Kostkę", - "title-creating": "Nowa Kostka", - "error-name": "Brakuje nazwy kostki", - "error-duplicate": "Nazwa kostki jest już używana", - "current-select": "Aktualny wybór:", - "question-delete": "Czy na pewno chcesz usunąć?", - "warning-delete": "Ta nieodwracalna czynność spowoduje usunięcie całej historii rozwiązań dla tej kostki i może wpłynąć na Twoje statystyki.", - "placeholder": "Marka | Model | Wersja | Magnetyczna?" + "category": "Kategoria", + "current-selection": "Aktualny wybór:", + "danger-msg": "Modyfikowanie kategorii kolekcji powoduje również zmianę rozwiązań skojarzonych z tą kategorią.", + "delete-collection": "Usuń kolekcję", + "delete-collection-description": "Ta kolekcja kostek zostanie usunięta wraz ze wszystkimi jej rozwiązaniami, rekordami i ustawieniami.", + "edit-collection": "Edytuj kolekcję", + "input-collection-name": "Wpisz nazwę kolekcji", + "name": "Nazwa", + "new-collection": "Nowa kolekcja", + "new-collection-description": "Kolekcje kostek umożliwiają śledzenie historii każdej kostki bez wpływu na ogólne statystyki kategorii.", + "select-an-option": "Wybierz opcję", + "to-continue": "kontynuować:", + "warning-alert": "Ostrzeżenie:", + "warning-msg": "To działanie nie jest odwracalne." }, "Inputs": { "select": "Wybierz", - "add-cube": "Dodaj kostkę", "favorites": "Ulubione", - "list": "Lista", - "trash-all": "Wyrzuć wszystko", - "move-all": "Przenieś wszystko", "create": "Utwórz", - "confirm": "Potwierdź", "cancel": "Anuluj", - "save": "Zapisz", - "delete": "Usuń" + "continue": "Kontynuować", + "move": "Przenosić", + "none": "Nic" }, "Settings-menu": { "title": "Ustawienia", @@ -114,7 +134,16 @@ "custom-background-image": "Niestandardowy obraz tła", "format": "Format", "allowed-file-types": "Dozwolone są tylko pliki obrazów (JPEG, PNG, GIF).", - "max-file-size": "Maksymalny dozwolony rozmiar pliku" + "max-file-size": "Maksymalny dozwolony rozmiar pliku", + "about": "O", + "auto-select": "Automatyczny wybór przy uruchomieniu", + "data": "Dane aplikacji", + "export-to-file": "Eksportuj do pliku", + "import-from-file": "Importuj z pliku", + "legend": "NexusTimer to bezstronne, minimalistyczne narzędzie internetowe typu open source dla SpeedCubing.", + "preferences": "Preferencje", + "report-bug": "Zgłoś błąd", + "suggest": "Zaproponuj zmianę" }, "backup-modal": { "title": "Inteligentne Przywracanie Kopii Zapasowej", @@ -124,6 +153,17 @@ "loading-part-1": "Ta operacja zajmuje mniej niż minutę.", "loading-part-2": "Proszę czekać, nie zamykaj tego okna.", "welcome": "Witaj:" + }, + "Errors": { + "empty-input": "Proszę wprowadzić wartość", + "not-match": "Imię nie pasuje.", + "repeated-name": "Ta kolekcja nazw już istnieje." + }, + "tooltips": { + "bookmark": "Zakładka w książce", + "copy": "Kopia", + "delete": "Usuwać", + "plus-two": "2 Kara" } }, "Metadata": { diff --git a/messages/pt.json b/messages/pt.json index 0e8867d2..c6c4668c 100644 --- a/messages/pt.json +++ b/messages/pt.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "Cronômetro", "hint": "Dica", "optimal-yellow-layer": "Camada Amarela Ótima", "solving": "Resolvendo...", @@ -23,41 +22,57 @@ }, "SolvesPage": { "title": "Soluções", - "search-by-time": "⏱︎ Pesquisar por tempo", - "finalize-session": "Finalizar sessão", - "eliminate-session": "Eliminar sessão", - "archive-sessions-legend": "Esta ação arquivará todas as sessões em andamento da mesma categoria.", - "delete-session-legend": "Esta ação excluirá apenas suas soluções atuais com o cubo selecionado.", - "archive": "Arquivar", - "unarchive": "Desarquivar", - "copy": "Copiar", - "remove": "Remover", - "enter-a-comment": "Digite um comentário", "session": "Sessão", "all": "Todos", - "no-cube-selection": "Nenhum cubo selecionado, escolha um...", - "no-solves": "Não há soluções para mostrar!", "time": "Tempo", - "sort-by": "Ordenar por...", "descending": "descendente", "date": "Data", - "ascending": "Ascendente" + "ascending": "Ascendente", + "alert": { + "empty-cubes": "Nenhum cubo selecionado. \nPor favor escolha um.", + "title": "Atenção!" + }, + "dialogs": { + "move-to-history": "Mover resolve para a história?", + "move-to-history-para": "Você poderá acessá-los tocando no botão de histórico." + }, + "empty-solves": "Nada aqui ainda!", + "empty-solves-description": "Toque no botão na parte superior da tela para ver seu histórico.", + "filter-by-time": "Filtrar por tempo", + "historial": "Histórico", + "last": "Durar", + "order": "Ordem", + "share": "Compartilhar", + "share-clipboard": { + "average": "Média", + "header": "Gerado por NexusTimer", + "list-of-times": "Lista de horários" + }, + "sort": "Organizar", + "toast": { + "success-copy": "Copiado com sucesso", + "success-copy-description": "Foi copiado para sua área de transferência.", + "unable-action": "Ação impossível", + "warning-select-cube": "Selecione um cubo antes." + }, + "tooltips": { + "move-to-history": "Mover resolve para a história" + } }, "StatsPage": { "title": "Estatísticas", - "total": "Total", - "category": "Categoria", "global": "Global", "sessions": "Sessões", "best-time": "Melhor Tempo", "average": "Média", "time-spent": "Tempo Gasto", "success-rate": "Taxa de Sucesso", - "counter": "Contador" + "counter": "Contador", + "advanced": "Avançado", + "overall": "Geral" }, "CubesPage": { "title": "Cubos", - "cube": "Cubo", "no-cubes-for-display": "Sem cubos para exibir.", "favorite": "Favorito", "category": "Categoria", @@ -66,30 +81,35 @@ "status": "Status", "using": "Usando", "idle": "Inativo", - "filter-cubes": "Filtrar seus cubos" + "find-your-cube": "Encontre o seu cubo", + "name": "Nome", + "new-collection": "Nova coleção", + "options": "Opções" }, "Cubes-modal": { - "title-editing": "Editar Cubo", - "title-creating": "Novo Cubo", - "error-name": "Falta o nome do cubo", - "error-duplicate": "Nome do cubo já em uso", - "current-select": "Seleção atual:", - "question-delete": "Tem certeza de que deseja excluir?", - "warning-delete": "Esta ação irreversível excluirá todo o histórico de soluções para este cubo e pode afetar suas estatísticas.", - "placeholder": "Marca | Modelo | Versão | Magnético?" + "category": "Categoria", + "current-selection": "Seleção atual:", + "danger-msg": "Modificar a categoria da coleção também altera as soluções associadas a essa categoria.", + "delete-collection": "Excluir coleção", + "delete-collection-description": "Esta coleção de cubos será excluída, juntamente com todas as suas soluções, registros e configurações.", + "edit-collection": "Editar coleção", + "input-collection-name": "Digite o nome da coleção", + "name": "Nome", + "new-collection": "Nova coleção", + "new-collection-description": "As coleções de cubos permitem que você acompanhe o histórico de cada cubo sem afetar as estatísticas gerais da categoria.", + "select-an-option": "Selecione uma opção", + "to-continue": "para continuar:", + "warning-alert": "Aviso:", + "warning-msg": "Esta ação não é reversível." }, "Inputs": { "select": "Selecionar", - "add-cube": "Adicionar cubo", "favorites": "Favoritos", - "list": "Lista", - "trash-all": "Excluir todos", - "move-all": "Mover todos", "create": "Criar", - "confirm": "Confirmar", "cancel": "Cancelar", - "save": "Salvar", - "delete": "Excluir" + "continue": "Continuar", + "move": "Mover", + "none": "Nenhum" }, "Settings-menu": { "title": "Configurações", @@ -114,7 +134,16 @@ "custom-background-image": "Imagem de fundo personalizada", "format": "Formato", "allowed-file-types": "Somente arquivos de imagem (JPEG, PNG, GIF) são permitidos.", - "max-file-size": "Tamanho máximo de arquivo permitido" + "max-file-size": "Tamanho máximo de arquivo permitido", + "about": "Sobre", + "auto-select": "Seleção automática na inicialização", + "data": "Dados do aplicativo", + "export-to-file": "Exportar para arquivo", + "import-from-file": "Importar do arquivo", + "legend": "NexusTimer é uma ferramenta web sem opinião, minimalista e de código aberto para SpeedCubing.", + "preferences": "Preferências", + "report-bug": "Reportar um bug", + "suggest": "Sugira uma mudança" }, "backup-modal": { "title": "Restauração Inteligente de Backup", @@ -124,6 +153,17 @@ "loading-part-1": "Esta ação leva menos de um minuto.", "loading-part-2": "Por favor, aguarde, não feche esta janela.", "welcome": "Bem-vindo:" + }, + "Errors": { + "empty-input": "Por favor insira um valor", + "not-match": "O nome não corresponde.", + "repeated-name": "Essa coleção de nomes já existe." + }, + "tooltips": { + "bookmark": "Marcador", + "copy": "Cópia", + "delete": "Excluir", + "plus-two": "2 Penalidade" } }, "Metadata": { diff --git a/messages/ro.json b/messages/ro.json index b982af8e..b3c0e6ea 100644 --- a/messages/ro.json +++ b/messages/ro.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "Cronometru", "hint": "Sugestie", "optimal-yellow-layer": "Stratul Galben Optim", "solving": "Rezolvare...", @@ -23,41 +22,57 @@ }, "SolvesPage": { "title": "Soluții", - "search-by-time": "⏱️ Căutați după timp", - "finalize-session": "Finalizați sesiunea", - "eliminate-session": "Eliminați sesiunea", - "archive-sessions-legend": "Această acțiune va arhiva toate sesiunile în curs din aceeași categorie.", - "delete-session-legend": "Această acțiune va șterge doar soluțiile curente cu cubul selectat.", - "archive": "Arhivă", - "unarchive": "Dezarhivare", - "copy": "Copiere", - "remove": "Eliminare", - "enter-a-comment": "Introduceți un comentariu", "session": "Sesiune", "all": "Toate", - "no-cube-selection": "Niciun cub selectat, alegeți unul...", - "no-solves": "Nu sunt soluții de afișat!", "time": "Timp", - "sort-by": "Filtrează după...", "descending": "Descendentă", "date": "Data", - "ascending": "Ascendent" + "ascending": "Ascendent", + "alert": { + "empty-cubes": "Niciun cub selectat. \nVă rugăm să alegeți unul.", + "title": "Atenţie!" + }, + "dialogs": { + "move-to-history": "Mutați soluțiile în istorie?", + "move-to-history-para": "Le veți putea accesa atingând comutatorul istoric." + }, + "empty-solves": "Nimic aici încă!", + "empty-solves-description": "Atingeți comutatorul din partea de sus a ecranului pentru a vedea istoricul dvs.", + "filter-by-time": "Filtrați după timp", + "historial": "istoric", + "last": "Dura", + "order": "Comanda", + "share": "Distribuie", + "share-clipboard": { + "average": "Medie", + "header": "Generat de NexusTimer", + "list-of-times": "Lista de timpuri" + }, + "sort": "Sorta", + "toast": { + "success-copy": "Copiat cu succes", + "success-copy-description": "A fost copiat în clipboard.", + "unable-action": "Acțiune imposibilă", + "warning-select-cube": "Vă rugăm să selectați un cub înainte." + }, + "tooltips": { + "move-to-history": "Mutați rezolvările în istorie" + } }, "StatsPage": { "title": "Statistici", - "total": "Total", - "category": "Categorie", "global": "Global", "sessions": "Sesiuni", "best-time": "Cel mai bun timp", "average": "Medie", "time-spent": "Timp petrecut", "success-rate": "Rată de succes", - "counter": "Contor" + "counter": "Contor", + "advanced": "Avansat", + "overall": "În general" }, "CubesPage": { "title": "Cuburi", - "cube": "Cub", "no-cubes-for-display": "Nu există cuburi de afișat.", "favorite": "Favorit", "category": "Categorie", @@ -66,30 +81,35 @@ "status": "Stare", "using": "Utilizând", "idle": "Inactiv", - "filter-cubes": "Filtrare cuburi" + "find-your-cube": "Găsește-ți cubul", + "name": "Nume", + "new-collection": "Noua colectie", + "options": "Opțiuni" }, "Cubes-modal": { - "title-editing": "Editare Cub", - "title-creating": "Cub Nou", - "error-name": "Lipsește numele cubului", - "error-duplicate": "Numele cubului este deja utilizat", - "current-select": "Selectare curentă:", - "question-delete": "Sigur doriți să ștergeți?", - "warning-delete": "Această acțiune ireversibilă va șterge întreaga istorie de soluții pentru acest cub și ar putea afecta statisticile dvs.", - "placeholder": "Marcă | Model | Versiune | Magnet?" + "category": "Categorie", + "current-selection": "Selecția curentă:", + "danger-msg": "Modificarea categoriei de colecție modifică și rezolvările asociate acelei categorii.", + "delete-collection": "Ștergeți colecția", + "delete-collection-description": "Această colecție de cuburi va fi ștearsă, împreună cu toate rezolvările, înregistrările și setările sale.", + "edit-collection": "Editați colecția", + "input-collection-name": "Introduceți numele colecției", + "name": "Nume", + "new-collection": "Noua colectie", + "new-collection-description": "Colecțiile de cub vă permit să urmăriți istoricul fiecărui cub fără a afecta statisticile generale ale categoriei.", + "select-an-option": "Selectați o opțiune", + "to-continue": "a continua:", + "warning-alert": "Avertizare:", + "warning-msg": "Această acțiune nu este reversibilă." }, "Inputs": { "select": "Selectați", - "add-cube": "Adăugați cub", "favorites": "Favorite", - "list": "Listă", - "trash-all": "Aruncă tot", - "move-all": "Mută tot", "create": "Creează", - "confirm": "Confirmare", "cancel": "Anulare", - "save": "Salvare", - "delete": "Ștergere" + "continue": "Continua", + "move": "Mişcare", + "none": "Nici unul" }, "Settings-menu": { "title": "Setări", @@ -114,7 +134,16 @@ "custom-background-image": "Imagine de fundal personalizată", "format": "Format", "allowed-file-types": "Sunt permise doar fișiere de imagine (JPEG, PNG, GIF).", - "max-file-size": "Dimensiunea maximă a fișierului permisă" + "max-file-size": "Dimensiunea maximă a fișierului permisă", + "about": "Despre", + "auto-select": "Selectare automată la pornire", + "data": "Date aplicației", + "export-to-file": "Exportați în fișier", + "import-from-file": "Import din fișier", + "legend": "NexusTimer este un instrument web fără păreri, minimalist și open source pentru SpeedCubing.", + "preferences": "Preferințe", + "report-bug": "Raportați o eroare", + "suggest": "Sugerați o schimbare" }, "backup-modal": { "title": "Restaurare Inteligentă a Backup-ului", @@ -124,6 +153,17 @@ "loading-part-1": "Această acțiune durează mai puțin de un minut.", "loading-part-2": "Vă rugăm să așteptați, nu închideți această fereastră.", "welcome": "Bun venit:" + }, + "Errors": { + "empty-input": "Vă rugăm să introduceți o valoare", + "not-match": "Numele nu se potrivește.", + "repeated-name": "Această colecție de nume există deja." + }, + "tooltips": { + "bookmark": "Marcaj", + "copy": "Copie", + "delete": "Şterge", + "plus-two": "2 pedeapsa" } }, "Metadata": { diff --git a/messages/ru.json b/messages/ru.json index 6a2aed78..e935a2c0 100644 --- a/messages/ru.json +++ b/messages/ru.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "Таймер", "hint": "Подсказка", "optimal-yellow-layer": "Оптимальный желтый слой", "solving": "Решение...", @@ -23,46 +22,57 @@ }, "SolvesPage": { "title": "Решения", - "search-by-time": "⏱️ Поиск по времени", - "finalize-session": "Завершить сессию", - "eliminate-session": "Удалить сессию", - "archive-sessions-legend": "Это действие архивирует все текущие сессии из той же категории.", - "delete-session-legend": "Это действие удалит только ваши текущие решения с выбранным кубом.", - "archive": "Архивировать", - "unarchive": "Разархивировать", - "copy": "Копировать", - "remove": "Удалить", - "enter-a-comment": "Введите комментарий", "session": "Сессия", "all": "Все", - "no-cube-selection": "Куб не выбран, выберите один...", - "no-solves": "Нет решений для отображения!", "ascending": "Восходящий", "date": "Дата", "descending": "По убыванию", - "sort-by": "Сортировать по...", "time": "Время", "share": "Поделиться...", - "share-stats-title": "Сгенерировано с помощью NexusTimer", - "average": "Среднее из", - "list-of-times": "Список времен", - "last": "Последнее" + "last": "Последнее", + "alert": { + "empty-cubes": "Куб не выбран. \nПожалуйста, выберите один.", + "title": "Внимание!" + }, + "dialogs": { + "move-to-history": "Переместить решения в историю?", + "move-to-history-para": "Вы сможете получить к ним доступ, нажав переключатель истории." + }, + "empty-solves": "Здесь пока ничего!", + "empty-solves-description": "Нажмите переключатель в верхней части экрана, чтобы просмотреть свою историю.", + "filter-by-time": "Фильтровать по времени", + "historial": "исторический", + "order": "Заказ", + "share-clipboard": { + "average": "Средний", + "header": "Создано NexusTimer", + "list-of-times": "Список раз" + }, + "sort": "Сортировать", + "toast": { + "success-copy": "Скопировано успешно", + "success-copy-description": "Скопировано в буфер обмена.", + "unable-action": "Невозможно выполнить действие", + "warning-select-cube": "Пожалуйста, выберите куб раньше." + }, + "tooltips": { + "move-to-history": "Переместить решения в историю" + } }, "StatsPage": { "title": "Статистика", - "total": "Всего", - "category": "Категория", "global": "Глобально", "sessions": "Сессии", "best-time": "Лучшее время", "average": "Средний", "time-spent": "Проведенное время", "success-rate": "Успешность", - "counter": "Счетчик" + "counter": "Счетчик", + "advanced": "Передовой", + "overall": "Общий" }, "CubesPage": { "title": "Кубики", - "cube": "Кубик", "no-cubes-for-display": "Нет кубиков для отображения.", "favorite": "Избранный", "category": "Категория", @@ -71,31 +81,35 @@ "status": "Статус", "using": "Используется", "idle": "Неактивный", - "filter-cubes": "Фильтровать кубики" + "find-your-cube": "Найди свой куб", + "name": "Имя", + "new-collection": "Новая коллекция", + "options": "Параметры" }, "Cubes-modal": { - "title-editing": "Редактирование Кубика", - "title-creating": "Новый Кубик", - "error-name": "Отсутствует название кубика", - "error-duplicate": "Название кубика уже используется", - "current-select": "Текущий выбор:", - "question-delete": "Вы уверены, что хотите удалить?", - "warning-delete": "Это необратимое действие удалит всю историю решений для этого кубика и может повлиять на ваши статистические данные.", - "placeholder": "Марка | Модель | Версия | Магниты?" + "category": "Категория", + "current-selection": "Текущий выбор:", + "danger-msg": "Изменение категории коллекции также изменяет решения, связанные с этой категорией.", + "delete-collection": "Удалить коллекцию", + "delete-collection-description": "Эта коллекция кубов будет удалена вместе со всеми ее решениями, записями и настройками.", + "edit-collection": "Изменить коллекцию", + "input-collection-name": "Введите название коллекции", + "name": "Имя", + "new-collection": "Новая коллекция", + "new-collection-description": "Коллекции кубов позволяют отслеживать историю каждого куба, не затрагивая общую статистику по категориям.", + "select-an-option": "Выберите вариант", + "to-continue": "продолжить:", + "warning-alert": "Предупреждение:", + "warning-msg": "Это действие необратимо." }, "Inputs": { "select": "Выбрать", - "add-cube": "Добавить кубик", "favorites": "Избранное", - "list": "Список", - "trash-all": "Удалить все", - "move-all": "Переместить все", "create": "Создать", - "confirm": "Подтвердить", "cancel": "Отмена", - "save": "Сохранить", - "delete": "Удалить", - "none": "Нет" + "none": "Нет", + "continue": "Продолжать", + "move": "Двигаться" }, "Settings-menu": { "title": "Настройки", @@ -119,7 +133,6 @@ "theme": "Тема", "data": "Данные приложения", "preferences": "Предпочтения", - "default-cube": "Кубик по умолчанию", "import-from-file": "Импорт из файла", "export-to-file": "Экспорт в файл", "custom-background-image": "Пользовательское фоновое изображение", @@ -129,7 +142,8 @@ "max-file-size": "Максимальный размер файла", "suggest": "Предложить изменение", "legend": "NexusTimer — это нейтральный, минималистичный и открытый веб-инструмент для SpeedCubing.", - "report-bug": "Сообщить об ошибке" + "report-bug": "Сообщить об ошибке", + "auto-select": "Автоматический выбор при запуске" }, "backup-modal": { "title": "Интеллектуальное Восстановление Резервной Копии", @@ -139,6 +153,17 @@ "loading-part-1": "Это действие займет менее минуты.", "loading-part-2": "Пожалуйста, подождите, не закрывайте это окно.", "welcome": "Добро пожаловать:" + }, + "Errors": { + "empty-input": "Пожалуйста, введите значение", + "not-match": "Имя не соответствует.", + "repeated-name": "Эта коллекция имен уже существует." + }, + "tooltips": { + "bookmark": "Закладка", + "copy": "Копировать", + "delete": "Удалить", + "plus-two": "2 пенальти" } }, "Metadata": { diff --git a/messages/sk.json b/messages/sk.json index eb69c411..5dc1b416 100644 --- a/messages/sk.json +++ b/messages/sk.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "Časovač", "hint": "Nápoveda", "optimal-yellow-layer": "Optimálna žltá vrstva", "solving": "Riešenie...", @@ -23,41 +22,57 @@ }, "SolvesPage": { "title": "Riešenia", - "search-by-time": "⏱️ Hľadať podľa času", - "finalize-session": "Dokončiť reláciu", - "eliminate-session": "Odstrániť reláciu", - "archive-sessions-legend": "Táto akcia archivuje všetky aktuálne relácie z rovnakej kategórie.", - "delete-session-legend": "Táto akcia vymaže iba vaše aktuálne riešenia s vybranou kockou.", - "archive": "Archív", - "unarchive": "Obnoviť archív", - "copy": "Kopírovať", - "remove": "Odstrániť", - "enter-a-comment": "Vložiť komentár", "session": "Relácia", "all": "Všetky", - "no-cube-selection": "Nevybrali ste kocku, vyberte jednu...", - "no-solves": "Nie sú žiadne riešenia na zobrazenie!", "ascending": "Vzostupne", "date": "Dátum", "descending": "Zostupne", - "sort-by": "Triediť podľa...", - "time": "Čas" + "time": "Čas", + "alert": { + "empty-cubes": "Nie je vybratá žiadna kocka. \nVyberte si jednu.", + "title": "Pozor!" + }, + "dialogs": { + "move-to-history": "Presun rieši históriu?", + "move-to-history-para": "Budete k nim mať prístup klepnutím na prepínač histórie." + }, + "empty-solves": "Zatiaľ tu nič nie je!", + "empty-solves-description": "Klepnutím na prepínač v hornej časti obrazovky zobrazíte svoju históriu.", + "filter-by-time": "Filtrujte podľa času", + "historial": "Historický", + "last": "Posledný", + "order": "Objednať", + "share": "zdieľať", + "share-clipboard": { + "average": "Priemerná", + "header": "Generuje NexusTimer", + "list-of-times": "Zoznam časov" + }, + "sort": "Triediť", + "toast": { + "success-copy": "Úspešne skopírované", + "success-copy-description": "Bol skopírovaný do vašej schránky.", + "unable-action": "Nemožná akcia", + "warning-select-cube": "Vyberte kocku predtým." + }, + "tooltips": { + "move-to-history": "Move rieši históriu" + } }, "StatsPage": { "title": "Štatistiky", - "total": "Celkom", - "category": "Kategória", "global": "Celosvetové", "sessions": "Relácie", "best-time": "Najlepší čas", "average": "Priemer", "time-spent": "Strávený čas", "success-rate": "Úspešnosť", - "counter": "Počítadlo" + "counter": "Počítadlo", + "advanced": "Pokročilé", + "overall": "Celkovo" }, "CubesPage": { "title": "Kocky", - "cube": "Kocka", "no-cubes-for-display": "Žiadne kocky na zobrazenie.", "favorite": "Obľúbené", "category": "Kategória", @@ -66,30 +81,35 @@ "status": "Stav", "using": "Používanie", "idle": "Neaktívne", - "filter-cubes": "Filtrovať kocky" + "find-your-cube": "Nájdite svoju kocku", + "name": "Meno", + "new-collection": "Nová kolekcia", + "options": "Možnosti" }, "Cubes-modal": { - "title-editing": "Upraviť kocku", - "title-creating": "Nová kocka", - "error-name": "Chýba názov kocky", - "error-duplicate": "Názov kocky už je použitý", - "current-select": "Aktuálny výber:", - "question-delete": "Naozaj chcete odstrániť?", - "warning-delete": "Táto nezvratná akcia vymaže celú históriu riešenia pre túto kocku a môže ovplyvniť vaše štatistiky.", - "placeholder": "Značka | Model | Verzia | Magnety?" + "category": "Kategória", + "current-selection": "Aktuálny výber:", + "danger-msg": "Úpravou kategórie kolekcie sa menia aj riešenia súvisiace s touto kategóriou.", + "delete-collection": "Odstrániť zbierku", + "delete-collection-description": "Táto zbierka kociek bude vymazaná spolu so všetkými jej riešeniami, záznamami a nastaveniami.", + "edit-collection": "Upraviť kolekciu", + "input-collection-name": "Zadajte názov kolekcie", + "name": "Meno", + "new-collection": "Nová kolekcia", + "new-collection-description": "Kolekcie kociek vám umožňujú sledovať históriu každej kocky bez ovplyvnenia celkovej štatistiky kategórií.", + "select-an-option": "Vyberte možnosť", + "to-continue": "pokračovať:", + "warning-alert": "POZOR:", + "warning-msg": "Táto akcia nie je reverzibilná." }, "Inputs": { "select": "Vybrať", - "add-cube": "Pridať kocku", "favorites": "Obľúbené", - "list": "Zoznam", - "trash-all": "Zahodiť všetko", - "move-all": "Presunúť všetko", "create": "Vytvoriť", - "confirm": "Potvrdiť", "cancel": "Zrušiť", - "save": "Uložiť", - "delete": "Odstrániť" + "continue": "Pokračovať", + "move": "Pohybujte sa", + "none": "žiadne" }, "Settings-menu": { "title": "Nastavenia", @@ -114,7 +134,16 @@ "custom-background-image": "Vlastný obrázok pozadia", "format": "Formát", "allowed-file-types": "Povolené sú iba obrazové súbory (JPEG, PNG, GIF).", - "max-file-size": "Maximálna veľkosť súboru" + "max-file-size": "Maximálna veľkosť súboru", + "about": "O", + "auto-select": "Automatický výber pri spustení", + "data": "Údaje aplikácie", + "export-to-file": "Exportovať do súboru", + "import-from-file": "Importovať zo súboru", + "legend": "NexusTimer je minimalistický webový nástroj s otvoreným zdrojom pre SpeedCubing bez názoru.", + "preferences": "Predvoľby", + "report-bug": "Nahlásiť chybu", + "suggest": "Navrhnite zmenu" }, "backup-modal": { "title": "Inteligentná Obnova Zálohy", @@ -124,6 +153,17 @@ "loading-part-1": "Toto akcia trvá menej ako minútu.", "loading-part-2": "Prosím, čakajte, nezatvárajte toto okno.", "welcome": "Vitajte:" + }, + "Errors": { + "empty-input": "Zadajte hodnotu", + "not-match": "Názov sa nezhoduje.", + "repeated-name": "Táto zbierka mien už existuje." + }, + "tooltips": { + "bookmark": "Záložka", + "copy": "Kopírovať", + "delete": "Odstrániť", + "plus-two": "2 Pokuta" } }, "Metadata": { diff --git a/messages/sv.json b/messages/sv.json index 7bc875bc..d3776dc2 100644 --- a/messages/sv.json +++ b/messages/sv.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "Timer", "hint": "Tips", "optimal-yellow-layer": "Optimalt gult lager", "solving": "Löser...", @@ -23,41 +22,57 @@ }, "SolvesPage": { "title": "Lösningar", - "search-by-time": "⏱️ Sök efter tid", - "finalize-session": "Avsluta session", - "eliminate-session": "Eliminera session", - "archive-sessions-legend": "Denna åtgärd kommer att arkivera alla pågående sessioner från samma kategori.", - "delete-session-legend": "Denna åtgärd kommer endast att radera dina nuvarande lösningar med den valda kuben.", - "archive": "Arkiv", - "unarchive": "Avarkivera", - "copy": "Kopiera", - "remove": "Ta bort", - "enter-a-comment": "Ange en kommentar", "session": "Session", "all": "Alla", - "no-cube-selection": "Ingen kub vald, välj en...", - "no-solves": "Det finns inga lösningar att visa!", "descending": "Nedåtgående", "date": "Datum", "ascending": "Stigande", - "sort-by": "Sortera efter...", - "time": "Tid" + "time": "Tid", + "alert": { + "empty-cubes": "Ingen kub har valts. \nVänligen välj en.", + "title": "Uppmärksamhet!" + }, + "dialogs": { + "move-to-history": "Flytta lösningar till historien?", + "move-to-history-para": "Du kommer att kunna komma åt dem genom att trycka på historikomkopplaren." + }, + "empty-solves": "Inget här ännu!", + "empty-solves-description": "Tryck på reglaget längst upp på skärmen för att se din historik.", + "filter-by-time": "Filtrera efter tid", + "historial": "Historiskt", + "last": "Sista", + "order": "Beställa", + "share": "Dela", + "share-clipboard": { + "average": "Genomsnitt", + "header": "Genererad av NexusTimer", + "list-of-times": "Lista över tider" + }, + "sort": "Sortera", + "toast": { + "success-copy": "Kopierades framgångsrikt", + "success-copy-description": "Har kopierats till ditt urklipp.", + "unable-action": "Det går inte att åtgärda", + "warning-select-cube": "Välj en kub innan." + }, + "tooltips": { + "move-to-history": "Flytta löser till historien" + } }, "StatsPage": { "title": "Statistik", - "total": "Totalt", - "category": "Kategori", "global": "Global", "sessions": "Sessioner", "best-time": "Bästa tid", "average": "Genomsnitt", "time-spent": "Tid spenderad", "success-rate": "Framgångsgrad", - "counter": "Räknare" + "counter": "Räknare", + "advanced": "Avancerad", + "overall": "Total" }, "CubesPage": { "title": "Kuber", - "cube": "Kub", "no-cubes-for-display": "Inga kuber att visa.", "favorite": "Favorit", "category": "Kategori", @@ -66,30 +81,35 @@ "status": "Status", "using": "Använder", "idle": "Inaktiv", - "filter-cubes": "Filtrera dina kuber" + "find-your-cube": "Hitta din kub", + "name": "Namn", + "new-collection": "Ny kollektion", + "options": "Alternativ" }, "Cubes-modal": { - "title-editing": "Redigera kub", - "title-creating": "Ny kub", - "error-name": "Kubnamn saknas", - "error-duplicate": "Kubnamnet används redan", - "current-select": "Nuvarande val:", - "question-delete": "Är du säker på att du vill radera?", - "warning-delete": "Denna åtgärd är inte återvinningsbar och kommer att radera all löshistorik för denna kub och kan påverka dina statistik.", - "placeholder": "Märke | Modell | Version | Magnetisk?" + "category": "Kategori", + "current-selection": "Nuvarande urval:", + "danger-msg": "Genom att ändra insamlingskategorin ändras också lösningarna som är kopplade till den kategorin.", + "delete-collection": "Ta bort samling", + "delete-collection-description": "Denna kubsamling kommer att raderas, tillsammans med alla dess lösningar, poster och inställningar.", + "edit-collection": "Redigera samling", + "input-collection-name": "Ange samlingens namn", + "name": "Namn", + "new-collection": "Ny kollektion", + "new-collection-description": "Kubsamlingar låter dig hålla reda på varje kubs historia utan att påverka den övergripande kategoristatistiken.", + "select-an-option": "Välj ett alternativ", + "to-continue": "för att fortsätta:", + "warning-alert": "Varning:", + "warning-msg": "Denna åtgärd är inte reversibel." }, "Inputs": { "select": "Välj", - "add-cube": "Lägg till kub", "favorites": "Favoriter", - "list": "Lista", - "trash-all": "Kasta alla", - "move-all": "Flytta alla", "create": "Skapa", - "confirm": "Bekräfta", "cancel": "Avbryt", - "save": "Spara", - "delete": "Radera" + "continue": "Fortsätta", + "move": "Flytta", + "none": "Ingen" }, "Settings-menu": { "title": "Inställningar", @@ -114,7 +134,16 @@ "custom-background-image": "Anpassad bakgrundsbild", "format": "Format", "allowed-file-types": "Endast bildfiler tillåtna (JPEG, PNG, GIF).", - "max-file-size": "Maximal filstorlek" + "max-file-size": "Maximal filstorlek", + "about": "Om", + "auto-select": "Välj automatiskt vid start", + "data": "Appdata", + "export-to-file": "Exportera till fil", + "import-from-file": "Importera från fil", + "legend": "NexusTimer är ett ointressant, minimalistiskt och öppen källkodswebbverktyg för SpeedCubing.", + "preferences": "Inställningar", + "report-bug": "Rapportera ett fel", + "suggest": "Föreslå en förändring" }, "backup-modal": { "title": "Intelligent Backup Restoration", @@ -124,6 +153,17 @@ "loading-part-1": "Denna åtgärd tar mindre än en minut.", "loading-part-2": "Vänta, stäng inte det här fönstret.", "welcome": "Välkommen:" + }, + "Errors": { + "empty-input": "Ange ett värde", + "not-match": "Namnet stämmer inte.", + "repeated-name": "Den namnsamlingen finns redan." + }, + "tooltips": { + "bookmark": "Bokmärke", + "copy": "Kopiera", + "delete": "Radera", + "plus-two": "2 Straff" } }, "Metadata": { diff --git a/messages/tr.json b/messages/tr.json index b43ce5f1..ec9e1a7b 100644 --- a/messages/tr.json +++ b/messages/tr.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "Kronometre", "hint": "İpucu", "optimal-yellow-layer": "Optimal Sarı Katman", "solving": "Çözülüyor...", @@ -23,41 +22,57 @@ }, "SolvesPage": { "title": "Çözümler", - "search-by-time": "⏱️ Zamana göre arama", - "finalize-session": "Oturumu sonlandır", - "eliminate-session": "Oturumu sil", - "archive-sessions-legend": "Bu işlem, aynı kategorideki tüm devam eden oturumları arşivleyecektir.", - "delete-session-legend": "Bu işlem, yalnızca seçilen küp ile mevcut çözümlerinizi silecektir.", - "archive": "Arşiv", - "unarchive": "Arşivden çıkar", - "copy": "Kopyala", - "remove": "Kaldır", - "enter-a-comment": "Bir yorum girin", "session": "Oturum", "all": "Tümü", - "no-cube-selection": "Hiçbir küp seçilmedi, bir tane seçin...", - "no-solves": "Gösterilecek çözüm yok!", "descending": "Azalan", "ascending": "Artan", "date": "Tarih", - "sort-by": "Göre sırala...", - "time": "Zaman" + "time": "Zaman", + "alert": { + "empty-cubes": "Hiçbir küp seçilmedi. \nLütfen birini seçin.", + "title": "Dikkat!" + }, + "dialogs": { + "move-to-history": "Taşınma geçmişi çözer mi?", + "move-to-history-para": "Geçmiş anahtarına dokunarak bunlara erişebileceksiniz." + }, + "empty-solves": "Burada henüz bir şey yok!", + "empty-solves-description": "Geçmişinizi görmek için ekranın üst kısmındaki anahtara dokunun.", + "filter-by-time": "Zamana göre filtrele", + "historial": "Tarihsel", + "last": "Son", + "order": "Emir", + "share": "Paylaşmak", + "share-clipboard": { + "average": "Ortalama", + "header": "NexusTimer tarafından oluşturuldu", + "list-of-times": "Zamanların listesi" + }, + "sort": "Düzenlemek", + "toast": { + "success-copy": "Başarıyla kopyalandı", + "success-copy-description": "Panonuza kopyalandı.", + "unable-action": "İşlem yapılamıyor", + "warning-select-cube": "Lütfen önce bir küp seçin." + }, + "tooltips": { + "move-to-history": "Taşıma geçmişi çözer" + } }, "StatsPage": { "title": "İstatistikler", - "total": "Toplam", - "category": "Kategori", "global": "Genel", "sessions": "Oturumlar", "best-time": "En İyi Zaman", "average": "Ortalama", "time-spent": "Harcanan Zaman", "success-rate": "Başarı Oranı", - "counter": "Sayaç" + "counter": "Sayaç", + "advanced": "Gelişmiş", + "overall": "Etraflı" }, "CubesPage": { "title": "Küpler", - "cube": "Küp", "no-cubes-for-display": "Görüntülenecek küp yok.", "favorite": "Favori", "category": "Kategori", @@ -66,30 +81,35 @@ "status": "Durum", "using": "Kullanma", "idle": "Boşta", - "filter-cubes": "Küplerinizi filtreleyin" + "find-your-cube": "Küpünüzü bulun", + "name": "İsim", + "new-collection": "Yeni koleksiyon", + "options": "Seçenekler" }, "Cubes-modal": { - "title-editing": "Küpü Düzenle", - "title-creating": "Yeni Küp", - "error-name": "Küp adı eksik", - "error-duplicate": "Küp adı zaten kullanılıyor", - "current-select": "Mevcut seçim:", - "question-delete": "Silmek istediğinizden emin misiniz?", - "warning-delete": "Bu geri alınamaz bir işlemdir ve bu küp için tüm çözüm geçmişini siler ve istatistiklerinizi etkileyebilir.", - "placeholder": "Marka | Model | Sürüm | Manyetik?" + "category": "Kategori", + "current-selection": "Mevcut seçim:", + "danger-msg": "Koleksiyon kategorisini değiştirmek aynı zamanda o kategoriyle ilişkili çözümleri de değiştirir.", + "delete-collection": "Koleksiyonu sil", + "delete-collection-description": "Bu küp koleksiyonu, tüm çözümleri, kayıtları ve ayarlarıyla birlikte silinecek.", + "edit-collection": "Koleksiyonu düzenle", + "input-collection-name": "Koleksiyon adını girin", + "name": "İsim", + "new-collection": "Yeni koleksiyon", + "new-collection-description": "Küp koleksiyonları, genel kategori istatistiklerini etkilemeden her küpün geçmişini takip etmenize olanak tanır.", + "select-an-option": "Bir seçenek seçin", + "to-continue": "devam etmek için:", + "warning-alert": "Uyarı:", + "warning-msg": "Bu eylem geri alınamaz." }, "Inputs": { "select": "Seç", - "add-cube": "Küp ekle", "favorites": "Favoriler", - "list": "Liste", - "trash-all": "Tümünü sil", - "move-all": "Tümünü taşı", "create": "Oluştur", - "confirm": "Onayla", "cancel": "İptal", - "save": "Kaydet", - "delete": "Sil" + "continue": "Devam etmek", + "move": "Taşınmak", + "none": "Hiçbiri" }, "Settings-menu": { "title": "Ayarlar", @@ -121,7 +141,9 @@ "about": "Hakkında", "legend": "NexusTimer, SpeedCubing için tarafsız, minimalist ve açık kaynaklı bir web aracıdır.", "suggest": "Bir değişiklik öner", - "report-bug": "Hata bildir" + "report-bug": "Hata bildir", + "auto-select": "Başlangıçta otomatik seç", + "preferences": "Tercihler" }, "backup-modal": { "title": "Akıllı Yedekleme Kurtarma", @@ -131,6 +153,17 @@ "loading-part-1": "Bu işlem bir dakikadan az sürer.", "loading-part-2": "Lütfen bekleyin, bu pencereyi kapatmayın.", "welcome": "Hoş geldin:" + }, + "Errors": { + "empty-input": "Lütfen bir değer girin", + "not-match": "İsim eşleşmiyor.", + "repeated-name": "Bu ad koleksiyonu zaten mevcut." + }, + "tooltips": { + "bookmark": "Yer imi", + "copy": "Kopyala", + "delete": "Silmek", + "plus-two": "2 Penaltı" } }, "Metadata": { diff --git a/messages/uk.json b/messages/uk.json index 5f7cb858..a12044f1 100644 --- a/messages/uk.json +++ b/messages/uk.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "Таймер", "hint": "Підказка", "optimal-yellow-layer": "Оптимальний Жовтий Шар", "solving": "Розв'язання...", @@ -23,41 +22,57 @@ }, "SolvesPage": { "title": "Розв'язки", - "search-by-time": "⏱️ Пошук за часом", - "finalize-session": "Завершити сеанс", - "eliminate-session": "Вилучити сеанс", - "archive-sessions-legend": "Ця дія архівує всі поточні сеанси з тієї ж категорії.", - "delete-session-legend": "Ця дія видалить лише ваші поточні розв'язки з вибраним кубом.", - "archive": "Архівувати", - "unarchive": "Розархівувати", - "copy": "Копіювати", - "remove": "Видалити", - "enter-a-comment": "Введіть коментар", "session": "Сеанс", "all": "Bci", - "no-cube-selection": "Ky6 не вибрано, виберіть один...", - "no-solves": "Немає розв'язків для відображення!", "ascending": "Висхідний", "date": "Дата", "descending": "Спускається", - "sort-by": "Сортувати за...", - "time": "час" + "time": "час", + "alert": { + "empty-cubes": "Не вибрано куб. \nВиберіть один.", + "title": "Увага!" + }, + "dialogs": { + "move-to-history": "Перемістити рішення в історію?", + "move-to-history-para": "Ви зможете отримати доступ до них, натиснувши перемикач історії." + }, + "empty-solves": "Тут ще нічого немає!", + "empty-solves-description": "Торкніться перемикача вгорі екрана, щоб переглянути свою історію.", + "filter-by-time": "Фільтрувати за часом", + "historial": "Історичний", + "last": "Останній", + "order": "порядок", + "share": "Поділіться", + "share-clipboard": { + "average": "Середній", + "header": "Створено NexusTimer", + "list-of-times": "Список часів" + }, + "sort": "Сортувати", + "toast": { + "success-copy": "Успішно скопійовано", + "success-copy-description": "Було скопійовано в буфер обміну.", + "unable-action": "Неможлива дія", + "warning-select-cube": "Будь ласка, виберіть куб раніше." + }, + "tooltips": { + "move-to-history": "Перенесіть рішення в історію" + } }, "StatsPage": { "title": "Статистика", - "total": "Всього", - "category": "Категорія", "global": "Загальний", "sessions": "Сеанси", "best-time": "Найкращий час", "average": "Середнє", "time-spent": "Витрачений час", "success-rate": "Швидкість успіху", - "counter": "Лічильник" + "counter": "Лічильник", + "advanced": "Просунутий", + "overall": "Загалом" }, "CubesPage": { "title": "Куби", - "cube": "Ky6", "no-cubes-for-display": "Немає кубів для відображення.", "favorite": "Вподобані", "category": "Категорія", @@ -66,30 +81,35 @@ "status": "Статус", "using": "Використання", "idle": "Неактивний", - "filter-cubes": "Фільтрувати ваші куби" + "find-your-cube": "Знайдіть свій куб", + "name": "Ім'я", + "new-collection": "Нова колекція", + "options": "Опції" }, "Cubes-modal": { - "title-editing": "Редагувати куб", - "title-creating": "Новий куб", - "error-name": "Відсутня назва куба", - "error-duplicate": "Назва куба вже використовується", - "current-select": "Поточний вибір:", - "question-delete": "Ви впевнені, що хочете видалити?", - "warning-delete": "Ця незворотня дія видалить всю історію розв'язків для цього куба i може вплинути на вашу статистику.", - "placeholder": "Марка | Модель | Версія | Магніт?" + "category": "Категорія", + "current-selection": "Поточний вибір:", + "danger-msg": "Зміна категорії колекції також змінює розв’язки, пов’язані з цією категорією.", + "delete-collection": "Видалити колекцію", + "delete-collection-description": "Цю колекцію кубів буде видалено разом із усіма її рішеннями, записами та налаштуваннями.", + "edit-collection": "Редагувати колекцію", + "input-collection-name": "Введіть назву колекції", + "name": "Ім'я", + "new-collection": "Нова колекція", + "new-collection-description": "Колекції кубів дозволяють відстежувати історію кожного куба, не впливаючи на загальну статистику категорії.", + "select-an-option": "Виберіть опцію", + "to-continue": "продовжити:", + "warning-alert": "УВАГА:", + "warning-msg": "Цю дію не можна відмінити." }, "Inputs": { "select": "Вибрати", - "add-cube": "Додати куб", "favorites": "Вподобані", - "list": "Список", - "trash-all": "Викинути все", - "move-all": "Перемістити все", "create": "Створити", - "confirm": "Підтвердити", "cancel": "Скасувати", - "save": "Зберегти", - "delete": "Видалити" + "continue": "Продовжити", + "move": "рухатися", + "none": "Жодного" }, "Settings-menu": { "title": "Налаштування", @@ -121,7 +141,9 @@ "about": "Про програму", "legend": "NexusTimer - це безперечний, мінімалістичний та відкритий веб-інструмент для SpeedCubing.", "suggest": "Запропонувати зміну", - "report-bug": "Повідомити про помилку" + "report-bug": "Повідомити про помилку", + "auto-select": "Автоматичний вибір під час запуску", + "preferences": "Уподобання" }, "backup-modal": { "title": "Інтелектуальне відновлення резервного копіювання", @@ -131,6 +153,17 @@ "loading-part-1": "Ця дія займе менше хвилини.", "loading-part-2": "Зачекайте, будь ласка, не закривайте це вікно.", "welcome": "Ласкаво просимо:" + }, + "Errors": { + "empty-input": "Будь ласка, введіть значення", + "not-match": "Ім'я не збігається.", + "repeated-name": "Ця колекція імен уже існує." + }, + "tooltips": { + "bookmark": "Закладка", + "copy": "Копіювати", + "delete": "Видалити", + "plus-two": "2 Пенальті" } }, "Metadata": { diff --git a/messages/vi.json b/messages/vi.json index 1aa39bfd..4f23c18d 100644 --- a/messages/vi.json +++ b/messages/vi.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "Bộ hẹn giờ", "hint": "Gợi ý", "optimal-yellow-layer": "Lớp Vàng Tối ưu", "solving": "Đang giải...", @@ -23,41 +22,57 @@ }, "SolvesPage": { "title": "Giải quyết", - "search-by-time": "⏱️ Tìm kiếm theo thời gian", - "finalize-session": "Hoàn thành phiên", - "eliminate-session": "Loại bỏ phiên", - "archive-sessions-legend": "Hành động này sẽ lưu trữ tất cả các phiên đang diễn ra từ cùng một danh mục.", - "delete-session-legend": "Hành động này sẽ chỉ xóa các giải quyết hiện tại của bạn với khối đã chọn.", - "archive": "Lưu trữ", - "unarchive": "Bỏ lưu trữ", - "copy": "Sao chép", - "remove": "Xóa bỏ", - "enter-a-comment": "Nhập bình luận", "session": "Phiên", "all": "Tất cả", - "no-cube-selection": "Không có khối nào được chọn, hãy chọn một...", - "no-solves": "Không có giải pháp để hiển thị!", "ascending": "Tăng dần", "date": "Ngày", "descending": "Giảm dần", - "sort-by": "Sắp xếp theo...", - "time": "Thời gian" + "time": "Thời gian", + "alert": { + "empty-cubes": "Không có khối nào được chọn. \nHãy chọn một.", + "title": "Chú ý!" + }, + "dialogs": { + "move-to-history": "Di chuyển giải pháp vào lịch sử?", + "move-to-history-para": "Bạn sẽ có thể truy cập chúng bằng cách nhấn vào nút chuyển lịch sử." + }, + "empty-solves": "Chưa có gì ở đây!", + "empty-solves-description": "Nhấn vào nút chuyển ở đầu màn hình để xem lịch sử của bạn.", + "filter-by-time": "Lọc theo thời gian", + "historial": "lịch sử", + "last": "Cuối cùng", + "order": "Đặt hàng", + "share": "Chia sẻ", + "share-clipboard": { + "average": "Trung bình", + "header": "Được tạo bởi NexusTimer", + "list-of-times": "Danh sách thời gian" + }, + "sort": "Loại", + "toast": { + "success-copy": "Đã sao chép thành công", + "success-copy-description": "Đã được sao chép vào clipboard của bạn.", + "unable-action": "Hành động không thể", + "warning-select-cube": "Vui lòng chọn một khối trước." + }, + "tooltips": { + "move-to-history": "Di chuyển các giải pháp vào lịch sử" + } }, "StatsPage": { "title": "Thống kê", - "total": "Tổng cộng", - "category": "Danh mục", "global": "Toàn cầu", "sessions": "Phiên", "best-time": "Thời gian tốt nhất", "average": "Trung bình", "time-spent": "Thời gian đã dùng", "success-rate": "Tỷ lệ thành công", - "counter": "Bộ đếm" + "counter": "Bộ đếm", + "advanced": "Trình độ cao", + "overall": "Tổng thể" }, "CubesPage": { "title": "Khối", - "cube": "Khối", "no-cubes-for-display": "Không có khối để hiển thị.", "favorite": "Yêu thích", "category": "Danh mục", @@ -66,30 +81,35 @@ "status": "Trạng thái", "using": "Đang sử dụng", "idle": "Trống", - "filter-cubes": "Lọc các khối của bạn" + "find-your-cube": "Tìm khối lập phương của bạn", + "name": "Tên", + "new-collection": "Bộ sưu tập mới", + "options": "Tùy chọn" }, "Cubes-modal": { - "title-editing": "Chỉnh sửa khối", - "title-creating": "Khối mới", - "error-name": "Thiếu tên khối", - "error-duplicate": "Tên khối đã được sử dụng", - "current-select": "Lựa chọn hiện tại:", - "question-delete": "Bạn chắc chắn muốn xóa?", - "warning-delete": "Hành động này sẽ không thể hoàn tác và sẽ xóa toàn bộ lịch sử giải quyết cho khối này và có thể ảnh hưởng đến thống kê của bạn.", - "placeholder": "Thương hiệu | Mẫu | Phiên bản | Nam châm?" + "category": "Loại", + "current-selection": "Lựa chọn hiện tại:", + "danger-msg": "Việc sửa đổi danh mục bộ sưu tập cũng thay đổi các giải pháp liên quan đến danh mục đó.", + "delete-collection": "Xóa bộ sưu tập", + "delete-collection-description": "Bộ sưu tập khối này sẽ bị xóa cùng với tất cả các phép giải, bản ghi và cài đặt của nó.", + "edit-collection": "Chỉnh sửa bộ sưu tập", + "input-collection-name": "Nhập tên bộ sưu tập", + "name": "Tên", + "new-collection": "Bộ sưu tập mới", + "new-collection-description": "Bộ sưu tập khối cho phép bạn theo dõi lịch sử của từng khối mà không ảnh hưởng đến số liệu thống kê chung của danh mục.", + "select-an-option": "Chọn một tùy chọn", + "to-continue": "để tiếp tục:", + "warning-alert": "Cảnh báo:", + "warning-msg": "Hành động này không thể đảo ngược." }, "Inputs": { "select": "Chọn", - "add-cube": "Thêm khối", "favorites": "Yêu thích", - "list": "Danh sách", - "trash-all": "Xóa tất cả", - "move-all": "Di chuyển tất cả", "create": "Tạo", - "confirm": "Xác nhận", "cancel": "Hủy", - "save": "Lưu", - "delete": "Xóa" + "continue": "Tiếp tục", + "move": "Di chuyển", + "none": "Không có" }, "Settings-menu": { "title": "Cài đặt", @@ -121,7 +141,9 @@ "about": "Về", "legend": "NexusTimer là một công cụ web không phán đoán, tối giản và mã nguồn mở cho SpeedCubing.", "suggest": "Đề xuất thay đổi", - "report-bug": "Báo cáo lỗi" + "report-bug": "Báo cáo lỗi", + "auto-select": "Tự động chọn khi khởi động", + "preferences": "Tùy chọn" }, "backup-modal": { "title": "Khôi phục sao lưu thông minh", @@ -131,6 +153,17 @@ "loading-part-1": "Hành động này mất ít hơn một phút.", "loading-part-2": "Vui lòng đợi, đừng đóng cửa sổ này.", "welcome": "Chào mừng:" + }, + "Errors": { + "empty-input": "Vui lòng nhập một giá trị", + "not-match": "Tên không khớp.", + "repeated-name": "Bộ sưu tập tên đó đã tồn tại." + }, + "tooltips": { + "bookmark": "Đánh dấu", + "copy": "Sao chép", + "delete": "Xóa bỏ", + "plus-two": "2 quả phạt đền" } }, "Metadata": { diff --git a/messages/zh.json b/messages/zh.json index 001b6873..3f96ca8d 100644 --- a/messages/zh.json +++ b/messages/zh.json @@ -1,7 +1,6 @@ { "Index": { "HomePage": { - "title": "计时器", "hint": "提示", "optimal-yellow-layer": "最佳黄层", "solving": "解决中...", @@ -23,41 +22,57 @@ }, "SolvesPage": { "title": "解决方案", - "search-by-time": "⏱️ 按时间搜索", - "finalize-session": "完成会话", - "eliminate-session": "消除会话", - "archive-sessions-legend": "此操作将存档同一类别中的所有正在进行的会话。", - "delete-session-legend": "此操作将仅删除所选魔方的当前解决方案。", - "archive": "存档", - "unarchive": "取消存档", - "copy": "复制", - "remove": "移除", - "enter-a-comment": "输入评论", "session": "会话", "all": "全部", - "no-cube-selection": "未选择魔方,请选择一个...", - "no-solves": "没有解决方案可显示!", "ascending": "上升", "date": "日期", "descending": "降序", - "sort-by": "排序方式...", - "time": "时间" + "time": "时间", + "alert": { + "empty-cubes": "未选择立方体。\n请选择一项。", + "title": "注意力!" + }, + "dialogs": { + "move-to-history": "将解决方案移至历史?", + "move-to-history-para": "您可以通过点击历史记录开关来访问它们。" + }, + "empty-solves": "这里还什么都没有!", + "empty-solves-description": "点击屏幕顶部的开关即可查看您的历史记录。", + "filter-by-time": "按时间过滤", + "historial": "历史", + "last": "最后的", + "order": "命令", + "share": "分享", + "share-clipboard": { + "average": "平均的", + "header": "由 NexusTimer 生成", + "list-of-times": "时间列表" + }, + "sort": "种类", + "toast": { + "success-copy": "复制成功", + "success-copy-description": "已复制到您的剪贴板。", + "unable-action": "无法行动", + "warning-select-cube": "请先选择一个立方体。" + }, + "tooltips": { + "move-to-history": "将解决方案移至历史记录" + } }, "StatsPage": { "title": "统计", - "total": "总计", - "category": "类别", "global": "全球", "sessions": "会话", "best-time": "最佳时间", "average": "平均", "time-spent": "花费时间", "success-rate": "成功率", - "counter": "计数器" + "counter": "计数器", + "advanced": "先进的", + "overall": "全面的" }, "CubesPage": { "title": "魔方", - "cube": "魔方", "no-cubes-for-display": "没有可显示的魔方。", "favorite": "收藏", "category": "类别", @@ -66,30 +81,35 @@ "status": "状态", "using": "使用中", "idle": "闲置", - "filter-cubes": "过滤你的魔方" + "find-your-cube": "找到你的立方体", + "name": "姓名", + "new-collection": "新系列", + "options": "选项" }, "Cubes-modal": { - "title-editing": "编辑魔方", - "title-creating": "新魔方", - "error-name": "魔方名称丢失", - "error-duplicate": "魔方名称已被使用", - "current-select": "当前选择:", - "question-delete": "您确定要删除吗?", - "warning-delete": "此不可逆转的操作将删除此魔方的所有解决历史,可能会影响您的统计数据。", - "placeholder": "品牌 | 型号 | 版本 | 磁性?" + "category": "类别", + "current-selection": "当前选择:", + "danger-msg": "修改集合类别也会更改与该类别关联的求解。", + "delete-collection": "删除集合", + "delete-collection-description": "该多维数据集集合及其所有求解、记录和设置都将被删除。", + "edit-collection": "编辑收藏", + "input-collection-name": "输入集合名称", + "name": "姓名", + "new-collection": "新系列", + "new-collection-description": "多维数据集集合允许您跟踪每个多维数据集的历史记录,而不会影响整体类别统计数据。", + "select-an-option": "选择一个选项", + "to-continue": "继续:", + "warning-alert": "警告:", + "warning-msg": "此操作不可逆转。" }, "Inputs": { "select": "选择", - "add-cube": "添加魔方", "favorites": "收藏夹", - "list": "列表", - "trash-all": "清空全部", - "move-all": "全部移动", "create": "创建", - "confirm": "确认", "cancel": "取消", - "save": "保存", - "delete": "删除" + "continue": "继续", + "move": "移动", + "none": "没有任何" }, "Settings-menu": { "title": "设置", @@ -121,7 +141,9 @@ "about": "关于", "legend": "NexusTimer是一个无偏见、简约和开源的SpeedCubing网络工具。", "suggest": "建议更改", - "report-bug": "报告错误" + "report-bug": "报告错误", + "auto-select": "启动时自动选择", + "preferences": "偏好设置" }, "backup-modal": { "title": "智能备份恢复", @@ -131,6 +153,17 @@ "loading-part-1": "此操作不到一分钟。", "loading-part-2": "请稍候,不要关闭此窗口。", "welcome": "欢迎:" + }, + "Errors": { + "empty-input": "请输入一个值", + "not-match": "名称不匹配。", + "repeated-name": "该名称集合已经存在。" + }, + "tooltips": { + "bookmark": "书签", + "copy": "复制", + "delete": "删除", + "plus-two": "2 处罚" } }, "Metadata": { diff --git a/package-lock.json b/package-lock.json index affea553..1fdbe20c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,38 +11,61 @@ "@headlessui/react": "^1.7.17", "@heroicons/react": "^2.1.3", "@mierak/react-virtualized-grid": "^0.0.5-ALPHA", + "@radix-ui/react-avatar": "^1.1.0", + "@radix-ui/react-checkbox": "^1.1.1", + "@radix-ui/react-dialog": "^1.1.1", + "@radix-ui/react-dropdown-menu": "^2.1.1", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-scroll-area": "^1.1.0", + "@radix-ui/react-select": "^2.1.1", + "@radix-ui/react-separator": "^1.1.0", + "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-switch": "^1.1.0", + "@radix-ui/react-tabs": "^1.1.0", + "@radix-ui/react-toggle": "^1.1.0", + "@radix-ui/react-tooltip": "^1.1.2", "@types/node": "20.6.0", "@types/papaparse": "^5.3.14", "@types/react": "18.2.21", "@types/react-dom": "18.2.7", "autoprefixer": "10.4.15", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", "country-flag-icons": "^1.5.11", "cube-solver": "^2.4.1", "cubing": "^0.44.1", "date-fns": "^2.30.0", "eslint": "8.49.0", "eslint-config-next": "^14.2.3", - "fast-sort": "3.4.0", + "fast-sort": "^3.4.0", + "filter-data": "^0.6.1", "framer-motion": "^10.17.4", "idb-wrapper": "^1.7.2", "lightweight-charts": "^4.1.4", + "lucide-react": "^0.439.0", "luxon": "^3.4.4", "next": "^14.2.3", "next-intl": "^3.19.1", + "next-themes": "^0.3.0", "papaparse": "^5.4.1", "postcss": "8.4.31", "pretty-ms": "^8.0.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-dom-confetti": "^0.2.0", + "react-resizable-panels": "^2.1.2", "recharts": "^2.8.0", "scrambow": "^1.8.1", "sharp": "0.32.6", - "tailwind-merge": "^2.3.0", + "sonner": "^1.5.0", + "tailwind-merge": "^2.5.2", "tailwindcss": "^3.4.0", + "tailwindcss-animate": "^1.0.7", "ts-deepmerge": "^7.0.0", "typescript": "5.2.2", "uuid": "9.0.1", + "vaul": "^0.9.2", "zustand": "4.4.1" }, "devDependencies": { @@ -150,6 +173,44 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.7.tgz", + "integrity": "sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.7" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.10", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.10.tgz", + "integrity": "sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.7" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.1.tgz", + "integrity": "sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.7.tgz", + "integrity": "sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==", + "license": "MIT" + }, "node_modules/@formatjs/ecma402-abstract": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.0.0.tgz", @@ -554,63 +615,960 @@ "node": ">= 10" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@playwright/test": { + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.43.1.tgz", + "integrity": "sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA==", + "devOptional": true, + "dependencies": { + "playwright": "1.43.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz", + "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", + "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-avatar": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.0.tgz", + "integrity": "sha512-Q/PbuSMk/vyAd/UoIShVGZ7StHHeRFYU7wXmi5GV+8cLXflZAEpHL/F697H1klrzxKXNtZ97vWiC0q3RKUH8UA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.1.1.tgz", + "integrity": "sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz", + "integrity": "sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", + "integrity": "sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.1.tgz", + "integrity": "sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-menu": "2.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz", + "integrity": "sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", + "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-icons": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.0.tgz", + "integrity": "sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==", + "license": "MIT", + "peerDependencies": { + "react": "^16.x || ^17.x || ^18.x" + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.0.tgz", + "integrity": "sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.1.tgz", + "integrity": "sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", + "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-rect": "1.1.0", + "@radix-ui/react-use-size": "1.1.0", + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", + "integrity": "sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", + "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz", + "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.1.0.tgz", + "integrity": "sha512-9ArIZ9HWhsrfqS765h+GZuLoxaRHD/j0ZWOWilsCvYTpYJp8XwCqNG7Dt9Nu/TItKOdgLGkOPCodQvDc+UMwYg==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.1.tgz", + "integrity": "sha512-8iRDfyLtzxlprOo9IicnzvpsO1wNCkuwzzCM+Z5Rb5tNOpCdMvcc2AkzX0Fz+Tz9v6NJ5B/7EEgyZveo4FBRfQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.0.tgz", + "integrity": "sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.0.tgz", + "integrity": "sha512-OBzy5WAj641k0AOSpKQtreDMe+isX0MQJ1IVyF03ucdF3DunOnROVrjWs8zsXUxC3zfZ6JL9HFVCUlMghz9dJw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.0.tgz", + "integrity": "sha512-bZgOKB/LtZIij75FSuPzyEti/XBhJH52ExgtdVqjCIh+Nx/FW+LhnbXtbCzIi34ccyMsyOja8T0thCzoHFXNKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.0.tgz", + "integrity": "sha512-gwoxaKZ0oJ4vIgzsfESBuSgJNdc0rv12VhHgcqN0TEJmmZixXG/2XpsLK8kzNWYcnaoRIEEQc0bEi3dIvdUpjw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.2.tgz", + "integrity": "sha512-9XRsLwe6Yb9B/tlnYCPVUd/TFS4J7HuOZW345DCeC6vKIxQGMZdx21RK4VoZauPD5frgkXTYVS5y90L+3YBn4w==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", + "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@radix-ui/react-use-callback-ref": "1.1.0" }, - "engines": { - "node": ">= 8" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", + "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", + "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@radix-ui/rect": "1.1.0" }, - "engines": { - "node": ">= 8" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@playwright/test": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.43.1.tgz", - "integrity": "sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA==", - "devOptional": true, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz", + "integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==", + "license": "MIT", "dependencies": { - "playwright": "1.43.1" + "@radix-ui/react-primitive": "2.0.0" }, - "bin": { - "playwright": "cli.js" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, - "engines": { - "node": ">=16" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, + "node_modules/@radix-ui/rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==", + "license": "MIT" + }, "node_modules/@rushstack/eslint-patch": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.4.0.tgz", @@ -957,6 +1915,18 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, + "node_modules/aria-hidden": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/aria-query": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", @@ -1399,6 +2369,27 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, + "node_modules/class-variance-authority": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz", + "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "2.0.0" + }, + "funding": { + "url": "https://joebell.co.uk" + } + }, + "node_modules/class-variance-authority/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/classnames": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", @@ -1409,6 +2400,15 @@ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", @@ -1750,6 +2750,12 @@ "node": ">=8" } }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -2429,7 +3435,8 @@ "node_modules/fast-sort": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/fast-sort/-/fast-sort-3.4.0.tgz", - "integrity": "sha512-c/cMBGA5mH3OYjaXedtLIM3hQjv+KuZuiD2QEH5GofNOZeQVDIYIN7Okc2AW1KPhk44g5PTZnXp8t2lOMl8qhQ==" + "integrity": "sha512-c/cMBGA5mH3OYjaXedtLIM3hQjv+KuZuiD2QEH5GofNOZeQVDIYIN7Okc2AW1KPhk44g5PTZnXp8t2lOMl8qhQ==", + "license": "MIT" }, "node_modules/fastq": { "version": "1.15.0", @@ -2466,6 +3473,15 @@ "node": ">=8" } }, + "node_modules/filter-data": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/filter-data/-/filter-data-0.6.1.tgz", + "integrity": "sha512-+gwqSD7Wxu9VP83nPV5QhdwGZoF1ZbkWOZgYmYequH0hoNe2PuggeHjdoRAnTtVy0yBZmuB/GQ7XLQ5DsfnXoQ==", + "license": "MIT", + "dependencies": { + "ramda": "^0.30.1" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -2625,6 +3641,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -2935,6 +3960,15 @@ "tslib": "^2.4.0" } }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -3453,6 +4487,15 @@ "node": ">=10" } }, + "node_modules/lucide-react": { + "version": "0.439.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.439.0.tgz", + "integrity": "sha512-PafSWvDTpxdtNEndS2HIHxcNAbd54OaqSYJO90/b63rab2HWYqDbH194j0i82ZFdWOAcf0AHinRykXRRK2PJbw==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" + } + }, "node_modules/luxon": { "version": "3.4.4", "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", @@ -3652,6 +4695,16 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/next-themes": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.3.0.tgz", + "integrity": "sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18", + "react-dom": "^16.8 || ^17 || ^18" + } + }, "node_modules/node-abi": { "version": "3.47.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", @@ -4271,6 +5324,16 @@ "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" }, + "node_modules/ramda": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.30.1.tgz", + "integrity": "sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ramda" + } + }, "node_modules/random-uint-below": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/random-uint-below/-/random-uint-below-2.0.0.tgz", @@ -4347,6 +5410,63 @@ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, + "node_modules/react-remove-scroll": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz", + "integrity": "sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.4", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", + "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-resizable-panels": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-2.1.2.tgz", + "integrity": "sha512-Ku2Bo7JvE8RpHhl4X1uhkdeT9auPBoxAOlGTqomDUUrBAX2mVGuHYZTcWvlnJSgx0QyHIxHECgGB5XVPUbUOkQ==", + "license": "MIT", + "peerDependencies": { + "react": "^16.14.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-resize-detector": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-8.1.0.tgz", @@ -4373,6 +5493,29 @@ "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-transition-group": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", @@ -4812,6 +5955,16 @@ "node": ">=8" } }, + "node_modules/sonner": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-1.5.0.tgz", + "integrity": "sha512-FBjhG/gnnbN6FY0jaNnqZOMmB73R+5IiyYAw8yBj7L54ER7HB3fOSE5OFiQiE2iXWxeXKvg6fIP4LtVppHEdJA==", + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -5099,13 +6252,10 @@ } }, "node_modules/tailwind-merge": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.3.0.tgz", - "integrity": "sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.2.tgz", + "integrity": "sha512-kjEBm+pvD+6eAwzJL2Bi+02/9LFLal1Gs61+QB7HvTfQQ0aXwC5LGT8PEt1gS0CWKktKe6ysPTAy3cBC5MeiIg==", "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.24.1" - }, "funding": { "type": "github", "url": "https://github.com/sponsors/dcastil" @@ -5147,6 +6297,15 @@ "node": ">=14.0.0" } }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -5412,6 +6571,27 @@ "punycode": "^2.1.0" } }, + "node_modules/use-callback-ref": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", + "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/use-intl": { "version": "3.19.1", "resolved": "https://registry.npmjs.org/use-intl/-/use-intl-3.19.1.tgz", @@ -5425,6 +6605,28 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/use-sync-external-store": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", @@ -5450,6 +6652,19 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/vaul": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/vaul/-/vaul-0.9.2.tgz", + "integrity": "sha512-m2A7UgAU/JMWiwUhmARK8LMvEfXiudA4trJxfZF5AtH2uBTgN855msZ2yjPnUDfa7i5glocMYLSfML8wriBtBA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-dialog": "^1.0.4" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, "node_modules/victory-vendor": { "version": "36.6.11", "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.6.11.tgz", diff --git a/package.json b/package.json index 4497c0d1..450f9ddc 100644 --- a/package.json +++ b/package.json @@ -14,38 +14,61 @@ "@headlessui/react": "^1.7.17", "@heroicons/react": "^2.1.3", "@mierak/react-virtualized-grid": "^0.0.5-ALPHA", + "@radix-ui/react-avatar": "^1.1.0", + "@radix-ui/react-checkbox": "^1.1.1", + "@radix-ui/react-dialog": "^1.1.1", + "@radix-ui/react-dropdown-menu": "^2.1.1", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-scroll-area": "^1.1.0", + "@radix-ui/react-select": "^2.1.1", + "@radix-ui/react-separator": "^1.1.0", + "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-switch": "^1.1.0", + "@radix-ui/react-tabs": "^1.1.0", + "@radix-ui/react-toggle": "^1.1.0", + "@radix-ui/react-tooltip": "^1.1.2", "@types/node": "20.6.0", "@types/papaparse": "^5.3.14", "@types/react": "18.2.21", "@types/react-dom": "18.2.7", "autoprefixer": "10.4.15", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", "country-flag-icons": "^1.5.11", "cube-solver": "^2.4.1", "cubing": "^0.44.1", "date-fns": "^2.30.0", "eslint": "8.49.0", "eslint-config-next": "^14.2.3", - "fast-sort": "3.4.0", + "fast-sort": "^3.4.0", + "filter-data": "^0.6.1", "framer-motion": "^10.17.4", "idb-wrapper": "^1.7.2", "lightweight-charts": "^4.1.4", + "lucide-react": "^0.439.0", "luxon": "^3.4.4", "next": "^14.2.3", "next-intl": "^3.19.1", + "next-themes": "^0.3.0", "papaparse": "^5.4.1", "postcss": "8.4.31", "pretty-ms": "^8.0.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-dom-confetti": "^0.2.0", + "react-resizable-panels": "^2.1.2", "recharts": "^2.8.0", "scrambow": "^1.8.1", "sharp": "0.32.6", - "tailwind-merge": "^2.3.0", + "sonner": "^1.5.0", + "tailwind-merge": "^2.5.2", "tailwindcss": "^3.4.0", + "tailwindcss-animate": "^1.0.7", "ts-deepmerge": "^7.0.0", "typescript": "5.2.2", "uuid": "9.0.1", + "vaul": "^0.9.2", "zustand": "4.4.1" }, "devDependencies": { diff --git a/public/empty.png b/public/empty.png new file mode 100644 index 00000000..30dfcbee Binary files /dev/null and b/public/empty.png differ diff --git a/src/FAKE_SESSION.ts b/src/FAKE_SESSION.ts new file mode 100644 index 00000000..14f6de12 --- /dev/null +++ b/src/FAKE_SESSION.ts @@ -0,0 +1,694 @@ +import { Solve } from "@/interfaces/Solve"; + +export const FAKE_SESSION: Solve[] = [ + { + id: "986b4374-a791-4c93-b394-68cf7a7da9ce", + startTime: 1718671570125, + endTime: 1718671584679, + scramble: "F2 D B2 D' R2 F2 L' B' R2 U2 F2 R' D2 F2 L' U2 R' F2 B2 R ", + bookmark: false, + time: 14553, + dnf: false, + plus2: false, + rating: 67, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "2fcd9e73-620d-40d1-9845-5f7908fd0119", + startTime: 1718671604236, + endTime: 1718671617958, + scramble: "D2 R2 D2 L2 F' R2 F D2 U2 B D2 F L' B R2 D2 R U F2 U' F' ", + bookmark: false, + time: 13718, + dnf: false, + plus2: false, + rating: 76, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "2a677145-dcd3-4a41-a53e-dde9584bd418", + startTime: 1719150613308, + endTime: 1719150625185, + scramble: "B2 L' F2 L B2 R' F2 R F2 D2 L2 D2 F' U' B F' U2 F2 L2 U R2 ", + bookmark: false, + time: 11875, + dnf: false, + plus2: false, + rating: 69, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "7ea1f741-8a3e-43fb-b742-05f38764af72", + startTime: 1719150653421, + endTime: 1719150667531, + scramble: + "L2 U' L2 B2 U' B2 F2 R2 D B2 U' B2 L' D R2 B R D' F2 U B' L2 ", + bookmark: false, + time: 14108, + dnf: false, + plus2: false, + rating: 73, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "b56c48fb-9299-4c7c-bbcd-37cf586d8830", + startTime: 1719150711340, + endTime: 1719150726394, + scramble: "U2 L B2 L D2 F2 R F2 R' B2 R' U' B D' L2 B F2 L D2 F2 D' ", + bookmark: false, + time: 15054, + dnf: false, + plus2: false, + rating: 76, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "0cb63bb7-c82d-451b-8726-5a65db784347", + startTime: 1719150748376, + endTime: 1719150763836, + scramble: "R' F2 L F L F' U D' F L2 U F2 R2 F2 D' B2 L2 D L2 F2 D ", + bookmark: false, + time: 15459, + dnf: false, + plus2: false, + rating: 68, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "3bd0ec2f-c3f1-40b6-b411-1ecbc207e3ce", + startTime: 1719150780019, + endTime: 1719150796733, + scramble: "D2 R B' L D2 F' L2 F' R2 D2 F2 L2 D' B2 D B2 L2 U R2 ", + bookmark: false, + time: 16711, + dnf: false, + plus2: false, + rating: 73, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "3fc1b2cb-23d2-4405-b670-fd912f53c130", + startTime: 1719181975832, + endTime: 1719181991195, + scramble: + "F2 D' B2 L2 U' R2 U B2 L2 F2 R2 D2 L' F' L R' F2 L2 U B2 R2 D' ", + bookmark: false, + time: 15361, + dnf: false, + plus2: false, + rating: 80, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "a9c8d0e1-bb33-4e94-9c5b-e71c8fad3941", + startTime: 1719771948618, + endTime: 1719771963336, + scramble: + "B2 U2 L' D F2 R' L B' U R B2 L2 F2 D' F2 U R2 U2 L2 F2 D2 F2 ", + bookmark: false, + time: 14712, + dnf: false, + plus2: false, + rating: 84, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "91272bf3-d2f2-4a22-a661-3d3dcf8ab001", + startTime: 1719771986337, + endTime: 1719772001364, + scramble: + "B2 L F2 D2 L F2 D2 L' B2 L B2 R D' L2 U2 R' U' B F L' F2 R2 ", + bookmark: false, + time: 15026, + dnf: false, + plus2: false, + rating: 74, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "3967db59-43c5-410c-96cc-c5ad8e6887f3", + startTime: 1719772060089, + endTime: 1719772076563, + scramble: "F' L2 B2 R2 F U2 R2 F' R2 F D2 F L' U' B' D L' D R U2 R' ", + bookmark: false, + time: 16471, + dnf: false, + plus2: false, + rating: 76, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "6f28c032-893e-477a-b8e1-0876a78fb385", + startTime: 1722627790298, + endTime: 1722627803012, + scramble: + "U F R F2 B R D' R2 L' B' L2 U' D' F2 R2 D2 B2 L2 D B2 D L2 ", + bookmark: false, + time: 12712, + dnf: false, + plus2: false, + rating: 76, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "0f9ed47c-0479-4c3b-9aa0-3fca3281e76a", + startTime: 1722627833027, + endTime: 1722627847137, + scramble: "U2 F2 L2 D2 U2 B L2 R2 U2 R2 U2 B L' U L' B' L' B F2 D' U' ", + bookmark: false, + time: 14107, + dnf: false, + plus2: false, + rating: 78, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "5468f3ea-eff0-4661-86e2-0bf3883d3bfa", + startTime: 1722864719512, + endTime: 1722864731439, + scramble: "B2 R F D' F2 U R F' R2 D2 F R2 F L2 B' U2 B2 R2 L2 ", + bookmark: false, + time: 11925, + dnf: false, + plus2: false, + rating: 59, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "3b4a8b96-eaed-4d9e-9af2-cf80607336d9", + startTime: 1722864757065, + endTime: 1722864770612, + scramble: + "R2 D2 R2 D U2 L2 B2 R2 F2 R2 D2 U' R' D2 U F D' U B2 L D2 R' ", + bookmark: false, + time: 13547, + dnf: false, + plus2: false, + rating: 73, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "d0f9f239-e12b-4718-be9e-ae482ede620f", + startTime: 1722864801375, + endTime: 1722864813141, + scramble: + "U2 B2 R2 B2 R2 D2 R2 U B2 F2 D L2 F D R2 F L' B' D U F R2 ", + bookmark: false, + time: 11763, + dnf: false, + plus2: false, + rating: 71, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "0eb22dd7-70c8-4f13-be38-55cd2958de3c", + startTime: 1722864853841, + endTime: 1722864867882, + scramble: + "D' R2 U F2 D U B2 U' R2 F2 L2 U' B' R' B2 R2 B R B' F' L' U2 ", + bookmark: false, + time: 14041, + dnf: false, + plus2: false, + rating: 66, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "81b1556d-693b-4e8e-adb0-882806061127", + startTime: 1722864888829, + endTime: 1722864902106, + scramble: "R' D' F' L B' U' F' U R' B' D L2 F2 L2 U D B2 D L2 D' F2 ", + bookmark: false, + time: 13273, + dnf: false, + plus2: false, + rating: 63, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "8bad3995-40f5-4973-b07a-7f851fdeb700", + startTime: 1722864963689, + endTime: 1722864977033, + scramble: "R' F B2 D F' U' R D2 B' R2 U2 F2 R2 F2 D' L2 D' B2 D2 L2 U ", + bookmark: false, + time: 13342, + dnf: false, + plus2: false, + rating: 76, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "719ccca1-87b4-4845-9147-6485bc98e2aa", + startTime: 1722864998947, + endTime: 1722865011234, + scramble: + "F R2 U2 B R2 F' D2 U2 L2 D2 B2 F D R U' L R D' F' U2 B2 D' ", + bookmark: false, + time: 12286, + dnf: false, + plus2: false, + rating: 83, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "d50eb126-df6b-429b-8d22-aeae8fc5e338", + startTime: 1722865141444, + endTime: 1722865153416, + scramble: "L2 D' B R2 L B D' F R D2 L2 U2 R2 B2 D2 B' D2 B' D2 ", + bookmark: false, + time: 11970, + dnf: false, + plus2: false, + rating: 62, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "0ed9e607-7b08-4633-9d74-b5bd338d1d3b", + startTime: 1722865178644, + endTime: 1722865191465, + scramble: "L F2 B L' B2 D L' B' U' L2 U2 B2 D R2 B2 U' B2 U' B2 U ", + bookmark: false, + time: 12819, + dnf: false, + plus2: false, + rating: 72, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "73d59437-d26b-4943-8f9b-3e251e52cd7e", + startTime: 1722865219663, + endTime: 1722865233024, + scramble: "F2 L2 R2 U2 F2 D' F2 U R2 B2 D2 R2 B' L' F2 U' F' L2 U2 B' D' ", + bookmark: false, + time: 13358, + dnf: false, + plus2: false, + rating: 80, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "4f743825-aa8d-45b5-b75a-088001182002", + startTime: 1722865254831, + endTime: 1722865265762, + scramble: "B2 U' B2 U L2 U2 L2 U2 B2 U' B2 U' L' B' U' F' U L D' R2 U2 ", + bookmark: false, + time: 10930, + dnf: false, + plus2: false, + rating: 64, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "9e8c71f3-af41-4bad-93f0-6ae9fa3f8b3a", + startTime: 1722865287654, + endTime: 1722865301157, + scramble: + "R2 D R2 U' B2 R2 D B2 D R2 U F2 R' B R2 B D R F' U B2 D ", + bookmark: false, + time: 13500, + dnf: false, + plus2: false, + rating: 81, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "e56717b7-77b7-49ee-8882-7c69b0f99923", + startTime: 1722865320376, + endTime: 1722865333984, + scramble: "R D2 L2 B D2 L U F' R' B U F2 U' F2 R2 U' R2 L2 F2 D2 F2 ", + bookmark: false, + time: 13607, + dnf: false, + plus2: false, + rating: 72, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "1206db45-b432-40ec-8729-6fb04eeb920d", + startTime: 1722865356236, + endTime: 1722865370053, + scramble: "L' D' L B U' F' U R D L2 U B2 R2 U' R2 D2 F2 R2 D B2 ", + bookmark: false, + time: 13814, + dnf: false, + plus2: false, + rating: 68, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "586391c3-a8d8-44fe-b1cc-ff60c3140686", + startTime: 1722865446554, + endTime: 1722865461339, + scramble: "B D2 F U' L B R U' F U F2 B2 U R2 L2 D F2 D2 R2 F2 R2 ", + bookmark: false, + time: 14781, + dnf: false, + plus2: false, + rating: 76, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "4ad5a229-6aae-44fe-aee2-b3bc1c3af964", + startTime: 1722865533632, + endTime: 1722865547246, + scramble: + "L2 R2 U2 F2 L2 D L2 U F2 L2 R2 U2 R' F' D' B L' F D F2 U L' ", + bookmark: false, + time: 13614, + dnf: false, + plus2: false, + rating: 66, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "62b4074c-74a3-4697-b9ee-5c4c5c08e218", + startTime: 1722865568064, + endTime: 1722865581560, + scramble: "D2 U2 F' U2 F L2 R2 B L2 D2 U2 F' R' B U L R2 D' R2 U2 F ", + bookmark: false, + time: 13494, + dnf: false, + plus2: false, + rating: 74, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "12a4675d-7a14-4ea4-af5f-a5ec4235f23d", + startTime: 1722865601719, + endTime: 1722865615176, + scramble: "R U2 L' B2 F2 D2 L U2 R' D2 L' F U2 R2 U B' R2 F' R2 F ", + bookmark: false, + time: 13454, + dnf: false, + plus2: false, + rating: 67, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "b6346329-8300-41eb-b7b0-73f53dd7c736", + startTime: 1722865645242, + endTime: 1722865658422, + scramble: "B' L B' R' B2 U' L D2 L' F2 U2 B' R2 B L2 B' U2 F' U2 F2 D2 ", + bookmark: false, + time: 13179, + dnf: false, + plus2: false, + rating: 68, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "414b9227-3f6e-4514-9cab-7756fb377069", + startTime: 1722865681287, + endTime: 1722865696516, + scramble: "U' B2 L2 U' L2 D2 B2 R2 D2 R2 D R B L' B' F' L' F2 D R2 B' ", + bookmark: false, + time: 15226, + dnf: false, + plus2: false, + rating: 81, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "426b0346-c2a2-43c9-ab61-d8884b3610d3", + startTime: 1722865717395, + endTime: 1722865732608, + scramble: "D2 R F2 L2 B U2 R2 F2 R B2 U R2 U' F2 U2 B2 L2 U' F2 U2 R2 ", + bookmark: false, + time: 15210, + dnf: false, + plus2: false, + rating: 75, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "f430d5fb-ab27-4e91-95ce-b28800890651", + startTime: 1722865750478, + endTime: 1722865763546, + scramble: "D' U2 B2 R2 U R2 U2 R2 B2 R2 B2 U' R U' R' F R' U F2 R B' ", + bookmark: false, + time: 13065, + dnf: false, + plus2: false, + rating: 82, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "aa1f07d4-154f-4a0e-ba1d-16c76542c782", + startTime: 1722865780673, + endTime: 1722865791648, + scramble: "D2 B R2 F D2 B R2 B2 U2 B' R2 B U' R B2 U F U' F' D B ", + bookmark: false, + time: 10973, + dnf: false, + plus2: false, + rating: 74, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "c868c582-23bc-451a-9270-cd9993d2732e", + startTime: 1722865819397, + endTime: 1722865830351, + scramble: "B2 D2 L' U2 L' D2 L F2 D2 U2 L2 F2 D L' R D' B D R2 F R2 ", + bookmark: false, + time: 10950, + dnf: false, + plus2: false, + rating: 71, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "1d89fc0a-60cf-4839-ac65-83911c9384d9", + startTime: 1722865848889, + endTime: 1722865862840, + scramble: "F2 R2 U' R2 B2 D' R2 D2 L2 F2 D L' U2 R' F' D U L U R' F2 ", + bookmark: false, + time: 13950, + dnf: false, + plus2: false, + rating: 78, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "e400da82-e409-43de-8bd3-c947b8fc09d2", + startTime: 1725060679529, + endTime: 1725060690942, + scramble: + "U2 R2 D2 L2 U' L2 F2 D L2 F2 D R2 F U' L D2 B2 F R U R F' ", + bookmark: false, + time: 11412, + dnf: false, + plus2: false, + rating: 76, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "37a05e2b-fefb-4a7b-b9f8-3a50c8c0c11c", + startTime: 1725060717826, + endTime: 1725060732612, + scramble: "R U2 L2 D2 B2 L2 B2 R D2 R' D2 R D' F L' F2 R' D U F ", + bookmark: false, + time: 14782, + dnf: false, + plus2: false, + rating: 74, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "60c47568-2985-4d51-b821-b2caca7cbf2d", + startTime: 1725060751690, + endTime: 1725060764944, + scramble: "D2 B' R2 B' L2 U2 B2 L2 U2 B' D2 F' R F' D2 B U L' B R' D2 ", + bookmark: false, + time: 13253, + dnf: false, + plus2: false, + rating: 81, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "076582dc-cd5b-4e25-ab77-b42d0363bf24", + startTime: 1725060791608, + endTime: 1725060806933, + scramble: + "B2 U B2 F2 U2 B2 U L2 U' R2 D B2 L U2 B' D U R' B F2 U2 F2 ", + bookmark: false, + time: 15320, + dnf: false, + plus2: false, + rating: 67, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "9c5ce1cf-26c6-4c47-939b-1420fc88a8c9", + startTime: 1725237430149, + endTime: 1725237443202, + scramble: "B D R' U2 L' B2 R' D B R2 F2 U2 F' R2 L2 U2 B' R2 B L2 ", + bookmark: false, + time: 13050, + dnf: false, + plus2: false, + rating: 69, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "6a0ad69f-ace8-4426-91c8-b049366f21fe", + startTime: 1725237466353, + endTime: 1725237479316, + scramble: "U2 B L2 R2 F2 U2 B' U2 R2 B L2 D' R B R' F U2 F' R D2 ", + bookmark: false, + time: 12960, + dnf: false, + plus2: false, + rating: 78, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "2056e114-e4ff-403c-b840-b60efbd1c794", + startTime: 1725237500150, + endTime: 1725237513743, + scramble: "D2 L2 B F2 U2 F' U2 F' L2 B U2 L2 U' L R' F' R' B' L2 D2 U' ", + bookmark: false, + time: 13589, + dnf: false, + plus2: false, + rating: 77, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "1e8c5874-0941-4b74-b7a2-90630718f844", + startTime: 1725237640264, + endTime: 1725237654171, + scramble: "L2 R2 D2 F U2 F L2 B' L2 D2 B F' L R' F2 D' B' D' R2 U' F ", + bookmark: false, + time: 13904, + dnf: false, + plus2: false, + rating: 81, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "a3e876cc-7cf4-424f-abac-ad8d120f34ac", + startTime: 1725237688642, + endTime: 1725237703922, + scramble: "F2 L2 D2 U2 B' R2 F L2 F D2 U2 B2 D U2 F L2 R2 F' R' D' L' ", + bookmark: false, + time: 15277, + dnf: false, + plus2: false, + rating: 63, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "7f60b2b5-3bb3-41e8-a563-ae3f916b1be2", + startTime: 1725237727816, + endTime: 1725237743208, + scramble: "F' L U' R L' F R2 U' F' U2 L2 B2 D2 B R2 L2 F R2 F' D2 ", + bookmark: false, + time: 15391, + dnf: false, + plus2: false, + rating: 63, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "7dfc2b71-2ceb-45a7-9562-0efa77c0c034", + startTime: 1725237764514, + endTime: 1725237780063, + scramble: "B' R2 B L2 B L2 U2 B2 F' R2 U2 F' R' D2 U L B F2 R' D F' ", + bookmark: false, + time: 15547, + dnf: false, + plus2: false, + rating: 69, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "5c2d3274-14d5-4681-89fb-b4af686a1499", + startTime: 1725237799888, + endTime: 1725237814379, + scramble: "B2 R' F2 D R' U2 F B R D' F2 L2 U B2 D2 R2 U L2 U L2 F2 ", + bookmark: false, + time: 14488, + dnf: false, + plus2: false, + rating: 80, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "428fa8de-f99c-4ac4-a4fa-93d90fb2a014", + startTime: 1725237838587, + endTime: 1725237849343, + scramble: "R B2 U2 R' U2 R U2 R' F2 R B2 L' B D2 L D2 R' F' R2 U ", + bookmark: false, + time: 10756, + dnf: false, + plus2: false, + rating: 76, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, + { + id: "9e657b64-88eb-4b24-be05-b3b677789529", + startTime: 1725237867793, + endTime: 1725237880395, + scramble: + "L2 R2 D' F2 U2 R2 D2 R2 B2 U2 F2 U' R B L' U' R U2 B' D2 U' F2 ", + bookmark: false, + time: 12600, + dnf: false, + plus2: false, + rating: 70, + cubeId: "c3cf8415-f57c-425a-90d9-76623279c6ee", + comment: "", + }, +]; diff --git a/src/app/[locale]/cubes/page.tsx b/src/app/[locale]/cubes/page.tsx index b3c2dcf4..193edcdd 100644 --- a/src/app/[locale]/cubes/page.tsx +++ b/src/app/[locale]/cubes/page.tsx @@ -1,44 +1,214 @@ "use client"; -import { Button } from "@/components/button/index"; -import { InputText } from "@/components/input-text/index"; -import ModalCreate from "@/components/cubes/ModalCreate"; -import { OverallContainer } from "@/components/OverallContainer"; -import { CubesContent } from "@/components/cubes/CubesContent"; -import { OverallHeader } from "@/components/OverallHeader"; -import { OptionsContainer } from "@/components/cubes/OptionsContainer"; + +import { Button } from "@/components/ui/button"; +import { Card } from "@/components/ui/card"; +import { Input } from "@/components/ui/input"; +import { Dialog } from "@/components/ui/dialog"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; import { useCubes } from "@/hooks/useCubes"; -import { AnimatePresence } from "framer-motion"; -import { useCubesModalStore } from "@/store/CubesModalStore"; -import { useTranslations } from "next-intl"; -import { PlusIcon } from "@heroicons/react/24/solid"; +import EmptyCubes from "@/components/cubes/EmptyCubes"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { DateTime } from "luxon"; +import { useLocale, useTranslations } from "next-intl"; +import { Checkbox } from "@/components/ui/checkbox"; +import { Drawer, DrawerTrigger } from "@/components/ui/drawer"; +import DialogDeleteCollection from "@/components/dialogs/dialog-delete-collection/dialog-delete-collection"; +import DrawerCreateCollection from "@/components/drawners/drawner-create-collection/drawner-create-collection"; +import { useDialogCubesOptions } from "@/store/DialogCubesOptions"; +import DialogEditCollection from "@/components/dialogs/dialog-edit-collection/dialog-edit-collection"; +import { useState } from "react"; +import { + DotsHorizontalIcon, + PlayIcon, + PlusIcon, + StopIcon, +} from "@radix-ui/react-icons"; -export default function CubesPage() { - const { filterCubes, handleSearchFilter } = useCubes(); - const { modalOpen, setModalOpen, setSelectedCategory } = useCubesModalStore(); - const t = useTranslations("Index.CubesPage"); +export default function Page() { + const [isOpenDrawerNewCollection, setIsOpenDrawerNewCollection] = + useState(false); + const { isOpen, type, openDialogType, closeDialog } = useDialogCubesOptions(); + const { + filterCubes, + handleSearchFilter, + handleFavoriteClick, + redirectToTimer, + } = useCubes(); + const locale = useLocale(); + const t = useTranslations("Index"); return ( <> - - - - - + + setIsOpenDrawerNewCollection(false)} + /> + + + + + + {/* cubes list */} + {filterCubes ? ( + + + + + + {t("CubesPage.favorite")} + + {t("CubesPage.name")} + {t("CubesPage.category")} + + {t("CubesPage.created-at")} + + + {t("CubesPage.solves")} + + + {t("CubesPage.status")} + + {t("CubesPage.options")} + + + + {filterCubes.map((cube) => { + return ( + + + { + handleFavoriteClick(cube.id); + }} + /> + + redirectToTimer(cube.id)} + className="hover:cursor-pointer" + > + {cube.name} + + redirectToTimer(cube.id)} + className="hover:cursor-pointer" + > + {cube.category} + + redirectToTimer(cube.id)} + className="hover:cursor-pointer hidden md:table-cell" + > + {DateTime.fromMillis(cube.createdAt) + .setLocale(locale) + .toLocaleString()} + + redirectToTimer(cube.id)} + className="hover:cursor-pointer hidden md:table-cell" + > + {cube.solves.session.length}/{cube.solves.all.length} + + redirectToTimer(cube.id)} + className="hover:cursor-pointer hidden md:table-cell" + > + {cube.solves.session.length > 0 ? ( +
+ + {t("CubesPage.using")} +
+ ) : ( +
+ + {t("CubesPage.idle")} +
+ )} +
+ + + + + + + + openDialogType({ + type: "edit", + cube: cube, + }) + } + > + Edit + + + openDialogType({ + type: "delete", + cube: cube, + }) + } + > + Delete + + + + +
+ ); + })} +
+
+
+ ) : ( + {}} /> + )} + + {/* dialogs */} + + + + + + + ); } diff --git a/src/app/[locale]/globals.css b/src/app/[locale]/globals.css index dcb82c27..2cbea5e9 100644 --- a/src/app/[locale]/globals.css +++ b/src/app/[locale]/globals.css @@ -4,7 +4,7 @@ /* width */ ::-webkit-scrollbar { - width: 3px; + width: 6px; } /* Track */ @@ -16,7 +16,7 @@ /* Handle */ ::-webkit-scrollbar-thumb { background: rgb(82 82 91); - border-radius: 5px; + border-radius: 2px; } scramble-display { @@ -56,3 +56,68 @@ scramble-display { max-width: 100%; } } + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 0 0% 3.9%; + --card: 0 0% 100%; + --card-foreground: 0 0% 3.9%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 3.9%; + --primary: 0 0% 9%; + --primary-foreground: 0 0% 98%; + --secondary: 0 0% 96.1%; + --secondary-foreground: 0 0% 9%; + --muted: 0 0% 96.1%; + --muted-foreground: 0 0% 45.1%; + --accent: 0 0% 96.1%; + --accent-foreground: 0 0% 9%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 89.8%; + --input: 0 0% 89.8%; + --ring: 0 0% 3.9%; + --chart-1: 12 76% 61%; + --chart-2: 173 58% 39%; + --chart-3: 197 37% 24%; + --chart-4: 43 74% 66%; + --chart-5: 27 87% 67%; + --radius: 0.5rem; + } + .dark { + --background: 0 0% 3.9%; + --foreground: 0 0% 98%; + --card: 0 0% 3.9%; + --card-foreground: 0 0% 98%; + --popover: 0 0% 3.9%; + --popover-foreground: 0 0% 98%; + --primary: 0 0% 98%; + --primary-foreground: 0 0% 9%; + --secondary: 0 0% 14.9%; + --secondary-foreground: 0 0% 98%; + --muted: 0 0% 14.9%; + --muted-foreground: 0 0% 63.9%; + --accent: 0 0% 14.9%; + --accent-foreground: 0 0% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 14.9%; + --input: 0 0% 14.9%; + --ring: 0 0% 83.1%; + --chart-1: 220 70% 50%; + --chart-2: 160 60% 45%; + --chart-3: 30 80% 55%; + --chart-4: 280 65% 60%; + --chart-5: 340 75% 55%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/src/app/[locale]/layout.tsx b/src/app/[locale]/layout.tsx index dd7d9256..8f9bcadf 100644 --- a/src/app/[locale]/layout.tsx +++ b/src/app/[locale]/layout.tsx @@ -1,3 +1,4 @@ +import { Toaster } from "@/components/ui/sonner"; import "./globals.css"; import PreloadSettings from "@/components/PreloadSettings"; import { roboto } from "@/fonts/fonts"; @@ -49,6 +50,7 @@ export default async function RootLayout({ {children} + ); diff --git a/src/app/[locale]/solves/page.tsx b/src/app/[locale]/solves/page.tsx index b96def59..4c14959e 100644 --- a/src/app/[locale]/solves/page.tsx +++ b/src/app/[locale]/solves/page.tsx @@ -1,242 +1,104 @@ "use client"; -import { Button } from "@/components/button/index"; -import Select from "@/components/Select"; -import ModalSolve from "@/components/solves/ModalSolve"; -import { OverallContainer } from "@/components/OverallContainer"; -import { OverallHeader } from "@/components/OverallHeader"; -import { SolveFilters } from "@/components/solves/SolveFilters"; -import { Filter } from "@/components/solves/Filter"; -import { ButtonsSection } from "@/components/solves/ButtonsSection"; + +import { Card } from "@/components/ui/card"; +import { Input } from "@/components/ui/input"; +import MainCubeSelector from "@/components/MainCubeSelector"; import { SolvesArea } from "@/components/solves/SolvesArea"; -import useSolvesPage from "@/hooks/useSolvesPage"; -import { InputText } from "@/components/input-text/index"; +import { Sheet } from "@/components/ui/sheet"; +import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { useDialogSolve } from "@/store/DialogSolve"; +import SheetSolveDetails from "@/components/sheets/sheet-solve-details/SheetSolveDetails"; +import DropdownFilterSolves from "@/components/dropdowns/dropdown-filter-options/dropdown-filter-options"; import { useTimerStore } from "@/store/timerStore"; -import MoveModal from "@/components/solves/MoveModal"; -import ConfirmDelete from "@/components/solves/ConfirmDelete"; -import { useTranslations } from "next-intl"; +import { useSolveFiltersStore } from "@/store/SolvesFilters"; +import { ScrollArea } from "@/components/ui/scroll-area"; +import { Button } from "@/components/ui/button"; +import { EnterIcon, ExitIcon, Share2Icon } from "@radix-ui/react-icons"; import { - FolderArrowDownIcon, - TrashIcon, - AdjustmentsHorizontalIcon, -} from "@heroicons/react/24/solid"; -import { useRef, useState } from "react"; -import useClickOutside from "@/hooks/useClickOutside"; -import { AnimatePresence, motion } from "framer-motion"; -import sortSolves, { SortMode } from "@/lib/SortSolves"; -import SortModeMenu from "@/components/solves/SortModeMenu"; -import SortOrderMenu from "@/components/solves/SortOrderMenu"; -import SolvesOptionsDropdown from "@/components/solves/SolvesOptionsDropdown"; -import ShareMenu from "@/components/solves/ShareMenu"; - -export default function SolvesPage() { - const { - handleTabClick, - currentTab, - handleMoveAll, - handleTrashAll, - handleSearch, - displaySolves, - isOpenMoveModal, - setIsOpenMoveModal, - handleGetMoveData, - setIsOpenDeleteModal, - handleGetDeleteData, - isOpenDeleteModal, - } = useSolvesPage(); + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; +import { useState } from "react"; +import DialogMoveHistorial from "@/components/dialogs/dialog-move-historial/dialog-move-historial"; +import { Dialog } from "@/components/ui/dialog"; +import { useTranslations } from "next-intl"; - const { selectedCube, setTimerStatistics } = useTimerStore(); +export default function Page() { + const { isDialogSolveOpen, handleCloseDialogSolve } = useDialogSolve(); + const { handleSearch, handleChangeTab, tab } = useSolveFiltersStore(); + const { selectedCube } = useTimerStore(); + const [isOpen, setIsOpen] = useState(false); // Used for move-historial button const t = useTranslations("Index"); - const sortMenuRef = useRef(null); - const sortSubMenuRef = useRef(null); - const solveMenuRef = useRef(null); - const shareMenuRef = useRef(null); - - const [sortOptions, setSortOptions] = useState({ - order: "Descending", - mode: "Date", - }); - const [sortModal, setSortModal] = useState(false); - const [subMenuModal, setSubMenuModal] = useState(false); - const [solvesOptionsMenu, setSolvesOptionsMenu] = useState(false); - const [shareSolveModal, setShareSolveModal] = useState(false); - - sortSolves({ displaySolves, sortMode: sortOptions }); - - useClickOutside(shareMenuRef, () => { - setShareSolveModal(false); - }); - useClickOutside(sortSubMenuRef, () => { - setSubMenuModal(false); - }); - - useClickOutside(sortMenuRef, () => { - setSortModal(false); - }); - - useClickOutside(solveMenuRef, () => { - setSolvesOptionsMenu(false); - }); - return ( <> - - - handleSearch(e.target.value)} + /> + + + + + + +

{t("SolvesPage.tooltips.move-to-history")}

+
+
+
- - {shareSolveModal && ( - - - - )} - + + + - - {sortModal && ( - - { - setSortModal(false); - setSubMenuModal(true); - setSortOptions((options) => ({ - ...options, - mode: e, - })); - }} - /> - - )} - + + + - - {subMenuModal && ( - - { - setSubMenuModal(false); - setSortOptions((options) => ({ - ...options, - order: e, - })); - }} - /> - - )} - - - - - + setIsOpen(false)}> + setIsOpen(false)} /> + - - -
- {isOpenMoveModal && ( - setIsOpenMoveModal(false)} - onConfirm={() => { - setIsOpenMoveModal(false); - handleMoveAll(); - setTimerStatistics(); - }} - data={handleGetMoveData} - /> - )} - {isOpenDeleteModal && ( - setIsOpenDeleteModal(false)} - onConfirm={() => { - setIsOpenDeleteModal(false); - handleTrashAll(); - setTimerStatistics(); - }} - data={handleGetDeleteData} - /> - )} + + + + ); } diff --git a/src/app/[locale]/stats/page.tsx b/src/app/[locale]/stats/page.tsx index 143759c4..5b92a52b 100644 --- a/src/app/[locale]/stats/page.tsx +++ b/src/app/[locale]/stats/page.tsx @@ -1,19 +1,45 @@ "use client"; -import { OverallContainer } from "@/components/OverallContainer"; -import { OverallHeader } from "@/components/OverallHeader"; import CategoryStatistics from "@/components/stats/CategoryStatistics"; +import { Card } from "@/components/ui/card"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; import { useTranslations } from "next-intl"; -export default function StatsPage() { - const t = useTranslations("Index.StatsPage"); - +export default function Page() { + const t = useTranslations("Index"); return ( <> - - + {/* container */} +
+ {/* header */} + +
+

{t("StatsPage.title")}

+
+ +
+
+
- +
); } diff --git a/src/components/MainCubeSelector.tsx b/src/components/MainCubeSelector.tsx new file mode 100644 index 00000000..6286914e --- /dev/null +++ b/src/components/MainCubeSelector.tsx @@ -0,0 +1,68 @@ +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { cubeCollection } from "@/lib/const/cubeCollection"; +import { useTimerStore } from "@/store/timerStore"; +import { useTranslations } from "next-intl"; +import Image from "next/image"; + +export default function MainCubeSelector() { + const t = useTranslations("Index"); + const { cubes, setSelectedCube, setNewScramble, setLastSolve, selectedCube } = + useTimerStore(); + const handleChangeValue = (e: any) => { + const choseCube = cubes?.find((cube) => cube.id === e); + if (!choseCube) return; + setSelectedCube(choseCube); + setNewScramble(choseCube); + setLastSolve(null); + }; + return ( + <> + + + ); +} diff --git a/src/components/PreloadSettings.tsx b/src/components/PreloadSettings.tsx index d72d0278..9d6eb5c7 100644 --- a/src/components/PreloadSettings.tsx +++ b/src/components/PreloadSettings.tsx @@ -4,6 +4,7 @@ import { Navbar } from "@/components/navbar/index"; import { useSettingsModalStore } from "@/store/SettingsModalStore"; import { useTimerStore } from "@/store/timerStore"; import { useBackgroundImageStore } from "@/store/BackgroundThemeStore"; +import { ThemeProvider } from "./theme-provider"; export default function PreloadSettings({ children, }: { @@ -18,9 +19,14 @@ export default function PreloadSettings({ return ( <> -
+
- {children}{" "} - <>{!isSolving && timerStatus === "IDLE" ? : null} + {children} + {!isSolving && timerStatus === "IDLE" ? : null}
-
+ ); } diff --git a/src/components/Select.tsx b/src/components/Select.tsx deleted file mode 100644 index 30898726..00000000 --- a/src/components/Select.tsx +++ /dev/null @@ -1,194 +0,0 @@ -import { useRef, useState } from "react"; -import Image from "next/image"; -import { Categories } from "@/interfaces/Categories"; -import { cubeCollection } from "@/lib/const/cubeCollection"; -import genId from "@/lib/genId"; -import { useTimerStore } from "@/store/timerStore"; -import { useCubesModalStore } from "@/store/CubesModalStore"; -import useClickOutside from "@/hooks/useClickOutside"; -import { AnimatePresence, motion } from "framer-motion"; -import { useBackgroundImageStore } from "@/store/BackgroundThemeStore"; -import { Cube } from "@/interfaces/Cube"; -import { useTranslations } from "next-intl"; -import { ChevronUpDownIcon, PlusIcon } from "@heroicons/react/24/solid"; -import { Link } from "@/i18n/routing"; - -export default function Select() { - const [open, setOpen] = useState(false); - const { selectedCube, cubes } = useTimerStore(); - const componentRef = useRef(null); - const { backgroundImage } = useBackgroundImageStore(); - const t = useTranslations("Index.Inputs"); - const handleClose = () => { - setOpen(false); - }; - - useClickOutside(componentRef, handleClose); - - return ( - <> -
- - - {open === true ? ( - - {/* Favorites */} - - {cubes?.map((cube) => { - if (cube.favorite) { - return ( - - ) : null} - -
- - ); -} - -export function MiniatureIcon({ category }: { category: Categories }) { - const images = cubeCollection.map((option) => { - if (option.name === category) { - return ( - {option.name} - ); - } else { - return null; - } - }); - - return <>{images}; -} - -function Option({ - name, - category, - cubeId, - handleClose, -}: { - name: string; - category: Categories; - cubeId: string; - handleClose: () => void; -}) { - const { - selectedCube, - setSelectedCube, - setNewScramble, - setLastSolve, - cubes, - setTimerStatistics, - } = useTimerStore(); - - return ( -
{ - if (setSelectedCube && setNewScramble) { - const selectCube = cubes?.find((cube: Cube) => cube.id === cubeId); - if (!selectCube) return; - setSelectedCube(selectCube); - setTimerStatistics(); - setNewScramble(selectCube); - setLastSolve(null); - } - handleClose(); - }} - className={`cursor-pointer transition duration-200 p-1 select-none rounded-md ps-2 flex items-center justify-between overflow-hidden ${ - selectedCube?.id === cubeId - ? `light:bg-neutral-700 light:text-neutral-200 dark:bg-zinc-500 dark:text-neutral-50` - : "light:bg-transparent light:text-neutral-900 light:hover:bg-neutral-500 light:hover:text-neutral-100 dark:bg-transparent dark:hover:bg-zinc-700 dark:text-neutral-50" - }`} - > -
- -
{name}
-
-
- ); -} - -function LabelSection({ description }: { description: string }) { - return ( -
- {description} -
- ); -} - -function AddCubeOption() { - const { setModalOpen } = useCubesModalStore(); - const t = useTranslations("Index.Inputs"); - - return ( -
- setModalOpen(true)}> -
- -
{t("add-cube")}
-
- -
- ); -} diff --git a/src/components/charts/LineCharter.tsx b/src/components/charts/LineCharter.tsx index c7795d1f..41712b21 100644 --- a/src/components/charts/LineCharter.tsx +++ b/src/components/charts/LineCharter.tsx @@ -1,3 +1,4 @@ +"use color"; import { Solve } from "@/interfaces/Solve"; import formatTime from "@/lib/formatTime"; import { useSettingsModalStore } from "@/store/SettingsModalStore"; @@ -20,20 +21,27 @@ type TimeObject = { export default function LineCharter({ data, cubeSelected, - optInChart, }: { data: ChartData; cubeSelected: boolean; - optInChart: { - mean: boolean; - best: boolean; - }; }) { const t = useTranslations("Index.StatsPage"); const { settings } = useSettingsModalStore(); const chartContainerRef = useRef(null); useEffect(() => { + const backgroundColor = getComputedStyle( + document.documentElement + ).getPropertyValue("--background"); + + const gridColor = getComputedStyle( + document.documentElement + ).getPropertyValue("--border"); + + const lineColor = getComputedStyle( + document.documentElement + ).getPropertyValue("--primary"); + const chartOptions: DeepPartial = { watermark: { visible: true, @@ -44,25 +52,17 @@ export default function LineCharter({ text: "nexustimer.pro", }, layout: { - textColor: - settings.theme.background.color === "dark" ? "white" : "gray", + textColor: "gray", background: { - color: - settings.theme.background.color === "dark" ? "#09090B" : "#F5F5F5", + color: `hsl(${backgroundColor})`, }, }, grid: { vertLines: { - color: - settings.theme.background.color === "dark" - ? "rgb(41, 44, 58)" - : "rgb(229 229 229)", + color: `hsl(${gridColor})`, }, horzLines: { - color: - settings.theme.background.color === "dark" - ? "rgb(41, 44, 58)" - : "rgb(229 229 229)", + color: `hsl(${gridColor})`, }, }, localization: { @@ -105,11 +105,7 @@ export default function LineCharter({ }); const lineSeries = chart.addLineSeries({ - color: cubeSelected - ? "#0891B2" - : settings.theme.background.color === "dark" - ? "white" - : "black", + // color: cubeSelected ? "#0891B2" : lineColor, lastValueVisible: false, priceLineVisible: false, lineWidth: 1, @@ -144,8 +140,6 @@ export default function LineCharter({ }; lineSeries.setData(structuredData); - optInChart.mean ? lineSeries.createPriceLine(meanTimeLine) : null; - optInChart.best ? lineSeries.createPriceLine(bestTimeLine) : null; chart.autoSizeActive(); chart.timeScale().fitContent(); @@ -159,14 +153,7 @@ export default function LineCharter({ chart.applyOptions({ height: newRect.height, width: newRect.width }); }).observe(container); } - }, [ - data, - cubeSelected, - t, - settings.theme.background.color, - optInChart.best, - optInChart.mean, - ]); + }, [data, cubeSelected, t, settings.theme.background.color]); return
; } diff --git a/src/components/cubes/BookmarkFav.tsx b/src/components/cubes/BookmarkFav.tsx deleted file mode 100644 index 5ecb641f..00000000 --- a/src/components/cubes/BookmarkFav.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { Cube } from "@/interfaces/Cube"; -import { StarIcon } from "@heroicons/react/24/solid"; -import { useState } from "react"; - -export default function BookmarkFav({ - isChecked, - setFavorite, - cube, -}: { - isChecked: boolean; - setFavorite: (cube: Cube) => void; - cube: Cube; -}) { - const [checked, setChecked] = useState(isChecked); - - return ( - - ); -} diff --git a/src/components/cubes/CheckboxImage.tsx b/src/components/cubes/CheckboxImage.tsx deleted file mode 100644 index a82a1072..00000000 --- a/src/components/cubes/CheckboxImage.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { Categories } from "@/interfaces/Categories"; -import Image from "next/image"; - -export default function CheckboxImage({ - id, - value, - src, - alt, - handleClickRadio, - selectedCategory, -}: { - id: string | number; - value: string; - src: string; - alt: string; - handleClickRadio?: (value: any) => void; - selectedCategory: Categories; -}) { - return ( - <> -
- - -
- - ); -} diff --git a/src/components/cubes/CubesContent.tsx b/src/components/cubes/CubesContent.tsx deleted file mode 100644 index 57589e11..00000000 --- a/src/components/cubes/CubesContent.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { Cube } from "@/interfaces/Cube"; -import { CubesSection } from "@/components/cubes/CubesSection"; -import EmptyCubes from "@/components/cubes/EmptyCubes"; -import { useCubesModalStore } from "@/store/CubesModalStore"; - -interface CubesContent { - filterCubes: Cube[] | null; -} - -export function CubesContent({ filterCubes }: CubesContent) { - const { setModalOpen } = useCubesModalStore(); - return ( - <> - {filterCubes && filterCubes.length > 0 ? ( - - ) : ( - setModalOpen(true)} /> - )} - - ); -} diff --git a/src/components/cubes/CubesSection.tsx b/src/components/cubes/CubesSection.tsx deleted file mode 100644 index 63aff582..00000000 --- a/src/components/cubes/CubesSection.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { Cube } from "@/interfaces/Cube"; -import TableHeader from "@/components/cubes/TableHeader"; -import TableRow from "@/components/cubes/TableRow"; - -interface CubesSectionProps { - filterCubes: Cube[]; -} - -export function CubesSection({ filterCubes }: CubesSectionProps) { - return ( - <> -
-
- -
- {filterCubes.map((cube) => ( - - ))} -
-
-
- - ); -} diff --git a/src/components/cubes/DeleteModal.tsx b/src/components/cubes/DeleteModal.tsx deleted file mode 100644 index 0f884460..00000000 --- a/src/components/cubes/DeleteModal.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import { DeleteCubeDetails } from "@/interfaces/DeleteCubeDetails"; -import { useTranslations } from "next-intl"; - -export default function DeleteModal({ - confirmDelete, - cancelDelete, - cubeData, -}: { - confirmDelete: () => void; - cancelDelete: () => void; - cubeData: DeleteCubeDetails | null; -}) { - const t = useTranslations("Index"); - if (!cubeData) return; - return ( - <> -
-
-
- {t("Cubes-modal.question-delete")} -
- -
- {cubeData.name} -
- -
-
-
{t("CubesPage.category")}:
-
{t("Settings-menu.best-time")}:
-
{t("HomePage.best")} Ao5:
-
{t("HomePage.counter")}:
-
- -
-
- {cubeData.category} -
-
- {cubeData.best} -
-
- {cubeData.ao5} -
-
- {cubeData.count} -
-
-
- -
- {t("Cubes-modal.warning-delete")} -
- -
- - - -
-
-
- - ); -} diff --git a/src/components/cubes/ModalCreate.tsx b/src/components/cubes/ModalCreate.tsx deleted file mode 100644 index a3a0bf72..00000000 --- a/src/components/cubes/ModalCreate.tsx +++ /dev/null @@ -1,161 +0,0 @@ -"use client"; -import { InputText } from "@/components/input-text/index"; -import CheckboxImage from "@/components/cubes/CheckboxImage"; -import { cubeCollection } from "@/lib/const/cubeCollection"; -import genId from "@/lib/genId"; -import useModalCube from "@/hooks/useModalCube"; -import { useCubesModalStore } from "@/store/CubesModalStore"; -import DeleteModal from "@/components/cubes/DeleteModal"; -import { motion } from "framer-motion"; -import { useTranslations } from "next-intl"; -import { XMarkIcon } from "@heroicons/react/24/solid"; - -export default function ModalCreate() { - const { editingCube } = useCubesModalStore(); - const { - error, - isDuplicate, - handleClickRadio, - handleWriteCubeName, - handleCreateCube, - handleEditCube, - handleCloseModal, - selectedCategory, - cubeName, - handleDeleteClick, - confirmDelete, - cancelDelete, - showDeleteConfirmation, - cubeData, - } = useModalCube(); - - const t = useTranslations("Index"); - - return ( - <> - {/* */} -
{ - if (e.target === e.currentTarget) handleCloseModal(); - }} - > -
- {/* */} - - {/* */} -
-

- {editingCube - ? t("Cubes-modal.title-editing") - : t("Cubes-modal.title-creating")} -

-
- - {error ? ( -

- {t("Cubes-modal.error-name")} -

- ) : ( - isDuplicate && ( -

- {t("Cubes-modal.error-duplicate")} -

- ) - )} -
- -
- {/* */} - -
- {cubeCollection.map((category) => { - return ( - - ); - })} -
- -
- {t("Cubes-modal.current-select")} {selectedCategory} -
- - {/* */} -
- {editingCube ? ( - - ) : null} - - {!editingCube ? ( - - ) : null} - - -
-
-
-
- {showDeleteConfirmation && ( - - )} - - ); -} diff --git a/src/components/cubes/OptionsContainer.tsx b/src/components/cubes/OptionsContainer.tsx deleted file mode 100644 index 3e3305e7..00000000 --- a/src/components/cubes/OptionsContainer.tsx +++ /dev/null @@ -1,11 +0,0 @@ -interface OptionsContainer { - children: React.ReactNode; -} - -export function OptionsContainer({ children }: OptionsContainer) { - return ( - <> -
{children}
- - ); -} diff --git a/src/components/cubes/TableHeader.tsx b/src/components/cubes/TableHeader.tsx deleted file mode 100644 index 506cb8a0..00000000 --- a/src/components/cubes/TableHeader.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { useTranslations } from "next-intl"; - -export default function TableHeader() { - const t = useTranslations("Index.CubesPage"); - return ( - <> -
-
-
- {t("favorite")} -
-
{t("cube")}
-
- {t("category")} -
-
- {t("solves")} -
-
- {t("created-at")} -
-
- {t("status")} -
-
-
-
- - ); -} diff --git a/src/components/cubes/TableRow.tsx b/src/components/cubes/TableRow.tsx deleted file mode 100644 index 34863e49..00000000 --- a/src/components/cubes/TableRow.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import { Cube } from "@/interfaces/Cube"; -import BookmarkFav from "@/components/cubes/BookmarkFav"; -import { useTimerStore } from "@/store/timerStore"; -import { useCubesModalStore } from "@/store/CubesModalStore"; -import { useRouter } from "@/i18n/routing"; -import { getAllCubes, saveCube } from "@/db/dbOperations"; -import { useTranslations, useLocale } from "next-intl"; -import { DateTime } from "luxon"; -import { - EllipsisHorizontalIcon, - PlayIcon, - StopIcon, -} from "@heroicons/react/24/solid"; - -export default function TableRow({ cube }: { cube: Cube }) { - const t = useTranslations("Index.CubesPage"); - const router = useRouter(); - const { - setSelectedCube, - setNewScramble, - setLastSolve, - setCubes, - setTimerStatistics, - } = useTimerStore(); - const { setEditingCube, setModalOpen, setCubeName, setSelectedCategory } = - useCubesModalStore(); - const setFavorite = async (cube: Cube) => { - await saveCube({ - ...cube, - favorite: !cube.favorite, - }); - - const cubesDB = await getAllCubes(); - setCubes(cubesDB); - }; - - const locale = useLocale(); - - const redirectToHome = (e: any) => { - const targetDiv = e.target; - const divIndex = Array.from(e.currentTarget.children).indexOf(targetDiv); - if (divIndex > 0 && divIndex < e.currentTarget.children.length - 1) { - setSelectedCube(cube); - setTimerStatistics(); - setNewScramble(cube); - setLastSolve(null); - router.push("/"); - } - }; - - return ( - <> -
redirectToHome(e)} - className="table-row h-10 transition duration-200 bg-transparent dark:even:bg-zinc-900 light:even:bg-neutral-200 dark:hover:bg-zinc-800 light:hover:bg-neutral-300 dark:text-neutral-100 light:text-neutral-950 " - > -
- setFavorite(cube)} - /> -
-
- {cube.name} -
-
- {cube?.category} -
-
- {`${cube?.solves?.session.length}/${cube?.solves?.all.length}`} -
-
- {DateTime.fromMillis(cube?.createdAt) - .setLocale(locale) - .toLocaleString()} -
-
- {cube?.solves?.session.length > 0 ? ( -
- - - {t("using")} -
- ) : ( -
- - - {t("idle")} -
- )} -
-
- -
-
- - ); -} diff --git a/src/components/dialogs/dialog-delete-collection/dialog-delete-collection.tsx b/src/components/dialogs/dialog-delete-collection/dialog-delete-collection.tsx new file mode 100644 index 00000000..2fd8859b --- /dev/null +++ b/src/components/dialogs/dialog-delete-collection/dialog-delete-collection.tsx @@ -0,0 +1,93 @@ +import { Alert, AlertDescription } from "@/components/ui/alert"; +import { Button } from "@/components/ui/button"; +import { + DialogClose, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { deleteCubeById, getAllCubes } from "@/db/dbOperations"; +import { useDialogCubesOptions } from "@/store/DialogCubesOptions"; +import { useTimerStore } from "@/store/timerStore"; +import { useTranslations } from "next-intl"; +import { useState } from "react"; + +export default function DialogDeleteCollection() { + const t = useTranslations("Index"); + const { setCubes } = useTimerStore(); + const { cube, closeDialog } = useDialogCubesOptions(); + const [cubeName, setCubeName] = useState(""); + const [error, setError] = useState({ + status: false, + message: "", + }); + const handleDeleteCube = async () => { + try { + if (cubeName.trim() !== cube?.name) { + setError((prev) => ({ + ...prev, + status: true, + message: t("Errors.not-match"), + })); + return; + } + + await deleteCubeById(cube.id); + const cubes = await getAllCubes(); + setCubes(cubes); + closeDialog(); + } catch (err) { + console.log(err); + } + }; + return ( + <> + + + {t("Cubes-modal.delete-collection")} + + {t("Cubes-modal.delete-collection-description")} + + + + + + {t("Cubes-modal.warning-alert")}{" "} + {t("Cubes-modal.warning-msg")} + + + + + { + setError((prev) => ({ ...prev, status: false, message: "" })); + setCubeName(e.target.value); + }} + /> + + {error && error.status && ( +

{error.message}

+ )} + +
+ + + + + +
+
+
+ + ); +} diff --git a/src/components/dialogs/dialog-edit-collection/dialog-edit-collection.tsx b/src/components/dialogs/dialog-edit-collection/dialog-edit-collection.tsx new file mode 100644 index 00000000..16c3dfb9 --- /dev/null +++ b/src/components/dialogs/dialog-edit-collection/dialog-edit-collection.tsx @@ -0,0 +1,166 @@ +import { Alert, AlertDescription } from "@/components/ui/alert"; +import { Button } from "@/components/ui/button"; +import { + DialogClose, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; + +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { getAllCubes, saveCube } from "@/db/dbOperations"; +import { cubeCollection } from "@/lib/const/cubeCollection"; +import { useDialogCubesOptions } from "@/store/DialogCubesOptions"; +import { useSettingsModalStore } from "@/store/SettingsModalStore"; +import { useTimerStore } from "@/store/timerStore"; +import { useTranslations } from "next-intl"; +import { useEffect, useState } from "react"; + +export default function DialogEditCollection() { + const t = useTranslations("Index"); + const { cube, closeDialog } = useDialogCubesOptions(); + const { cubes, setCubes, selectedCube, setSelectedCube, setTimerStatistics } = + useTimerStore(); + const { settings, setSettings } = useSettingsModalStore(); + const [form, setForm] = useState({ + name: cube?.name || "", + category: cube?.category || "2x2", + }); + const [error, setError] = useState({ + status: false, + message: "", + }); + const handleSubmitEditCubeCollection = async () => { + try { + // verify if its repeated the name + if (cubes?.some((e) => e.name === form.name)) { + setError((prev) => ({ + ...prev, + status: true, + message: t("Errors.repeated-name"), + })); + return; + } + + // update cube info that its linked to settings "preferences" the default start cube + if (cube && cube.id === settings.preferences.defaultCube.cube?.id) { + const newSettings = { + ...settings, + preferences: { + ...settings.preferences, + defaultCube: { + ...settings.preferences.defaultCube, + cube: { + ...settings.preferences.defaultCube.cube, + name: form.name, + category: form.category, + }, + }, + }, + }; + setSettings(newSettings); + window.localStorage.setItem("settings", JSON.stringify(newSettings)); + } + + await saveCube({ + ...cube, + name: form.name.trim(), + category: form.category, + }); + + const cubesDB = await getAllCubes(); + setCubes(cubesDB); + + if (cube && cube.id === selectedCube?.id) { + setSelectedCube(null); + setTimerStatistics(); + } + + // update states + closeDialog(); + } catch (err) { + console.log(err); + } + }; + + // helps to refresh input (name) when re-open the dialog + useEffect(() => { + setForm((prev) => ({ + ...prev, + category: cube?.category || "2x2", + name: cube?.name || "", + })); + }, [cube]); + + return ( + <> + + + {t("Cubes-modal.edit-collection")} + + + + + {t("Cubes-modal.danger-msg")} + + + + + { + setForm((prev) => ({ ...prev, name: e.target.value })); + }} + /> + + {error && error.status && ( +

{error.message}

+ )} + + + + +
+ + + + + +
+
+
+ + ); +} diff --git a/src/components/dialogs/dialog-move-historial/dialog-move-historial.tsx b/src/components/dialogs/dialog-move-historial/dialog-move-historial.tsx new file mode 100644 index 00000000..4a2b69aa --- /dev/null +++ b/src/components/dialogs/dialog-move-historial/dialog-move-historial.tsx @@ -0,0 +1,63 @@ +import { Button } from "@/components/ui/button"; +import { + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { getAllCubes, getCubeById } from "@/db/dbOperations"; +import finishSession from "@/lib/finishSession"; +import { useTimerStore } from "@/store/timerStore"; +import { useTranslations } from "next-intl"; +import { toast } from "sonner"; + +export default function DialogMoveHistorial({ + handleClose, +}: { + handleClose: () => void; +}) { + const t = useTranslations("Index"); + const { selectedCube, cubes, setCubes, setSelectedCube, setTimerStatistics } = + useTimerStore(); + + const handleMoveSessionToHistorial = async () => { + if (selectedCube) { + await finishSession({ selectedCube, cubesDB: cubes }); + const cubesDB = await getAllCubes(); + setCubes(cubesDB); + const currentCube = await getCubeById(selectedCube.id); + setSelectedCube(currentCube); + setTimerStatistics(); + handleClose(); + return; + } + + toast(t("SolvesPage.toast.unable-action"), { + description: t("SolvesPage.toast.warning-select-cube"), + }); + }; + + return ( + <> + + + {t("SolvesPage.dialogs.move-to-history")} + + {t("SolvesPage.dialogs.move-to-history-para")} + + +
+ + +
+
+
+
+ + ); +} diff --git a/src/components/drawners/drawner-create-collection/drawner-create-collection.tsx b/src/components/drawners/drawner-create-collection/drawner-create-collection.tsx new file mode 100644 index 00000000..28a988de --- /dev/null +++ b/src/components/drawners/drawner-create-collection/drawner-create-collection.tsx @@ -0,0 +1,145 @@ +import { Button } from "@/components/ui/button"; +import { + DrawerClose, + DrawerContent, + DrawerDescription, + DrawerFooter, + DrawerHeader, + DrawerTitle, +} from "@/components/ui/drawer"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { getAllCubes, saveCube } from "@/db/dbOperations"; +import { Categories } from "@/interfaces/Categories"; +import { cubeCollection } from "@/lib/const/cubeCollection"; +import genId from "@/lib/genId"; +import { cn } from "@/lib/utils"; +import { useTimerStore } from "@/store/timerStore"; +import { useTranslations } from "next-intl"; +import Image from "next/image"; +import { useState } from "react"; + +interface FormProps { + category: Categories; + name: string; +} + +export default function DrawerCreateCollection({ + closeDrawer, +}: { + closeDrawer: () => void; +}) { + const t = useTranslations("Index"); + const [newCollection, setNewCollection] = useState({ + category: "2x2", + name: "", + }); + const { setCubes, cubes } = useTimerStore(); + const [error, setError] = useState({ + error: false, + message: "", + }); + + const handleSubmitNewCollection = async () => { + try { + if (newCollection.name.trim() === "") { + setError((prev) => ({ + ...prev, + error: true, + message: t("Errors.empty-input"), + })); + return; + } + + if ( + cubes && + cubes.some((cube) => cube.name === newCollection.name.trim()) + ) { + setError((prev) => ({ + ...prev, + error: true, + message: t("Errors.repeated-name"), + })); + return; + } + + await saveCube({ + name: newCollection.name, + category: newCollection.category, + }); + const cubesDB = await getAllCubes(); + setCubes(cubesDB); + closeDrawer(); + } catch (err) { + console.log(err); + } + }; + + return ( + + + {t("Cubes-modal.new-collection")} + + {t("Cubes-modal.new-collection-description")} + + + +
+ + { + setNewCollection((prev) => ({ ...prev, name: e.target.value })); + setError((prev) => ({ ...prev, error: false, message: "" })); + }} + /> + + {error &&

{error.message}

} + +
+ +
+ {cubeCollection.map((e) => { + return ( + {e.event { + console.log(e.name); + setNewCollection((prev) => ({ ...prev, category: e.name })); + }} + /> + ); + })} +
+ +
+ +
+ + + + + + + +
+ ); +} diff --git a/src/components/dropdowns/dropdown-filter-options/dropdown-filter-options.tsx b/src/components/dropdowns/dropdown-filter-options/dropdown-filter-options.tsx new file mode 100644 index 00000000..14c6dddc --- /dev/null +++ b/src/components/dropdowns/dropdown-filter-options/dropdown-filter-options.tsx @@ -0,0 +1,153 @@ +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuPortal, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { createShareMessage } from "@/lib/createShareMessage"; +import { useSolveFiltersStore } from "@/store/SolvesFilters"; +import { useTimerStore } from "@/store/timerStore"; +import { + DotsVerticalIcon, + DragHandleHorizontalIcon, + DragHandleVerticalIcon, + Share1Icon, +} from "@radix-ui/react-icons"; +import { DateTime } from "luxon"; +import { useLocale, useTranslations } from "next-intl"; +import { toast } from "sonner"; + +export default function DropdownFilterSolves() { + const t = useTranslations("Index"); + const { sortType, order, handleChangeOrder, handleChangeSortType, tab } = + useSolveFiltersStore(); + const { selectedCube } = useTimerStore(); + const locale = useLocale(); + const date = DateTime.now().setLocale(locale).toLocaleString(); + const handleShare = (type: "All" | "3" | "5" | "12" | "50" | "100") => { + if (selectedCube) { + const tempSolves = + tab === "all" ? selectedCube.solves.all : selectedCube.solves.session; + + const message = createShareMessage({ + type, + solves: tempSolves, + translations: { + statsTitle: t("SolvesPage.share-clipboard.header"), + avg: t("SolvesPage.share-clipboard.average"), + listOfTimes: t("SolvesPage.share-clipboard.list-of-times"), + date: date, + }, + }); + + if ("clipboard" in navigator) { + navigator.clipboard.writeText(message); + } + + toast(t("SolvesPage.toast.success-copy"), { + description: t("SolvesPage.toast.success-copy-description"), + }); + } else { + toast(t("SolvesPage.toast.unable-action"), { + description: t("SolvesPage.toast.warning-select-cube"), + }); + } + }; + + return ( + <> + + + + + + {/* sort - type */} + + +
+ +

{t("SolvesPage.sort")}

+
+
+ + + { + handleChangeSortType(e as any); + }} + > + + {t("SolvesPage.time")} + + + {t("SolvesPage.date")} + + + + +
+ + {/* sort - direction */} + + +
+ +

{t("SolvesPage.order")}

+
+
+ + + { + handleChangeOrder(e as any); + }} + > + + {t("SolvesPage.ascending")} + + + {t("SolvesPage.descending")} + + + + +
+ + {/* share */} + + +
+ +

{t("SolvesPage.share")}

+
+
+ + + handleShare("5")}> + {t("SolvesPage.last")} Ao5 + + handleShare("12")}> + {t("SolvesPage.last")} Ao12 + + handleShare("All")}> + {t("SolvesPage.all")} + + + +
+
+
+ + ); +} diff --git a/src/components/menu-settings/CustomTheme.tsx b/src/components/menu-settings/CustomTheme.tsx index c2b611dc..0dcafbb1 100644 --- a/src/components/menu-settings/CustomTheme.tsx +++ b/src/components/menu-settings/CustomTheme.tsx @@ -1,8 +1,8 @@ import { ChangeEvent, useRef } from "react"; -import { Button } from "../button"; import { useBackgroundImageStore } from "@/store/BackgroundThemeStore"; import { useTranslations } from "next-intl"; -import { GifIcon, PhotoIcon } from "@heroicons/react/24/solid"; +import { Button } from "../ui/button"; +import { ImageIcon } from "@radix-ui/react-icons"; export default function CustomTheme() { const dataInputRef = useRef(null); @@ -62,12 +62,13 @@ export default function CustomTheme() { onChange={handleImageChange} />
{t("format")} .png .jpg .gif
diff --git a/src/components/menu-settings/DataImportExport.tsx b/src/components/menu-settings/DataImportExport.tsx index 1d6c37ee..e06355be 100644 --- a/src/components/menu-settings/DataImportExport.tsx +++ b/src/components/menu-settings/DataImportExport.tsx @@ -1,8 +1,8 @@ import exportDataToFile from "@/lib/exportDataToFile"; -import { Button } from "@/components/button"; import { useSettingsModalStore } from "@/store/SettingsModalStore"; import { useTranslations } from "next-intl"; -import { BarsArrowDownIcon, BarsArrowUpIcon } from "@heroicons/react/24/solid"; +import { Button } from "../ui/button"; +import { DownloadIcon, UploadIcon } from "@radix-ui/react-icons"; export function DataImportExport() { const t = useTranslations("Index.Settings-menu"); @@ -10,19 +10,20 @@ export function DataImportExport() { return (
); } diff --git a/src/components/menu-settings/Menu.tsx b/src/components/menu-settings/Menu.tsx index bd7d16b5..5a4f8d62 100644 --- a/src/components/menu-settings/Menu.tsx +++ b/src/components/menu-settings/Menu.tsx @@ -11,17 +11,20 @@ import { AnimatePresence, motion } from "framer-motion"; import CustomTheme from "./CustomTheme"; import { useTranslations } from "next-intl"; import MenuSelectLanguage from "./MenuSelectLanguage"; +import MenuSelectDefaultStartCube from "./MenuSelectDefaultStartCube"; +import { ScrollArea } from "../ui/scroll-area"; +import { Button } from "../ui/button"; import { ArrowLeftIcon, - BellAlertIcon, - CogIcon, - CpuChipIcon, - FolderIcon, - IdentificationIcon, - SparklesIcon, - ViewColumnsIcon, -} from "@heroicons/react/24/solid"; -import MenuSelectDefaultStartCube from "./MenuSelectDefaultStartCube"; + BellIcon, + BoxModelIcon, + ComponentBooleanIcon, + ExternalLinkIcon, + FileTextIcon, + LapTimerIcon, + MagicWandIcon, + QuoteIcon, +} from "@radix-ui/react-icons"; export default function MenuSettings() { const { settingsOpen, setSettingsOpen, settings } = useSettingsModalStore(); @@ -35,152 +38,142 @@ export default function MenuSettings() { <> {settingsOpen && !isSolving ? ( -
+
-
- setSettingsOpen(false)} - className="flex items-center cursor-pointer ms-3" - > - - -
- {t("title")} + +
+ setSettingsOpen(false)} + className="flex items-center cursor-pointer ms-3 absolute top-0 left-0" + > + + +
+ {t("title")} +
-
- - - - } - title={t("timer")} - > - - - - - - - } - title={t("features")} - > - - - - - - - - } - title={t("alerts")} - > - - - - - - - } - title={t("theme")} - > - - - - - } - title={t("data")} - > - - - - } - title={t("preferences")} - > - - - - } - title={t("about")} - > -
- logo + + } title={t("timer")}> + + + + + -
- ”{t("legend")}” -
+ } title={t("features")}> + + + + + + + + } title={t("alerts")}> + + + + + + + } title={t("theme")}> + + + -
- - {t("suggest")} - - - {t("report-bug")} - + } title={t("data")}> + + + + } title={t("preferences")}> + + + + } title={t("about")}> +
+ logo + +
+ ”{t("legend")}” +
+ +
+ + + + + + + +
-
- + + {/* Area to the right -> Its a transparent layer next to menu */} { + const currentSettings = loadSettings(); + + Object.values(currentSettings.timer).forEach((setting: any) => { + if (setting.key === id) { + setting.status = !setting.status; + } + }); + + Object.values(currentSettings.alerts).forEach((setting: any) => { + if (setting.key === id) { + setting.status = !setting.status; + } + }); + Object.values(currentSettings.features).forEach((setting: any) => { + if (setting.key === id) { + setting.status = !setting.status; + } + }); + + window.localStorage.setItem("settings", JSON.stringify(currentSettings)); + setSettings(currentSettings); + }; + return (
-
{label}
+
{label}
- +
); diff --git a/src/components/menu-settings/MenuSection.tsx b/src/components/menu-settings/MenuSection.tsx index 48a30bf0..def6b62e 100644 --- a/src/components/menu-settings/MenuSection.tsx +++ b/src/components/menu-settings/MenuSection.tsx @@ -8,7 +8,7 @@ export function MenuSection({ children, icon, title }: MenuSection) { return ( <>
-
+
{icon}
{title} diff --git a/src/components/menu-settings/MenuSelectDefaultStartCube.tsx b/src/components/menu-settings/MenuSelectDefaultStartCube.tsx index b4fc35d5..ec507baa 100644 --- a/src/components/menu-settings/MenuSelectDefaultStartCube.tsx +++ b/src/components/menu-settings/MenuSelectDefaultStartCube.tsx @@ -1,96 +1,66 @@ import { useTranslations } from "next-intl"; -import { useRef, useState } from "react"; +import { useState } from "react"; import { useSettingsModalStore } from "@/store/SettingsModalStore"; -import useClickOutside from "@/hooks/useClickOutside"; import { useTimerStore } from "@/store/timerStore"; -import { MiniatureIcon } from "../Select"; -import { AnimatePresence, motion } from "framer-motion"; import loadSettings from "@/lib/loadSettings"; import { Cube } from "@/interfaces/Cube"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; export default function MenuSelectDefaultStartCube() { const { settings, setSettings } = useSettingsModalStore(); const t = useTranslations("Index"); - - const [open, setOpen] = useState(false); const { cubes } = useTimerStore(); - const componentRef = useRef(null); - const handleClose = () => { - setOpen(false); - }; + const handleCubeSelect = (cubeId: string) => { + // if selected no cube at start + if (cubeId === "none") { + const currentSettings = loadSettings(); + currentSettings.preferences.defaultCube.cube = null; + setSettings(currentSettings); + window.localStorage.setItem("settings", JSON.stringify(currentSettings)); + return; + } - const handleCubeSelect = (cube: Cube | null) => { + // if selected a cube for start + const selection = cubes?.find((i) => i.id === cubeId); + if (!selection) return; const currentSettings = loadSettings(); - currentSettings.preferences.defaultCube.cube = cube; + currentSettings.preferences.defaultCube.cube = selection; setSettings(currentSettings); window.localStorage.setItem("settings", JSON.stringify(currentSettings)); - handleClose(); }; - const defaultCube = settings.preferences.defaultCube.cube; - - useClickOutside(componentRef, handleClose); + const defaultCube = settings.preferences.defaultCube.cube?.id; return (
-
{t("Settings-menu.default-cube")}
+
{t("Settings-menu.auto-select")}
-
); diff --git a/src/components/menu-settings/MenuSelectLanguage.tsx b/src/components/menu-settings/MenuSelectLanguage.tsx index 6e1f6527..e8ead6e4 100644 --- a/src/components/menu-settings/MenuSelectLanguage.tsx +++ b/src/components/menu-settings/MenuSelectLanguage.tsx @@ -3,75 +3,49 @@ import { MenuSection } from "./MenuSection"; import { useLocale, useTranslations } from "next-intl"; import { languages } from "@/lib/const/languages"; -import { useRef } from "react"; import { useRouter } from "@/i18n/routing"; import { useSettingsModalStore } from "@/store/SettingsModalStore"; -import { GlobeAltIcon } from "@heroicons/react/24/solid"; -import { Button } from "../button"; -import useClickOutside from "@/hooks/useClickOutside"; -import useOpenClose from "@/hooks/useOpenClose"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { GlobeIcon } from "@radix-ui/react-icons"; export default function MenuSelectLanguage() { - const { isOpen, close, toggle } = useOpenClose(false); - const componentRef = useRef(null); - useClickOutside(componentRef, () => close()); const { setSettingsOpen } = useSettingsModalStore(); const t = useTranslations("Index.Settings-menu"); const router = useRouter(); const locale = useLocale(); - function onSelectChange(event: any) { - const nextLocale = event.target.id; + function handleLanguageChange(event: any) { + const nextLocale = event; setSettingsOpen(false); router.replace(`${window.location.origin}/${nextLocale}`); } - const localeData = (locale: string) => { - const language = languages.find((item) => item.code === locale); - if (!language) return languages[0]; - return language; - }; - const labelData = localeData(locale)?.name.toString(); - const flagIcon = localeData(locale)?.flag; return ( <> - } - title={t("locale")} - > + } title={t("locale")}>
{t("language")}
-
diff --git a/src/components/menu-settings/ThemeSelect.tsx b/src/components/menu-settings/ThemeSelect.tsx index 3f2b2098..405f43c2 100644 --- a/src/components/menu-settings/ThemeSelect.tsx +++ b/src/components/menu-settings/ThemeSelect.tsx @@ -2,6 +2,7 @@ import { Themes } from "@/interfaces/types/Themes"; import loadSettings from "@/lib/loadSettings"; import { useBackgroundImageStore } from "@/store/BackgroundThemeStore"; import { useSettingsModalStore } from "@/store/SettingsModalStore"; +import { useTheme } from "next-themes"; interface Variation { bg: string; @@ -13,6 +14,7 @@ interface Variation { export default function ThemeSelect() { const { settings, setSettings } = useSettingsModalStore(); const { backgroundImage, deleteBackgroundImage } = useBackgroundImageStore(); + const { setTheme } = useTheme(); const variation: Variation[] = [ { bg: "bg-neutral-100", @@ -45,30 +47,30 @@ export default function ThemeSelect() { currentSettings.theme.background.color = theme; window.localStorage.setItem("settings", JSON.stringify(currentSettings)); setSettings(currentSettings); + setTheme(themeKey); }; return ( -
+
{variation.map((item) => ( -
+
handleSelectTheme(item.key)} + className="flex flex-col items-center justify-center" + >
handleSelectTheme(item.key)} - className="flex flex-col items-center justify-center" - > -
-
{item.name}
-
+ className={`cursor-pointer size-20 rounded-full ${item.bg} ${ + item.key === settings.theme.background.color + ? "outline outline-blue-600" + : "border border-neutral-400" + }`} + >
+
{item.name}
))} {backgroundImage && (
X
diff --git a/src/components/menu-solve-options/menu-solve-options.tsx b/src/components/menu-solve-options/menu-solve-options.tsx new file mode 100644 index 00000000..78851815 --- /dev/null +++ b/src/components/menu-solve-options/menu-solve-options.tsx @@ -0,0 +1,208 @@ +import { Button } from "@/components/ui/button"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; +import { getAllCubes, getCubeById } from "@/db/dbOperations"; +import { Solve } from "@/interfaces/Solve"; +import formatTime from "@/lib/formatTime"; +import updateSolve from "@/lib/updateSolve"; +import { useDialogSolve } from "@/store/DialogSolve"; +import { useTimerStore } from "@/store/timerStore"; +import { + BookmarkFilledIcon, + BookmarkIcon, + CopyIcon, + Cross1Icon, +} from "@radix-ui/react-icons"; +import { useTranslations } from "next-intl"; +import { toast } from "sonner"; + +export default function MenuSolveOptions({ + solve, + onDeleteSolve = () => {}, + caseOfUse, +}: { + solve: Solve | null; + onDeleteSolve?: () => void; + caseOfUse: "last-solve" | "modal-solve"; +}) { + const t = useTranslations("Index"); + const { selectedCube, setCubes, setSelectedCube } = useTimerStore(); + const dialog = useDialogSolve(); + const { lastSolve, setLastSolve } = useTimerStore(); + + if (!solve && !selectedCube) return null; + + const handleDeleteSolve = async () => { + if (solve && selectedCube) { + await updateSolve({ + solveId: solve.id, + selectedCube: selectedCube, + type: "DELETE", + }); + + const lastCubes = await getAllCubes(); + setCubes([...lastCubes]); + + const lastCube = await getCubeById(selectedCube.id); + if (lastCube) { + setSelectedCube({ ...lastCube }); + } + + toast("", { + description: "Deleted solve", + duration: 1000, + }); + + onDeleteSolve(); + } + }; + + const handlePenaltyPlus2 = async () => { + if (solve && selectedCube) { + await updateSolve({ + solveId: solve.id, + selectedCube: selectedCube, + type: "+2", + }); + const lastCubes = await getAllCubes(); + setCubes([...lastCubes]); + + const lastCube = await getCubeById(selectedCube.id); + if (lastCube) { + setSelectedCube({ ...lastCube }); + } + + if (caseOfUse === "modal-solve") { + dialog.handleSetSolveInDialog({ + solve: { ...solve, plus2: !solve.plus2 }, + }); + } + + if (caseOfUse === "last-solve" && lastSolve) { + setLastSolve({ ...lastSolve, plus2: !lastSolve.plus2 }); + } + + toast("", { + description: "Penalty status updated.", + duration: 1000, + }); + } + }; + + const handleBookmarkSolve = async () => { + if (solve && selectedCube) { + await updateSolve({ + solveId: solve.id, + selectedCube: selectedCube, + type: "BOOKMARK", + }); + const lastCubes = await getAllCubes(); + setCubes([...lastCubes]); + + const lastCube = await getCubeById(selectedCube.id); + if (lastCube) { + setSelectedCube({ ...lastCube }); + } + + if (caseOfUse === "modal-solve") { + dialog.handleSetSolveInDialog({ + solve: { ...solve, bookmark: !solve.bookmark }, + }); + } + + if (caseOfUse === "last-solve" && lastSolve) { + setLastSolve({ ...lastSolve, bookmark: !lastSolve.bookmark }); + } + + toast("", { + description: "Bookmark status updated.", + duration: 1000, + }); + } + }; + + const handleClipboardSolve = () => { + if ("clipboard" in navigator) { + navigator.clipboard.writeText( + `${formatTime(solve?.time || 0)} - ${solve?.scramble}` + ); + } + + toast(t("SolvesPage.toast.success-copy"), { + description: t("SolvesPage.toast.success-copy-description"), + duration: 1000, + }); + }; + + return ( + <> + {/* options */} +
+ + + + + + +

{t("tooltips.delete")}

+
+
+ + + + + +

{t("tooltips.plus-two")}

+
+
+ + + {caseOfUse === "last-solve" ? ( + + ) : ( + + )} + + +

{t("tooltips.bookmark")}

+
+
+ + + + + +

{t("tooltips.copy")}

+
+
+
+
+ + ); +} diff --git a/src/components/navbar/NavContainer.tsx b/src/components/navbar/NavContainer.tsx index 8ae7f701..5582bcf8 100644 --- a/src/components/navbar/NavContainer.tsx +++ b/src/components/navbar/NavContainer.tsx @@ -1,15 +1,15 @@ +import { Card } from "../ui/card"; + interface NavContainer { children: React.ReactNode; } export function NavContainer({ children }: NavContainer) { return ( -