diff --git a/Cartesian.Frontend/.vscode/extensions.json b/Cartesian.Frontend/.vscode/extensions.json index 7a0bae1..8495979 100644 --- a/Cartesian.Frontend/.vscode/extensions.json +++ b/Cartesian.Frontend/.vscode/extensions.json @@ -1,8 +1,8 @@ { - "recommendations": [ - "esbenp.prettier-vscode", - "oxc.oxc-vscode", - "svelte.svelte-vscode", - "inlang.vs-code-extension" - ] -} \ No newline at end of file + "recommendations": [ + "esbenp.prettier-vscode", + "oxc.oxc-vscode", + "svelte.svelte-vscode", + "inlang.vs-code-extension" + ] +} diff --git a/Cartesian.Frontend/AGENTS.md b/Cartesian.Frontend/AGENTS.md index cce21b3..e0877c3 100644 --- a/Cartesian.Frontend/AGENTS.md +++ b/Cartesian.Frontend/AGENTS.md @@ -66,7 +66,7 @@ Svelte Runes - `$effect`: Manage side effects and lifecycle ```typescript $effect(() => { - console.log(`Count is now ${count}`); + console.log(`Count is now ${count}`); }); ``` - `$props`: Declare component props @@ -146,20 +146,20 @@ State Management ```typescript // counter.svelte.ts class Counter { - count = $state(0); - incrementor = $state(1); + count = $state(0); + incrementor = $state(1); - increment() { - this.count += this.incrementor; - } + increment() { + this.count += this.incrementor; + } - resetCount() { - this.count = 0; - } + resetCount() { + this.count = 0; + } - resetIncrementor() { - this.incrementor = 1; - } + resetIncrementor() { + this.incrementor = 1; + } } export const counter = new Counter(); diff --git a/Cartesian.Frontend/messages/en.json b/Cartesian.Frontend/messages/en.json index d53ce47..55aba71 100644 --- a/Cartesian.Frontend/messages/en.json +++ b/Cartesian.Frontend/messages/en.json @@ -1,41 +1,174 @@ { - "$schema": "https://inlang.com/schema/inlang-message-format", - "nav_home": "Home", - "nav_map": "Map", - "nav_settings": "Settings", - "nav_group_main_app": "Application", - "tag_outdoor": "Outdoor", - "tag_sport": "Sport", - "tag_fitness": "Fitness", - "tag_literature": "Literature", - "tag_business": "Business", - "tag_tech": "Tech", - "tag_educational": "Educational", - "tag_kids": "Kids", - "tag_family": "Family", - "tag_parenting": "Parenting", - "tag_conference": "Conference", - "tag_film": "Film", - "tag_fashion": "Fashion", - "tag_running": "Running", - "tag_cycling": "Cycling", - "tag_board_games": "Board Games", - "tag_video_games": "Video Games", - "tag_entertainment": "Entertainment", - "tag_comedy": "Comedy", - "tag_arts": "Arts", - "tag_hobby": "Hobby", - "tag_party": "Party", - "tag_gathering": "Gathering", - "tag_charity": "Charity", - "tag_volunteering": "Volunteering", - "tag_environmental": "Environmental", - "tag_festival": "Festival", - "tag_concert": "Concert", - "tag_food": "Food", - "tag_travel": "Travel", - "tag_religious": "Religious", - "tag_study": "Study", - "tag_market": "Market", - "tag_political": "Political" + "$schema": "https://inlang.com/schema/inlang-message-format", + "nav_home": "Home", + "nav_map": "Map", + "nav_settings": "Settings", + "nav_group_main_app": "Application", + "tag_outdoor": "Outdoor", + "tag_sport": "Sport", + "tag_fitness": "Fitness", + "tag_literature": "Literature", + "tag_business": "Business", + "tag_tech": "Tech", + "tag_educational": "Educational", + "tag_kids": "Kids", + "tag_family": "Family", + "tag_parenting": "Parenting", + "tag_conference": "Conference", + "tag_film": "Film", + "tag_fashion": "Fashion", + "tag_running": "Running", + "tag_cycling": "Cycling", + "tag_board_games": "Board Games", + "tag_video_games": "Video Games", + "tag_entertainment": "Entertainment", + "tag_comedy": "Comedy", + "tag_arts": "Arts", + "tag_hobby": "Hobby", + "tag_party": "Party", + "tag_gathering": "Gathering", + "tag_charity": "Charity", + "tag_volunteering": "Volunteering", + "tag_environmental": "Environmental", + "tag_festival": "Festival", + "tag_concert": "Concert", + "tag_food": "Food", + "tag_travel": "Travel", + "tag_religious": "Religious", + "tag_study": "Study", + "tag_market": "Market", + "tag_political": "Political", + "common_close": "Close", + "common_cancel": "Cancel", + "common_discard": "Discard", + "common_save": "Save", + "common_delete": "Delete", + "common_add": "Add", + "common_edit": "Edit", + "common_search": "Search", + "common_searching": "Searching...", + "common_loading": "Loading...", + "common_remove": "Remove", + "common_change": "Change", + "common_upload": "Upload", + "common_saving": "Saving...", + "common_updating": "Updating...", + "common_save_changes": "Save Changes", + "search_bar_placeholder": "Search events, locations...", + "search_bar_ai_placeholder": "Ask AI to find events...", + "search_bar_searching_locations": "Searching locations...", + "event_new_title": "New Event", + "event_new_subtitle": "Create a public gathering", + "event_details_section": "Details", + "event_title_label": "Event Title", + "event_title_placeholder": "What are you planning?", + "event_description_label": "Description", + "event_description_placeholder": "Add details about your event...", + "event_images_label": "Images", + "event_location_section": "Location", + "event_location_required": "Location required", + "event_location_placeholder": "Search location...", + "event_location_searching": "Searching locations...", + "event_location_unknown": "Unknown location", + "event_schedule_section": "Schedule", + "event_schedule_simple": "Simple", + "event_schedule_advanced": "Advanced", + "event_start_time_placeholder": "Pick start time", + "event_end_time_placeholder": "Pick end time", + "event_window_title_placeholder": "Session Title", + "event_window_description_placeholder": "Optional description", + "event_window_default_title": "Event Window 1", + "event_add_window": "Add time window", + "event_categories_section": "Categories", + "event_categories_placeholder": "Filter categories...", + "event_publish": "Publish Event", + "event_publishing": "Publishing...", + "event_share": "Share event", + "event_participate": "Participate in event", + "event_dont_participate": "Don't participate", + "event_favorite": "Favorite", + "event_unfavorite": "Unfavorite", + "event_add_here": "Add event here", + "event_about_section": "About", + "event_occurrence": "Event Occurrence", + "event_no_upcoming_dates": "No upcoming dates", + "events_dialog_title": "Events", + "events_dialog_subtitle": "Manage your events and schedule", + "events_search_placeholder": "Search events...", + "events_tab_favorited": "Favorited", + "events_tab_created": "Created", + "events_tab_attending": "Attending", + "events_no_favorited": "No favorited events", + "events_no_created": "No created events", + "events_no_attending": "No attending events", + "events_no_search_results": "No events match your search query", + "events_favorited_empty": "Events you favorite will appear here", + "events_created_empty": "Events you create will appear here", + "events_attending_empty": "Events you attend will appear here", + "dialog_discard_title": "Discard changes?", + "dialog_discard_description": "Are you sure you want to discard your changes? This action cannot be undone.", + "dialog_discard_keep": "Keep Editing", + "dialog_account_required_title": "Account Required", + "dialog_account_required_description": "You need to sign up before you can create an event.", + "dialog_account_required_login": "Log In", + "dialog_account_required_signup": "Sign Up", + "profile_settings_title": "Settings", + "profile_settings_subtitle": "Manage your account preferences", + "profile_tab_profile": "Profile", + "profile_tab_security": "Security", + "profile_display_name_label": "Display Name", + "profile_display_name_placeholder": "Your display name", + "profile_email_label": "Email Address", + "profile_email_note": "Email address cannot be changed directly.", + "profile_password_security_title": "Password Security", + "profile_password_security_description": "Ensure your account stays secure by using a strong, unique password.", + "profile_current_password_label": "Current Password", + "profile_new_password_label": "New Password", + "profile_confirm_password_label": "Confirm Password", + "profile_update_password": "Update Password", + "profile_feature_requires_backend": "This feature requires backend support.", + "user_menu_profile": "Profile", + "user_menu_events": "Events", + "user_menu_settings": "Settings", + "user_menu_logout": "Logout", + "user_menu_sign_in": "Sign in", + "user_menu_sign_up": "Sign up", + "auth_sign_in_title": "Sign in", + "auth_sign_in_subtitle": "Enter your credentials to continue", + "auth_sign_in_button": "Sign in", + "auth_signing_in": "Signing in...", + "auth_sign_up_title": "Create an account", + "auth_sign_up_subtitle": "Enter your details to get started", + "auth_sign_up_button": "Create account", + "auth_creating_account": "Creating account...", + "auth_no_account": "Don't have an account?", + "auth_have_account": "Already have an account?", + "auth_sign_up_link": "Sign up", + "auth_sign_in_link": "Sign in", + "form_label_email": "Email", + "form_label_password": "Password", + "form_label_username": "Username", + "form_label_confirm_password": "Confirm Password", + "toast_link_copied": "Link copied to clipboard", + "toast_event_published": "Event published successfully", + "toast_profile_updated": "Profile updated successfully", + "toast_profile_update_failed": "Failed to update profile", + "toast_passwords_dont_match": "Passwords do not match", + "toast_password_update_not_implemented": "Password update not implemented yet", + "toast_image_too_large": "Image must be smaller than 5MB", + "geolocate_aria_label": "Recenter map on my location", + "color_picker_placeholder": "#009FE7", + "date_picker_placeholder": "Pick a date", + "sidebar_toggle": "Toggle Sidebar", + "sidebar_title": "Sidebar", + "sidebar_description": "Displays the mobile sidebar.", + "landing_system_status": "System: Online", + "landing_location_status": "Loc: Global", + "profile_picture_title": "Profile Picture", + "profile_picture_formats": "JPG, GIF or PNG. Max size of 5MB.", + "validation_name_required": "Name is required", + "validation_description_required": "Description is required", + "validation_tag_required": "At least one tag is required", + "error_load_address": "Failed to load address", + "theme_color_label": "Theme Color:" } diff --git a/Cartesian.Frontend/messages/pl.json b/Cartesian.Frontend/messages/pl.json index b5fbf96..f282254 100644 --- a/Cartesian.Frontend/messages/pl.json +++ b/Cartesian.Frontend/messages/pl.json @@ -1,41 +1,174 @@ { - "$schema": "https://inlang.com/schema/inlang-message-format", - "nav_home": "Dom", - "nav_map": "Mapa", - "nav_settings": "Ustawienia", - "nav_group_main_app": "Aplikacja", - "tag_outdoor": "Plener", - "tag_sport": "Sport", - "tag_fitness": "Fitness", - "tag_literature": "Literatura", - "tag_business": "Biznes", - "tag_tech": "Technologia", - "tag_educational": "Edukacja", - "tag_kids": "Dzieci", - "tag_family": "Rodzina", - "tag_parenting": "Rodzicielstwo", - "tag_conference": "Konferencja", - "tag_film": "Film", - "tag_fashion": "Moda", - "tag_running": "Bieganie", - "tag_cycling": "Kolarstwo", - "tag_board_games": "Gry planszowe", - "tag_video_games": "Gry wideo", - "tag_entertainment": "Rozrywka", - "tag_comedy": "Komedia", - "tag_arts": "Sztuka", - "tag_hobby": "Hobby", - "tag_party": "Impreza", - "tag_gathering": "Spotkanie", - "tag_charity": "Charytatywne", - "tag_volunteering": "Wolontariat", - "tag_environmental": "Ekologia", - "tag_festival": "Festiwal", - "tag_concert": "Koncert", - "tag_food": "Jedzenie", - "tag_travel": "Podróże", - "tag_religious": "Religia", - "tag_study": "Nauka", - "tag_market": "Targ", - "tag_political": "Polityka" + "$schema": "https://inlang.com/schema/inlang-message-format", + "nav_home": "Dom", + "nav_map": "Mapa", + "nav_settings": "Ustawienia", + "nav_group_main_app": "Aplikacja", + "tag_outdoor": "Plener", + "tag_sport": "Sport", + "tag_fitness": "Fitness", + "tag_literature": "Literatura", + "tag_business": "Biznes", + "tag_tech": "Technologia", + "tag_educational": "Edukacja", + "tag_kids": "Dzieci", + "tag_family": "Rodzina", + "tag_parenting": "Rodzicielstwo", + "tag_conference": "Konferencja", + "tag_film": "Film", + "tag_fashion": "Moda", + "tag_running": "Bieganie", + "tag_cycling": "Kolarstwo", + "tag_board_games": "Gry planszowe", + "tag_video_games": "Gry wideo", + "tag_entertainment": "Rozrywka", + "tag_comedy": "Komedia", + "tag_arts": "Sztuka", + "tag_hobby": "Hobby", + "tag_party": "Impreza", + "tag_gathering": "Spotkanie", + "tag_charity": "Charytatywne", + "tag_volunteering": "Wolontariat", + "tag_environmental": "Ekologia", + "tag_festival": "Festiwal", + "tag_concert": "Koncert", + "tag_food": "Jedzenie", + "tag_travel": "Podróże", + "tag_religious": "Religia", + "tag_study": "Nauka", + "tag_market": "Targ", + "tag_political": "Polityka", + "common_close": "Zamknij", + "common_cancel": "Anuluj", + "common_discard": "Odrzuć", + "common_save": "Zapisz", + "common_delete": "Usuń", + "common_add": "Dodaj", + "common_edit": "Edytuj", + "common_search": "Szukaj", + "common_searching": "Wyszukiwanie...", + "common_loading": "Ładowanie...", + "common_remove": "Usuń", + "common_change": "Zmień", + "common_upload": "Prześlij", + "common_saving": "Zapisywanie...", + "common_updating": "Aktualizowanie...", + "common_save_changes": "Zapisz zmiany", + "search_bar_placeholder": "Wyszukaj wydarzenia, lokalizacje...", + "search_bar_ai_placeholder": "Zapytaj AI, aby znaleźć wydarzenia...", + "search_bar_searching_locations": "Wyszukiwanie lokalizacji...", + "event_new_title": "Nowe wydarzenie", + "event_new_subtitle": "Utwórz publiczne spotkanie", + "event_details_section": "Szczegóły", + "event_title_label": "Tytuł wydarzenia", + "event_title_placeholder": "Co planujesz?", + "event_description_label": "Opis", + "event_description_placeholder": "Dodaj szczegóły swojego wydarzenia...", + "event_images_label": "Obrazy", + "event_location_section": "Lokalizacja", + "event_location_required": "Lokalizacja wymagana", + "event_location_placeholder": "Wyszukaj lokalizację...", + "event_location_searching": "Wyszukiwanie lokalizacji...", + "event_location_unknown": "Nieznana lokalizacja", + "event_schedule_section": "Harmonogram", + "event_schedule_simple": "Prosty", + "event_schedule_advanced": "Zaawansowany", + "event_start_time_placeholder": "Wybierz czas rozpoczęcia", + "event_end_time_placeholder": "Wybierz czas zakończenia", + "event_window_title_placeholder": "Tytuł sesji", + "event_window_description_placeholder": "Opcjonalny opis", + "event_window_default_title": "Okno wydarzenia 1", + "event_add_window": "Dodaj okno czasowe", + "event_categories_section": "Kategorie", + "event_categories_placeholder": "Filtruj kategorie...", + "event_publish": "Opublikuj wydarzenie", + "event_publishing": "Publikowanie...", + "event_share": "Udostępnij wydarzenie", + "event_participate": "Weź udział w wydarzeniu", + "event_dont_participate": "Nie bierz udziału", + "event_favorite": "Ulubione", + "event_unfavorite": "Usuń z ulubionych", + "event_add_here": "Dodaj wydarzenie tutaj", + "event_about_section": "O wydarzeniu", + "event_occurrence": "Termin wydarzenia", + "event_no_upcoming_dates": "Brak nadchodzących terminów", + "events_dialog_title": "Wydarzenia", + "events_dialog_subtitle": "Zarządzaj swoimi wydarzeniami i harmonogramem", + "events_search_placeholder": "Wyszukaj wydarzenia...", + "events_tab_favorited": "Ulubione", + "events_tab_created": "Utworzone", + "events_tab_attending": "Uczestniczę", + "events_no_favorited": "Brak ulubionych wydarzeń", + "events_no_created": "Brak utworzonych wydarzeń", + "events_no_attending": "Brak wydarzeń, w których uczestniczysz", + "events_no_search_results": "Żadne wydarzenie nie pasuje do zapytania wyszukiwania", + "events_favorited_empty": "Wydarzenia, które polubisz, pojawią się tutaj", + "events_created_empty": "Wydarzenia, które utworzysz, pojawią się tutaj", + "events_attending_empty": "Wydarzenia, w których uczestniczysz, pojawią się tutaj", + "dialog_discard_title": "Odrzucić zmiany?", + "dialog_discard_description": "Czy na pewno chcesz odrzucić swoje zmiany? Tej czynności nie można cofnąć.", + "dialog_discard_keep": "Kontynuuj edycję", + "dialog_account_required_title": "Wymagane konto", + "dialog_account_required_description": "Musisz się zarejestrować, zanim będziesz mógł utworzyć wydarzenie.", + "dialog_account_required_login": "Zaloguj się", + "dialog_account_required_signup": "Zarejestruj się", + "profile_settings_title": "Ustawienia", + "profile_settings_subtitle": "Zarządzaj preferencjami swojego konta", + "profile_tab_profile": "Profil", + "profile_tab_security": "Bezpieczeństwo", + "profile_display_name_label": "Nazwa wyświetlana", + "profile_display_name_placeholder": "Twoja wyświetlana nazwa", + "profile_email_label": "Adres email", + "profile_email_note": "Adres email nie może być zmieniony bezpośrednio.", + "profile_password_security_title": "Bezpieczeństwo hasła", + "profile_password_security_description": "Upewnij się, że Twoje konto jest bezpieczne, używając silnego, unikalnego hasła.", + "profile_current_password_label": "Aktualne hasło", + "profile_new_password_label": "Nowe hasło", + "profile_confirm_password_label": "Potwierdź hasło", + "profile_update_password": "Aktualizuj hasło", + "profile_feature_requires_backend": "Ta funkcja wymaga wsparcia serwera.", + "user_menu_profile": "Profil", + "user_menu_events": "Wydarzenia", + "user_menu_settings": "Ustawienia", + "user_menu_logout": "Wyloguj", + "user_menu_sign_in": "Zaloguj się", + "user_menu_sign_up": "Zarejestruj się", + "auth_sign_in_title": "Zaloguj się", + "auth_sign_in_subtitle": "Wprowadź swoje dane, aby kontynuować", + "auth_sign_in_button": "Zaloguj się", + "auth_signing_in": "Logowanie...", + "auth_sign_up_title": "Utwórz konto", + "auth_sign_up_subtitle": "Wprowadź swoje dane, aby rozpocząć", + "auth_sign_up_button": "Utwórz konto", + "auth_creating_account": "Tworzenie konta...", + "auth_no_account": "Nie masz konta?", + "auth_have_account": "Masz już konto?", + "auth_sign_up_link": "Zarejestruj się", + "auth_sign_in_link": "Zaloguj się", + "form_label_email": "Email", + "form_label_password": "Hasło", + "form_label_username": "Nazwa użytkownika", + "form_label_confirm_password": "Potwierdź hasło", + "toast_link_copied": "Link skopiowany do schowka", + "toast_event_published": "Wydarzenie opublikowane pomyślnie", + "toast_profile_updated": "Profil zaktualizowany pomyślnie", + "toast_profile_update_failed": "Nie udało się zaktualizować profilu", + "toast_passwords_dont_match": "Hasła nie pasują", + "toast_password_update_not_implemented": "Aktualizacja hasła nie została jeszcze zaimplementowana", + "toast_image_too_large": "Obraz musi być mniejszy niż 5MB", + "geolocate_aria_label": "Wyśrodkuj mapę na moją lokalizację", + "color_picker_placeholder": "#009FE7", + "date_picker_placeholder": "Wybierz datę", + "sidebar_toggle": "Przełącz pasek boczny", + "sidebar_title": "Pasek boczny", + "sidebar_description": "Wyświetla mobilny pasek boczny.", + "landing_system_status": "System: Online", + "landing_location_status": "Lok: Global", + "profile_picture_title": "Zdjęcie profilowe", + "profile_picture_formats": "JPG, GIF lub PNG. Maksymalny rozmiar 5MB.", + "validation_name_required": "Nazwa jest wymagana", + "validation_description_required": "Opis jest wymagany", + "validation_tag_required": "Wymagany jest co najmniej jeden tag", + "error_load_address": "Nie udało się załadować adresu", + "theme_color_label": "Kolor motywu:" } diff --git a/Cartesian.Frontend/package.json b/Cartesian.Frontend/package.json index c127644..bfd90b4 100644 --- a/Cartesian.Frontend/package.json +++ b/Cartesian.Frontend/package.json @@ -19,6 +19,8 @@ "devDependencies": { "@inlang/cli": "^3.0.0", "@inlang/paraglide-js": "2.4.0", + "@inlang/plugin-m-function-matcher": "^2.1.0", + "@inlang/plugin-message-format": "^4.0.0", "@internationalized/date": "^3.10.0", "@lucide/svelte": "^0.544.0", "@material/material-color-utilities": "^0.3.0", diff --git a/Cartesian.Frontend/pnpm-lock.yaml b/Cartesian.Frontend/pnpm-lock.yaml index 5a154e3..6973db0 100644 --- a/Cartesian.Frontend/pnpm-lock.yaml +++ b/Cartesian.Frontend/pnpm-lock.yaml @@ -51,6 +51,12 @@ importers: '@inlang/paraglide-js': specifier: 2.4.0 version: 2.4.0 + '@inlang/plugin-m-function-matcher': + specifier: ^2.1.0 + version: 2.1.0 + '@inlang/plugin-message-format': + specifier: ^4.0.0 + version: 4.0.0 '@internationalized/date': specifier: ^3.10.0 version: 3.10.0 @@ -402,6 +408,12 @@ packages: resolution: {integrity: sha512-T/m9uoev574/1JrhCnPcgK1xnAwkVMgaDev4LFthnmID8ubX2xjboSGO3IztwXWwO0aJoT1UJr89JCwjbwgnJQ==} hasBin: true + '@inlang/plugin-m-function-matcher@2.1.0': + resolution: {integrity: sha512-IAbG7rOl+rlTiZY7qj92we6lmII693lVthPtY9bFDkZ/Ig7FPSpae/TfLzqjf2KcR1nDdx1zRpSo6roDPeM85g==} + + '@inlang/plugin-message-format@4.0.0': + resolution: {integrity: sha512-zNpLxLTt+bDd3JLXj1ONzo+Q6AOzz2MfcgGo8XB6/bweGhFIndK3GU/q0iU4o7VI4KS1+OHNLpKwFcrAifwERQ==} + '@inlang/recommend-sherlock@0.2.1': resolution: {integrity: sha512-ckv8HvHy/iTqaVAEKrr+gnl+p3XFNwe5D2+6w6wJk2ORV2XkcRkKOJ/XsTUJbPSiyi4PI+p+T3bqbmNx/rDUlg==} @@ -1491,6 +1503,11 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + flat@6.0.1: + resolution: {integrity: sha512-/3FfIa8mbrg3xE7+wAhWeV+bd7L2Mof+xtZb5dRDKZ+wDvYJK4WDYeIOuOhre5Yv5aQObZrlbRmk3RTSiuQBtw==} + engines: {node: '>=18'} + hasBin: true + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -3075,6 +3092,16 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros + '@inlang/plugin-m-function-matcher@2.1.0': + dependencies: + '@inlang/sdk': 2.4.9 + transitivePeerDependencies: + - babel-plugin-macros + + '@inlang/plugin-message-format@4.0.0': + dependencies: + flat: 6.0.1 + '@inlang/recommend-sherlock@0.2.1': dependencies: comment-json: 4.4.1 @@ -4328,6 +4355,8 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + flat@6.0.1: {} + for-each@0.3.5: dependencies: is-callable: 1.2.7 diff --git a/Cartesian.Frontend/project.inlang/settings.json b/Cartesian.Frontend/project.inlang/settings.json index ac2acf1..ef70f01 100644 --- a/Cartesian.Frontend/project.inlang/settings.json +++ b/Cartesian.Frontend/project.inlang/settings.json @@ -1,15 +1,12 @@ { - "$schema": "https://inlang.com/schema/project-settings", - "baseLocale": "en", - "locales": [ - "en", - "pl" - ], - "modules": [ - "https://cdn.jsdelivr.net/npm/@inlang/plugin-message-format@4/dist/index.js", - "https://cdn.jsdelivr.net/npm/@inlang/plugin-m-function-matcher@2/dist/index.js" - ], - "plugin.inlang.messageFormat": { - "pathPattern": "./messages/{locale}.json" - } -} \ No newline at end of file + "$schema": "https://inlang.com/schema/project-settings", + "baseLocale": "en", + "locales": ["en", "pl"], + "modules": [ + "./node_modules/@inlang/plugin-message-format/dist/index.js", + "./node_modules/@inlang/plugin-m-function-matcher/dist/index.js" + ], + "plugin.inlang.messageFormat": { + "pathPattern": "./messages/{locale}.json" + } +} diff --git a/Cartesian.Frontend/src/app.css b/Cartesian.Frontend/src/app.css index 7056747..46d6800 100644 --- a/Cartesian.Frontend/src/app.css +++ b/Cartesian.Frontend/src/app.css @@ -193,12 +193,16 @@ --corner-shape-square: square; --corner-shape-squircle: squircle; --corner-shape-smooth: superellipse(1.3); - + --animate-slide: slide 60s linear infinite; - + @keyframes slide { - from { transform: translateX(0); } - to { transform: translateX(-50%); } + from { + transform: translateX(0); + } + to { + transform: translateX(-50%); + } } } diff --git a/Cartesian.Frontend/src/app.html b/Cartesian.Frontend/src/app.html index e83dffa..9746057 100644 --- a/Cartesian.Frontend/src/app.html +++ b/Cartesian.Frontend/src/app.html @@ -1,20 +1,18 @@ + + + + %sveltekit.head% + + - - - - %sveltekit.head% - - - - -
%sveltekit.body%
- - + +
%sveltekit.body%
+ diff --git a/Cartesian.Frontend/src/lib/api/queries/forward-geocode.query.ts b/Cartesian.Frontend/src/lib/api/queries/forward-geocode.query.ts index e010d4c..0bb4f4d 100644 --- a/Cartesian.Frontend/src/lib/api/queries/forward-geocode.query.ts +++ b/Cartesian.Frontend/src/lib/api/queries/forward-geocode.query.ts @@ -127,7 +127,8 @@ export function createReverseGeocodeQuery Effect.runPromise(fetchReverseGeocode(coords!.longitude, coords!.latitude)), + queryFn: () => + Effect.runPromise(fetchReverseGeocode(coords!.longitude, coords!.latitude)), staleTime: 1000 * 60 * 60, enabled: !!coords && coords.longitude !== undefined && coords.latitude !== undefined, ...options?.query, diff --git a/Cartesian.Frontend/src/lib/components/auth/login-alert-dialog.svelte b/Cartesian.Frontend/src/lib/components/auth/login-alert-dialog.svelte index e2d2def..2b28d1b 100644 --- a/Cartesian.Frontend/src/lib/components/auth/login-alert-dialog.svelte +++ b/Cartesian.Frontend/src/lib/components/auth/login-alert-dialog.svelte @@ -2,6 +2,7 @@ import * as AlertDialog from "$lib/components/ui/alert-dialog"; import { Button } from "$lib/components/ui/button"; import { goto } from "$app/navigation"; + import { m } from "$lib/paraglide/messages"; let { open = $bindable(false) }: { open: boolean } = $props(); @@ -9,13 +10,13 @@ - Account Required + {m.dialog_account_required_title()} - You need to sign up before you can create an event. + {m.dialog_account_required_description()} - Cancel + {m.common_cancel()} diff --git a/Cartesian.Frontend/src/lib/components/color-picker.svelte b/Cartesian.Frontend/src/lib/components/color-picker.svelte index 94a7da7..806f1ce 100644 --- a/Cartesian.Frontend/src/lib/components/color-picker.svelte +++ b/Cartesian.Frontend/src/lib/components/color-picker.svelte @@ -1,6 +1,7 @@
- + updateColor(e.currentTarget.value)} class="w-28 rounded border border-input bg-background px-3 py-2 text-sm" - placeholder="#009FE7" + placeholder={m.color_picker_placeholder()} />
diff --git a/Cartesian.Frontend/src/lib/components/landing/globe.svelte b/Cartesian.Frontend/src/lib/components/landing/globe.svelte index 0001d15..249ddf1 100644 --- a/Cartesian.Frontend/src/lib/components/landing/globe.svelte +++ b/Cartesian.Frontend/src/lib/components/landing/globe.svelte @@ -37,7 +37,7 @@ 45, container.clientWidth / container.clientHeight, 0.1, - 1000 + 1000, ); camera.position.z = VIEW_DISTANCE; camera.position.y = 8; @@ -100,7 +100,7 @@ // u: 0 to 1 (longitude) // v: 0 to 1 (latitude) const u = (spherical.theta + Math.PI) / (2 * Math.PI); - const v = 1 - (spherical.phi / Math.PI); // Invert v to match texture + const v = 1 - spherical.phi / Math.PI; // Invert v to match texture // Sample texture const px = Math.floor(u * canvas.width) % canvas.width; @@ -122,7 +122,7 @@ // Is land check (approximate from reference) // Reference: W - H < 0.1 // W = b/255, H = (r/255 + g/255)/2 - const isLand = (b/255) - ((r/255 + g/255)/2) < 0.1; + const isLand = b / 255 - (r / 255 + g / 255) / 2 < 0.1; if (isLand) { positions.push(vector.multiplyScalar(GLOBE_RADIUS)); @@ -140,7 +140,7 @@ instancedMesh.instanceMatrix.needsUpdate = true; globeGroup.add(instancedMesh); - } + }, ); // Animation Loop @@ -154,7 +154,7 @@ renderer.render(scene, camera); // Update events positions - const newRenderedEvents = events.map(event => { + const newRenderedEvents = events.map((event) => { // Map 0-100 to spherical coordinates (matching original logic but scaled) const lat = ((event.y - 50) / 50) * -Math.PI * 0.8; const lon = ((event.x - 50) / 50) * Math.PI * 2; @@ -176,7 +176,7 @@ const widthHalf = container!.clientWidth / 2; const heightHalf = container!.clientHeight / 2; - const screenX = (pos.x * widthHalf) + widthHalf; + const screenX = pos.x * widthHalf + widthHalf; const screenY = -(pos.y * heightHalf) + heightHalf; // Raycast check or simple normal check @@ -204,7 +204,7 @@ screenX, screenY, visible, - zIndex: Math.floor((1 - pos.z) * 1000) // Sort by depth + zIndex: Math.floor((1 - pos.z) * 1000), // Sort by depth }; }); @@ -239,7 +239,7 @@ {#each renderedEvents as event}
{ + if (typeof window !== "undefined") { + window.addEventListener("resize", () => { viewportHeight = window.innerHeight; }); } @@ -46,14 +46,14 @@ $effect(() => { if (!drawerElement) return; - drawerElement.addEventListener('touchstart', handleTouchStart); - drawerElement.addEventListener('touchmove', handleTouchMove, { passive: false }); - drawerElement.addEventListener('touchend', handleTouchEnd); + drawerElement.addEventListener("touchstart", handleTouchStart); + drawerElement.addEventListener("touchmove", handleTouchMove, { passive: false }); + drawerElement.addEventListener("touchend", handleTouchEnd); return () => { - drawerElement?.removeEventListener('touchstart', handleTouchStart); - drawerElement?.removeEventListener('touchmove', handleTouchMove); - drawerElement?.removeEventListener('touchend', handleTouchEnd); + drawerElement?.removeEventListener("touchstart", handleTouchStart); + drawerElement?.removeEventListener("touchmove", handleTouchMove); + drawerElement?.removeEventListener("touchend", handleTouchEnd); }; }); @@ -94,34 +94,36 @@ } - - -
+