diff --git a/.github/RELEASE_PULL_REQUEST_TEMPLATE.erb b/.github/RELEASE_PULL_REQUEST_TEMPLATE.erb index c6326836..7da14474 100644 --- a/.github/RELEASE_PULL_REQUEST_TEMPLATE.erb +++ b/.github/RELEASE_PULL_REQUEST_TEMPLATE.erb @@ -34,6 +34,13 @@ Release: <%= Time.now.strftime('%Y-%m-%d %H:%M') %>(UTC) <%= "* #{pr.title} by #{pr.mention} in ##{pr.number}" %> <% end -%> <% end -%> +<% remove_prs = pull_requests.select { |pr| pr.labels.map { |label| label['name'] }.include?('remove') } -%> +<% if remove_prs.any? -%> +## 🗑️ Remove Features +<% remove_prs.each do |pr| -%> +<%= "* #{pr.title} by #{pr.mention} in ##{pr.number}" %> +<% end -%> +<% end -%> <% documentation_prs = pull_requests.select { |pr| pr.labels.map { |label| label['name'] }.include?('documentation') } -%> <% if documentation_prs.any? -%> ## 📝 Documentation @@ -41,7 +48,7 @@ Release: <%= Time.now.strftime('%Y-%m-%d %H:%M') %>(UTC) <%= "* #{pr.title} by #{pr.mention} in ##{pr.number}" %> <% end -%> <% end -%> -<% other_prs = pull_requests.reject { |pr| (pr.labels.map { |label| label['name'] } & ['feature', 'refinement', 'bug', 'translation', 'maintenance', 'documentation']).any? } -%> +<% other_prs = pull_requests.reject { |pr| (pr.labels.map { |label| label['name'] } & ['feature', 'refinement', 'bug', 'translation', 'maintenance', 'remove', 'documentation']).any? } -%> <% if other_prs.any? -%> ## Others <% other_prs.each do |pr| -%> diff --git a/.github/release.yml b/.github/release.yml index adb543b5..af98236f 100644 --- a/.github/release.yml +++ b/.github/release.yml @@ -19,6 +19,9 @@ changelog: - title: 🏠 Maintenances labels: - maintenance + - title: 🗑️ Remove Features + labels: + - remove - title: 📝 Documentation labels: - documentation diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 67a16b6d..79540c57 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: - node-version: 24.10.0 + node-version: 24.11.0 cache: npm - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 id: node_modules_cache_id diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index debe3ec4..73843e2c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -34,7 +34,7 @@ jobs: - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: - node-version: 24.10.0 + node-version: 24.11.0 cache: npm - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 id: node_modules_cache_id diff --git a/dist/_locales/bg/messages.json b/dist/_locales/bg/messages.json index 97d40457..8624a6c5 100644 --- a/dist/_locales/bg/messages.json +++ b/dist/_locales/bg/messages.json @@ -283,10 +283,6 @@ "message": "Час", "description": "One of the selectable units for the duration in the feature that automatically closes tabs after a specified period of inactivity." }, - "options_navigation_all_windows": { - "message": "Всички прозорци", - "description": "Navigation header for AllWindows Page in options.html" - }, "options_navigation_save_and_restore": { "message": "Запазване и Възстановяване", "description": "Navigation header for Save & Restore page in options.html" @@ -299,14 +295,6 @@ "message": "Настройки", "description": "Navigation header for Settings page in options.html" }, - "options_navigation_feedback": { - "message": "Обратна връзка", - "description": "Navigation header for Feedback page in options.html" - }, - "options_navigation_sponsor": { - "message": "Спонсор", - "description": "Navigation header for Sponsor page in options.html" - }, "tab_grouping_header": { "message": "Групиране на раздели", "description": "The main header for the tab grouping section." @@ -359,6 +347,22 @@ "message": "Цвят на темата", "description": "The main header for the theme color setting section." }, + "mode": { + "message": "Режим", + "description": "Label for theme mode selection." + }, + "light": { + "message": "Светъл", + "description": "Light theme mode option." + }, + "system": { + "message": "Система", + "description": "System theme mode option that follows OS settings." + }, + "dark": { + "message": "Тъмен", + "description": "Dark theme mode option." + }, "popup_setting_header": { "message": "Изскачащ прозорец", "description": "The main header for the popup setting section." @@ -371,22 +375,6 @@ "message": "Височина: 200-600px, Ширина: 400-800px задължително.", "description": "Notes or cautionary advice regarding the settings for the popup size." }, - "popup_element_scale_header": { - "message": "Скала за размера на изкачащия прозорец", - "description": "Heading for the settings to adjust the scale of elements within the popup." - }, - "popup_element_scale_description": { - "message": "Коригирайте размерът на елементите (шрифтове, иконки) в изскачащия прозорец между 50-150% от размера им по подразбиране.", - "description": "Notes or cautionary advice regarding the settings for scaling elements within the popup." - }, - "popup_element_scale_validation_error_value_format": { - "message": "Въведете число!", - "description": "Error message displayed for validation issues in the settings for scaling elements within the popup." - }, - "popup_element_scale_validation_error_value_range": { - "message": "Въведете числена стойност от 50 до 150.", - "description": "Error message displayed for validation issues in the settings for scaling elements within the popup." - }, "toolbar_setting_header": { "message": "Лента с инструменти", "description": "The main header for the toolbar setting section." @@ -403,10 +391,6 @@ "message": "Страничен панел", "description": "Option to open the side panel when the toolbar icon is clicked." }, - "toolbar_icon_click_behavior_select_dashboard": { - "message": "Табло за управление", - "description": "Option to open the dashboard when the toolbar icon is clicked." - }, "scale": { "message": "Скала", "description": "Heading for the input form to adjust the scale of elements within the popup." @@ -447,38 +431,6 @@ "message": "Въведете положително число.", "description": "Error message displayed for validation issues in the feature that automatically closes tabs after a specified period of inactivity." }, - "bug_report_and_feature_request_title": { - "message": "Докладване на бъг & Заявка за подобрение", - "description": "Heading for the section covering bug reports and feature requests." - }, - "bug_report_and_feature_request_description": { - "message": "Ако попаднете на бъг, докато използвате TabTabTab или имате предложение за подобрение, не се колебайте да отворите `Issue` в Github.", - "description": "Description for the section dedicated to submitting bug reports and feature requests." - }, - "store_review_title": { - "message": "Преглед в магазина", - "description": "Heading for the store reviews section." - }, - "store_review_description": { - "message": "Ако намирате TabTabTab за полезен, ще сме много благодарни, ако ни оставите отзив в ChromeWebStore! Вашият глас значително допринася за развитието на TabTabTab.", - "description": "Description for the section regarding store reviews." - }, - "source_code_title": { - "message": "Програмен код", - "description": "Heading for the source code section." - }, - "source_code_description": { - "message": "TabTabTab е софтуерен продукт с публично достъпен отворен код. Той се управлява внимателно, за да се предотвратят всякакви незаконни действия, гарантиращи сигурна и безопасна работа с приложението.", - "description": "Description for the section related to the source code." - }, - "sponsor_page_header": { - "message": "Подкрепете проекта", - "description": "Header in Sponsor Page" - }, - "sponsor_page_description": { - "message": "TabTabTab е отворен проект, разработен главно от един индивид. Ако намирате, че е полезен, ще съм благодарен, ако обмислите подкрепата си за този проект.", - "description": "Description in Sponsor Page" - }, "add_tab": { "message": "Добавяне на раздел", "description": "Action to add a new tab." diff --git a/dist/_locales/de/messages.json b/dist/_locales/de/messages.json index b4beaeb0..b8e76f90 100644 --- a/dist/_locales/de/messages.json +++ b/dist/_locales/de/messages.json @@ -283,10 +283,6 @@ "message": "Stunden", "description": "One of the selectable units for the duration in the feature that automatically closes tabs after a specified period of inactivity." }, - "options_navigation_all_windows": { - "message": "Alle Fenster", - "description": "Navigation header for AllWindows Page in options.html" - }, "options_navigation_save_and_restore": { "message": "Speichern & Wiederherstellen", "description": "Navigation header for Save & Restore page in options.html" @@ -299,14 +295,6 @@ "message": "Einstellungen", "description": "Navigation header for Settings page in options.html" }, - "options_navigation_feedback": { - "message": "Feedback", - "description": "Navigation header for Feedback page in options.html" - }, - "options_navigation_sponsor": { - "message": "Sponsor", - "description": "Navigation header for Sponsor page in options.html" - }, "tab_grouping_header": { "message": "Tab-Gruppierung", "description": "The main header for the tab grouping section." @@ -359,6 +347,22 @@ "message": "Thema Farbe", "description": "The main header for the theme color setting section." }, + "mode": { + "message": "Modus", + "description": "Label for theme mode selection." + }, + "light": { + "message": "Hell", + "description": "Light theme mode option." + }, + "system": { + "message": "System", + "description": "System theme mode option that follows OS settings." + }, + "dark": { + "message": "Dunkel", + "description": "Dark theme mode option." + }, "popup_setting_header": { "message": "Popup", "description": "The main header for the popup setting section." @@ -371,22 +375,6 @@ "message": "Höhe: 200-600px, Breite: 400-800px erforderlich.", "description": "Notes or cautionary advice regarding the settings for the popup size." }, - "popup_element_scale_header": { - "message": "Popup Element Skalierung", - "description": "Heading for the settings to adjust the scale of elements within the popup." - }, - "popup_element_scale_description": { - "message": "Passen Sie die Größe von Elementen wie Schriften und Symbolen im Popup zwischen 50~150% ihrer Standardgröße an.", - "description": "Notes or cautionary advice regarding the settings for scaling elements within the popup." - }, - "popup_element_scale_validation_error_value_format": { - "message": "Eine ganze Zahl eingeben.", - "description": "Error message displayed for validation issues in the settings for scaling elements within the popup." - }, - "popup_element_scale_validation_error_value_range": { - "message": "Geben Sie einen Wert im Bereich von 50 bis 150 ein.", - "description": "Error message displayed for validation issues in the settings for scaling elements within the popup." - }, "toolbar_setting_header": { "message": "Symbolleiste", "description": "The main header for the toolbar setting section." @@ -403,10 +391,6 @@ "message": "Seitenbereich", "description": "Option to open the side panel when the toolbar icon is clicked." }, - "toolbar_icon_click_behavior_select_dashboard": { - "message": "Dashboard", - "description": "Option to open the dashboard when the toolbar icon is clicked." - }, "scale": { "message": "Skalierung", "description": "Heading for the input form to adjust the scale of elements within the popup." @@ -447,38 +431,6 @@ "message": "Eingabe einer positiven ganzen Zahl.", "description": "Error message displayed for validation issues in the feature that automatically closes tabs after a specified period of inactivity." }, - "bug_report_and_feature_request_title": { - "message": "Fehlerbericht & Feature-Anfrage", - "description": "Heading for the section covering bug reports and feature requests." - }, - "bug_report_and_feature_request_description": { - "message": "Wenn Sie bei der Verwendung von TabTabTab auf Fehler stoßen oder Vorschläge für neue Funktionen haben, können Sie einen Eintrag auf GitHub erstellen.", - "description": "Description for the section dedicated to submitting bug reports and feature requests." - }, - "store_review_title": { - "message": "Bewertung abgeben.", - "description": "Heading for the store reviews section." - }, - "store_review_description": { - "message": "Wenn Sie TabTabTab hilfreich finden, würden wir uns sehr freuen, wenn Sie uns eine Bewertung im Chrome WebStore hinterlassen würden! Ihre Stimme trägt wesentlich zur Entwicklung von TabTabTab bei.", - "description": "Description for the section regarding store reviews." - }, - "source_code_title": { - "message": "Quellcode", - "description": "Heading for the source code section." - }, - "source_code_description": { - "message": "Der Code für TabTabTab ist quelloffen und öffentlich zugänglich. Er wird sorgfältig verwaltet, um jegliche unerlaubte Programmierung zu verhindern und sicherzustellen, dass die Erweiterung sicher entwickelt wird.", - "description": "Description for the section related to the source code." - }, - "sponsor_page_header": { - "message": "Unterstützen Sie das Projekt", - "description": "Header in Sponsor Page" - }, - "sponsor_page_description": { - "message": "TabTabTab ist ein Open-Source-Projekt, das hauptsächlich von einer Einzelperson entwickelt wurde. Wenn Sie es nützlich finden, wäre ich Ihnen dankbar, wenn Sie in Erwägung ziehen würden, dieses Projekt zu unterstützen.", - "description": "Description in Sponsor Page" - }, "add_tab": { "message": "Tab hinzufügen", "description": "Action to add a new tab." diff --git a/dist/_locales/en/messages.json b/dist/_locales/en/messages.json index f5889523..478e58ca 100644 --- a/dist/_locales/en/messages.json +++ b/dist/_locales/en/messages.json @@ -283,10 +283,6 @@ "message": "Hour", "description": "One of the selectable units for the duration in the feature that automatically closes tabs after a specified period of inactivity." }, - "options_navigation_all_windows": { - "message": "All Windows", - "description": "Navigation header for AllWindows Page in options.html" - }, "options_navigation_save_and_restore": { "message": "Save & Restore", "description": "Navigation header for Save & Restore page in options.html" @@ -299,14 +295,6 @@ "message": "Settings", "description": "Navigation header for Settings page in options.html" }, - "options_navigation_feedback": { - "message": "Feedback", - "description": "Navigation header for Feedback page in options.html" - }, - "options_navigation_sponsor": { - "message": "Sponsor", - "description": "Navigation header for Sponsor page in options.html" - }, "tab_grouping_header": { "message": "Tab Grouping", "description": "The main header for the tab grouping section." @@ -359,6 +347,22 @@ "message": "Theme Color", "description": "The main header for the theme color setting section." }, + "mode": { + "message": "Mode", + "description": "Label for theme mode selection." + }, + "light": { + "message": "Light", + "description": "Light theme mode option." + }, + "system": { + "message": "System", + "description": "System theme mode option that follows OS settings." + }, + "dark": { + "message": "Dark", + "description": "Dark theme mode option." + }, "popup_setting_header": { "message": "Popup", "description": "The main header for the popup setting section." @@ -371,22 +375,6 @@ "message": "Height: 200-600px, Width: 400-800px required.", "description": "Notes or cautionary advice regarding the settings for the popup size." }, - "popup_element_scale_header": { - "message": "Popup element scale", - "description": "Heading for the settings to adjust the scale of elements within the popup." - }, - "popup_element_scale_description": { - "message": "Adjust the size of elements such as fonts and icons in the popup between 50~150% of their default size.", - "description": "Notes or cautionary advice regarding the settings for scaling elements within the popup." - }, - "popup_element_scale_validation_error_value_format": { - "message": "Input an integer.", - "description": "Error message displayed for validation issues in the settings for scaling elements within the popup." - }, - "popup_element_scale_validation_error_value_range": { - "message": "Input a value within the range of 50 to 150.", - "description": "Error message displayed for validation issues in the settings for scaling elements within the popup." - }, "toolbar_setting_header": { "message": "Toolbar", "description": "The main header for the toolbar setting section." @@ -403,10 +391,6 @@ "message": "SidePanel", "description": "Option to open the side panel when the toolbar icon is clicked." }, - "toolbar_icon_click_behavior_select_dashboard": { - "message": "Dashboard", - "description": "Option to open the dashboard when the toolbar icon is clicked." - }, "scale": { "message": "Scale", "description": "Heading for the input form to adjust the scale of elements within the popup." @@ -447,38 +431,6 @@ "message": "Input a positive integer.", "description": "Error message displayed for validation issues in the feature that automatically closes tabs after a specified period of inactivity." }, - "bug_report_and_feature_request_title": { - "message": "Bug Report & Feature Request", - "description": "Heading for the section covering bug reports and feature requests." - }, - "bug_report_and_feature_request_description": { - "message": "If you encounter any bugs while using TabTabTab, or have suggestions for feature requests, please feel free to create an issue on GitHub.", - "description": "Description for the section dedicated to submitting bug reports and feature requests." - }, - "store_review_title": { - "message": "Store Review", - "description": "Heading for the store reviews section." - }, - "store_review_description": { - "message": "If you find TabTabTab helpful, we would greatly appreciate it if you could leave us a review on the ChromeWebStore! Your voice greatly contributes to the development of TabTabTab.", - "description": "Description for the section regarding store reviews." - }, - "source_code_title": { - "message": "Source Code", - "description": "Heading for the source code section." - }, - "source_code_description": { - "message": "The code for TabTabTab is open source and publicly available. It is carefully managed to prevent any illicit programming, ensuring the extension is developed safely.", - "description": "Description for the section related to the source code." - }, - "sponsor_page_header": { - "message": "Support the Project", - "description": "Header in Sponsor Page" - }, - "sponsor_page_description": { - "message": "TabTabTab is an open-source project, mainly developed by an individual. If you find it useful, I'd be grateful if you could consider supporting this project.", - "description": "Description in Sponsor Page" - }, "add_tab": { "message": "Add Tab", "description": "Action to add a new tab." diff --git a/dist/_locales/en_GB/messages.json b/dist/_locales/en_GB/messages.json index f5889523..478e58ca 100644 --- a/dist/_locales/en_GB/messages.json +++ b/dist/_locales/en_GB/messages.json @@ -283,10 +283,6 @@ "message": "Hour", "description": "One of the selectable units for the duration in the feature that automatically closes tabs after a specified period of inactivity." }, - "options_navigation_all_windows": { - "message": "All Windows", - "description": "Navigation header for AllWindows Page in options.html" - }, "options_navigation_save_and_restore": { "message": "Save & Restore", "description": "Navigation header for Save & Restore page in options.html" @@ -299,14 +295,6 @@ "message": "Settings", "description": "Navigation header for Settings page in options.html" }, - "options_navigation_feedback": { - "message": "Feedback", - "description": "Navigation header for Feedback page in options.html" - }, - "options_navigation_sponsor": { - "message": "Sponsor", - "description": "Navigation header for Sponsor page in options.html" - }, "tab_grouping_header": { "message": "Tab Grouping", "description": "The main header for the tab grouping section." @@ -359,6 +347,22 @@ "message": "Theme Color", "description": "The main header for the theme color setting section." }, + "mode": { + "message": "Mode", + "description": "Label for theme mode selection." + }, + "light": { + "message": "Light", + "description": "Light theme mode option." + }, + "system": { + "message": "System", + "description": "System theme mode option that follows OS settings." + }, + "dark": { + "message": "Dark", + "description": "Dark theme mode option." + }, "popup_setting_header": { "message": "Popup", "description": "The main header for the popup setting section." @@ -371,22 +375,6 @@ "message": "Height: 200-600px, Width: 400-800px required.", "description": "Notes or cautionary advice regarding the settings for the popup size." }, - "popup_element_scale_header": { - "message": "Popup element scale", - "description": "Heading for the settings to adjust the scale of elements within the popup." - }, - "popup_element_scale_description": { - "message": "Adjust the size of elements such as fonts and icons in the popup between 50~150% of their default size.", - "description": "Notes or cautionary advice regarding the settings for scaling elements within the popup." - }, - "popup_element_scale_validation_error_value_format": { - "message": "Input an integer.", - "description": "Error message displayed for validation issues in the settings for scaling elements within the popup." - }, - "popup_element_scale_validation_error_value_range": { - "message": "Input a value within the range of 50 to 150.", - "description": "Error message displayed for validation issues in the settings for scaling elements within the popup." - }, "toolbar_setting_header": { "message": "Toolbar", "description": "The main header for the toolbar setting section." @@ -403,10 +391,6 @@ "message": "SidePanel", "description": "Option to open the side panel when the toolbar icon is clicked." }, - "toolbar_icon_click_behavior_select_dashboard": { - "message": "Dashboard", - "description": "Option to open the dashboard when the toolbar icon is clicked." - }, "scale": { "message": "Scale", "description": "Heading for the input form to adjust the scale of elements within the popup." @@ -447,38 +431,6 @@ "message": "Input a positive integer.", "description": "Error message displayed for validation issues in the feature that automatically closes tabs after a specified period of inactivity." }, - "bug_report_and_feature_request_title": { - "message": "Bug Report & Feature Request", - "description": "Heading for the section covering bug reports and feature requests." - }, - "bug_report_and_feature_request_description": { - "message": "If you encounter any bugs while using TabTabTab, or have suggestions for feature requests, please feel free to create an issue on GitHub.", - "description": "Description for the section dedicated to submitting bug reports and feature requests." - }, - "store_review_title": { - "message": "Store Review", - "description": "Heading for the store reviews section." - }, - "store_review_description": { - "message": "If you find TabTabTab helpful, we would greatly appreciate it if you could leave us a review on the ChromeWebStore! Your voice greatly contributes to the development of TabTabTab.", - "description": "Description for the section regarding store reviews." - }, - "source_code_title": { - "message": "Source Code", - "description": "Heading for the source code section." - }, - "source_code_description": { - "message": "The code for TabTabTab is open source and publicly available. It is carefully managed to prevent any illicit programming, ensuring the extension is developed safely.", - "description": "Description for the section related to the source code." - }, - "sponsor_page_header": { - "message": "Support the Project", - "description": "Header in Sponsor Page" - }, - "sponsor_page_description": { - "message": "TabTabTab is an open-source project, mainly developed by an individual. If you find it useful, I'd be grateful if you could consider supporting this project.", - "description": "Description in Sponsor Page" - }, "add_tab": { "message": "Add Tab", "description": "Action to add a new tab." diff --git a/dist/_locales/en_US/messages.json b/dist/_locales/en_US/messages.json index f5889523..478e58ca 100644 --- a/dist/_locales/en_US/messages.json +++ b/dist/_locales/en_US/messages.json @@ -283,10 +283,6 @@ "message": "Hour", "description": "One of the selectable units for the duration in the feature that automatically closes tabs after a specified period of inactivity." }, - "options_navigation_all_windows": { - "message": "All Windows", - "description": "Navigation header for AllWindows Page in options.html" - }, "options_navigation_save_and_restore": { "message": "Save & Restore", "description": "Navigation header for Save & Restore page in options.html" @@ -299,14 +295,6 @@ "message": "Settings", "description": "Navigation header for Settings page in options.html" }, - "options_navigation_feedback": { - "message": "Feedback", - "description": "Navigation header for Feedback page in options.html" - }, - "options_navigation_sponsor": { - "message": "Sponsor", - "description": "Navigation header for Sponsor page in options.html" - }, "tab_grouping_header": { "message": "Tab Grouping", "description": "The main header for the tab grouping section." @@ -359,6 +347,22 @@ "message": "Theme Color", "description": "The main header for the theme color setting section." }, + "mode": { + "message": "Mode", + "description": "Label for theme mode selection." + }, + "light": { + "message": "Light", + "description": "Light theme mode option." + }, + "system": { + "message": "System", + "description": "System theme mode option that follows OS settings." + }, + "dark": { + "message": "Dark", + "description": "Dark theme mode option." + }, "popup_setting_header": { "message": "Popup", "description": "The main header for the popup setting section." @@ -371,22 +375,6 @@ "message": "Height: 200-600px, Width: 400-800px required.", "description": "Notes or cautionary advice regarding the settings for the popup size." }, - "popup_element_scale_header": { - "message": "Popup element scale", - "description": "Heading for the settings to adjust the scale of elements within the popup." - }, - "popup_element_scale_description": { - "message": "Adjust the size of elements such as fonts and icons in the popup between 50~150% of their default size.", - "description": "Notes or cautionary advice regarding the settings for scaling elements within the popup." - }, - "popup_element_scale_validation_error_value_format": { - "message": "Input an integer.", - "description": "Error message displayed for validation issues in the settings for scaling elements within the popup." - }, - "popup_element_scale_validation_error_value_range": { - "message": "Input a value within the range of 50 to 150.", - "description": "Error message displayed for validation issues in the settings for scaling elements within the popup." - }, "toolbar_setting_header": { "message": "Toolbar", "description": "The main header for the toolbar setting section." @@ -403,10 +391,6 @@ "message": "SidePanel", "description": "Option to open the side panel when the toolbar icon is clicked." }, - "toolbar_icon_click_behavior_select_dashboard": { - "message": "Dashboard", - "description": "Option to open the dashboard when the toolbar icon is clicked." - }, "scale": { "message": "Scale", "description": "Heading for the input form to adjust the scale of elements within the popup." @@ -447,38 +431,6 @@ "message": "Input a positive integer.", "description": "Error message displayed for validation issues in the feature that automatically closes tabs after a specified period of inactivity." }, - "bug_report_and_feature_request_title": { - "message": "Bug Report & Feature Request", - "description": "Heading for the section covering bug reports and feature requests." - }, - "bug_report_and_feature_request_description": { - "message": "If you encounter any bugs while using TabTabTab, or have suggestions for feature requests, please feel free to create an issue on GitHub.", - "description": "Description for the section dedicated to submitting bug reports and feature requests." - }, - "store_review_title": { - "message": "Store Review", - "description": "Heading for the store reviews section." - }, - "store_review_description": { - "message": "If you find TabTabTab helpful, we would greatly appreciate it if you could leave us a review on the ChromeWebStore! Your voice greatly contributes to the development of TabTabTab.", - "description": "Description for the section regarding store reviews." - }, - "source_code_title": { - "message": "Source Code", - "description": "Heading for the source code section." - }, - "source_code_description": { - "message": "The code for TabTabTab is open source and publicly available. It is carefully managed to prevent any illicit programming, ensuring the extension is developed safely.", - "description": "Description for the section related to the source code." - }, - "sponsor_page_header": { - "message": "Support the Project", - "description": "Header in Sponsor Page" - }, - "sponsor_page_description": { - "message": "TabTabTab is an open-source project, mainly developed by an individual. If you find it useful, I'd be grateful if you could consider supporting this project.", - "description": "Description in Sponsor Page" - }, "add_tab": { "message": "Add Tab", "description": "Action to add a new tab." diff --git a/dist/_locales/fa/messages.json b/dist/_locales/fa/messages.json index f70e4d70..239020dd 100644 --- a/dist/_locales/fa/messages.json +++ b/dist/_locales/fa/messages.json @@ -283,10 +283,6 @@ "message": "ساعت", "description": "One of the selectable units for the duration in the feature that automatically closes tabs after a specified period of inactivity." }, - "options_navigation_all_windows": { - "message": "تمام پنجره ها", - "description": "Navigation header for AllWindows Page in options.html" - }, "options_navigation_save_and_restore": { "message": "ذخیره و بازیابی", "description": "Navigation header for Save & Restore page in options.html" @@ -299,14 +295,6 @@ "message": "تنظیمات", "description": "Navigation header for Settings page in options.html" }, - "options_navigation_feedback": { - "message": "بازخورد", - "description": "Navigation header for Feedback page in options.html" - }, - "options_navigation_sponsor": { - "message": "حامی ", - "description": "Navigation header for Sponsor page in options.html" - }, "tab_grouping_header": { "message": "گروه کردن تب", "description": "The main header for the tab grouping section." @@ -359,6 +347,22 @@ "message": "رنگ قالب", "description": "The main header for the theme color setting section." }, + "mode": { + "message": "حالت", + "description": "Label for theme mode selection." + }, + "light": { + "message": "روشن", + "description": "Light theme mode option." + }, + "system": { + "message": "سیستم", + "description": "System theme mode option that follows OS settings." + }, + "dark": { + "message": "تیره", + "description": "Dark theme mode option." + }, "popup_setting_header": { "message": "پاپ اپ", "description": "The main header for the popup setting section." @@ -371,22 +375,6 @@ "message": "ارتفاع: ۲۰۰-۶۰۰ پیکسل، عرض: ۴۰۰-۸۰۰ پیکسل الزامی است.", "description": "Notes or cautionary advice regarding the settings for the popup size." }, - "popup_element_scale_header": { - "message": "مقیاس عناصر پنجره پاپ‌آپ", - "description": "Heading for the settings to adjust the scale of elements within the popup." - }, - "popup_element_scale_description": { - "message": "اندازه عناصری مانند فونت‌ها و آیکون‌ها را در پنجره پاپ‌آپ بین ۵۰ تا ۱۵۰ درصد از اندازه پیش‌فرض تنظیم کنید.", - "description": "Notes or cautionary advice regarding the settings for scaling elements within the popup." - }, - "popup_element_scale_validation_error_value_format": { - "message": "یک عدد صحیح وارد کنید.", - "description": "Error message displayed for validation issues in the settings for scaling elements within the popup." - }, - "popup_element_scale_validation_error_value_range": { - "message": "یک مقدار در بازه ۵۰ تا ۱۵۰ وارد کنید.", - "description": "Error message displayed for validation issues in the settings for scaling elements within the popup." - }, "toolbar_setting_header": { "message": "نوار ابزار", "description": "The main header for the toolbar setting section." @@ -403,10 +391,6 @@ "message": "پنل کناری", "description": "Option to open the side panel when the toolbar icon is clicked." }, - "toolbar_icon_click_behavior_select_dashboard": { - "message": "داشبورد", - "description": "Option to open the dashboard when the toolbar icon is clicked." - }, "scale": { "message": "مقیاس", "description": "Heading for the input form to adjust the scale of elements within the popup." @@ -447,38 +431,6 @@ "message": "یک عدد صحیح مثبت وارد کنید", "description": "Error message displayed for validation issues in the feature that automatically closes tabs after a specified period of inactivity." }, - "bug_report_and_feature_request_title": { - "message": "گزارش مشکل یا درخواست ویژگی", - "description": "Heading for the section covering bug reports and feature requests." - }, - "bug_report_and_feature_request_description": { - "message": "اگر هنگام استفاده از TabTabTab با باگی مواجه شدید یا پیشنهادی برای ویژگی‌های جدید دارید، لطفاً با خیال راحت یک ایشو در GitHub ایجاد کنید.", - "description": "Description for the section dedicated to submitting bug reports and feature requests." - }, - "store_review_title": { - "message": "بازخورد فروشگاه", - "description": "Heading for the store reviews section." - }, - "store_review_description": { - "message": "اگر TabTabTab برای شما مفید بوده است، بسیار سپاسگزار خواهیم شد اگر نظر خود را در Chrome Web Store ثبت کنید! بازخورد شما تأثیر زیادی در توسعه و بهبود TabTabTab دارد.", - "description": "Description for the section regarding store reviews." - }, - "source_code_title": { - "message": "منبع کد", - "description": "Heading for the source code section." - }, - "source_code_description": { - "message": "کد TabTabTab متن‌باز و به‌صورت عمومی در دسترس است. این کد به‌دقت مدیریت می‌شود تا از هرگونه برنامه‌نویسی غیرقانونی جلوگیری شود و توسعه این افزونه به‌صورت ایمن انجام گیرد.", - "description": "Description for the section related to the source code." - }, - "sponsor_page_header": { - "message": "حمایت از پروژه", - "description": "Header in Sponsor Page" - }, - "sponsor_page_description": { - "message": "TabTabTab یک پروژه متن‌باز است که عمدتاً توسط یک فرد توسعه داده شده است. اگر این پروژه برای شما مفید بوده، خوشحال می‌شوم اگر حمایت از آن را در نظر بگیرید.", - "description": "Description in Sponsor Page" - }, "add_tab": { "message": "اضافه کردن تب", "description": "Action to add a new tab." diff --git a/dist/_locales/fr/messages.json b/dist/_locales/fr/messages.json index aee33829..1bc91a35 100644 --- a/dist/_locales/fr/messages.json +++ b/dist/_locales/fr/messages.json @@ -283,10 +283,6 @@ "message": "Heure", "description": "One of the selectable units for the duration in the feature that automatically closes tabs after a specified period of inactivity." }, - "options_navigation_all_windows": { - "message": "Toutes les fenêtres", - "description": "Navigation header for AllWindows Page in options.html" - }, "options_navigation_save_and_restore": { "message": "Sauvegarder et Restaurer", "description": "Navigation header for Save & Restore page in options.html" @@ -299,14 +295,6 @@ "message": "Paramètres", "description": "Navigation header for Settings page in options.html" }, - "options_navigation_feedback": { - "message": "Retour d'information", - "description": "Navigation header for Feedback page in options.html" - }, - "options_navigation_sponsor": { - "message": "Sponsor", - "description": "Navigation header for Sponsor page in options.html" - }, "tab_grouping_header": { "message": "Groupement d'onglets", "description": "The main header for the tab grouping section." @@ -359,6 +347,22 @@ "message": "Couleur du thème", "description": "The main header for the theme color setting section." }, + "mode": { + "message": "Mode", + "description": "Label for theme mode selection." + }, + "light": { + "message": "Clair", + "description": "Light theme mode option." + }, + "system": { + "message": "Système", + "description": "System theme mode option that follows OS settings." + }, + "dark": { + "message": "Sombre", + "description": "Dark theme mode option." + }, "popup_setting_header": { "message": "Popup", "description": "The main header for the popup setting section." @@ -371,22 +375,6 @@ "message": "Hauteur: 200-600px, Largeur: 400-800px requis.", "description": "Notes or cautionary advice regarding the settings for the popup size." }, - "popup_element_scale_header": { - "message": "Échelle des éléments du popup", - "description": "Heading for the settings to adjust the scale of elements within the popup." - }, - "popup_element_scale_description": { - "message": "Ajustez la taille des éléments tels que les polices et les icônes dans le popup entre 50~150% de leur taille par défaut.", - "description": "Notes or cautionary advice regarding the settings for scaling elements within the popup." - }, - "popup_element_scale_validation_error_value_format": { - "message": "Entrez un nombre entier.", - "description": "Error message displayed for validation issues in the settings for scaling elements within the popup." - }, - "popup_element_scale_validation_error_value_range": { - "message": "Entrez une valeur dans la plage de 50 à 150.", - "description": "Error message displayed for validation issues in the settings for scaling elements within the popup." - }, "toolbar_setting_header": { "message": "Barre d'outils", "description": "The main header for the toolbar setting section." @@ -403,10 +391,6 @@ "message": "Panneau latéral", "description": "Option to open the side panel when the toolbar icon is clicked." }, - "toolbar_icon_click_behavior_select_dashboard": { - "message": "Tableau de bord", - "description": "Option to open the dashboard when the toolbar icon is clicked." - }, "scale": { "message": "Échelle", "description": "Heading for the input form to adjust the scale of elements within the popup." @@ -447,38 +431,6 @@ "message": "Saisir un nombre entier positif.", "description": "Error message displayed for validation issues in the feature that automatically closes tabs after a specified period of inactivity." }, - "bug_report_and_feature_request_title": { - "message": "Rapport de Bug & Demande de Fonctionnalité", - "description": "Heading for the section covering bug reports and feature requests." - }, - "bug_report_and_feature_request_description": { - "message": "Si vous rencontrez des bugs lors de l'utilisation de TabTabTab, ou si vous avez des suggestions pour des demandes de fonctionnalités, n'hésitez pas à créer une issue sur GitHub.", - "description": "Description for the section dedicated to submitting bug reports and feature requests." - }, - "store_review_title": { - "message": "Avis sur l'Extension", - "description": "Heading for the store reviews section." - }, - "store_review_description": { - "message": "Si vous trouvez TabTabTab utile, nous vous serions reconnaissants de bien vouloir nous laisser un avis sur le ChromeWebStore ! Votre voix contribue grandement au développement de TabTabTab.", - "description": "Description for the section regarding store reviews." - }, - "source_code_title": { - "message": "Code Source", - "description": "Heading for the source code section." - }, - "source_code_description": { - "message": "Le code de TabTabTab est open source et accessible au public. Il est soigneusement géré pour empêcher toute programmation illicite, garantissant que l'extension puisse être développée en toute sécurité.", - "description": "Description for the section related to the source code." - }, - "sponsor_page_header": { - "message": "Soutenez le projet", - "description": "Header in Sponsor Page" - }, - "sponsor_page_description": { - "message": "TabTabTab est un projet open-source, principalement développé par un individu. Si vous le trouvez utile, je serais reconnaissant si vous envisagiez de soutenir ce projet.", - "description": "Description in Sponsor Page" - }, "add_tab": { "message": "Ajouter un onglet", "description": "Action to add a new tab." diff --git a/dist/_locales/ja/messages.json b/dist/_locales/ja/messages.json index 760c8c9a..a9b86c26 100644 --- a/dist/_locales/ja/messages.json +++ b/dist/_locales/ja/messages.json @@ -283,10 +283,6 @@ "message": "時間", "description": "One of the selectable units for the duration in the feature that automatically closes tabs after a specified period of inactivity." }, - "options_navigation_all_windows": { - "message": "すべてのウィンドウ", - "description": "Navigation header for AllWindows Page in options.html" - }, "options_navigation_save_and_restore": { "message": "保存と復元", "description": "Navigation header for Save & Restore page in options.html" @@ -299,14 +295,6 @@ "message": "設定", "description": "Navigation header for Settings page in options.html" }, - "options_navigation_feedback": { - "message": "フィードバック", - "description": "Navigation header for Feedback page in options.html" - }, - "options_navigation_sponsor": { - "message": "スポンサー", - "description": "Navigation header for Sponsor page in options.html" - }, "tab_grouping_header": { "message": "タブのグループ化", "description": "The main header for the tab grouping section." @@ -359,6 +347,22 @@ "message": "テーマカラー", "description": "The main header for the theme color setting section." }, + "mode": { + "message": "モード", + "description": "Label for theme mode selection." + }, + "light": { + "message": "ライト", + "description": "Light theme mode option." + }, + "system": { + "message": "システム", + "description": "System theme mode option that follows OS settings." + }, + "dark": { + "message": "ダーク", + "description": "Dark theme mode option." + }, "popup_setting_header": { "message": "ポップアップ", "description": "The main header for the popup setting section." @@ -371,22 +375,6 @@ "message": "高さ: 200~600px, 幅: 400~800px の範囲で指定してください。", "description": "Notes or cautionary advice regarding the settings for the popup size." }, - "popup_element_scale_header": { - "message": "ポップアップ要素のスケール", - "description": "Heading for the settings to adjust the scale of elements within the popup." - }, - "popup_element_scale_description": { - "message": "フォントやアイコンなどのポップアップ内の要素サイズをデフォルトサイズに対する50~150%の範囲で調整します。", - "description": "Notes or cautionary advice regarding the settings for scaling elements within the popup." - }, - "popup_element_scale_validation_error_value_format": { - "message": "整数値を入力してください。", - "description": "Error message displayed for validation issues in the settings for scaling elements within the popup." - }, - "popup_element_scale_validation_error_value_range": { - "message": "50~150の範囲の値を入力してください。", - "description": "Error message displayed for validation issues in the settings for scaling elements within the popup." - }, "toolbar_setting_header": { "message": "ツールバー", "description": "The main header for the toolbar setting section." @@ -403,10 +391,6 @@ "message": "サイドパネル", "description": "Option to open the side panel when the toolbar icon is clicked." }, - "toolbar_icon_click_behavior_select_dashboard": { - "message": "ダッシュボード", - "description": "Option to open the dashboard when the toolbar icon is clicked." - }, "scale": { "message": "スケール", "description": "Heading for the input form to adjust the scale of elements within the popup." @@ -447,38 +431,6 @@ "message": "1以上の整数値を入力してください。", "description": "Error message displayed for validation issues in the feature that automatically closes tabs after a specified period of inactivity." }, - "bug_report_and_feature_request_title": { - "message": "バグ報告&機能要望", - "description": "Heading for the section covering bug reports and feature requests." - }, - "bug_report_and_feature_request_description": { - "message": "TabTabTabを使っていてバグを見つけたり、機能改善の要望がありましたらGitHubにてお気軽にイシューを作成ください。", - "description": "Description for the section dedicated to submitting bug reports and feature requests." - }, - "store_review_title": { - "message": "ストアのレビュー", - "description": "Heading for the store reviews section." - }, - "store_review_description": { - "message": "TabTabTabが役立つと思ったらぜひChromeストアでレビューをお願いします!あなたの声がTabTabTabの発展に大きく寄与します!", - "description": "Description for the section regarding store reviews." - }, - "source_code_title": { - "message": "ソースコード", - "description": "Heading for the source code section." - }, - "source_code_description": { - "message": "TabTabTabのコードは公開されたオープンソースです。不正なプログラムが入らないよう管理されており、拡張機能が安全に開発されています。", - "description": "Description for the section related to the source code." - }, - "sponsor_page_header": { - "message": "プロジェクトをサポートする", - "description": "Header in Sponsor Page" - }, - "sponsor_page_description": { - "message": "TabTabTabは、主に個人によって開発されているオープンソースプロジェクトです。役立つツールと思われましたら、このプロジェクトをサポートしていただけるとありがたいです。", - "description": "Description in Sponsor Page" - }, "add_tab": { "message": "タブを追加", "description": "Action to add a new tab." diff --git a/dist/_locales/ko/messages.json b/dist/_locales/ko/messages.json index 3cd72c0c..5d42c5f4 100644 --- a/dist/_locales/ko/messages.json +++ b/dist/_locales/ko/messages.json @@ -283,10 +283,6 @@ "message": "시간", "description": "One of the selectable units for the duration in the feature that automatically closes tabs after a specified period of inactivity." }, - "options_navigation_all_windows": { - "message": "모든 창", - "description": "Navigation header for AllWindows Page in options.html" - }, "options_navigation_save_and_restore": { "message": "저장 및 복원", "description": "Navigation header for Save & Restore page in options.html" @@ -299,14 +295,6 @@ "message": "설정", "description": "Navigation header for Settings page in options.html" }, - "options_navigation_feedback": { - "message": "피드백", - "description": "Navigation header for Feedback page in options.html" - }, - "options_navigation_sponsor": { - "message": "스폰서", - "description": "Navigation header for Sponsor page in options.html" - }, "tab_grouping_header": { "message": "탭 그룹화", "description": "The main header for the tab grouping section." @@ -359,6 +347,22 @@ "message": "테마 색상", "description": "The main header for the theme color setting section." }, + "mode": { + "message": "모드", + "description": "Label for theme mode selection." + }, + "light": { + "message": "라이트", + "description": "Light theme mode option." + }, + "system": { + "message": "시스템", + "description": "System theme mode option that follows OS settings." + }, + "dark": { + "message": "다크", + "description": "Dark theme mode option." + }, "popup_setting_header": { "message": "팝업", "description": "The main header for the popup setting section." @@ -371,22 +375,6 @@ "message": "높이 범위: 200-600px, 너비 범위: 400-800px.", "description": "Notes or cautionary advice regarding the settings for the popup size." }, - "popup_element_scale_header": { - "message": "텍스트 및 아이콘 크기 조절", - "description": "Heading for the settings to adjust the scale of elements within the popup." - }, - "popup_element_scale_description": { - "message": "팝업 창 내 글씨와 아이콘의 크기를 조절합니다. 50-150% 사이 값을 입력하세요.", - "description": "Notes or cautionary advice regarding the settings for scaling elements within the popup." - }, - "popup_element_scale_validation_error_value_format": { - "message": "정수 값을 입력하세요.", - "description": "Error message displayed for validation issues in the settings for scaling elements within the popup." - }, - "popup_element_scale_validation_error_value_range": { - "message": "50-150% 사이의 값을 입력하세요.", - "description": "Error message displayed for validation issues in the settings for scaling elements within the popup." - }, "toolbar_setting_header": { "message": "도구 모음", "description": "The main header for the toolbar setting section." @@ -403,10 +391,6 @@ "message": "사이드 패널", "description": "Option to open the side panel when the toolbar icon is clicked." }, - "toolbar_icon_click_behavior_select_dashboard": { - "message": "대시보드", - "description": "Option to open the dashboard when the toolbar icon is clicked." - }, "scale": { "message": "비율", "description": "Heading for the input form to adjust the scale of elements within the popup." @@ -447,38 +431,6 @@ "message": "자연수를 입력하세요.", "description": "Error message displayed for validation issues in the feature that automatically closes tabs after a specified period of inactivity." }, - "bug_report_and_feature_request_title": { - "message": "버그 제보 & 신규 기능 요청", - "description": "Heading for the section covering bug reports and feature requests." - }, - "bug_report_and_feature_request_description": { - "message": "사용 중에 발견한 버그를 제보하거나 신규 기능을 요청하고 싶은 경우, GitHub에 이슈를 생성해주세요.", - "description": "Description for the section dedicated to submitting bug reports and feature requests." - }, - "store_review_title": { - "message": "스토어 리뷰", - "description": "Heading for the store reviews section." - }, - "store_review_description": { - "message": "TabTabTab이 마음에 들었다면 Chrome 웹 스토어에 리뷰를 남겨주세요! 여러분의 리뷰는 개발에 큰 도움이 됩니다.", - "description": "Description for the section regarding store reviews." - }, - "source_code_title": { - "message": "소스 코드", - "description": "Heading for the source code section." - }, - "source_code_description": { - "message": "TabTabTab은 오픈 소스 프로젝트이고, 소스 코드는 GitHub에 공개되어 있습니다. 안전한 확장 프로그램을 제공하기 위해 어떤 불법적인 프로그래밍도 하지 않습니다.", - "description": "Description for the section related to the source code." - }, - "sponsor_page_header": { - "message": "프로젝트 지원하기", - "description": "Header in Sponsor Page" - }, - "sponsor_page_description": { - "message": "TabTabTab은 주로 개인이 개발한 오픈 소스 프로젝트입니다. 유용하다고 생각되면 이 프로젝트를 지원해 주시면 감사하겠습니다.", - "description": "Description in Sponsor Page" - }, "add_tab": { "message": "탭 추가", "description": "Action to add a new tab." diff --git a/dist/_locales/pl/messages.json b/dist/_locales/pl/messages.json index 8f177234..ea5eb99f 100644 --- a/dist/_locales/pl/messages.json +++ b/dist/_locales/pl/messages.json @@ -283,10 +283,6 @@ "message": "Godzina", "description": "One of the selectable units for the duration in the feature that automatically closes tabs after a specified period of inactivity." }, - "options_navigation_all_windows": { - "message": "Wszystkie okna", - "description": "Navigation header for AllWindows Page in options.html" - }, "options_navigation_save_and_restore": { "message": "Zapisz i Przywróć", "description": "Navigation header for Save & Restore page in options.html" @@ -299,14 +295,6 @@ "message": "Ustawienia", "description": "Navigation header for Settings page in options.html" }, - "options_navigation_feedback": { - "message": "Opinie", - "description": "Navigation header for Feedback page in options.html" - }, - "options_navigation_sponsor": { - "message": "Sponsor", - "description": "Navigation header for Sponsor page in options.html" - }, "tab_grouping_header": { "message": "Grupowanie kart", "description": "The main header for the tab grouping section." @@ -359,6 +347,22 @@ "message": "Kolor motywu", "description": "The main header for the theme color setting section." }, + "mode": { + "message": "Tryb", + "description": "Label for theme mode selection." + }, + "light": { + "message": "Jasny", + "description": "Light theme mode option." + }, + "system": { + "message": "System", + "description": "System theme mode option that follows OS settings." + }, + "dark": { + "message": "Ciemny", + "description": "Dark theme mode option." + }, "popup_setting_header": { "message": "Popup", "description": "The main header for the popup setting section." @@ -371,22 +375,6 @@ "message": "Wymagania: wysokość: 200-600px, szerokość: 400-800px.", "description": "Notes or cautionary advice regarding the settings for the popup size." }, - "popup_element_scale_header": { - "message": "Skalowanie elementów popupu", - "description": "Heading for the settings to adjust the scale of elements within the popup." - }, - "popup_element_scale_description": { - "message": "Dostosuj rozmiar elementów, takich jak czcionki i ikony w popupie, do 50~150% ich domyślnego rozmiaru.", - "description": "Notes or cautionary advice regarding the settings for scaling elements within the popup." - }, - "popup_element_scale_validation_error_value_format": { - "message": "Wprowadź liczbę całkowitą.", - "description": "Error message displayed for validation issues in the settings for scaling elements within the popup." - }, - "popup_element_scale_validation_error_value_range": { - "message": "Wprowadź wartość w zakresie od 50 do 150.", - "description": "Error message displayed for validation issues in the settings for scaling elements within the popup." - }, "toolbar_setting_header": { "message": "Pasek narzędzi", "description": "The main header for the toolbar setting section." @@ -403,10 +391,6 @@ "message": "Panel boczny", "description": "Option to open the side panel when the toolbar icon is clicked." }, - "toolbar_icon_click_behavior_select_dashboard": { - "message": "Pulpit nawigacyjny", - "description": "Option to open the dashboard when the toolbar icon is clicked." - }, "scale": { "message": "Skala", "description": "Heading for the input form to adjust the scale of elements within the popup." @@ -447,38 +431,6 @@ "message": "Wprowadź dodatnią liczbę całkowitą.", "description": "Error message displayed for validation issues in the feature that automatically closes tabs after a specified period of inactivity." }, - "bug_report_and_feature_request_title": { - "message": "Zgłoszenie Błędu & Wniosek o Funkcję", - "description": "Heading for the section covering bug reports and feature requests." - }, - "bug_report_and_feature_request_description": { - "message": "Jeśli podczas korzystania z TabTabTab zauważysz jakieś błędy lub masz sugestie dotyczące funkcjonalności, możesz utworzyć zgłoszenie w serwisie GitHub.", - "description": "Description for the section dedicated to submitting bug reports and feature requests." - }, - "store_review_title": { - "message": "Opinie", - "description": "Heading for the store reviews section." - }, - "store_review_description": { - "message": "Jeśli uważasz, że TabTabTab jest pomocny - napisz nam swoją opinię w ChromeWebStore! Będziemy Ci za to bardzo wdzięczni. Twój głos w znacznym stopniu przyczynia się do rozwoju TabTabTab.", - "description": "Description for the section regarding store reviews." - }, - "source_code_title": { - "message": "Kod Źródłowy", - "description": "Heading for the source code section." - }, - "source_code_description": { - "message": "Kod źródłowy TabTabTab jest otwarty i publicznie dostępny (open source). Jest też starannie zarządzany, aby nie dopuścić do jakiegokolwiek niedozwolonego oprogramowania, zapewniając tym samym bezpieczny rozwój rozszerzenia.", - "description": "Description for the section related to the source code." - }, - "sponsor_page_header": { - "message": "Wesprzyj projekt", - "description": "Header in Sponsor Page" - }, - "sponsor_page_description": { - "message": "TabTabTab jest projektem open-source, głównie rozwijanym przez jedną osobę. Jeśli uznasz go za przydatny, byłbym wdzięczny, gdybyś rozważył wsparcie tego projektu.", - "description": "Description in Sponsor Page" - }, "add_tab": { "message": "Dodaj kartę", "description": "Action to add a new tab." diff --git a/dist/manifest.json b/dist/manifest.json index 821cb8ba..ebc56ade 100644 --- a/dist/manifest.json +++ b/dist/manifest.json @@ -4,7 +4,7 @@ "short_name": "__MSG_app_name_short__", "description": "__MSG_app_desc__", "default_locale": "en", - "version": "2.38.4", + "version": "2.38.5", "action": { "default_title": "TabTabTab", "default_icon": { diff --git a/package-lock.json b/package-lock.json index 659b07c5..84eed1db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,15 +18,16 @@ "tldts": "^7.0.17" }, "devDependencies": { - "@biomejs/biome": "^2.3.1", + "@biomejs/biome": "^2.3.2", "@types/chrome": "^0.1.27", + "@types/node": "^24.9.2", "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", "@vitejs/plugin-react": "^5.1.0", "chromex-locale-lint": "^0.1.0", "typescript": "^5.9.3", "vite": "^7.1.12", - "vitest": "^4.0.4" + "vitest": "^4.0.6" } }, "node_modules/@babel/code-frame": { @@ -319,9 +320,9 @@ } }, "node_modules/@biomejs/biome": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.1.tgz", - "integrity": "sha512-A29evf1R72V5bo4o2EPxYMm5mtyGvzp2g+biZvRFx29nWebGyyeOSsDWGx3tuNNMFRepGwxmA9ZQ15mzfabK2w==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.2.tgz", + "integrity": "sha512-8e9tzamuDycx7fdrcJ/F/GDZ8SYukc5ud6tDicjjFqURKYFSWMl0H0iXNXZEGmcmNUmABgGuHThPykcM41INgg==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -335,20 +336,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.3.1", - "@biomejs/cli-darwin-x64": "2.3.1", - "@biomejs/cli-linux-arm64": "2.3.1", - "@biomejs/cli-linux-arm64-musl": "2.3.1", - "@biomejs/cli-linux-x64": "2.3.1", - "@biomejs/cli-linux-x64-musl": "2.3.1", - "@biomejs/cli-win32-arm64": "2.3.1", - "@biomejs/cli-win32-x64": "2.3.1" + "@biomejs/cli-darwin-arm64": "2.3.2", + "@biomejs/cli-darwin-x64": "2.3.2", + "@biomejs/cli-linux-arm64": "2.3.2", + "@biomejs/cli-linux-arm64-musl": "2.3.2", + "@biomejs/cli-linux-x64": "2.3.2", + "@biomejs/cli-linux-x64-musl": "2.3.2", + "@biomejs/cli-win32-arm64": "2.3.2", + "@biomejs/cli-win32-x64": "2.3.2" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.1.tgz", - "integrity": "sha512-ombSf3MnTUueiYGN1SeI9tBCsDUhpWzOwS63Dove42osNh0PfE1cUtHFx6eZ1+MYCCLwXzlFlYFdrJ+U7h6LcA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.2.tgz", + "integrity": "sha512-4LECm4kc3If0JISai4c3KWQzukoUdpxy4fRzlrPcrdMSRFksR9ZoXK7JBcPuLBmd2SoT4/d7CQS33VnZpgBjew==", "cpu": [ "arm64" ], @@ -363,9 +364,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.1.tgz", - "integrity": "sha512-pcOfwyoQkrkbGvXxRvZNe5qgD797IowpJPovPX5biPk2FwMEV+INZqfCaz4G5bVq9hYnjwhRMamg11U4QsRXrQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.2.tgz", + "integrity": "sha512-jNMnfwHT4N3wi+ypRfMTjLGnDmKYGzxVr1EYAPBcauRcDnICFXN81wD6wxJcSUrLynoyyYCdfW6vJHS/IAoTDA==", "cpu": [ "x64" ], @@ -380,9 +381,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.1.tgz", - "integrity": "sha512-td5O8pFIgLs8H1sAZsD6v+5quODihyEw4nv2R8z7swUfIK1FKk+15e4eiYVLcAE4jUqngvh4j3JCNgg0Y4o4IQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.2.tgz", + "integrity": "sha512-amnqvk+gWybbQleRRq8TMe0rIv7GHss8mFJEaGuEZYWg1Tw14YKOkeo8h6pf1c+d3qR+JU4iT9KXnBKGON4klw==", "cpu": [ "arm64" ], @@ -397,9 +398,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.1.tgz", - "integrity": "sha512-+DZYv8l7FlUtTrWs1Tdt1KcNCAmRO87PyOnxKGunbWm5HKg1oZBSbIIPkjrCtDZaeqSG1DiGx7qF+CPsquQRcg==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.2.tgz", + "integrity": "sha512-2Zz4usDG1GTTPQnliIeNx6eVGGP2ry5vE/v39nT73a3cKN6t5H5XxjcEoZZh62uVZvED7hXXikclvI64vZkYqw==", "cpu": [ "arm64" ], @@ -414,9 +415,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.1.tgz", - "integrity": "sha512-PYWgEO7up7XYwSAArOpzsVCiqxBCXy53gsReAb1kKYIyXaoAlhBaBMvxR/k2Rm9aTuZ662locXUmPk/Aj+Xu+Q==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.2.tgz", + "integrity": "sha512-8BG/vRAhFz1pmuyd24FQPhNeueLqPtwvZk6yblABY2gzL2H8fLQAF/Z2OPIc+BPIVPld+8cSiKY/KFh6k81xfA==", "cpu": [ "x64" ], @@ -431,9 +432,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.1.tgz", - "integrity": "sha512-Y3Ob4nqgv38Mh+6EGHltuN+Cq8aj/gyMTJYzkFZV2AEj+9XzoXB9VNljz9pjfFNHUxvLEV4b55VWyxozQTBaUQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.2.tgz", + "integrity": "sha512-gzB19MpRdTuOuLtPpFBGrV3Lq424gHyq2lFj8wfX9tvLMLdmA/R9C7k/mqBp/spcbWuHeIEKgEs3RviOPcWGBA==", "cpu": [ "x64" ], @@ -448,9 +449,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.1.tgz", - "integrity": "sha512-RHIG/zgo+69idUqVvV3n8+j58dKYABRpMyDmfWu2TITC+jwGPiEaT0Q3RKD+kQHiS80mpBrST0iUGeEXT0bU9A==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.2.tgz", + "integrity": "sha512-lCruqQlfWjhMlOdyf5pDHOxoNm4WoyY2vZ4YN33/nuZBRstVDuqPPjS0yBkbUlLEte11FbpW+wWSlfnZfSIZvg==", "cpu": [ "arm64" ], @@ -465,9 +466,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.1.tgz", - "integrity": "sha512-izl30JJ5Dp10mi90Eko47zhxE6pYyWPcnX1NQxKpL/yMhXxf95oLTzfpu4q+MDBh/gemNqyJEwjBpe0MT5iWPA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.2.tgz", + "integrity": "sha512-6Ee9P26DTb4D8sN9nXxgbi9Dw5vSOfH98M7UlmkjKB2vtUbrRqCbZiNfryGiwnPIpd6YUoTl7rLVD2/x1CyEHQ==", "cpu": [ "x64" ], @@ -1153,17 +1154,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", - "dev": true, - "optional": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", @@ -1844,6 +1834,17 @@ "integrity": "sha512-OP6L9VuZNdskgNN3zFQQ54ceYD8OLq5IbqO4VK91ORLfOm7WdT/CiT/pHEBSQEqCInJ2y3O6iCm/zGtPElpgJQ==", "dev": true }, + "node_modules/@types/node": { + "version": "24.9.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.2.tgz", + "integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "undici-types": "~7.16.0" + } + }, "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -1906,16 +1907,16 @@ } }, "node_modules/@vitest/expect": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.4.tgz", - "integrity": "sha512-0ioMscWJtfpyH7+P82sGpAi3Si30OVV73jD+tEqXm5+rIx9LgnfdaOn45uaFkKOncABi/PHL00Yn0oW/wK4cXw==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.6.tgz", + "integrity": "sha512-5j8UUlBVhOjhj4lR2Nt9sEV8b4WtbcYh8vnfhTNA2Kn5+smtevzjNq+xlBuVhnFGXiyPPNzGrOVvmyHWkS5QGg==", "dev": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.4", - "@vitest/utils": "4.0.4", + "@vitest/spy": "4.0.6", + "@vitest/utils": "4.0.6", "chai": "^6.0.1", "tinyrainbow": "^3.0.3" }, @@ -1924,13 +1925,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.4.tgz", - "integrity": "sha512-UTtKgpjWj+pvn3lUM55nSg34098obGhSHH+KlJcXesky8b5wCUgg7s60epxrS6yAG8slZ9W8T9jGWg4PisMf5Q==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.6.tgz", + "integrity": "sha512-3COEIew5HqdzBFEYN9+u0dT3i/NCwppLnO1HkjGfAP1Vs3vti1Hxm/MvcbC4DAn3Szo1M7M3otiAaT83jvqIjA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.0.4", + "@vitest/spy": "4.0.6", "estree-walker": "^3.0.3", "magic-string": "^0.30.19" }, @@ -1951,9 +1952,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.4.tgz", - "integrity": "sha512-lHI2rbyrLVSd1TiHGJYyEtbOBo2SDndIsN3qY4o4xe2pBxoJLD6IICghNCvD7P+BFin6jeyHXiUICXqgl6vEaQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.6.tgz", + "integrity": "sha512-4vptgNkLIA1W1Nn5X4x8rLJBzPiJwnPc+awKtfBE5hNMVsoAl/JCCPPzNrbf+L4NKgklsis5Yp2gYa+XAS442g==", "dev": true, "license": "MIT", "dependencies": { @@ -1964,13 +1965,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.4.tgz", - "integrity": "sha512-99EDqiCkncCmvIZj3qJXBZbyoQ35ghOwVWNnQ5nj0Hnsv4Qm40HmrMJrceewjLVvsxV/JSU4qyx2CGcfMBmXJw==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.6.tgz", + "integrity": "sha512-trPk5qpd7Jj+AiLZbV/e+KiiaGXZ8ECsRxtnPnCrJr9OW2mLB72Cb824IXgxVz/mVU3Aj4VebY+tDTPn++j1Og==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.0.4", + "@vitest/utils": "4.0.6", "pathe": "^2.0.3" }, "funding": { @@ -1978,13 +1979,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.4.tgz", - "integrity": "sha512-XICqf5Gi4648FGoBIeRgnHWSNDp+7R5tpclGosFaUUFzY6SfcpsfHNMnC7oDu/iOLBxYfxVzaQpylEvpgii3zw==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.6.tgz", + "integrity": "sha512-PaYLt7n2YzuvxhulDDu6c9EosiRuIE+FI2ECKs6yvHyhoga+2TBWI8dwBjs+IeuQaMtZTfioa9tj3uZb7nev1g==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.4", + "@vitest/pretty-format": "4.0.6", "magic-string": "^0.30.19", "pathe": "^2.0.3" }, @@ -1993,9 +1994,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.4.tgz", - "integrity": "sha512-G9L13AFyYECo40QG7E07EdYnZZYCKMTSp83p9W8Vwed0IyCG1GnpDLxObkx8uOGPXfDpdeVf24P1Yka8/q1s9g==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.6.tgz", + "integrity": "sha512-g9jTUYPV1LtRPRCQfhbMintW7BTQz1n6WXYQYRQ25qkyffA4bjVXjkROokZnv7t07OqfaFKw1lPzqKGk1hmNuQ==", "dev": true, "license": "MIT", "funding": { @@ -2003,32 +2004,19 @@ } }, "node_modules/@vitest/utils": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.4.tgz", - "integrity": "sha512-4bJLmSvZLyVbNsYFRpPYdJViG9jZyRvMZ35IF4ymXbRZoS+ycYghmwTGiscTXduUg2lgKK7POWIyXJNute1hjw==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.6.tgz", + "integrity": "sha512-bG43VS3iYKrMIZXBo+y8Pti0O7uNju3KvNn6DrQWhQQKcLavMB+0NZfO1/QBAEbq0MaQ3QjNsnnXlGQvsh0Z6A==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.4", + "@vitest/pretty-format": "4.0.6", "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "optional": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -2107,13 +2095,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "optional": true - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2201,13 +2182,6 @@ "node": ">=6" } }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "optional": true - }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -2905,27 +2879,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "optional": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -3064,8 +3017,7 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true, - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/update-browserslist-db": { "version": "1.1.4", @@ -3175,19 +3127,19 @@ } }, "node_modules/vitest": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.4.tgz", - "integrity": "sha512-hV31h0/bGbtmDQc0KqaxsTO1v4ZQeF8ojDFuy4sZhFadwAqqvJA0LDw68QUocctI5EDpFMql/jVWKuPYHIf2Ew==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.6.tgz", + "integrity": "sha512-gR7INfiVRwnEOkCk47faros/9McCZMp5LM+OMNWGLaDBSvJxIzwjgNFufkuePBNaesGRnLmNfW+ddbUJRZn0nQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.0.4", - "@vitest/mocker": "4.0.4", - "@vitest/pretty-format": "4.0.4", - "@vitest/runner": "4.0.4", - "@vitest/snapshot": "4.0.4", - "@vitest/spy": "4.0.4", - "@vitest/utils": "4.0.4", + "@vitest/expect": "4.0.6", + "@vitest/mocker": "4.0.6", + "@vitest/pretty-format": "4.0.6", + "@vitest/runner": "4.0.6", + "@vitest/snapshot": "4.0.6", + "@vitest/spy": "4.0.6", + "@vitest/utils": "4.0.6", "debug": "^4.4.3", "es-module-lexer": "^1.7.0", "expect-type": "^1.2.2", @@ -3215,10 +3167,10 @@ "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.4", - "@vitest/browser-preview": "4.0.4", - "@vitest/browser-webdriverio": "4.0.4", - "@vitest/ui": "4.0.4", + "@vitest/browser-playwright": "4.0.6", + "@vitest/browser-preview": "4.0.6", + "@vitest/browser-webdriverio": "4.0.6", + "@vitest/ui": "4.0.6", "happy-dom": "*", "jsdom": "*" }, diff --git a/package.json b/package.json index 05a6fed2..4c69a097 100755 --- a/package.json +++ b/package.json @@ -27,14 +27,15 @@ "tldts": "^7.0.17" }, "devDependencies": { - "@biomejs/biome": "^2.3.1", + "@biomejs/biome": "^2.3.2", "@types/chrome": "^0.1.27", + "@types/node": "^24.9.2", "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", "@vitejs/plugin-react": "^5.1.0", "chromex-locale-lint": "^0.1.0", "typescript": "^5.9.3", "vite": "^7.1.12", - "vitest": "^4.0.4" + "vitest": "^4.0.6" } } diff --git a/src/background/ToolBarAction.ts b/src/background/ToolBarAction.ts index ee621498..0a6ae3dc 100644 --- a/src/background/ToolBarAction.ts +++ b/src/background/ToolBarAction.ts @@ -33,19 +33,6 @@ export const addToolBarActions = async () => { const toolbarSetting = await getToolbarSetting(); setToolbarIconBehavior(toolbarSetting.iconClickOpenView); - - chrome.action.onClicked.addListener(async () => { - const toolbarSetting = await getToolbarSetting(); - const openView = toolbarSetting.iconClickOpenView; - switch (openView) { - case "dashboard": - navigateToOptionsPage(); - break; - case "popup": - case "sidePanel": - break; - } - }); }; chrome.contextMenus.onClicked.addListener(async (info) => { diff --git a/src/data/repository/SettingsRepository.ts b/src/data/repository/SettingsRepository.ts index aabc933c..da111516 100644 --- a/src/data/repository/SettingsRepository.ts +++ b/src/data/repository/SettingsRepository.ts @@ -16,19 +16,6 @@ export const updatePopupSizeSetting = (popupSize: PopupSize): Promise => { return ChromeLocalStorage.updatePopupSizeSetting(popupSize); }; -export const getPopupElementScaleSetting = async (): Promise => { - const setting = await ChromeLocalStorage.getPopupElementScaleSetting(); - if (!setting) return 80; - - return setting; -}; - -export const updatePopupElementScaleSetting = ( - scale: number, -): Promise => { - return ChromeLocalStorage.updatePopupElementScaleSetting(scale); -}; - export const getToolbarSetting = async (): Promise => { const setting = await ChromeLocalStorage.getToolbarSetting(); if (!setting) return defaultToolbarSetting; diff --git a/src/data/repository/ToolbarRepository.ts b/src/data/repository/ToolbarRepository.ts index 42251ca3..cca4af0c 100644 --- a/src/data/repository/ToolbarRepository.ts +++ b/src/data/repository/ToolbarRepository.ts @@ -21,11 +21,10 @@ export const setToolbarIconBehavior = async ( case "sidePanel": await setToolbarIconBehaviorToOpenSidePanel(); break; - case "dashboard": - await setToolbarIconBehaviorToNone(); - break; default: - throw new Error(`Invalid view: ${view}`); + // NOTE: Fallback for legacy "dashboard" value from previous versions + console.error(`Unknown toolbar icon click view: ${view}`); + await setToolbarIconBehaviorToOpenPopup(); } }; diff --git a/src/data/storage/ChromeLocalStorage.ts b/src/data/storage/ChromeLocalStorage.ts index c9724d1d..2f1445b6 100644 --- a/src/data/storage/ChromeLocalStorage.ts +++ b/src/data/storage/ChromeLocalStorage.ts @@ -7,7 +7,7 @@ import type { ToolbarSetting } from "../../model/ToolbarSetting"; export namespace ChromeLocalStorage { const TAB_CLEANER_SETTING_KEY = "tab_cleaner_setting"; const POPUP_SIZE_SETTING_KEY = "popup_size_setting"; - const POPUP_ELEMENT_SCALE_SETTING_KEY = "popup_element_scale"; + const _POPUP_ELEMENT_SCALE_SETTING_KEY = "popup_element_scale"; const TOOLBAR_SETTING_KEY = "toolbar_setting"; const MODE_KEY = "mode"; const THEME_COLOR_KEY = "theme_color"; @@ -93,23 +93,6 @@ export namespace ChromeLocalStorage { }); }; - // PopupElementScaleSetting - type PopupElementScaleSettingStorageObject = { - [POPUP_ELEMENT_SCALE_SETTING_KEY]: number; - }; - export const getPopupElementScaleSetting = async () => { - const { [POPUP_ELEMENT_SCALE_SETTING_KEY]: setting } = - (await chrome.storage.local.get( - POPUP_ELEMENT_SCALE_SETTING_KEY, - )) as PopupElementScaleSettingStorageObject; - return setting; - }; - export const updatePopupElementScaleSetting = (scale: number) => { - return chrome.storage.local.set({ - [POPUP_ELEMENT_SCALE_SETTING_KEY]: scale, - }); - }; - // ToolbarSetting type ToolbarSettingStorageObject = { [TOOLBAR_SETTING_KEY]: { diff --git a/src/i18n/Translations.ts b/src/i18n/Translations.ts index d65f7a03..92589a72 100644 --- a/src/i18n/Translations.ts +++ b/src/i18n/Translations.ts @@ -201,6 +201,18 @@ class Translations { get themeColorSettingHeader() { return chrome.i18n.getMessage("theme_color_setting_header"); } + get mode() { + return chrome.i18n.getMessage("mode"); + } + get light() { + return chrome.i18n.getMessage("light"); + } + get dark() { + return chrome.i18n.getMessage("dark"); + } + get system() { + return chrome.i18n.getMessage("system"); + } get popupSettingHeader() { return chrome.i18n.getMessage("popup_setting_header"); } @@ -224,11 +236,6 @@ class Translations { "toolbar_icon_click_behavior_select_side_panel", ); } - get toolbarIconClickBehaviorSelectDashboard() { - return chrome.i18n.getMessage( - "toolbar_icon_click_behavior_select_dashboard", - ); - } get height() { return chrome.i18n.getMessage("height"); } @@ -256,51 +263,14 @@ class Translations { get popupSizeValidationErrorValueRange() { return chrome.i18n.getMessage("popup_size_validation_error_value_range"); } - get popupElementScaleHeader() { - return chrome.i18n.getMessage("popup_element_scale_header"); - } - get popupElementScaleDescription() { - return chrome.i18n.getMessage("popup_element_scale_description"); - } - get popupElementScaleValidationErrorValueFormat() { - return chrome.i18n.getMessage( - "popup_element_scale_validation_error_value_format", - ); - } - get popupElementScaleValidationErrorValueRange() { - return chrome.i18n.getMessage( - "popup_element_scale_validation_error_value_range", - ); - } get settings() { return chrome.i18n.getMessage("settings"); } get feedback() { return chrome.i18n.getMessage("feedback"); } - get bugReportAndFeatureRequestTitle() { - return chrome.i18n.getMessage("bug_report_and_feature_request_title"); - } - get bugReportAndFeatureRequestDescription() { - return chrome.i18n.getMessage("bug_report_and_feature_request_description"); - } - get storeReviewTitle() { - return chrome.i18n.getMessage("store_review_title"); - } - get storeReviewDescription() { - return chrome.i18n.getMessage("store_review_description"); - } - get sourceCodeTitle() { - return chrome.i18n.getMessage("source_code_title"); - } - get sourceCodeDescription() { - return chrome.i18n.getMessage("source_code_description"); - } // OptionsHeader - get optionsNavigationAllWindows() { - return chrome.i18n.getMessage("options_navigation_all_windows"); - } get optionsNavigationSaveAndRestore() { return chrome.i18n.getMessage("options_navigation_save_and_restore"); } @@ -310,12 +280,6 @@ class Translations { get optionsNavigationSettings() { return chrome.i18n.getMessage("options_navigation_settings"); } - get optionsNavigationFeedback() { - return chrome.i18n.getMessage("options_navigation_feedback"); - } - get optionsNavigationSponsor() { - return chrome.i18n.getMessage("options_navigation_sponsor"); - } // TidyTabPage get cleanupTabsHeader() { @@ -390,15 +354,6 @@ class Translations { "tab_grouping_group_tabs_by_menu_item_subdomain", ); } - - // SponsorPage - get sponsorPageHeader() { - return chrome.i18n.getMessage("sponsor_page_header"); - } - get sponsorPageDescription() { - return chrome.i18n.getMessage("sponsor_page_description"); - } - // Common get addTab() { return chrome.i18n.getMessage("add_tab"); diff --git a/src/model/Theme.ts b/src/model/Theme.ts index a473aeab..f9100abd 100644 --- a/src/model/Theme.ts +++ b/src/model/Theme.ts @@ -1,4 +1,4 @@ -export type Mode = "light" | "dark"; +export type Mode = "light" | "dark" | "system"; export type ThemeColor = | "grey" | "blue" diff --git a/src/model/ToolbarSetting.ts b/src/model/ToolbarSetting.ts index 91ff8ee3..cc9ac564 100644 --- a/src/model/ToolbarSetting.ts +++ b/src/model/ToolbarSetting.ts @@ -1,5 +1,5 @@ export type ToolbarSetting = { - iconClickOpenView: "popup" | "sidePanel" | "dashboard"; + iconClickOpenView: "popup" | "sidePanel"; }; export const defaultToolbarSetting: ToolbarSetting = { @@ -9,5 +9,5 @@ export const defaultToolbarSetting: ToolbarSetting = { export const isValidIconClickOpenView = ( value: string, ): value is ToolbarSetting["iconClickOpenView"] => { - return ["popup", "sidePanel", "dashboard"].includes(value); + return ["popup", "sidePanel"].includes(value); }; diff --git a/src/presentation/views/options/App.tsx b/src/presentation/views/options/App.tsx index 9026cae8..4d370b42 100644 --- a/src/presentation/views/options/App.tsx +++ b/src/presentation/views/options/App.tsx @@ -1,47 +1,31 @@ import { ThemeProvider } from "@emotion/react"; -import AutoAwesomeMotionIcon from "@mui/icons-material/AutoAwesomeMotion"; -import ForumIcon from "@mui/icons-material/Forum"; -import SettingsIcon from "@mui/icons-material/Settings"; -import SyncIcon from "@mui/icons-material/Sync"; -import ViewColumnIcon from "@mui/icons-material/ViewColumn"; -import VolunteerActivismIcon from "@mui/icons-material/VolunteerActivism"; -import Container from "@mui/material/Container"; import CssBaseline from "@mui/material/CssBaseline"; -import Divider from "@mui/material/Divider"; -import List from "@mui/material/List"; -import ListItem from "@mui/material/ListItem"; -import ListItemButton from "@mui/material/ListItemButton"; -import ListItemIcon from "@mui/material/ListItemIcon"; -import ListItemText from "@mui/material/ListItemText"; -import Stack from "@mui/material/Stack"; import { createTheme } from "@mui/material/styles"; +import useMediaQuery from "@mui/material/useMediaQuery"; import type React from "react"; -import { useContext, useState } from "react"; -import t from "../../../i18n/Translations"; +import { useContext } from "react"; import { ModeContext, ModeProvider } from "../../contexts/ModeContext"; import { ThemeColorContext, ThemeColorProvider, } from "../../contexts/ThemeColorContext"; import { WindowsProvider } from "../../contexts/WindowsContext"; -import SaveAndRestorePage from "../shared/components/SaveAndRestorePage"; -import TidyTabsPage from "../shared/components/TidyTabsPage"; import { tabGroupColorPalette } from "../shared/resources/tabGroupColorPalette"; import { themeColorPaletteBy } from "../shared/resources/themeColorPalette"; -import Header from "./components/Header"; -import Feedback from "./pages/Feedback"; -import Overview from "./pages/Overview"; -import Settings from "./pages/Settings"; -import Sponsor from "./pages/Sponsor"; +import Header from "./Header"; +import Overview from "./Overview"; const MuiThemeProvider = ({ children }: { children: React.ReactNode }) => { const { mode } = useContext(ModeContext); const { themeColor } = useContext(ThemeColorContext); + const prefersDarkMode = useMediaQuery("(prefers-color-scheme: dark)"); + const actualMode = + mode === "system" ? (prefersDarkMode ? "dark" : "light") : mode; const themePalette = createTheme({ palette: { - mode, - primary: themeColorPaletteBy(themeColor, mode), - ...tabGroupColorPalette(mode), + mode: actualMode, + primary: themeColorPaletteBy(themeColor, actualMode), + ...tabGroupColorPalette(actualMode), }, }); @@ -49,66 +33,6 @@ const MuiThemeProvider = ({ children }: { children: React.ReactNode }) => { }; const App = () => { - const [currentPage, setPage] = useState(0); - const pages = [ - { - name: t.optionsNavigationAllWindows, - icon: , - content: ( - - - - ), - }, - { - name: t.optionsNavigationSaveAndRestore, - icon: , - content: ( - - - - - - ), - }, - { - name: t.optionsNavigationTidyTabs, - icon: , - content: ( - - - - ), - }, - { - name: t.optionsNavigationSettings, - icon: , - content: ( - - - - ), - }, - { - name: t.optionsNavigationFeedback, - icon: , - content: ( - - - - ), - }, - { - name: t.optionsNavigationSponsor, - icon: , - content: ( - - - - ), - }, - ]; - return ( @@ -116,30 +40,9 @@ const App = () => {
- - - {pages.map((page, index) => ( - - setPage(index)} - > - {page.icon} - - - - ))} - - - {pages[currentPage].content} - + + + diff --git a/src/presentation/views/options/Header.tsx b/src/presentation/views/options/Header.tsx new file mode 100644 index 00000000..2c7713b8 --- /dev/null +++ b/src/presentation/views/options/Header.tsx @@ -0,0 +1,20 @@ +import AppBar from "@mui/material/AppBar"; +import Toolbar from "@mui/material/Toolbar"; +import Typography from "@mui/material/Typography"; +import TabSearchForm from "./TabSearchForm"; + +const Header = () => { + return ( + + + + TabTabTab + + + + + + ); +}; + +export default Header; diff --git a/src/presentation/views/options/pages/Overview/index.tsx b/src/presentation/views/options/Overview.tsx similarity index 90% rename from src/presentation/views/options/pages/Overview/index.tsx rename to src/presentation/views/options/Overview.tsx index 3d2ece67..b8ceb1a7 100644 --- a/src/presentation/views/options/pages/Overview/index.tsx +++ b/src/presentation/views/options/Overview.tsx @@ -11,16 +11,16 @@ import Stack from "@mui/material/Stack"; import { alpha, useTheme } from "@mui/material/styles"; import Typography from "@mui/material/Typography"; import { useContext, useState } from "react"; -import { addWindow } from "../../../../../data/repository/WindowsRepository"; -import t from "../../../../../i18n/Translations"; -import { flatTabsInWindow, type Window } from "../../../../../model/Window"; -import { WindowsContext } from "../../../../contexts/WindowsContext"; -import { WindowActionMenu } from "../../../shared/components/ActionMenu"; +import { addWindow } from "../../../data/repository/WindowsRepository"; +import t from "../../../i18n/Translations"; +import { flatTabsInWindow, type Window } from "../../../model/Window"; +import { WindowsContext } from "../../contexts/WindowsContext"; +import { WindowActionMenu } from "../shared/components/ActionMenu"; import DragAndDropContext, { DROPPABLE_EMPTY_WINDOW_COLUMN_ID, DROPPABLE_WINDOW_COLUMN_ID_PREFIX, -} from "../../../shared/components/DragAndDropContext"; -import TabList from "../../../shared/components/TabList"; +} from "../shared/components/DragAndDropContext"; +import TabList from "../shared/components/TabList"; type WindowColumnProps = { windows: Window[]; diff --git a/src/presentation/views/options/components/TabSearchForm.tsx b/src/presentation/views/options/TabSearchForm.tsx similarity index 97% rename from src/presentation/views/options/components/TabSearchForm.tsx rename to src/presentation/views/options/TabSearchForm.tsx index eb23cd02..958a38ad 100644 --- a/src/presentation/views/options/components/TabSearchForm.tsx +++ b/src/presentation/views/options/TabSearchForm.tsx @@ -21,16 +21,13 @@ import { useCallback, useContext, useEffect, useRef, useState } from "react"; import { focusTab, getRecentActiveTabs, -} from "../../../../data/repository/TabsRepository"; -import t from "../../../../i18n/Translations"; -import type { Tab } from "../../../../model/Tab"; -import { findTabsByTitleOrUrl } from "../../../../model/Window"; -import { - WindowsContext, - WindowsProvider, -} from "../../../contexts/WindowsContext"; -import groupTabsBySearchKeyword from "../../../functions/groupTabsBySearchKeyword"; -import TabItem from "../../shared/components/TabItem"; +} from "../../../data/repository/TabsRepository"; +import t from "../../../i18n/Translations"; +import type { Tab } from "../../../model/Tab"; +import { findTabsByTitleOrUrl } from "../../../model/Window"; +import { WindowsContext, WindowsProvider } from "../../contexts/WindowsContext"; +import groupTabsBySearchKeyword from "../../functions/groupTabsBySearchKeyword"; +import TabItem from "../shared/components/TabItem"; const smoothScrollTo = (container: HTMLElement, targetScrollTop: number) => { const startScrollTop = container.scrollTop; diff --git a/src/presentation/views/options/components/Header.tsx b/src/presentation/views/options/components/Header.tsx deleted file mode 100644 index 78ee3bd0..00000000 --- a/src/presentation/views/options/components/Header.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import DarkModeIcon from "@mui/icons-material/DarkMode"; -import LightModeIcon from "@mui/icons-material/LightMode"; -import AppBar from "@mui/material/AppBar"; -import IconButton from "@mui/material/IconButton"; -import Stack from "@mui/material/Stack"; -import Toolbar from "@mui/material/Toolbar"; -import Typography from "@mui/material/Typography"; -import { useContext } from "react"; -import { updateMode } from "../../../../data/repository/ThemeRepository"; -import { ModeContext } from "../../../contexts/ModeContext"; -import TabSearchForm from "./TabSearchForm"; - -const Header = () => { - const { mode } = useContext(ModeContext); - - return ( - - - - TabTabTab - - - - - updateMode(mode === "light" ? "dark" : "light")} - color="inherit" - > - {mode === "light" ? : } - - - - - ); -}; - -export default Header; diff --git a/src/presentation/views/options/pages/Feedback/index.tsx b/src/presentation/views/options/pages/Feedback/index.tsx deleted file mode 100644 index 237fd34c..00000000 --- a/src/presentation/views/options/pages/Feedback/index.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import BugReportIcon from "@mui/icons-material/BugReport"; -import GitHubIcon from "@mui/icons-material/GitHub"; -import RateReviewIcon from "@mui/icons-material/RateReview"; -import Card from "@mui/material/Card"; -import CardActionArea from "@mui/material/CardActionArea"; -import CardHeader from "@mui/material/CardHeader"; -import Link from "@mui/material/Link"; -import Stack from "@mui/material/Stack"; -import Typography from "@mui/material/Typography"; -import t from "../../../../../i18n/Translations"; - -const Feedback = () => { - const feedbacks = [ - { - title: t.bugReportAndFeatureRequestTitle, - description: t.bugReportAndFeatureRequestDescription, - link: "https://github.com/okaryo/TabTabTab/issues", - icon: , - }, - { - title: t.storeReviewTitle, - description: t.storeReviewDescription, - link: "https://chrome.google.com/webstore/detail/tabtabtab/hfmnidllojimehmfjkclnadpebibhgoi", - icon: , - }, - { - title: t.sourceCodeTitle, - description: t.sourceCodeDescription, - link: "https://github.com/okaryo/TabTabTab", - icon: , - }, - ]; - - return ( - - {feedbacks.map((feedback) => { - return ( - - - - - {feedback.icon} - - {feedback.title} - - - } - subheader={ - - {feedback.description} - - } - /> - - - - ); - })} - - ); -}; - -export default Feedback; diff --git a/src/presentation/views/options/pages/Settings/PopupElementScaleSettingForm.tsx b/src/presentation/views/options/pages/Settings/PopupElementScaleSettingForm.tsx deleted file mode 100644 index 85b5617e..00000000 --- a/src/presentation/views/options/pages/Settings/PopupElementScaleSettingForm.tsx +++ /dev/null @@ -1,148 +0,0 @@ -import Box from "@mui/material/Box"; -import Button from "@mui/material/Button"; -import Card from "@mui/material/Card"; -import CardHeader from "@mui/material/CardHeader"; -import FormControl from "@mui/material/FormControl"; -import FormHelperText from "@mui/material/FormHelperText"; -import InputAdornment from "@mui/material/InputAdornment"; -import Snackbar from "@mui/material/Snackbar"; -import Stack from "@mui/material/Stack"; -import TextField from "@mui/material/TextField"; -import Typography from "@mui/material/Typography"; -import { useEffect, useState } from "react"; - -import { - getPopupElementScaleSetting, - updatePopupElementScaleSetting, -} from "../../../../../data/repository/SettingsRepository"; -import t from "../../../../../i18n/Translations"; - -type SubmissionState = { - isLoading: boolean; - isError: boolean; - errorMessage: string; -}; - -const PopupFontAndIconScaleSettingForm = () => { - const MIN_SCALE = 50; - const MAX_SCALE = 150; - - const [settingState, setSettingState] = useState("100"); - const [submissionState, setSubmissionState] = useState({ - isLoading: false, - isError: false, - errorMessage: "", - }); - const [isOpenSnackBarState, setIsOpenSnackBarState] = useState(false); - - useEffect(() => { - const setSetting = async () => { - const scale = await getPopupElementScaleSetting(); - setSettingState(scale.toString()); - }; - setSetting(); - }, []); - - const onChangeScale = (event: React.ChangeEvent) => { - const value = event.target.value; - setSettingState(value); - }; - - const onSave = async () => { - setSubmissionState({ isLoading: false, isError: false, errorMessage: "" }); - - if (!Number.isInteger(Number(settingState))) { - setSubmissionState({ - isLoading: false, - isError: true, - errorMessage: t.popupElementScaleValidationErrorValueFormat, - }); - return; - } - if (MIN_SCALE > Number(settingState) || Number(settingState) > MAX_SCALE) { - setSubmissionState({ - isLoading: false, - isError: true, - errorMessage: t.popupElementScaleValidationErrorValueRange, - }); - return; - } - - try { - setSubmissionState({ isLoading: true, isError: false, errorMessage: "" }); - await updatePopupElementScaleSetting(Number(settingState)); - setSubmissionState({ - isLoading: false, - isError: false, - errorMessage: "", - }); - setIsOpenSnackBarState(true); - } catch (_) { - setSubmissionState({ - isLoading: false, - isError: true, - errorMessage: t.savedError, - }); - } - }; - - return ( - - - {t.popupElementScaleHeader} - - } - subheader={ - - {t.popupElementScaleDescription} - - } - /> - - - - - % - ), - }} - onChange={onChangeScale} - /> - - - - - {submissionState.errorMessage} - - setIsOpenSnackBarState(false)} - autoHideDuration={3000} - message={t.savedSuccessfully} - /> - - - - ); -}; - -export default PopupFontAndIconScaleSettingForm; diff --git a/src/presentation/views/options/pages/Settings/index.tsx b/src/presentation/views/options/pages/Settings/index.tsx deleted file mode 100644 index 2de3485e..00000000 --- a/src/presentation/views/options/pages/Settings/index.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import Divider from "@mui/material/Divider"; -import Stack from "@mui/material/Stack"; -import t from "../../../../../i18n/Translations"; -import PaperWithHeader from "../../../shared/components/PaperWithHeader"; -import PopupElementScaleSettingForm from "./PopupElementScaleSettingForm"; -import PopupSizeSettingForm from "./PopupSizeSettingForm"; -import ThemeColorSettingForm from "./ThemeColorSettingForm"; -import ToolbarSettingForm from "./ToolbarSettingForm"; - -const Settings = () => { - return ( - - - - - - - - - - ); -}; - -export default Settings; diff --git a/src/presentation/views/options/pages/Sponsor/index.tsx b/src/presentation/views/options/pages/Sponsor/index.tsx deleted file mode 100644 index 86d22d34..00000000 --- a/src/presentation/views/options/pages/Sponsor/index.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import GitHubIcon from "@mui/icons-material/GitHub"; -import Button from "@mui/material/Button"; -import Link from "@mui/material/Link"; -import Stack from "@mui/material/Stack"; -import { useTheme } from "@mui/material/styles"; -import Typography from "@mui/material/Typography"; - -import t from "../../../../../i18n/Translations"; - -const Sponsor = () => { - const BuyMeCoffeeButton = () => { - return ( - - Buy Me A Coffee - - ); - }; - - const GitHubButton = () => { - const githubTheme = { - light: { - background: "#0d1117", - text: "#ffffff", - border: "#30363d", - }, - dark: { - background: "#ffffff", - text: "#333333", - border: "#dddddd", - }, - }; - const theme = useTheme(); - const mode = theme.palette.mode; - const buttonStyle = { - backgroundColor: githubTheme[mode].background, - color: githubTheme[mode].text, - borderColor: githubTheme[mode].border, - "&:hover": { - opacity: 0.8, - backgroundColor: githubTheme[mode].background, - color: githubTheme[mode].text, - }, - }; - - return ( - - ); - }; - - return ( - - - - {`${t.sponsorPageHeader} ❤️`} - - - {t.sponsorPageDescription} - - - - - - - - ); -}; - -export default Sponsor; diff --git a/src/presentation/views/popup/components/Header.tsx b/src/presentation/views/popup/components/Header.tsx index b477c41e..4dcbfdeb 100644 --- a/src/presentation/views/popup/components/Header.tsx +++ b/src/presentation/views/popup/components/Header.tsx @@ -1,10 +1,9 @@ import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import AutoAwesomeMotionIcon from "@mui/icons-material/AutoAwesomeMotion"; import ClearIcon from "@mui/icons-material/Clear"; -import DarkModeIcon from "@mui/icons-material/DarkMode"; -import LightModeIcon from "@mui/icons-material/LightMode"; import MoreVertIcon from "@mui/icons-material/MoreVert"; import SearchIcon from "@mui/icons-material/Search"; +import SettingsIcon from "@mui/icons-material/Settings"; import SyncIcon from "@mui/icons-material/Sync"; import AppBar from "@mui/material/AppBar"; import IconButton from "@mui/material/IconButton"; @@ -13,10 +12,8 @@ import InputBase from "@mui/material/InputBase"; import { alpha, styled } from "@mui/material/styles"; import Toolbar from "@mui/material/Toolbar"; import Typography from "@mui/material/Typography"; -import { useContext, useState } from "react"; -import { updateMode } from "../../../../data/repository/ThemeRepository"; +import { useState } from "react"; import t from "../../../../i18n/Translations"; -import { ModeContext } from "../../../contexts/ModeContext"; import { PopupHeaderActionMenu } from "../../shared/components/ActionMenu"; import type { PopupPage } from "./Home"; @@ -63,7 +60,6 @@ const StyledInputBase = styled(InputBase)(({ theme }) => ({ const Header = (props: HeaderProps) => { const { sidePanel, currentPage, searchText, setCurrentPage, setSearchText } = props; - const { mode } = useContext(ModeContext); const onInputSearchField = (event: React.ChangeEvent) => { setSearchText(event.target.value); @@ -82,12 +78,6 @@ const Header = (props: HeaderProps) => { return ( <> - updateMode(mode === "light" ? "dark" : "light")} - > - {mode === "light" ? : } - @@ -101,7 +91,7 @@ const Header = (props: HeaderProps) => { ); }; - if (["saveAndRestore", "tidyTabs"].includes(currentPage)) { + if (["saveAndRestore", "tidyTabs", "settings"].includes(currentPage)) { return ( @@ -116,6 +106,7 @@ const Header = (props: HeaderProps) => { {currentPage === "saveAndRestore" && t.optionsNavigationSaveAndRestore} {currentPage === "tidyTabs" && t.optionsNavigationTidyTabs} + {currentPage === "settings" && t.optionsNavigationSettings} @@ -161,6 +152,12 @@ const Header = (props: HeaderProps) => { > + setCurrentPage("settings")} + > + + )} diff --git a/src/presentation/views/popup/components/Home.tsx b/src/presentation/views/popup/components/Home.tsx index 1b0932aa..c0ba3f85 100644 --- a/src/presentation/views/popup/components/Home.tsx +++ b/src/presentation/views/popup/components/Home.tsx @@ -3,12 +3,13 @@ import { useEffect, useState } from "react"; import { getPopupSizeSetting } from "../../../../data/repository/SettingsRepository"; import { defaultPopupSize, type PopupSize } from "../../../../model/PopupSize"; import SaveAndRestorePage from "../../shared/components/SaveAndRestorePage"; +import SettingsPage from "../../shared/components/SettingsPage"; import TidyTabsPage from "../../shared/components/TidyTabsPage"; import Header from "./Header"; import SearchResult from "./SearchResult"; import WindowsContainer from "./WindowsContainer"; -export type PopupPage = "root" | "saveAndRestore" | "tidyTabs"; +export type PopupPage = "root" | "saveAndRestore" | "tidyTabs" | "settings"; type HomeProps = { sidePanel: boolean; }; @@ -62,6 +63,11 @@ const Home = (props: HomeProps) => { )} + {searchText.length === 0 && currentPage === "settings" && ( + + + + )} ); }; diff --git a/src/presentation/views/popup/components/MuiThemeProvider.tsx b/src/presentation/views/popup/components/MuiThemeProvider.tsx index 244c5780..e9867531 100644 --- a/src/presentation/views/popup/components/MuiThemeProvider.tsx +++ b/src/presentation/views/popup/components/MuiThemeProvider.tsx @@ -1,7 +1,7 @@ import { ThemeProvider } from "@emotion/react"; import { createTheme } from "@mui/material/styles"; -import { useContext, useEffect, useMemo, useState } from "react"; -import { getPopupElementScaleSetting } from "../../../../data/repository/SettingsRepository"; +import useMediaQuery from "@mui/material/useMediaQuery"; +import { useContext, useMemo } from "react"; import { ModeContext } from "../../../contexts/ModeContext"; import { ThemeColorContext } from "../../../contexts/ThemeColorContext"; import { tabGroupColorPalette } from "../../shared/resources/tabGroupColorPalette"; @@ -15,27 +15,16 @@ const MuiThemeProvider = (props: MuiThemeProviderProps) => { const { children } = props; const { mode } = useContext(ModeContext); const { themeColor } = useContext(ThemeColorContext); - - const [scale, setScale] = useState(100); - useEffect(() => { - const initState = async () => { - setScale(await getPopupElementScaleSetting()); - }; - initState(); - }, []); + const prefersDarkMode = useMediaQuery("(prefers-color-scheme: dark)"); + const actualMode = + mode === "system" ? (prefersDarkMode ? "dark" : "light") : mode; const themePalette = useMemo(() => { - const defaultTheme = createTheme(); - const defaultTabMinHeight = 48; - const defaultTabsMinHeight = 48; - const defaultToolbarMinHeight = 56; - const defaultChipHeight = 22; - return createTheme({ palette: { - mode, - primary: themeColorPaletteBy(themeColor, mode), - ...tabGroupColorPalette(mode), + mode: actualMode, + primary: themeColorPaletteBy(themeColor, actualMode), + ...tabGroupColorPalette(actualMode), }, breakpoints: { values: { @@ -47,40 +36,40 @@ const MuiThemeProvider = (props: MuiThemeProviderProps) => { }, }, typography: { - fontSize: defaultTheme.typography.fontSize * (scale / 100), + fontSize: 12, }, components: { MuiTab: { styleOverrides: { root: { - minHeight: defaultTabMinHeight * (scale / 100), + minHeight: 36, }, }, }, MuiTabs: { styleOverrides: { root: { - minHeight: defaultTabsMinHeight * (scale / 100), + minHeight: 36, }, }, }, MuiToolbar: { styleOverrides: { root: { - minHeight: defaultToolbarMinHeight * (scale / 100), + minHeight: 42, }, }, }, MuiChip: { styleOverrides: { root: { - height: defaultChipHeight * (scale / 100), + height: 16, }, }, }, }, }); - }, [mode, themeColor, scale]); + }, [actualMode, themeColor]); return {children}; }; diff --git a/src/presentation/views/shared/components/SettingsPage/ModeSettingForm.tsx b/src/presentation/views/shared/components/SettingsPage/ModeSettingForm.tsx new file mode 100644 index 00000000..e73e65d3 --- /dev/null +++ b/src/presentation/views/shared/components/SettingsPage/ModeSettingForm.tsx @@ -0,0 +1,59 @@ +import DarkModeIcon from "@mui/icons-material/DarkMode"; +import LightModeIcon from "@mui/icons-material/LightMode"; +import SettingsBrightnessIcon from "@mui/icons-material/SettingsBrightness"; +import ToggleButton from "@mui/material/ToggleButton"; +import ToggleButtonGroup from "@mui/material/ToggleButtonGroup"; +import { useContext } from "react"; +import { updateMode } from "../../../../../data/repository/ThemeRepository"; +import t from "../../../../../i18n/Translations"; +import type { Mode } from "../../../../../model/Theme"; +import { ModeContext } from "../../../../contexts/ModeContext"; +import PaperWithHeader from "../PaperWithHeader"; + +const ModeSettingForm = () => { + const { mode } = useContext(ModeContext); + + const onChangeMode = async ( + _: React.MouseEvent, + newMode: string, + ) => { + updateMode(newMode as Mode); + }; + + const items = [ + { value: "light", label: t.light, icon: }, + { + value: "system", + label: t.system, + icon: , + }, + { value: "dark", label: t.dark, icon: }, + ]; + + return ( + + + {items.map((item) => ( + + {item.icon} + {item.label} + + ))} + + + ); +}; + +export default ModeSettingForm; diff --git a/src/presentation/views/options/pages/Settings/PopupSizeSettingForm.tsx b/src/presentation/views/shared/components/SettingsPage/PopupSizeSettingForm.tsx similarity index 57% rename from src/presentation/views/options/pages/Settings/PopupSizeSettingForm.tsx rename to src/presentation/views/shared/components/SettingsPage/PopupSizeSettingForm.tsx index 4596181f..d934b8cc 100644 --- a/src/presentation/views/options/pages/Settings/PopupSizeSettingForm.tsx +++ b/src/presentation/views/shared/components/SettingsPage/PopupSizeSettingForm.tsx @@ -16,6 +16,7 @@ import { updatePopupSizeSetting, } from "../../../../../data/repository/SettingsRepository"; import t from "../../../../../i18n/Translations"; +import PaperWithHeader from "../PaperWithHeader"; type SettingForm = { height: string; @@ -110,74 +111,80 @@ const PopupSizeSettingForm = () => { }; return ( - - - {t.popupSizeHeader} - - } - subheader={ - - {t.popupSizeDescription} - - } - /> - - - - - px - ), - }} - onChange={onChangeHeight} - /> - px - ), - }} - onChange={onChangeWidth} - /> - - - - - {submissionState.errorMessage} - - setIsOpenSnackBarState(false)} - autoHideDuration={3000} - message={t.savedSuccessfully} - /> - - - + + + + {t.popupSizeHeader} + + } + subheader={ + + {t.popupSizeDescription} + + } + /> + + + + + px + ), + }} + onChange={onChangeHeight} + /> + px + ), + }} + onChange={onChangeWidth} + /> + + + + + {submissionState.errorMessage} + + setIsOpenSnackBarState(false)} + autoHideDuration={3000} + message={t.savedSuccessfully} + /> + + + + ); }; diff --git a/src/presentation/views/options/pages/Settings/ThemeColorSettingForm.tsx b/src/presentation/views/shared/components/SettingsPage/ThemeColorSettingForm.tsx similarity index 86% rename from src/presentation/views/options/pages/Settings/ThemeColorSettingForm.tsx rename to src/presentation/views/shared/components/SettingsPage/ThemeColorSettingForm.tsx index c245b8e4..92c736a3 100644 --- a/src/presentation/views/options/pages/Settings/ThemeColorSettingForm.tsx +++ b/src/presentation/views/shared/components/SettingsPage/ThemeColorSettingForm.tsx @@ -4,8 +4,8 @@ import { updateThemeColor } from "../../../../../data/repository/ThemeRepository import t from "../../../../../i18n/Translations"; import { themeColors } from "../../../../../model/Theme"; import { ThemeColorContext } from "../../../../contexts/ThemeColorContext"; -import PaperWithHeader from "../../../shared/components/PaperWithHeader"; -import TabGroupColorRadio from "../../../shared/components/TabGroupColorRadio"; +import PaperWithHeader from "../PaperWithHeader"; +import TabGroupColorRadio from "../TabGroupColorRadio"; const ThemeColorSetting = () => { const { themeColor } = useContext(ThemeColorContext); diff --git a/src/presentation/views/options/pages/Settings/ToolbarSettingForm.tsx b/src/presentation/views/shared/components/SettingsPage/ToolbarSettingForm.tsx similarity index 69% rename from src/presentation/views/options/pages/Settings/ToolbarSettingForm.tsx rename to src/presentation/views/shared/components/SettingsPage/ToolbarSettingForm.tsx index 04669dab..402d448d 100644 --- a/src/presentation/views/options/pages/Settings/ToolbarSettingForm.tsx +++ b/src/presentation/views/shared/components/SettingsPage/ToolbarSettingForm.tsx @@ -1,3 +1,4 @@ +import FormControl from "@mui/material/FormControl"; import ListItem from "@mui/material/ListItem"; import ListItemText from "@mui/material/ListItemText"; import MenuItem from "@mui/material/MenuItem"; @@ -10,7 +11,7 @@ import { isValidIconClickOpenView, type ToolbarSetting, } from "../../../../../model/ToolbarSetting"; -import PaperWithHeader from "../../../shared/components/PaperWithHeader"; +import PaperWithHeader from "../PaperWithHeader"; const ToolbarSettingForm = () => { const [settingState, setSettingState] = useState(null); @@ -36,22 +37,21 @@ const ToolbarSettingForm = () => { return ( {settingState && ( - + - + + + )} diff --git a/src/presentation/views/shared/components/SettingsPage/index.tsx b/src/presentation/views/shared/components/SettingsPage/index.tsx new file mode 100644 index 00000000..4e66bec0 --- /dev/null +++ b/src/presentation/views/shared/components/SettingsPage/index.tsx @@ -0,0 +1,18 @@ +import Stack from "@mui/material/Stack"; +import ModeSettingForm from "./ModeSettingForm"; +import PopupSizeSettingForm from "./PopupSizeSettingForm"; +import ThemeColorSettingForm from "./ThemeColorSettingForm"; +import ToolbarSettingForm from "./ToolbarSettingForm"; + +const SettingsPage = () => { + return ( + + + + + + + ); +}; + +export default SettingsPage; diff --git a/vite.config.ts b/vite.config.ts index 3f5525ef..0f55c8e7 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,8 +1,11 @@ /// -import path from "node:path"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; import react from "@vitejs/plugin-react"; import { defineConfig } from "vite"; +const __dirname = dirname(fileURLToPath(import.meta.url)); + export default defineConfig(({ mode }) => { const isDev = mode === "development"; const isProduction = !isDev; @@ -16,19 +19,16 @@ export default defineConfig(({ mode }) => { reportCompressedSize: isProduction, rollupOptions: { input: { - popup: path.resolve( - __dirname, - "src/presentation/views/popup/index.tsx", - ), - sidePanel: path.resolve( + popup: resolve(__dirname, "src/presentation/views/popup/index.tsx"), + sidePanel: resolve( __dirname, "src/presentation/views/sidePanel/index.tsx", ), - options: path.resolve( + options: resolve( __dirname, "src/presentation/views/options/index.tsx", ), - background: path.resolve(__dirname, "src/background/index.ts"), + background: resolve(__dirname, "src/background/index.ts"), }, output: { entryFileNames: "[name].js",