Compare commits

...

327 Commits

Author SHA1 Message Date
Alex Sparkes
bc9cf3c11e Fix/beta workflow version check (#1131)
* fix(workflows): prevent beta release for non-beta versions

* fix(workflows): address copilot PR review feedback

- Support iterative beta versions (7.6.0-beta.1 -> 7.6.0-beta.2)
- Remove tag trigger from beta workflow to prevent premature releases
- Fix tag format in docs/summaries to include 'v' prefix
- Clarify deployment approval wording
2026-01-25 17:46:15 +00:00
Alex Sparkes
896816c185 feat: add professional three-branch release workflow automation (#1129)
- Add version-bump workflow for semantic versioning across all files
- Add beta-release workflow for automated pre-release testing
- Add production-release workflow with manual approval gates
- Add hotfix-release workflow for emergency patches
- Create comprehensive CONTRIBUTING.md with workflow guide
- Create detailed RELEASE_PROCESS.md for maintainers
- Add PR template with release checklists
- Update CODEOWNERS to protect workflow files
- Update README with contribution links
- Remove /docs from .gitignore to allow documentation

This implements a dev  beta  main branching strategy with:
- Automated version management across 6 files
- Changelog generation from conventional commits
- GitHub Releases with build artifacts
- Environment-based approvals for production
- Back-merge support for hotfixes
2026-01-25 17:27:54 +00:00
David Ralph
6d209e10fb cleanup: remove 50% of offline images 2026-01-25 17:00:09 +00:00
alexsparkes
a763ead3ec feat: enhance drag-and-drop functionality in CustomSettings component 2026-01-24 22:41:00 +00:00
alexsparkes
9688f0ba96 feat: improve image file handling and compression in CustomSettings component 2026-01-24 22:37:34 +00:00
alexsparkes
cb30790fae refactor: remove unused resetCustom function and improve localStorage error handling 2026-01-24 22:36:17 +00:00
alexsparkes
5be6955b13 feat: add translation percentage tracking and update related components 2026-01-24 22:36:17 +00:00
David Ralph
17560819a1 chore: change to 7.5.0 and update deps 2026-01-24 22:24:12 +00:00
alexsparkes
65d26da867 feat: enhance time formatting and localization support in Clock and Weather components 2026-01-24 22:05:31 +00:00
David Ralph
4e08570599 Merge branch 'main' of https://github.com/mue/mue 2026-01-24 21:57:57 +00:00
David Ralph
57a6060f93 style: make colours more like site 2026-01-24 21:57:49 +00:00
alexsparkes
012d7bf5a8 feat(Language): add locale formatting option and update translations 2026-01-24 21:54:14 +00:00
David Ralph
6f1b81d503 fix(background): custom colour default 2026-01-24 21:38:00 +00:00
alexsparkes
07a6e2bbf4 feat(Language): remove unused quote language functionality and clean up code 2026-01-24 21:32:11 +00:00
alexsparkes
503eef29c8 feat(Greeting): update events title and localization for improved clarity 2026-01-24 21:28:16 +00:00
alexsparkes
745e4e7106 feat(Language): add search functionality and system language detection to language options 2026-01-24 21:24:20 +00:00
alexsparkes
9824b8e99a feat(Tabs): add scroll to top functionality when changing tabs or resetting 2026-01-24 20:33:39 +00:00
alexsparkes
6cf6ad1fe3 feat(ChooseLanguage): update language options to use translated names for improved user experience 2026-01-24 20:24:54 +00:00
alexsparkes
c0efd7f01d feat(Quote): enhance user select properties for improved text interaction 2026-01-24 20:21:23 +00:00
alexsparkes
98b8f6e00e feat(Quote): adjust font size scaling and update quote container width for improved readability 2026-01-24 20:18:21 +00:00
alexsparkes
276bb78c1e feat(Discover): implement deep link navigation and update iframe source accordingly 2026-01-24 20:08:39 +00:00
alexsparkes
000fc49b01 feat(vite.config): rename buildEnd to closeBundle for clarity in build process 2026-01-24 20:00:56 +00:00
alexsparkes
724cdb48a0 feat(MainModal): clear iframe breadcrumbs on back navigation
feat(Discover): scroll modal content to top and clear breadcrumbs on item navigation
2026-01-24 19:10:30 +00:00
alexsparkes
ba512a25d1 feat(uninstall): optimize quote and photo removal logic in uninstall function 2026-01-24 19:03:42 +00:00
alexsparkes
76c9aa4df9 feat(background): implement IndexedDB for custom background storage and enhance background management features 2026-01-24 18:55:27 +00:00
alexsparkes
d84b09801c feat(Quote): refactor quote component to enhance state management and event handling 2026-01-24 18:31:50 +00:00
alexsparkes
6ca19fc48d feat(translation): integrate useT hook for improved translation handling across components 2026-01-24 18:07:25 +00:00
alexsparkes
30aa53fdd7 feat(EffectsSettings): update default brightness value to 100
feat(GreetingOptions): refine event title message key for clarity
refactor(WelcomeModal): simplify useEffect by removing event bus listener
2026-01-24 17:53:44 +00:00
alexsparkes
37578d7638 feat(stats): update achievements based on empty stats during reset 2026-01-24 17:45:55 +00:00
alexsparkes
3e5dddf617 feat(language): enhance language options with native and translated names 2026-01-24 17:25:53 +00:00
alexsparkes
c88b3cc03c feat(translation): refactor translation system to use useT hook for reactive updates 2026-01-24 17:18:29 +00:00
alexsparkes
b8647538fd feat(translation): implement reactive translation system with context and hooks 2026-01-24 17:02:41 +00:00
alexsparkes
d0dbd7e75c feat(MainModal): initialize currentSubSection with deepLinkData if available
fix(ModalTopBar): enhance accessibility for breadcrumb navigation
refactor(Header): remove back navigation title for cleaner header display
2026-01-24 16:30:20 +00:00
alexsparkes
819057ed8b feat(settings): add sub-section handling for settings navigation and deep linking 2026-01-24 16:24:26 +00:00
alexsparkes
8cbb5a5c92 feat(theme): implement helper function to resolve auto theme settings 2026-01-24 15:53:38 +00:00
David Ralph
ae42aa1241 feat: deep links for rest of settings 2026-01-24 15:52:16 +00:00
alexsparkes
19c2c29df0 fix(navbar): emit refresh event on app link add, edit, and delete actions 2026-01-24 15:50:47 +00:00
David Ralph
944e899870 Merge branch 'main' of https://github.com/mue/mue 2026-01-24 15:44:06 +00:00
David Ralph
c49bc39770 fix: stat timestamps, resetting achievements 2026-01-24 15:43:58 +00:00
alexsparkes
80ee7885e1 fix(background): enhance background settings handling and improve colour picker styles 2026-01-24 15:43:44 +00:00
David Ralph
8beda77a76 fix: stats localisation, marketplace title 2026-01-24 15:33:19 +00:00
alexsparkes
f58ad986da fix(modal): update styles for modal and buttons, improve theme handling 2026-01-24 15:23:34 +00:00
David Ralph
66fe285fb1 fix: addon update check 2026-01-24 15:15:09 +00:00
alexsparkes
64f69bbbbd fix(search): replace createRef with useRef for microphone icon 2026-01-24 14:39:35 +00:00
alexsparkes
17bbdeb7b9 fix(navbar): improve handling of display on hover and widgets hot reloading 2026-01-24 14:33:13 +00:00
alexsparkes
b2087f4733 fix(events): incorrect hover cursor 2026-01-24 14:22:18 +00:00
David Ralph
8a83671c88 fix: marketplace preview check 2026-01-24 14:02:05 +00:00
David Ralph
d0e91f7099 fix: stats, marketplace, deep links on preview 2026-01-24 13:43:40 +00:00
David Ralph
e218ad512e fix: welcome choose language styling and link 2026-01-24 13:10:39 +00:00
alexsparkes
c8bd531bb5 fix(tooltip): exit animation 2026-01-24 12:22:57 +00:00
alexsparkes
2ded256bda fix(Changelog): adjust layout styles for improved responsiveness 2026-01-24 11:05:54 +00:00
alexsparkes
7835ef1dec feat(StatsOptions): add error icon and preview mode handling in stats component 2026-01-24 11:02:15 +00:00
alexsparkes
92bddd0538 fix(weather0: issue with dependency 2026-01-24 00:40:10 +00:00
alexsparkes
e43615bcdf feat(MainModal): implement sidebar skeleton loader and enhance loading experience 2026-01-24 00:28:31 +00:00
alexsparkes
7b48b3a4d8 fix(vite.config): enhance build process for Chrome, Firefox, and Safari extensions 2026-01-24 00:09:50 +00:00
alexsparkes
ce4ae1039f fix(styles): adjust padding and margin for improved layout in modal tab content 2026-01-24 00:00:39 +00:00
alexsparkes
039ef863bb fix(Tabs, styles): adjust padding and margin for improved layout in modal components 2026-01-23 23:57:14 +00:00
David Ralph
e5e9260ac3 fix: constants urls, changelog url 2026-01-23 23:52:36 +00:00
alexsparkes
7c93e95200 fix(constants, Changelog): update marketplace URL to production and adjust iframe source 2026-01-23 23:37:28 +00:00
alexsparkes
775cae375f fix(styles): adjust padding and margin for improved layout in sidebar and settings row 2026-01-23 23:29:41 +00:00
alexsparkes
05b7d5c293 refactor(MainModal): improve layout and styling for better responsiveness 2026-01-23 23:20:31 +00:00
alexsparkes
3f638855d7 fix(build): attempted fix with version number 2026-01-23 23:00:33 +00:00
David Ralph
f2a9d0a05c chore: add safari gitignore 2026-01-23 22:57:54 +00:00
dependabot[bot]
291f1f054c chore(deps-dev): bump stylelint-scss from 6.14.0 to 7.0.0 (#1128)
Bumps [stylelint-scss](https://github.com/stylelint-scss/stylelint-scss) from 6.14.0 to 7.0.0.
- [Release notes](https://github.com/stylelint-scss/stylelint-scss/releases)
- [Changelog](https://github.com/stylelint-scss/stylelint-scss/blob/master/CHANGELOG.md)
- [Commits](https://github.com/stylelint-scss/stylelint-scss/compare/v6.14.0...v7.0.0)

---
updated-dependencies:
- dependency-name: stylelint-scss
  dependency-version: 7.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-16 08:44:53 +00:00
dependabot[bot]
cfa8442f28 chore(deps-dev): bump stylelint from 16.26.1 to 17.0.0 (#1127)
Bumps [stylelint](https://github.com/stylelint/stylelint) from 16.26.1 to 17.0.0.
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/16.26.1...17.0.0)

---
updated-dependencies:
- dependency-name: stylelint
  dependency-version: 17.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-16 08:44:47 +00:00
dependabot[bot]
2b59f07e4b chore(deps-dev): bump stylelint-config-standard-scss (#1126)
Bumps [stylelint-config-standard-scss](https://github.com/stylelint-scss/stylelint-config-standard-scss) from 16.0.0 to 17.0.0.
- [Release notes](https://github.com/stylelint-scss/stylelint-config-standard-scss/releases)
- [Changelog](https://github.com/stylelint-scss/stylelint-config-standard-scss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint-scss/stylelint-config-standard-scss/compare/v16.0.0...v17.0.0)

---
updated-dependencies:
- dependency-name: stylelint-config-standard-scss
  dependency-version: 17.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-16 08:43:11 +00:00
dependabot[bot]
62ae44acc4 chore(deps): bump @mui/material from 7.3.6 to 7.3.7 (#1125)
Bumps [@mui/material](https://github.com/mui/material-ui/tree/HEAD/packages/mui-material) from 7.3.6 to 7.3.7.
- [Release notes](https://github.com/mui/material-ui/releases)
- [Changelog](https://github.com/mui/material-ui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mui/material-ui/commits/v7.3.7/packages/mui-material)

---
updated-dependencies:
- dependency-name: "@mui/material"
  dependency-version: 7.3.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-08 08:59:39 +00:00
David Ralph
c22793b7cf fix(translations): add missing localisations 2026-01-03 18:06:14 +00:00
David Ralph
0b6fb4f3c2 fix: about tab links and icons 2026-01-03 17:58:08 +00:00
David Ralph
7807462c7b fix: lightbox, breadcrumbs, navbar, uninstall 2026-01-03 17:52:10 +00:00
David Ralph
7c2e17b44d fix: wrong url 2026-01-03 17:26:20 +00:00
David Ralph
0431fc830d feat(marketplace): use web ui 2026-01-03 17:25:34 +00:00
David Ralph
73bc89d7ae chore: update translations url 2026-01-03 11:32:03 +00:00
David Ralph
49c4c0ecdb chore: remove refs to kaiso and opencollective 2026-01-03 11:27:40 +00:00
David Ralph
8265bf06e7 feat: improve safari ux 2026-01-02 23:29:34 +00:00
David Ralph
9ac7327691 feat: safari support (wip) 2026-01-02 23:04:29 +00:00
David Ralph
6dd60fbd45 chore: 2026 2026-01-02 23:02:56 +00:00
Pose marto
91c49e0e81 Translated using Weblate (French)
Currently translated at 100.0% (502 of 502 strings)

Co-authored-by: Pose marto <weblate.drainage895@passmail.net>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/fr/
Translation: Mue/Mue Tab 7.1
2026-01-02 12:01:56 +01:00
pooya mokhtari
dfd5c3f07e Translated using Weblate (Persian (Old))
Currently translated at 3.7% (19 of 502 strings)

Co-authored-by: pooya mokhtari <pooya.mokhtari1986@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/peo/
Translation: Mue/Mue Tab 7.1
2025-12-29 10:00:27 +00:00
Hosted Weblate
6d2756a7ee Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/
Translation: Mue/Mue Tab 7.1
2025-12-28 10:54:08 +01:00
pooya mokhtari
61bf53bdda Added translation using Weblate (Persian (Old))
Co-authored-by: pooya mokhtari <pooya.mokhtari1986@gmail.com>
2025-12-28 10:54:08 +01:00
LibreTranslate
7059c10918 Translated using Weblate (French)
Currently translated at 100.0% (502 of 502 strings)

Co-authored-by: LibreTranslate <noreply-mt-libretranslate@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/fr/
Translation: Mue/Mue Tab 7.1
2025-12-26 11:02:07 +01:00
Pose marto
e78bc17187 Translated using Weblate (French)
Currently translated at 100.0% (502 of 502 strings)

Co-authored-by: Pose marto <weblate.drainage895@passmail.net>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/fr/
Translation: Mue/Mue Tab 7.1
2025-12-26 11:02:07 +01:00
Weblate Translation Memory
eebedfd76e Translated using Weblate (French)
Currently translated at 100.0% (502 of 502 strings)

Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/fr/
Translation: Mue/Mue Tab 7.1
2025-12-23 19:00:30 +01:00
Pose marto
0111d6f1e2 Translated using Weblate (French)
Currently translated at 100.0% (502 of 502 strings)

Co-authored-by: Pose marto <weblate.drainage895@passmail.net>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/fr/
Translation: Mue/Mue Tab 7.1
2025-12-23 19:00:28 +01:00
Saúl Palacios
ddd34fd5c0 Translated using Weblate (Spanish)
Currently translated at 99.8% (501 of 502 strings)

Co-authored-by: Saúl Palacios <palacios22c@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/es/
Translation: Mue/Mue Tab 7.1
2025-12-13 19:00:26 +01:00
dependabot[bot]
754707c26c chore(deps): bump @mui/material from 7.3.5 to 7.3.6 (#1123)
Bumps [@mui/material](https://github.com/mui/material-ui/tree/HEAD/packages/mui-material) from 7.3.5 to 7.3.6.
- [Release notes](https://github.com/mui/material-ui/releases)
- [Changelog](https://github.com/mui/material-ui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mui/material-ui/commits/v7.3.6/packages/mui-material)

---
updated-dependencies:
- dependency-name: "@mui/material"
  dependency-version: 7.3.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-03 08:03:07 +00:00
Munch Rémi
bcf0e655ca Translated using Weblate (French)
Currently translated at 99.4% (499 of 502 strings)

Co-authored-by: Munch Rémi <munch.remi@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/fr/
Translation: Mue/Mue Tab 7.1
2025-11-29 12:02:14 +01:00
lxy
dea01cc02e Translated using Weblate (English (United States))
Currently translated at 99.4% (499 of 502 strings)

Co-authored-by: lxy <453704074@qq.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/en_US/
Translation: Mue/Mue Tab 7.1
2025-11-27 17:00:17 +01:00
Weblate Translation Memory
72f3f432b5 Translated using Weblate (English (United States))
Currently translated at 99.4% (499 of 502 strings)

Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/en_US/
Translation: Mue/Mue Tab 7.1
2025-11-07 14:51:20 +00:00
dependabot[bot]
4ddab432eb chore(deps-dev): bump vite from 6.4.1 to 7.2.1 (#1122)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.4.1 to 7.2.1.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.2.1/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.2.1
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-06 08:03:10 +00:00
dependabot[bot]
87ee910f68 chore(deps): bump @mui/material from 7.3.4 to 7.3.5 (#1121)
Bumps [@mui/material](https://github.com/mui/material-ui/tree/HEAD/packages/mui-material) from 7.3.4 to 7.3.5.
- [Release notes](https://github.com/mui/material-ui/releases)
- [Changelog](https://github.com/mui/material-ui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mui/material-ui/commits/v7.3.5/packages/mui-material)

---
updated-dependencies:
- dependency-name: "@mui/material"
  dependency-version: 7.3.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-05 08:02:50 +00:00
alexsparkes
2c376c7506 Refactor marketplace components to use hooks and context
- Converted ItemPage from a class component to a functional component using hooks for state management.
- Introduced MarketplaceContext for managing marketplace-related state and actions.
- Created custom hooks: useMarketplaceData for fetching and sorting marketplace items, useMarketplaceInstall for handling installation and uninstallation of items, and useMarketplaceNavigation for managing navigation within the marketplace.
- Implemented BrowsePage and CollectionPage components to display items and collections with improved structure and functionality.
- Enhanced error handling and loading states across the marketplace features.
2025-11-03 14:26:12 +00:00
alexsparkes
59824eb6ef Refactor ItemPage and related components for improved structure and readability
- Updated styles in _main.scss to enhance layout and visual consistency.
- Refactored ItemPage.jsx to utilize new tab components (OverviewTab, QuotesTab, PhotosTab, PresetsTab) for better organization of content.
- Created InfoItem and WarningBanner components for reusable UI elements.
- Implemented QuotesTab and PhotosTab components to handle quotes and photos display logic.
- Added PresetsTab component to manage settings display.
- Enhanced user experience with dynamic tab switching and improved data handling.
2025-11-02 23:29:57 +00:00
Максим Горпиніч
6785011eb5 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (502 of 502 strings)

Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/uk/
Translation: Mue/Mue Tab 7.1
2025-11-02 18:53:05 +00:00
abdelbasset jabrane
9fdc771569 Translated using Weblate (Arabic)
Currently translated at 99.6% (500 of 502 strings)

Co-authored-by: abdelbasset jabrane <naminio201@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/ar/
Translation: Mue/Mue Tab 7.1
2025-11-02 18:53:04 +00:00
தமிழ்நேரம்
f07190c3d9 Translated using Weblate (Tamil)
Currently translated at 99.6% (500 of 502 strings)

Co-authored-by: தமிழ்நேரம் <tamilneram247@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/ta/
Translation: Mue/Mue Tab 7.1
2025-11-02 18:53:03 +00:00
Arvaidas Rekis
1ba276eefa Translated using Weblate (Estonian)
Currently translated at 99.6% (500 of 502 strings)

Translated using Weblate (Latvian)

Currently translated at 99.6% (500 of 502 strings)

Translated using Weblate (Lithuanian)

Currently translated at 99.6% (500 of 502 strings)

Translated using Weblate (Azerbaijani (Southern))

Currently translated at 99.6% (500 of 502 strings)

Translated using Weblate (Azerbaijani)

Currently translated at 99.6% (500 of 502 strings)

Translated using Weblate (Slovenian)

Currently translated at 99.6% (500 of 502 strings)

Co-authored-by: Arvaidas Rekis <arvrekis@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/az/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/azb/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/et/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/lt/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/lv/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/sl/
Translation: Mue/Mue Tab 7.1
2025-11-02 18:53:02 +00:00
ssantos
cec2301617 Translated using Weblate (Portuguese)
Currently translated at 99.0% (497 of 502 strings)

Co-authored-by: ssantos <ssantos@web.de>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/pt/
Translation: Mue/Mue Tab 7.1
2025-11-02 18:52:58 +00:00
Alejandro
36ee67f86f Translated using Weblate (Spanish (Latin America))
Currently translated at 99.6% (500 of 502 strings)

Co-authored-by: Alejandro <alejandroandrade2015@outlook.es>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/es_419/
Translation: Mue/Mue Tab 7.1
2025-11-02 18:52:56 +00:00
Spectro
4fa1f47565 Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.8% (496 of 502 strings)

Co-authored-by: Spectro <spectro@keemail.me>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/pt_BR/
Translation: Mue/Mue Tab 7.1
2025-11-02 18:52:55 +00:00
Anonymous
b3fd726a95 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 99.6% (500 of 502 strings)

Translated using Weblate (Persian)

Currently translated at 99.4% (499 of 502 strings)

Translated using Weblate (Bengali)

Currently translated at 99.6% (500 of 502 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 99.6% (500 of 502 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 99.2% (498 of 502 strings)

Translated using Weblate (Turkish)

Currently translated at 99.6% (500 of 502 strings)

Translated using Weblate (Russian)

Currently translated at 99.6% (500 of 502 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 99.4% (499 of 502 strings)

Translated using Weblate (Dutch)

Currently translated at 99.4% (499 of 502 strings)

Translated using Weblate (Indonesian)

Currently translated at 99.0% (497 of 502 strings)

Translated using Weblate (French)

Currently translated at 99.6% (500 of 502 strings)

Translated using Weblate (Spanish)

Currently translated at 99.2% (498 of 502 strings)

Translated using Weblate (English (United States))

Currently translated at 99.2% (498 of 502 strings)

Translated using Weblate (German)

Currently translated at 99.6% (500 of 502 strings)

Co-authored-by: Anonymous <noreply@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/bn/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/de/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/en_US/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/es/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/es_419/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/fa/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/fr/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/id/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/nl/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/ru/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/tr/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/zh_Hant/
Translation: Mue/Mue Tab 7.1
2025-11-02 18:52:53 +00:00
alexsparkes
127b2492a5 feat(Items): enhance ItemCard with installed badge and gradient background; optimize performance with memoization 2025-11-01 18:26:20 +00:00
alexsparkes
9727346ff1 style(marketplace): potential marketplace page redesign 2025-11-01 00:50:33 +00:00
alexsparkes
b303d02492 feat: add onChange handlers to ChipSelect and Text components; clear imageQueue on background type and category changes 2025-10-31 16:42:15 +00:00
alexsparkes
ef22e91b07 refactor(Background): make the background filters an overlay to prevent juttery transition of styles being added AFTER completion 2025-10-31 13:56:03 +00:00
alexsparkes
94c92f7216 feat(MainModal): enhance deep linking and navigation handling for collections and products
fix(Tabs): improve sidebar visibility logic and margin adjustment
feat(ModalTopBar): update breadcrumb logic for collection and product views
feat(Added): add button to navigate to discover page with deep linking
fix(Browse): refine error handling and update hash for collection navigation
2025-10-31 11:15:20 +00:00
Максим Горпиніч
389590a04d Translated using Weblate (Ukrainian)
Currently translated at 100.0% (502 of 502 strings)

Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/uk/
Translation: Mue/Mue Tab 7.1
2025-10-31 07:02:41 +01:00
alexsparkes
1e283160cc style(MainModal): update modal background and sidebar styles for improved aesthetics 2025-10-31 00:32:34 +00:00
alexsparkes
bc272e14dd style(MainModal): style change of navigation buttons 2025-10-31 00:27:38 +00:00
alexsparkes
3f9e3e5d59 feat(marketplace): add filter options and sorting functionality to Items component 2025-10-30 23:33:06 +00:00
alexsparkes
9c477e3980 feat(ModalTopBar): replace static logo path with imported icon 2025-10-30 23:11:52 +00:00
alexsparkes
aa6b1a3be3 feat(modal): new navigation with back and forth arrow 2025-10-29 23:46:15 +00:00
alexsparkes
3f1aa9f5cd Merge branch 'main' of https://github.com/mue/mue 2025-10-29 22:57:06 +00:00
alexsparkes
e83afbda2c Refactor MainModal and Tab components to integrate Library and Discover tabs 2025-10-29 22:56:23 +00:00
deivix13
8a8d02eed6 feat(dockerfile): add development with docker (#1119)
* feat(dockerfile): add development with docker

* fix(Doc): correct typo 'volumen' to 'volume'
2025-10-29 11:53:01 +00:00
alexsparkes
ac3924aaf7 refactor: optimize background loading and rendering logic 2025-10-29 10:06:09 +00:00
David Ralph
293cc93500 refactor: split quicklinks, move features to functional components 2025-10-28 23:04:19 +00:00
David Ralph
2eed0f7307 refactor: make quote like background 2025-10-28 22:01:06 +00:00
David Ralph
7ac848c9a0 refactor: clean greeting 2025-10-28 21:28:06 +00:00
David Ralph
9d7660d962 chore: remove migrations for background 2025-10-28 21:20:39 +00:00
David Ralph
d7496f133c refactor: restructure background feature 2025-10-28 21:17:33 +00:00
alexsparkes
0e852e8a89 feat(SearchOptions): add Chrome policy warning for search engine selection removal 2025-10-28 19:41:30 +00:00
alexsparkes
e1ad5d490b feat: implement deep linking support for marketplace items and tabs 2025-10-28 18:55:13 +00:00
alexsparkes
ae3c135660 refactor(MainModal): and related components for improved tab management and loading states 2025-10-28 12:39:11 +00:00
alexsparkes
16b113f7eb fix: dependency issue 2025-10-28 09:16:24 +00:00
dependabot[bot]
1810bcf3e2 chore(deps-dev): bump eslint-plugin-react-hooks from 5.2.0 to 7.0.1 (#1118)
Bumps [eslint-plugin-react-hooks](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks) from 5.2.0 to 7.0.1.
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/HEAD/packages/eslint-plugin-react-hooks)

---
updated-dependencies:
- dependency-name: eslint-plugin-react-hooks
  dependency-version: 7.0.1
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-28 09:12:56 +00:00
alexsparkes
293df015d6 Make lint step non-blocking in CI 2025-10-28 09:12:09 +00:00
alexsparkes
3327cacabe Remove eslint-config-react-app (incompatible with ESLint 9) and disable pre-commit lint checks 2025-10-28 09:10:09 +00:00
alexsparkes
467adcdd85 Refactor state updates for consistency and readability across components
- Simplified state updates in Background, Favourite, PhotoInformation, GreetingOptions, Added, Browse, About, Overview, Navbar, Apps, Notes, QuickLinksOptions, Quote, and QuoteOptions components by consolidating multiple lines into single line updates.
- Improved readability by reducing unnecessary line breaks and maintaining consistent formatting in JSX elements.
- Enhanced maintainability by ensuring uniformity in how state is set and how JSX is structured.
2025-10-27 23:27:37 +00:00
alexsparkes
6f05e3bf03 Fix all ESLint errors: case declarations, empty blocks, display names, keys, and more 2025-10-27 23:27:13 +00:00
alexsparkes
b5fbb9db9e style: simplify object declarations and improve code readability in Todo component 2025-10-27 23:20:32 +00:00
alexsparkes
2954b4b2f5 feat: update project configuration and dependencies
- Updated jsconfig.json to use ESNext module and target, added JSX support, and improved path mappings.
- Modified package.json to set module type, updated dependencies including React and MUI, and added new dev dependencies for ESLint and Husky.
- Refactored Favourite component to improve tooltip handling with lifecycle methods.
- Replaced @muetab/react-sortable-hoc with @dnd-kit for drag-and-drop functionality in Overview, Todo, and QuickLinksOptions components.
- Enhanced QuickLinksOptions to support drag-and-drop reordering with updated state management.
- Updated Vite configuration to target ESNext for modern JavaScript features.
- Added Husky pre-commit hook for linting.
- Created .nvmrc file to specify Node.js version.
- Added ESLint configuration for improved code quality and consistency.
2025-10-27 23:20:28 +00:00
alexsparkes
04679ba1f6 Modernize to 2025 standards: React 19, Vite 6, ESLint 9, @dnd-kit migration 2025-10-27 23:19:35 +00:00
alexsparkes
7d432dc6f5 style: format SCSS code for improved readability 2025-10-27 22:59:56 +00:00
alexsparkes
83b3204afa chore: update SASS and fix all associated depreciation errors 2025-10-27 22:59:48 +00:00
dependabot[bot]
97c876c714 chore(deps-dev): bump vite from 7.1.11 to 7.1.12 (#1115)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.1.11 to 7.1.12.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v7.1.12/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.12/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.1.12
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-23 08:04:09 +00:00
dependabot[bot]
0538dd8f9c chore(deps-dev): bump vite from 7.1.10 to 7.1.11 (#1113)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.1.10 to 7.1.11.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.11/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.1.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-20 08:37:50 +00:00
Kağan Can Şit
0109ef5bb2 Translated using Weblate (Turkish)
Currently translated at 100.0% (501 of 501 strings)

Co-authored-by: Kağan Can Şit <kagancansit@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/tr/
Translation: Mue/Mue Tab 7.1
2025-10-20 04:51:22 +00:00
dependabot[bot]
2064eebdc6 chore(deps-dev): bump @commitlint/cli from 19.8.1 to 20.1.0 (#1109)
Bumps [@commitlint/cli](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli) from 19.8.1 to 20.1.0.
- [Release notes](https://github.com/conventional-changelog/commitlint/releases)
- [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/cli/CHANGELOG.md)
- [Commits](https://github.com/conventional-changelog/commitlint/commits/v20.1.0/@commitlint/cli)

---
updated-dependencies:
- dependency-name: "@commitlint/cli"
  dependency-version: 20.1.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-15 08:06:24 +00:00
dependabot[bot]
99bf72ae60 chore(deps): bump @floating-ui/react-dom from 2.1.2 to 2.1.6 (#1106)
Bumps [@floating-ui/react-dom](https://github.com/floating-ui/floating-ui/tree/HEAD/packages/react-dom) from 2.1.2 to 2.1.6.
- [Release notes](https://github.com/floating-ui/floating-ui/releases)
- [Changelog](https://github.com/floating-ui/floating-ui/blob/master/packages/react-dom/CHANGELOG.md)
- [Commits](https://github.com/floating-ui/floating-ui/commits/@floating-ui/react-dom@2.1.6/packages/react-dom)

---
updated-dependencies:
- dependency-name: "@floating-ui/react-dom"
  dependency-version: 2.1.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-15 08:05:47 +00:00
dependabot[bot]
b55dea13c1 chore(deps): bump react-clock from 5.1.0 to 6.0.0 (#1105)
Bumps [react-clock](https://github.com/wojtekmaj/react-clock/tree/HEAD/packages/react-clock) from 5.1.0 to 6.0.0.
- [Release notes](https://github.com/wojtekmaj/react-clock/releases)
- [Commits](https://github.com/wojtekmaj/react-clock/commits/v6.0.0/packages/react-clock)

---
updated-dependencies:
- dependency-name: react-clock
  dependency-version: 6.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-15 08:05:09 +00:00
dependabot[bot]
f785e6da08 chore(deps-dev): bump stylelint-config-standard-scss (#1104)
Bumps [stylelint-config-standard-scss](https://github.com/stylelint-scss/stylelint-config-standard-scss) from 14.0.0 to 16.0.0.
- [Release notes](https://github.com/stylelint-scss/stylelint-config-standard-scss/releases)
- [Changelog](https://github.com/stylelint-scss/stylelint-config-standard-scss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint-scss/stylelint-config-standard-scss/compare/v14.0.0...v16.0.0)

---
updated-dependencies:
- dependency-name: stylelint-config-standard-scss
  dependency-version: 16.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-15 08:05:00 +00:00
dependabot[bot]
8b11f5da7f chore(deps-dev): bump vite from 6.3.6 to 7.1.10 (#1103)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.3.6 to 7.1.10.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.10/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.1.10
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-15 08:04:40 +00:00
dependabot[bot]
9295a8f163 chore(deps): bump @sentry/react from 8.47.0 to 10.19.0 (#1101)
Bumps [@sentry/react](https://github.com/getsentry/sentry-javascript) from 8.47.0 to 10.19.0.
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.47.0...10.19.0)

---
updated-dependencies:
- dependency-name: "@sentry/react"
  dependency-version: 10.19.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-14 09:04:10 +00:00
dependabot[bot]
95f06cf101 chore(deps): bump @mui/material from 7.0.2 to 7.3.4 (#1098)
Bumps [@mui/material](https://github.com/mui/material-ui/tree/HEAD/packages/mui-material) from 7.0.2 to 7.3.4.
- [Release notes](https://github.com/mui/material-ui/releases)
- [Changelog](https://github.com/mui/material-ui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mui/material-ui/commits/v7.3.4/packages/mui-material)

---
updated-dependencies:
- dependency-name: "@mui/material"
  dependency-version: 7.3.4
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-14 09:01:48 +00:00
dependabot[bot]
bf9a80db83 chore(deps): bump embla-carousel-autoplay from 8.5.1 to 8.6.0 (#1085)
Bumps [embla-carousel-autoplay](https://github.com/davidjerleke/embla-carousel) from 8.5.1 to 8.6.0.
- [Release notes](https://github.com/davidjerleke/embla-carousel/releases)
- [Commits](https://github.com/davidjerleke/embla-carousel/compare/v8.5.1...v8.6.0)

---
updated-dependencies:
- dependency-name: embla-carousel-autoplay
  dependency-version: 8.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-14 09:01:40 +00:00
dependabot[bot]
058c3ddcb3 chore(deps-dev): bump @commitlint/config-conventional (#1093)
Bumps [@commitlint/config-conventional](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/config-conventional) from 19.6.0 to 20.0.0.
- [Release notes](https://github.com/conventional-changelog/commitlint/releases)
- [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/config-conventional/CHANGELOG.md)
- [Commits](https://github.com/conventional-changelog/commitlint/commits/v20.0.0/@commitlint/config-conventional)

---
updated-dependencies:
- dependency-name: "@commitlint/config-conventional"
  dependency-version: 20.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-14 09:01:34 +00:00
dependabot[bot]
0139f8d902 chore(deps-dev): bump @vitejs/plugin-react-swc from 3.7.2 to 4.1.0 (#1084)
Bumps [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react-swc) from 3.7.2 to 4.1.0.
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/v4.1.0/packages/plugin-react-swc)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-react-swc"
  dependency-version: 4.1.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-14 09:01:29 +00:00
dependabot[bot]
f5fbabc0ca chore(deps-dev): bump vite from 6.0.6 to 6.3.6 (#1080)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.0.6 to 6.3.6.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v6.3.6/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.3.6/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 6.3.6
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-14 09:01:08 +00:00
Fawaz Khan
51d2791c65 feat(quicklinks): add drag-and-drop reordering for Quick Links (#1102)
* feat(quicklinks): enable drag-and-drop reordering for Quick Links

* fix(quicklinks): some bug fixes
2025-10-14 09:58:49 +01:00
David Ralph
b84e4400ae chore: update readme text
Signed-off-by: David Ralph <ohlookitsderpy@protonmail.com>
2025-09-30 22:56:25 +01:00
dependabot[bot]
dda4e60e58 chore(deps-dev): bump eslint-config-prettier from 9.1.0 to 10.1.2 (#1068)
Bumps [eslint-config-prettier](https://github.com/prettier/eslint-config-prettier) from 9.1.0 to 10.1.2.
- [Release notes](https://github.com/prettier/eslint-config-prettier/releases)
- [Changelog](https://github.com/prettier/eslint-config-prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/eslint-config-prettier/compare/v9.1.0...v10.1.2)

---
updated-dependencies:
- dependency-name: eslint-config-prettier
  dependency-version: 10.1.2
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-17 11:22:04 +01:00
dependabot[bot]
a2fab4443d chore(deps): bump @mui/material from 6.3.0 to 7.0.2 (#1067)
Bumps [@mui/material](https://github.com/mui/material-ui/tree/HEAD/packages/mui-material) from 6.3.0 to 7.0.2.
- [Release notes](https://github.com/mui/material-ui/releases)
- [Changelog](https://github.com/mui/material-ui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mui/material-ui/commits/v7.0.2/packages/mui-material)

---
updated-dependencies:
- dependency-name: "@mui/material"
  dependency-version: 7.0.2
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-17 11:21:52 +01:00
dependabot[bot]
2420f56c7c chore(deps): bump embla-carousel-react from 8.5.1 to 8.6.0 (#1064)
Bumps [embla-carousel-react](https://github.com/davidjerleke/embla-carousel) from 8.5.1 to 8.6.0.
- [Release notes](https://github.com/davidjerleke/embla-carousel/releases)
- [Commits](https://github.com/davidjerleke/embla-carousel/compare/v8.5.1...v8.6.0)

---
updated-dependencies:
- dependency-name: embla-carousel-react
  dependency-version: 8.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-17 11:21:46 +01:00
dependabot[bot]
0ff25607cb chore(deps-dev): bump sass from 1.83.0 to 1.86.3 (#1061)
Bumps [sass](https://github.com/sass/dart-sass) from 1.83.0 to 1.86.3.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.83.0...1.86.3)

---
updated-dependencies:
- dependency-name: sass
  dependency-version: 1.86.3
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-17 11:21:37 +01:00
dependabot[bot]
c2e9d0e581 chore(deps): bump react-toastify from 10.0.6 to 11.0.5 (#1025)
Bumps [react-toastify](https://github.com/fkhadra/react-toastify) from 10.0.6 to 11.0.5.
- [Release notes](https://github.com/fkhadra/react-toastify/releases)
- [Commits](https://github.com/fkhadra/react-toastify/compare/v10.0.6...v11.0.5)

---
updated-dependencies:
- dependency-name: react-toastify
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-17 11:21:28 +01:00
dependabot[bot]
b0048bf0ba chore(deps-dev): bump stylelint-scss from 6.10.0 to 6.11.1 (#1024)
Bumps [stylelint-scss](https://github.com/stylelint-scss/stylelint-scss) from 6.10.0 to 6.11.1.
- [Release notes](https://github.com/stylelint-scss/stylelint-scss/releases)
- [Changelog](https://github.com/stylelint-scss/stylelint-scss/blob/master/CHANGELOG.md)
- [Commits](https://github.com/stylelint-scss/stylelint-scss/compare/v6.10.0...v6.11.1)

---
updated-dependencies:
- dependency-name: stylelint-scss
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-17 11:21:22 +01:00
dependabot[bot]
4224678559 chore(deps): bump react-best-gradient-color-picker from 3.0.11 to 3.0.14 (#983)
Bumps [react-best-gradient-color-picker](https://github.com/hxf31891/react-gradient-color-picker) from 3.0.11 to 3.0.14.
- [Release notes](https://github.com/hxf31891/react-gradient-color-picker/releases)
- [Commits](https://github.com/hxf31891/react-gradient-color-picker/compare/v3.0.11...v3.0.14)

---
updated-dependencies:
- dependency-name: react-best-gradient-color-picker
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-17 11:21:14 +01:00
Walter Pagani
02c3a29390 Translated using Weblate (Spanish (Latin America))
Currently translated at 100.0% (501 of 501 strings)

Co-authored-by: Walter Pagani <paganiwalter@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/es_419/
Translation: Mue/Mue Tab 7.1
2025-09-17 04:51:59 +02:00
Максим Горпиніч
229b2bda90 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (501 of 501 strings)

Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/uk/
Translation: Mue/Mue Tab 7.1
2025-08-23 20:02:10 +02:00
Данил Поляков
97407fa96f Translated using Weblate (Ukrainian)
Currently translated at 78.6% (394 of 501 strings)

Co-authored-by: Данил Поляков <yozkox@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/uk/
Translation: Mue/Mue Tab 7.1
2025-08-22 02:02:17 +00:00
Данил Поляков
47943cc97a Translated using Weblate (Ukrainian)
Currently translated at 1.9% (10 of 501 strings)

Co-authored-by: Данил Поляков <yozkox@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/uk/
Translation: Mue/Mue Tab 7.1
2025-08-21 03:32:22 +02:00
Hosted Weblate
df817d7567 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/
Translation: Mue/Mue Tab 7.1
2025-08-21 03:25:36 +02:00
Данил Поляков
7017dbe8ee Added translation using Weblate (Ukrainian)
Co-authored-by: Данил Поляков <yozkox@gmail.com>
2025-08-21 03:25:35 +02:00
Sunset Mikoto
71b4113e0a fix: "SiMicrosoftbing" is not exported (#1077) 2025-08-06 15:40:36 +01:00
Ammar Yasser
295b5b67f8 Translated using Weblate (Arabic (Egyptian))
Currently translated at 0.1% (1 of 501 strings)

Co-authored-by: Ammar Yasser <zasmimaz@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/arz/
Translation: Mue/Mue Tab 7.1
2025-08-01 14:02:16 +02:00
Hosted Weblate
021f15fd34 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/
Translation: Mue/Mue Tab 7.1
2025-07-31 14:00:08 +02:00
Ammar Yasser
0d7829f628 Added translation using Weblate (Arabic (Egyptian))
Co-authored-by: Ammar Yasser <zasmimaz@gmail.com>
2025-07-31 14:00:08 +02:00
Hosted Weblate
db6f0e42dc Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/
Translation: Mue/Mue Tab 7.1
2025-07-20 16:42:31 +02:00
Milán Magda
9b43b5ddc2 Added translation using Weblate (Hungarian)
Co-authored-by: Milán Magda <magdamilan60@gmail.com>
2025-07-20 16:42:31 +02:00
Chris Batris
01039fb990 Translated using Weblate (Greek)
Currently translated at 0.1% (1 of 501 strings)

Co-authored-by: Chris Batris <robo.chris11@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/el/
Translation: Mue/Mue Tab 7.1
2025-07-17 07:33:21 +02:00
Maydo Al-Dosery
f5ce18b0cc Translated using Weblate (English (United States))
Currently translated at 100.0% (501 of 501 strings)

Co-authored-by: Maydo Al-Dosery <maydo@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/en_US/
Translation: Mue/Mue Tab 7.1
2025-07-16 20:01:59 +00:00
Hosted Weblate
ab7f6cafbd Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/
Translation: Mue/Mue Tab 7.1
2025-06-28 23:54:50 +02:00
Theo Str
5657a2e64d Added translation using Weblate (Greek)
Co-authored-by: Theo Str <striggas85@gmail.com>
2025-06-28 23:54:49 +02:00
தமிழ்நேரம்
06350a58ce Translated using Weblate (Tamil)
Currently translated at 100.0% (501 of 501 strings)

Co-authored-by: தமிழ்நேரம் <anishprabu.t@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/ta/
Translation: Mue/Mue Tab 7.1
2025-06-22 21:03:15 +00:00
Kağan Can Şit
b288db9c04 Translated using Weblate (Turkish)
Currently translated at 100.0% (501 of 501 strings)

Co-authored-by: Kağan Can Şit <kagancansit@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/tr/
Translation: Mue/Mue Tab 7.1
2025-06-15 22:04:30 +02:00
WEBBAB
2295de4f94 Translated using Weblate (Swedish)
Currently translated at 1.3% (7 of 501 strings)

Co-authored-by: WEBBAB <johan@webbab.se>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/sv/
Translation: Mue/Mue Tab 7.1
2025-06-01 10:22:04 +02:00
Hosted Weblate
1aee984c75 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/
Translation: Mue/Mue Tab 7.1
2025-06-01 10:13:56 +02:00
WEBBAB
4639c7b8af Added translation using Weblate (Swedish)
Co-authored-by: WEBBAB <johan@webbab.se>
2025-06-01 10:13:56 +02:00
abdelbasset jabrane
4184d7fd32 Translated using Weblate (Arabic)
Currently translated at 100.0% (501 of 501 strings)

Co-authored-by: abdelbasset jabrane <ribago9317@cubene.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/ar/
Translation: Mue/Mue Tab 7.1
2025-05-10 20:01:45 +02:00
Tachibana Saza
32a7fda42a Translated using Weblate (Japanese)
Currently translated at 1.3% (7 of 501 strings)

Co-authored-by: Tachibana Saza <tachibanasaza@proton.me>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/ja/
Translation: Mue/Mue Tab 7.1
2025-04-04 04:16:09 +02:00
LibreTranslate
eb195187db Translated using Weblate (Japanese)
Currently translated at 1.3% (7 of 501 strings)

Co-authored-by: LibreTranslate <noreply-mt-libretranslate@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/ja/
Translation: Mue/Mue Tab 7.1
2025-04-04 04:16:09 +02:00
Anonymous
addb659cf3 Translated using Weblate (Portuguese)
Currently translated at 99.4% (498 of 501 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 99.6% (499 of 501 strings)

Translated using Weblate (Indonesian)

Currently translated at 99.4% (498 of 501 strings)

Translated using Weblate (Spanish)

Currently translated at 99.6% (499 of 501 strings)

Co-authored-by: Anonymous <noreply@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/es/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/id/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/pt/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/zh_Hans/
Translation: Mue/Mue Tab 7.1
2025-03-14 07:02:29 +01:00
Hosted Weblate
c199e12be0 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/
Translation: Mue/Mue Tab 7.1
2025-03-14 00:44:25 +01:00
‫ابو اسامه (فيصل)‬‎
0e5cad4d1b Added translation using Weblate (Arabic)
Co-authored-by: ‫ابو اسامه (فيصل)‬‎ <onepiece3277@gmail.com>
2025-03-14 00:44:24 +01:00
Nguyen Duy Thanh
9a1b9830a7 Translated using Weblate (Vietnamese)
Currently translated at 0.1% (1 of 501 strings)

Co-authored-by: Nguyen Duy Thanh <ndt1710bt@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/vi/
Translation: Mue/Mue Tab 7.1
2025-01-26 19:01:53 +01:00
தமிழ்நேரம்
67a6eb2332 Translated using Weblate (Tamil)
Currently translated at 99.8% (500 of 501 strings)

Co-authored-by: தமிழ்நேரம் <anishprabu.t@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/ta/
Translation: Mue/Mue Tab 7.1
2025-01-20 09:00:48 +01:00
Hosted Weblate
5712c869c3 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/
Translation: Mue/Mue Tab 7.1
2025-01-19 06:48:06 +01:00
தமிழ்நேரம்
a70ca6f48e Added translation using Weblate (Tamil)
Co-authored-by: தமிழ்நேரம் <anishprabu.t@gmail.com>
2025-01-19 06:48:05 +01:00
David Ralph
2f8b15205e Update dependabot.yml
Signed-off-by: David Ralph <ohlookitsderpy@protonmail.com>
2025-01-18 23:05:18 +00:00
xiezheyuan
6a9d2fb9c6 Improve some Chinese translations (#988) 2025-01-07 10:14:34 +00:00
Hosted Weblate
ea8c5a4982 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/
Translation: Mue/Mue Tab 7.1
2025-01-05 08:01:58 +01:00
A
56a85c761d Added translation using Weblate (Japanese)
Co-authored-by: A <117unko@gmail.com>
2025-01-05 08:01:58 +01:00
dependabot[bot]
44d630220a chore(deps-dev): bump stylelint from 16.11.0 to 16.12.0 (#979)
Bumps [stylelint](https://github.com/stylelint/stylelint) from 16.11.0 to 16.12.0.
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/16.11.0...16.12.0)

---
updated-dependencies:
- dependency-name: stylelint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-26 23:07:10 +00:00
dependabot[bot]
d36c989af9 chore(deps): bump react-modal from 3.16.1 to 3.16.3 (#978)
Bumps [react-modal](https://github.com/reactjs/react-modal) from 3.16.1 to 3.16.3.
- [Release notes](https://github.com/reactjs/react-modal/releases)
- [Changelog](https://github.com/reactjs/react-modal/blob/master/CHANGELOG.md)
- [Commits](https://github.com/reactjs/react-modal/compare/v3.16.1...v3.16.3)

---
updated-dependencies:
- dependency-name: react-modal
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-26 23:07:05 +00:00
dependabot[bot]
cd21579ef5 chore(deps-dev): bump vite from 6.0.5 to 6.0.6 (#981)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.0.5 to 6.0.6.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.0.6/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-26 23:06:58 +00:00
dependabot[bot]
b4e79a4ac4 chore(deps): bump @emotion/react from 11.13.5 to 11.14.0 (#963)
Bumps [@emotion/react](https://github.com/emotion-js/emotion) from 11.13.5 to 11.14.0.
- [Release notes](https://github.com/emotion-js/emotion/releases)
- [Changelog](https://github.com/emotion-js/emotion/blob/main/CHANGELOG.md)
- [Commits](https://github.com/emotion-js/emotion/compare/@emotion/react@11.13.5...@emotion/react@11.14.0)

---
updated-dependencies:
- dependency-name: "@emotion/react"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-23 19:24:08 +00:00
dependabot[bot]
51cedb04b3 chore(deps-dev): bump @commitlint/cli from 19.6.0 to 19.6.1 (#969)
Bumps [@commitlint/cli](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli) from 19.6.0 to 19.6.1.
- [Release notes](https://github.com/conventional-changelog/commitlint/releases)
- [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/cli/CHANGELOG.md)
- [Commits](https://github.com/conventional-changelog/commitlint/commits/v19.6.1/@commitlint/cli)

---
updated-dependencies:
- dependency-name: "@commitlint/cli"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-23 19:23:13 +00:00
dependabot[bot]
97bba2f113 chore(deps): bump @emotion/styled from 11.13.5 to 11.14.0 (#962)
Bumps [@emotion/styled](https://github.com/emotion-js/emotion) from 11.13.5 to 11.14.0.
- [Release notes](https://github.com/emotion-js/emotion/releases)
- [Changelog](https://github.com/emotion-js/emotion/blob/main/CHANGELOG.md)
- [Commits](https://github.com/emotion-js/emotion/compare/@emotion/styled@11.13.5...@emotion/styled@11.14.0)

---
updated-dependencies:
- dependency-name: "@emotion/styled"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-23 19:22:58 +00:00
dependabot[bot]
32dadd7ef4 chore(deps): bump react-icons from 5.3.0 to 5.4.0 (#958)
Bumps [react-icons](https://github.com/react-icons/react-icons) from 5.3.0 to 5.4.0.
- [Release notes](https://github.com/react-icons/react-icons/releases)
- [Commits](https://github.com/react-icons/react-icons/compare/v5.3.0...v5.4.0)

---
updated-dependencies:
- dependency-name: react-icons
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-23 19:22:34 +00:00
dependabot[bot]
1841cf64fa chore(deps-dev): bump sass from 1.81.1 to 1.83.0 (#966)
Bumps [sass](https://github.com/sass/dart-sass) from 1.81.1 to 1.83.0.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.81.1...1.83.0)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-23 19:21:30 +00:00
dependabot[bot]
59b2b7f078 chore(deps): bump @mui/material from 6.1.9 to 6.3.0 (#977)
Bumps [@mui/material](https://github.com/mui/material-ui/tree/HEAD/packages/mui-material) from 6.1.9 to 6.3.0.
- [Release notes](https://github.com/mui/material-ui/releases)
- [Changelog](https://github.com/mui/material-ui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mui/material-ui/commits/v6.3.0/packages/mui-material)

---
updated-dependencies:
- dependency-name: "@mui/material"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-23 19:21:22 +00:00
dependabot[bot]
4ff9798748 chore(deps-dev): bump prettier from 3.4.1 to 3.4.2 (#959)
Bumps [prettier](https://github.com/prettier/prettier) from 3.4.1 to 3.4.2.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.4.1...3.4.2)

---
updated-dependencies:
- dependency-name: prettier
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-23 19:20:00 +00:00
dependabot[bot]
d06444ae01 chore(deps): bump nanoid from 3.3.7 to 3.3.8 (#968)
Bumps [nanoid](https://github.com/ai/nanoid) from 3.3.7 to 3.3.8.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.3.7...3.3.8)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-23 19:19:49 +00:00
dependabot[bot]
4706a8debd chore(deps): bump @sentry/react from 8.42.0 to 8.47.0 (#974)
Bumps [@sentry/react](https://github.com/getsentry/sentry-javascript) from 8.42.0 to 8.47.0.
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/8.47.0/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.42.0...8.47.0)

---
updated-dependencies:
- dependency-name: "@sentry/react"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-23 19:19:37 +00:00
dependabot[bot]
90b4babe7f chore(deps-dev): bump vite from 6.0.2 to 6.0.5 (#976)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.0.2 to 6.0.5.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.0.5/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-23 19:19:31 +00:00
LibreTranslate
423528f0a6 Translated using Weblate (Russian)
Currently translated at 100.0% (501 of 501 strings)

Co-authored-by: LibreTranslate <noreply-mt-libretranslate@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/ru/
Translation: Mue/Mue Tab 7.1
2024-12-04 18:00:36 +01:00
dependabot[bot]
9752ae0ea7 chore(deps-dev): bump sass from 1.81.0 to 1.81.1 (#956)
Bumps [sass](https://github.com/sass/dart-sass) from 1.81.0 to 1.81.1.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.81.0...1.81.1)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-03 08:53:21 +00:00
dependabot[bot]
f3c54201f9 chore(deps): bump @sentry/react from 8.41.0 to 8.42.0 (#955)
Bumps [@sentry/react](https://github.com/getsentry/sentry-javascript) from 8.41.0 to 8.42.0.
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.41.0...8.42.0)

---
updated-dependencies:
- dependency-name: "@sentry/react"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-03 08:52:58 +00:00
dependabot[bot]
8dc3a2c67a chore(deps-dev): bump vite from 6.0.1 to 6.0.2 (#954)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.0.2/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-02 08:13:23 +00:00
dependabot[bot]
440c79b818 chore(deps-dev): bump stylelint-config-standard-scss (#953)
Bumps [stylelint-config-standard-scss](https://github.com/stylelint-scss/stylelint-config-standard-scss) from 13.1.0 to 14.0.0.
- [Release notes](https://github.com/stylelint-scss/stylelint-config-standard-scss/releases)
- [Changelog](https://github.com/stylelint-scss/stylelint-config-standard-scss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint-scss/stylelint-config-standard-scss/compare/v13.1.0...v14.0.0)

---
updated-dependencies:
- dependency-name: stylelint-config-standard-scss
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-02 08:13:05 +00:00
dependabot[bot]
e1eea82d7e chore(deps-dev): bump stylelint from 16.10.0 to 16.11.0 (#952)
Bumps [stylelint](https://github.com/stylelint/stylelint) from 16.10.0 to 16.11.0.
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/16.10.0...16.11.0)

---
updated-dependencies:
- dependency-name: stylelint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-29 08:42:52 +00:00
dependabot[bot]
103eb9f50d chore(deps): bump @sentry/react from 8.40.0 to 8.41.0 (#950)
Bumps [@sentry/react](https://github.com/getsentry/sentry-javascript) from 8.40.0 to 8.41.0.
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.40.0...8.41.0)

---
updated-dependencies:
- dependency-name: "@sentry/react"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-28 08:38:08 +00:00
dependabot[bot]
59503a425a chore(deps-dev): bump vite from 5.4.11 to 6.0.1 (#951)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.11 to 6.0.1.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/create-vite@6.0.1/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-28 08:36:17 +00:00
dependabot[bot]
874b911ee5 chore(deps): bump @mui/material from 6.1.8 to 6.1.9 (#949)
Bumps [@mui/material](https://github.com/mui/material-ui/tree/HEAD/packages/mui-material) from 6.1.8 to 6.1.9.
- [Release notes](https://github.com/mui/material-ui/releases)
- [Changelog](https://github.com/mui/material-ui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mui/material-ui/commits/v6.1.9/packages/mui-material)

---
updated-dependencies:
- dependency-name: "@mui/material"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-28 08:35:40 +00:00
dependabot[bot]
fdc0cbae66 chore(deps-dev): bump @vitejs/plugin-react-swc from 3.7.1 to 3.7.2 (#948)
Bumps [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) from 3.7.1 to 3.7.2.
- [Release notes](https://github.com/vitejs/vite-plugin-react-swc/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react-swc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react-swc/compare/v3.7.1...v3.7.2)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-react-swc"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-27 08:24:26 +00:00
dependabot[bot]
b304d60e49 chore(deps-dev): bump prettier from 3.4.0 to 3.4.1 (#947)
Bumps [prettier](https://github.com/prettier/prettier) from 3.4.0 to 3.4.1.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.4.0...3.4.1)

---
updated-dependencies:
- dependency-name: prettier
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-27 08:23:58 +00:00
dependabot[bot]
36bd7136e8 chore(deps-dev): bump prettier from 3.3.3 to 3.4.0 (#946)
Bumps [prettier](https://github.com/prettier/prettier) from 3.3.3 to 3.4.0.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.3.3...3.4.0)

---
updated-dependencies:
- dependency-name: prettier
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-26 08:47:22 +00:00
dependabot[bot]
b87de92707 chore(deps): bump @sentry/react from 8.39.0 to 8.40.0 (#945)
Bumps [@sentry/react](https://github.com/getsentry/sentry-javascript) from 8.39.0 to 8.40.0.
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.39.0...8.40.0)

---
updated-dependencies:
- dependency-name: "@sentry/react"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-25 08:52:28 +00:00
dependabot[bot]
c478830ded chore(deps): bump embla-carousel-autoplay from 8.4.0 to 8.5.1 (#944)
Bumps [embla-carousel-autoplay](https://github.com/davidjerleke/embla-carousel) from 8.4.0 to 8.5.1.
- [Release notes](https://github.com/davidjerleke/embla-carousel/releases)
- [Commits](https://github.com/davidjerleke/embla-carousel/compare/v8.4.0...v8.5.1)

---
updated-dependencies:
- dependency-name: embla-carousel-autoplay
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-22 09:00:45 +00:00
dependabot[bot]
fe67c73e78 chore(deps-dev): bump stylelint-scss from 6.9.0 to 6.10.0 (#943)
Bumps [stylelint-scss](https://github.com/stylelint-scss/stylelint-scss) from 6.9.0 to 6.10.0.
- [Release notes](https://github.com/stylelint-scss/stylelint-scss/releases)
- [Changelog](https://github.com/stylelint-scss/stylelint-scss/blob/master/CHANGELOG.md)
- [Commits](https://github.com/stylelint-scss/stylelint-scss/compare/v6.9.0...v6.10.0)

---
updated-dependencies:
- dependency-name: stylelint-scss
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-21 08:33:48 +00:00
dependabot[bot]
935106e69d chore(deps): bump embla-carousel-react from 8.4.0 to 8.5.1 (#942)
Bumps [embla-carousel-react](https://github.com/davidjerleke/embla-carousel) from 8.4.0 to 8.5.1.
- [Release notes](https://github.com/davidjerleke/embla-carousel/releases)
- [Commits](https://github.com/davidjerleke/embla-carousel/compare/v8.4.0...v8.5.1)

---
updated-dependencies:
- dependency-name: embla-carousel-react
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-21 08:33:28 +00:00
dependabot[bot]
88daa4284d chore(deps): bump @mui/material from 6.1.7 to 6.1.8 (#941)
Bumps [@mui/material](https://github.com/mui/material-ui/tree/HEAD/packages/mui-material) from 6.1.7 to 6.1.8.
- [Release notes](https://github.com/mui/material-ui/releases)
- [Changelog](https://github.com/mui/material-ui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mui/material-ui/commits/v6.1.8/packages/mui-material)

---
updated-dependencies:
- dependency-name: "@mui/material"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-21 08:33:00 +00:00
dependabot[bot]
31685a313c chore(deps): bump @emotion/styled from 11.13.0 to 11.13.5 (#940)
Bumps [@emotion/styled](https://github.com/emotion-js/emotion) from 11.13.0 to 11.13.5.
- [Release notes](https://github.com/emotion-js/emotion/releases)
- [Changelog](https://github.com/emotion-js/emotion/blob/main/CHANGELOG.md)
- [Commits](https://github.com/emotion-js/emotion/compare/@emotion/styled@11.13.0...@emotion/styled@11.13.5)

---
updated-dependencies:
- dependency-name: "@emotion/styled"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-20 08:42:39 +00:00
dependabot[bot]
616efbff56 chore(deps-dev): bump @commitlint/config-conventional (#939)
Bumps [@commitlint/config-conventional](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/config-conventional) from 19.5.0 to 19.6.0.
- [Release notes](https://github.com/conventional-changelog/commitlint/releases)
- [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/config-conventional/CHANGELOG.md)
- [Commits](https://github.com/conventional-changelog/commitlint/commits/v19.6.0/@commitlint/config-conventional)

---
updated-dependencies:
- dependency-name: "@commitlint/config-conventional"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-20 08:41:40 +00:00
dependabot[bot]
4634fc5626 chore(deps): bump @emotion/react from 11.13.3 to 11.13.5 (#937)
Bumps [@emotion/react](https://github.com/emotion-js/emotion) from 11.13.3 to 11.13.5.
- [Release notes](https://github.com/emotion-js/emotion/releases)
- [Changelog](https://github.com/emotion-js/emotion/blob/main/CHANGELOG.md)
- [Commits](https://github.com/emotion-js/emotion/compare/@emotion/react@11.13.3...@emotion/react@11.13.5)

---
updated-dependencies:
- dependency-name: "@emotion/react"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-20 08:41:00 +00:00
dependabot[bot]
7264560294 chore(deps-dev): bump @commitlint/cli from 19.5.0 to 19.6.0 (#938)
Bumps [@commitlint/cli](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli) from 19.5.0 to 19.6.0.
- [Release notes](https://github.com/conventional-changelog/commitlint/releases)
- [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/cli/CHANGELOG.md)
- [Commits](https://github.com/conventional-changelog/commitlint/commits/v19.6.0/@commitlint/cli)

---
updated-dependencies:
- dependency-name: "@commitlint/cli"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-20 08:39:07 +00:00
dependabot[bot]
8e7c0c6d42 chore(deps): bump @sentry/react from 8.38.0 to 8.39.0 (#936)
Bumps [@sentry/react](https://github.com/getsentry/sentry-javascript) from 8.38.0 to 8.39.0.
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.38.0...8.39.0)

---
updated-dependencies:
- dependency-name: "@sentry/react"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-20 08:38:39 +00:00
dependabot[bot]
92cfb28ba7 chore(deps-dev): bump husky from 9.1.6 to 9.1.7 (#935)
Bumps [husky](https://github.com/typicode/husky) from 9.1.6 to 9.1.7.
- [Release notes](https://github.com/typicode/husky/releases)
- [Commits](https://github.com/typicode/husky/compare/v9.1.6...v9.1.7)

---
updated-dependencies:
- dependency-name: husky
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-19 08:27:24 +00:00
dependabot[bot]
2617172cea chore(deps): bump embla-carousel-autoplay from 8.3.1 to 8.4.0 (#934)
Bumps [embla-carousel-autoplay](https://github.com/davidjerleke/embla-carousel) from 8.3.1 to 8.4.0.
- [Release notes](https://github.com/davidjerleke/embla-carousel/releases)
- [Commits](https://github.com/davidjerleke/embla-carousel/compare/v8.3.1...v8.4.0)

---
updated-dependencies:
- dependency-name: embla-carousel-autoplay
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-19 08:26:46 +00:00
dependabot[bot]
ef844171cf chore(deps): bump cross-spawn from 7.0.3 to 7.0.5 (#933)
Bumps [cross-spawn](https://github.com/moxystudio/node-cross-spawn) from 7.0.3 to 7.0.5.
- [Changelog](https://github.com/moxystudio/node-cross-spawn/blob/master/CHANGELOG.md)
- [Commits](https://github.com/moxystudio/node-cross-spawn/compare/v7.0.3...v7.0.5)

---
updated-dependencies:
- dependency-name: cross-spawn
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-18 08:42:45 +00:00
dependabot[bot]
46d5b28bcc chore(deps): bump embla-carousel-react from 8.3.1 to 8.4.0 (#932)
Bumps [embla-carousel-react](https://github.com/davidjerleke/embla-carousel) from 8.3.1 to 8.4.0.
- [Release notes](https://github.com/davidjerleke/embla-carousel/releases)
- [Commits](https://github.com/davidjerleke/embla-carousel/compare/v8.3.1...v8.4.0)

---
updated-dependencies:
- dependency-name: embla-carousel-react
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-18 08:40:37 +00:00
Lesnay Manrresa Martínez
b319bc8957 Translated using Weblate (Spanish (Latin America))
Currently translated at 100.0% (501 of 501 strings)

Co-authored-by: Lesnay Manrresa Martínez <ELPERRO@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/es_419/
Translation: Mue/Mue Tab 7.1
2024-11-17 18:00:20 +00:00
dependabot[bot]
309c4b9380 chore(deps-dev): bump sass from 1.80.7 to 1.81.0 (#931)
Bumps [sass](https://github.com/sass/dart-sass) from 1.80.7 to 1.81.0.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.80.7...1.81.0)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-15 08:34:35 +00:00
dependabot[bot]
17dfcc2706 chore(deps): bump @mui/material from 6.1.6 to 6.1.7 (#930)
Bumps [@mui/material](https://github.com/mui/material-ui/tree/HEAD/packages/mui-material) from 6.1.6 to 6.1.7.
- [Release notes](https://github.com/mui/material-ui/releases)
- [Changelog](https://github.com/mui/material-ui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mui/material-ui/commits/v6.1.7/packages/mui-material)

---
updated-dependencies:
- dependency-name: "@mui/material"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-14 08:51:22 +00:00
Isaac
329da19048 docs: add web store badges 2024-11-13 23:19:03 +00:00
dependabot[bot]
fbb71e07c4 chore(deps): bump @sentry/react from 8.37.1 to 8.38.0 (#929)
Bumps [@sentry/react](https://github.com/getsentry/sentry-javascript) from 8.37.1 to 8.38.0.
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.37.1...8.38.0)

---
updated-dependencies:
- dependency-name: "@sentry/react"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-13 08:24:52 +00:00
dependabot[bot]
0243441f36 chore(deps-dev): bump sass from 1.80.6 to 1.80.7 (#928)
Bumps [sass](https://github.com/sass/dart-sass) from 1.80.6 to 1.80.7.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.80.6...1.80.7)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-13 08:24:34 +00:00
dependabot[bot]
ffa98fc7e2 chore(deps-dev): bump stylelint-scss from 6.8.1 to 6.9.0 (#927)
Bumps [stylelint-scss](https://github.com/stylelint-scss/stylelint-scss) from 6.8.1 to 6.9.0.
- [Release notes](https://github.com/stylelint-scss/stylelint-scss/releases)
- [Changelog](https://github.com/stylelint-scss/stylelint-scss/blob/master/CHANGELOG.md)
- [Commits](https://github.com/stylelint-scss/stylelint-scss/compare/v6.8.1...v6.9.0)

---
updated-dependencies:
- dependency-name: stylelint-scss
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-12 08:59:57 +00:00
dependabot[bot]
95da2d425a chore(deps-dev): bump vite from 5.4.10 to 5.4.11 (#926)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.10 to 5.4.11.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.11/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.11/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-12 08:57:31 +00:00
dependabot[bot]
1f19676282 chore(deps): bump react-best-gradient-color-picker from 3.0.10 to 3.0.11 (#925)
Bumps [react-best-gradient-color-picker](https://github.com/hxf31891/react-gradient-color-picker) from 3.0.10 to 3.0.11.
- [Release notes](https://github.com/hxf31891/react-gradient-color-picker/releases)
- [Commits](https://github.com/hxf31891/react-gradient-color-picker/compare/v3.0.10...v3.0.11)

---
updated-dependencies:
- dependency-name: react-best-gradient-color-picker
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-11 08:14:01 +00:00
dependabot[bot]
16847eeec4 chore(deps): bump @sentry/react from 8.36.0 to 8.37.1 (#924)
Bumps [@sentry/react](https://github.com/getsentry/sentry-javascript) from 8.36.0 to 8.37.1.
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.36.0...8.37.1)

---
updated-dependencies:
- dependency-name: "@sentry/react"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-06 08:37:33 +00:00
dependabot[bot]
db43ffad8d chore(deps-dev): bump sass from 1.80.5 to 1.80.6 (#923)
Bumps [sass](https://github.com/sass/dart-sass) from 1.80.5 to 1.80.6.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.80.5...1.80.6)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-04 08:26:55 +00:00
Đức Hải Vũ
d2f440bc9d Translated using Weblate (Vietnamese)
Currently translated at 0.0% (0 of 501 strings)

Co-authored-by: Đức Hải Vũ <haixom0@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/vi/
Translation: Mue/Mue Tab 7.1
2024-11-03 07:00:28 +01:00
Hosted Weblate
e2cf767add Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/
Translation: Mue/Mue Tab 7.1
2024-11-02 06:48:53 +01:00
Đức Hải Vũ
23385437b5 Added translation using Weblate (Vietnamese)
Co-authored-by: Đức Hải Vũ <haixom0@gmail.com>
2024-11-02 06:48:53 +01:00
dependabot[bot]
d01d571415 chore(deps): bump @sentry/react from 8.35.0 to 8.36.0 (#921)
Bumps [@sentry/react](https://github.com/getsentry/sentry-javascript) from 8.35.0 to 8.36.0.
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.35.0...8.36.0)

---
updated-dependencies:
- dependency-name: "@sentry/react"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-31 08:44:00 +00:00
dependabot[bot]
f24c1d8bc5 chore(deps): bump embla-carousel-autoplay from 8.3.0 to 8.3.1 (#922)
Bumps [embla-carousel-autoplay](https://github.com/davidjerleke/embla-carousel) from 8.3.0 to 8.3.1.
- [Release notes](https://github.com/davidjerleke/embla-carousel/releases)
- [Commits](https://github.com/davidjerleke/embla-carousel/compare/v8.3.0...v8.3.1)

---
updated-dependencies:
- dependency-name: embla-carousel-autoplay
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-31 08:42:01 +00:00
dependabot[bot]
81072e6621 chore(deps): bump @mui/material from 6.1.5 to 6.1.6 (#920)
Bumps [@mui/material](https://github.com/mui/material-ui/tree/HEAD/packages/mui-material) from 6.1.5 to 6.1.6.
- [Release notes](https://github.com/mui/material-ui/releases)
- [Changelog](https://github.com/mui/material-ui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mui/material-ui/commits/v6.1.6/packages/mui-material)

---
updated-dependencies:
- dependency-name: "@mui/material"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-31 08:40:40 +00:00
hugoalh
ea7192c454 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (501 of 501 strings)

Co-authored-by: hugoalh <hugoalh@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/zh_Hant/
Translation: Mue/Mue Tab 7.1
2024-10-31 06:00:17 +00:00
dependabot[bot]
c0bad6fea3 chore(deps): bump embla-carousel-react from 8.3.0 to 8.3.1 (#918)
Bumps [embla-carousel-react](https://github.com/davidjerleke/embla-carousel) from 8.3.0 to 8.3.1.
- [Release notes](https://github.com/davidjerleke/embla-carousel/releases)
- [Commits](https://github.com/davidjerleke/embla-carousel/compare/v8.3.0...v8.3.1)

---
updated-dependencies:
- dependency-name: embla-carousel-react
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-30 08:58:10 +00:00
dependabot[bot]
149ad0d354 chore(deps-dev): bump sass from 1.80.4 to 1.80.5 (#917)
Bumps [sass](https://github.com/sass/dart-sass) from 1.80.4 to 1.80.5.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.80.4...1.80.5)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-30 08:57:50 +00:00
dependabot[bot]
2c62904a05 chore(deps-dev): bump sass from 1.80.3 to 1.80.4 (#916)
Bumps [sass](https://github.com/sass/dart-sass) from 1.80.3 to 1.80.4.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.80.3...1.80.4)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-24 08:44:17 +00:00
dependabot[bot]
48eb835ba7 chore(deps): bump react-clock from 5.0.0 to 5.1.0 (#915)
Bumps [react-clock](https://github.com/wojtekmaj/react-clock/tree/HEAD/packages/react-clock) from 5.0.0 to 5.1.0.
- [Release notes](https://github.com/wojtekmaj/react-clock/releases)
- [Commits](https://github.com/wojtekmaj/react-clock/commits/v5.1.0/packages/react-clock)

---
updated-dependencies:
- dependency-name: react-clock
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-24 08:43:42 +00:00
dependabot[bot]
7dc35c6487 chore(deps-dev): bump vite from 5.4.9 to 5.4.10 (#914)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.9 to 5.4.10.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.10/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.10/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-23 08:19:26 +00:00
dependabot[bot]
f51277fd8e chore(deps): bump @mui/material from 6.1.4 to 6.1.5 (#913)
Bumps [@mui/material](https://github.com/mui/material-ui/tree/HEAD/packages/mui-material) from 6.1.4 to 6.1.5.
- [Release notes](https://github.com/mui/material-ui/releases)
- [Changelog](https://github.com/mui/material-ui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mui/material-ui/commits/v6.1.5/packages/mui-material)

---
updated-dependencies:
- dependency-name: "@mui/material"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-23 08:18:38 +00:00
dependabot[bot]
dd4f1d800d chore(deps): bump @sentry/react from 8.34.0 to 8.35.0 (#912)
Bumps [@sentry/react](https://github.com/getsentry/sentry-javascript) from 8.34.0 to 8.35.0.
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.34.0...8.35.0)

---
updated-dependencies:
- dependency-name: "@sentry/react"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-22 08:50:39 +00:00
dependabot[bot]
75a9b207f0 chore(deps-dev): bump sass from 1.80.2 to 1.80.3 (#911)
Bumps [sass](https://github.com/sass/dart-sass) from 1.80.2 to 1.80.3.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.80.2...1.80.3)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-21 08:12:51 +00:00
nokya
71866713e2 Translated using Weblate (Portuguese (Brazil))
Currently translated at 99.2% (497 of 501 strings)

Co-authored-by: nokya <n0ky4@proton.me>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/pt_BR/
Translation: Mue/Mue Tab 7.1
2024-10-19 12:16:08 +00:00
dependabot[bot]
71ff5852c9 chore(deps-dev): bump stylelint-scss from 6.8.0 to 6.8.1 (#910)
Bumps [stylelint-scss](https://github.com/stylelint-scss/stylelint-scss) from 6.8.0 to 6.8.1.
- [Release notes](https://github.com/stylelint-scss/stylelint-scss/releases)
- [Changelog](https://github.com/stylelint-scss/stylelint-scss/blob/master/CHANGELOG.md)
- [Commits](https://github.com/stylelint-scss/stylelint-scss/compare/v6.8.0...v6.8.1)

---
updated-dependencies:
- dependency-name: stylelint-scss
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-18 08:08:48 +00:00
dependabot[bot]
4a19ffd486 chore(deps-dev): bump sass from 1.80.1 to 1.80.2 (#909)
Bumps [sass](https://github.com/sass/dart-sass) from 1.80.1 to 1.80.2.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.80.1...1.80.2)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-18 08:08:35 +00:00
dependabot[bot]
f19e1446e0 chore(deps-dev): bump stylelint-scss from 6.7.0 to 6.8.0 (#908)
Bumps [stylelint-scss](https://github.com/stylelint-scss/stylelint-scss) from 6.7.0 to 6.8.0.
- [Release notes](https://github.com/stylelint-scss/stylelint-scss/releases)
- [Changelog](https://github.com/stylelint-scss/stylelint-scss/blob/master/CHANGELOG.md)
- [Commits](https://github.com/stylelint-scss/stylelint-scss/compare/v6.7.0...v6.8.0)

---
updated-dependencies:
- dependency-name: stylelint-scss
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-17 08:39:45 +00:00
dependabot[bot]
34ed909b18 chore(deps-dev): bump sass from 1.79.5 to 1.80.1 (#907)
Bumps [sass](https://github.com/sass/dart-sass) from 1.79.5 to 1.80.1.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.79.5...1.80.1)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-17 08:39:32 +00:00
dependabot[bot]
c62887e809 chore(deps): bump @mui/material from 6.1.3 to 6.1.4 (#905)
Bumps [@mui/material](https://github.com/mui/material-ui/tree/HEAD/packages/mui-material) from 6.1.3 to 6.1.4.
- [Release notes](https://github.com/mui/material-ui/releases)
- [Changelog](https://github.com/mui/material-ui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mui/material-ui/commits/v6.1.4/packages/mui-material)

---
updated-dependencies:
- dependency-name: "@mui/material"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-16 08:11:59 +00:00
dependabot[bot]
c967d15189 chore(deps-dev): bump vite from 5.4.8 to 5.4.9 (#904)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.8 to 5.4.9.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.9/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.9/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-15 08:41:13 +00:00
MAYUR
2a4c193dc4 feat: fix for dates (#903) 2024-10-14 12:02:19 +01:00
David Ralph
198918c066 chore: styling, remove deprecated vite config, possible img on demo fix 2024-10-14 11:59:11 +01:00
Hosted Weblate
fe7b5b3586 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/
Translation: Mue/Mue Tab 7.1
2024-10-14 12:50:20 +02:00
MAYUR
30130e5e99 feature : Option to show / hide author details (#899)
* feature : option to show author details

* added languages

* feat: added dates proper format

final
2024-10-14 11:50:11 +01:00
dependabot[bot]
03de2ecc3f chore(deps): bump use-debounce from 10.0.3 to 10.0.4 (#901)
Bumps [use-debounce](https://github.com/xnimorz/use-debounce) from 10.0.3 to 10.0.4.
- [Release notes](https://github.com/xnimorz/use-debounce/releases)
- [Changelog](https://github.com/xnimorz/use-debounce/blob/master/CHANGELOG.md)
- [Commits](https://github.com/xnimorz/use-debounce/commits/10.0.4)

---
updated-dependencies:
- dependency-name: use-debounce
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-14 08:41:12 +00:00
dependabot[bot]
b0e89ed1e6 chore(deps-dev): bump stylelint from 16.9.0 to 16.10.0 (#902)
Bumps [stylelint](https://github.com/stylelint/stylelint) from 16.9.0 to 16.10.0.
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/16.9.0...16.10.0)

---
updated-dependencies:
- dependency-name: stylelint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-14 08:39:11 +00:00
dependabot[bot]
e2973f6137 chore(deps): bump react-toastify from 10.0.5 to 10.0.6 (#900)
Bumps [react-toastify](https://github.com/fkhadra/react-toastify) from 10.0.5 to 10.0.6.
- [Release notes](https://github.com/fkhadra/react-toastify/releases)
- [Commits](https://github.com/fkhadra/react-toastify/compare/v10.0.5...v10.0.6)

---
updated-dependencies:
- dependency-name: react-toastify
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-14 08:38:46 +00:00
dependabot[bot]
0bf5f22848 chore(deps): bump @sentry/react from 8.33.1 to 8.34.0 (#887)
Bumps [@sentry/react](https://github.com/getsentry/sentry-javascript) from 8.33.1 to 8.34.0.
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.33.1...8.34.0)

---
updated-dependencies:
- dependency-name: "@sentry/react"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-13 18:40:52 +01:00
dependabot[bot]
3f3042f354 chore(deps-dev): bump sass from 1.79.4 to 1.79.5 (#888)
Bumps [sass](https://github.com/sass/dart-sass) from 1.79.4 to 1.79.5.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.79.4...1.79.5)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-11 08:47:11 +00:00
dependabot[bot]
caecee4a77 chore(deps): bump @mui/material from 6.1.2 to 6.1.3 (#886)
Bumps [@mui/material](https://github.com/mui/material-ui/tree/HEAD/packages/mui-material) from 6.1.2 to 6.1.3.
- [Release notes](https://github.com/mui/material-ui/releases)
- [Changelog](https://github.com/mui/material-ui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mui/material-ui/commits/v6.1.3/packages/mui-material)

---
updated-dependencies:
- dependency-name: "@mui/material"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-10 08:22:36 +00:00
Arvaidas Rekis
2caa88de07 Translated using Weblate (Azerbaijani (Southern))
Currently translated at 100.0% (500 of 500 strings)

Translated using Weblate (Azerbaijani)

Currently translated at 100.0% (500 of 500 strings)

Translated using Weblate (Slovenian)

Currently translated at 100.0% (500 of 500 strings)

Translated using Weblate (French)

Currently translated at 100.0% (500 of 500 strings)

Co-authored-by: Arvaidas Rekis <arvrekis@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/az/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/azb/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/fr/
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/sl/
Translation: Mue/Mue Tab 7.1
2024-10-06 04:16:40 +02:00
Arvaidas Rekis
75964bcbfe Translated using Weblate (Estonian)
Currently translated at 100.0% (500 of 500 strings)

Co-authored-by: Arvaidas Rekis <arvrekis@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/et/
Translation: Mue/Mue Tab 7.1
2024-10-05 02:16:31 +02:00
dependabot[bot]
1535d4dad3 chore(deps): bump rollup from 4.21.2 to 4.24.0 (#885)
Bumps [rollup](https://github.com/rollup/rollup) from 4.21.2 to 4.24.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.21.2...v4.24.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-04 08:25:07 +00:00
dependabot[bot]
0924a8bbba chore(deps): bump @sentry/react from 8.33.0 to 8.33.1 (#884)
Bumps [@sentry/react](https://github.com/getsentry/sentry-javascript) from 8.33.0 to 8.33.1.
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/8.33.1/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.33.0...8.33.1)

---
updated-dependencies:
- dependency-name: "@sentry/react"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-04 08:22:54 +00:00
Arvaidas Rekis
353fdd591d Translated using Weblate (Latvian)
Currently translated at 100.0% (500 of 500 strings)

Co-authored-by: Arvaidas Rekis <arvrekis@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/lv/
Translation: Mue/Mue Tab 7.1
2024-10-04 01:46:51 +02:00
Hosted Weblate
ca306e8bcf Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/
Translation: Mue/Mue Tab 7.1
2024-10-04 01:11:24 +02:00
Arvaidas Rekis
f3f3ac67aa Added translation using Weblate (Estonian)
Co-authored-by: Arvaidas Rekis <arvrekis@gmail.com>
2024-10-04 01:11:23 +02:00
Hosted Weblate
731a6b7297 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/
Translation: Mue/Mue Tab 7.1
2024-10-04 01:10:55 +02:00
Arvaidas Rekis
0dff7e7812 Added translation using Weblate (Latvian)
Translated using Weblate (Lithuanian)

Currently translated at 100.0% (500 of 500 strings)

Co-authored-by: Arvaidas Rekis <arvrekis@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/lt/
Translation: Mue/Mue Tab 7.1
2024-10-04 01:10:55 +02:00
Isaac
5e8d4a34df feat(i18n): add Lithuanian 2024-10-03 23:48:07 +01:00
Arvaidas Rekis
82efe4865d Translated using Weblate (Lithuanian)
Currently translated at 21.2% (106 of 500 strings)

Translated using Weblate (Lithuanian)

Currently translated at 21.2% (106 of 500 strings)

Translated using Weblate (Lithuanian)

Currently translated at 21.2% (106 of 500 strings)

Translated using Weblate (Lithuanian)

Currently translated at 21.2% (106 of 500 strings)

Co-authored-by: Arvaidas Rekis <arvrekis@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/lt/
Translation: Mue/Mue Tab 7.1
2024-10-03 21:15:11 +02:00
Weblate Translation Memory
eb97901fc8 Translated using Weblate (Lithuanian)
Currently translated at 21.2% (106 of 500 strings)

Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/lt/
Translation: Mue/Mue Tab 7.1
2024-10-03 21:15:10 +02:00
Arvaidas Rekis
c889e27f23 Translated using Weblate (Lithuanian)
Currently translated at 21.2% (106 of 500 strings)

Co-authored-by: Arvaidas Rekis <arvrekis@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/lt/
Translation: Mue/Mue Tab 7.1
2024-10-03 21:15:10 +02:00
dependabot[bot]
19ed4451d8 chore(deps): bump @sentry/react from 8.32.0 to 8.33.0 (#883)
Bumps [@sentry/react](https://github.com/getsentry/sentry-javascript) from 8.32.0 to 8.33.0.
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.32.0...8.33.0)

---
updated-dependencies:
- dependency-name: "@sentry/react"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-03 08:08:11 +00:00
dependabot[bot]
c43ce627bd chore(deps): bump @mui/material from 6.1.1 to 6.1.2 (#882)
Bumps [@mui/material](https://github.com/mui/material-ui/tree/HEAD/packages/mui-material) from 6.1.1 to 6.1.2.
- [Release notes](https://github.com/mui/material-ui/releases)
- [Changelog](https://github.com/mui/material-ui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mui/material-ui/commits/v6.1.2/packages/mui-material)

---
updated-dependencies:
- dependency-name: "@mui/material"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-03 08:05:54 +00:00
Hosted Weblate
440468a1b6 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/
Translation: Mue/Mue Tab 7.1
2024-10-03 02:44:21 +02:00
Arvaidas Rekis
274e92a01b Added translation using Weblate (Lithuanian)
Co-authored-by: Arvaidas Rekis <arvrekis@gmail.com>
2024-10-03 02:44:21 +02:00
dependabot[bot]
22d5212fc3 chore(deps-dev): bump @vitejs/plugin-react-swc from 3.7.0 to 3.7.1 (#879)
Bumps [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) from 3.7.0 to 3.7.1.
- [Release notes](https://github.com/vitejs/vite-plugin-react-swc/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react-swc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react-swc/compare/v3.7.0...v3.7.1)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-react-swc"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-30 08:40:44 +00:00
dependabot[bot]
cbb9ad4be6 chore(deps-dev): bump sass from 1.79.3 to 1.79.4 (#878)
Bumps [sass](https://github.com/sass/dart-sass) from 1.79.3 to 1.79.4.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.79.3...1.79.4)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-30 08:38:12 +00:00
dependabot[bot]
1c33d5ca67 chore(deps): bump @sentry/react from 8.31.0 to 8.32.0 (#877)
Bumps [@sentry/react](https://github.com/getsentry/sentry-javascript) from 8.31.0 to 8.32.0.
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/8.32.0/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.31.0...8.32.0)

---
updated-dependencies:
- dependency-name: "@sentry/react"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-26 08:52:37 +00:00
dependabot[bot]
fe45dcf309 chore(deps-dev): bump vite from 5.4.7 to 5.4.8 (#876)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.7 to 5.4.8.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.8/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.8/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-25 08:50:11 +00:00
dependabot[bot]
8817ea630e chore(deps-dev): bump vite from 5.4.6 to 5.4.7 (#873)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.6 to 5.4.7.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.7/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.7/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-23 08:16:26 +00:00
dependabot[bot]
b779902595 chore(deps): bump @sentry/react from 8.30.0 to 8.31.0 (#872)
Bumps [@sentry/react](https://github.com/getsentry/sentry-javascript) from 8.30.0 to 8.31.0.
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/8.31.0/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.30.0...8.31.0)

---
updated-dependencies:
- dependency-name: "@sentry/react"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-23 08:14:08 +00:00
dependabot[bot]
a977297183 chore(deps-dev): bump sass from 1.79.2 to 1.79.3 (#871)
Bumps [sass](https://github.com/sass/dart-sass) from 1.79.2 to 1.79.3.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.79.2...1.79.3)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-23 08:13:56 +00:00
Isaac
d675e8ee53 fix: remove extra utm_source query
Signed-off-by: Isaac <git@eartharoid.me>
2024-09-21 22:01:02 +01:00
dependabot[bot]
9224ceda23 chore(deps-dev): bump sass from 1.79.1 to 1.79.2 (#870)
Bumps [sass](https://github.com/sass/dart-sass) from 1.79.1 to 1.79.2.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.79.1...1.79.2)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-20 08:18:25 +00:00
dependabot[bot]
0cb78faf3d chore(deps-dev): bump stylelint-scss from 6.6.0 to 6.7.0 (#868)
Bumps [stylelint-scss](https://github.com/stylelint-scss/stylelint-scss) from 6.6.0 to 6.7.0.
- [Release notes](https://github.com/stylelint-scss/stylelint-scss/releases)
- [Changelog](https://github.com/stylelint-scss/stylelint-scss/blob/master/CHANGELOG.md)
- [Commits](https://github.com/stylelint-scss/stylelint-scss/compare/v6.6.0...v6.7.0)

---
updated-dependencies:
- dependency-name: stylelint-scss
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-19 08:05:42 +00:00
dependabot[bot]
6923e849ef chore(deps): bump @mui/material from 6.1.0 to 6.1.1 (#867)
Bumps [@mui/material](https://github.com/mui/material-ui/tree/HEAD/packages/mui-material) from 6.1.0 to 6.1.1.
- [Release notes](https://github.com/mui/material-ui/releases)
- [Changelog](https://github.com/mui/material-ui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mui/material-ui/commits/v6.1.1/packages/mui-material)

---
updated-dependencies:
- dependency-name: "@mui/material"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-19 08:05:21 +00:00
dependabot[bot]
a9fd9add32 chore(deps-dev): bump sass from 1.78.0 to 1.79.1 (#866)
Bumps [sass](https://github.com/sass/dart-sass) from 1.78.0 to 1.79.1.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.78.0...1.79.1)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-18 08:50:35 +00:00
dependabot[bot]
4b5869c2ed chore(deps-dev): bump vite from 5.4.5 to 5.4.6 (#865)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.5 to 5.4.6.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.6/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.6/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-17 08:50:25 +00:00
dependabot[bot]
bba9542c75 chore(deps-dev): bump eslint from 8.57.0 to 8.57.1 (#864)
Bumps [eslint](https://github.com/eslint/eslint) from 8.57.0 to 8.57.1.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.57.0...v8.57.1)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-17 08:50:16 +00:00
dependabot[bot]
86e084eab9 chore(deps): bump @floating-ui/react-dom from 2.1.1 to 2.1.2 (#863)
Bumps [@floating-ui/react-dom](https://github.com/floating-ui/floating-ui/tree/HEAD/packages/react-dom) from 2.1.1 to 2.1.2.
- [Release notes](https://github.com/floating-ui/floating-ui/releases)
- [Changelog](https://github.com/floating-ui/floating-ui/blob/master/packages/react-dom/CHANGELOG.md)
- [Commits](https://github.com/floating-ui/floating-ui/commits/@floating-ui/react-dom@2.1.2/packages/react-dom)

---
updated-dependencies:
- dependency-name: "@floating-ui/react-dom"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-16 08:12:56 +00:00
dependabot[bot]
9d4f0a2125 chore(deps-dev): bump vite from 5.4.4 to 5.4.5 (#862)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.4 to 5.4.5.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.5/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.5/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-16 08:12:45 +00:00
dependabot[bot]
67cb77ef8a chore(deps): bump embla-carousel-autoplay from 8.2.1 to 8.3.0 (#861)
Bumps [embla-carousel-autoplay](https://github.com/davidjerleke/embla-carousel) from 8.2.1 to 8.3.0.
- [Release notes](https://github.com/davidjerleke/embla-carousel/releases)
- [Commits](https://github.com/davidjerleke/embla-carousel/compare/v8.2.1...v8.3.0)

---
updated-dependencies:
- dependency-name: embla-carousel-autoplay
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-16 08:12:34 +00:00
Alex Sparkes
530aafba20 Update README.md
Signed-off-by: Alex Sparkes <alexsparkes@gmail.com>
2024-09-15 20:46:58 +01:00
David Ralph
20319d0b8e chore: new readme v1 2024-09-15 20:13:38 +01:00
dependabot[bot]
28e7d0c0fd chore(deps-dev): bump stylelint-scss from 6.5.1 to 6.6.0 (#860)
Bumps [stylelint-scss](https://github.com/stylelint-scss/stylelint-scss) from 6.5.1 to 6.6.0.
- [Release notes](https://github.com/stylelint-scss/stylelint-scss/releases)
- [Changelog](https://github.com/stylelint-scss/stylelint-scss/blob/master/CHANGELOG.md)
- [Commits](https://github.com/stylelint-scss/stylelint-scss/compare/v6.5.1...v6.6.0)

---
updated-dependencies:
- dependency-name: stylelint-scss
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-13 08:38:05 +00:00
dependabot[bot]
1e36c3268a chore(deps): bump embla-carousel-react from 8.2.1 to 8.3.0 (#859)
Bumps [embla-carousel-react](https://github.com/davidjerleke/embla-carousel) from 8.2.1 to 8.3.0.
- [Release notes](https://github.com/davidjerleke/embla-carousel/releases)
- [Commits](https://github.com/davidjerleke/embla-carousel/compare/v8.2.1...v8.3.0)

---
updated-dependencies:
- dependency-name: embla-carousel-react
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-13 08:37:52 +00:00
Isaac
80e2c37751 fix(manifest): firefox addon id (#851) 2024-09-12 17:02:46 +01:00
Isaac
32a4c1e72e fix(manifest): another attempt to fix firefox 2024-09-12 16:56:49 +01:00
dependabot[bot]
bb57c215aa chore(deps): bump @mui/material from 6.0.2 to 6.1.0 (#858)
Bumps [@mui/material](https://github.com/mui/material-ui/tree/HEAD/packages/mui-material) from 6.0.2 to 6.1.0.
- [Release notes](https://github.com/mui/material-ui/releases)
- [Changelog](https://github.com/mui/material-ui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mui/material-ui/commits/v6.1.0/packages/mui-material)

---
updated-dependencies:
- dependency-name: "@mui/material"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-12 08:58:23 +00:00
dependabot[bot]
58ac84bdc3 chore(deps-dev): bump husky from 9.1.5 to 9.1.6 (#857)
Bumps [husky](https://github.com/typicode/husky) from 9.1.5 to 9.1.6.
- [Release notes](https://github.com/typicode/husky/releases)
- [Commits](https://github.com/typicode/husky/compare/v9.1.5...v9.1.6)

---
updated-dependencies:
- dependency-name: husky
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-12 08:58:09 +00:00
dependabot[bot]
f8f89d236c chore(deps-dev): bump @commitlint/config-conventional (#856)
Bumps [@commitlint/config-conventional](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/config-conventional) from 19.4.1 to 19.5.0.
- [Release notes](https://github.com/conventional-changelog/commitlint/releases)
- [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/config-conventional/CHANGELOG.md)
- [Commits](https://github.com/conventional-changelog/commitlint/commits/v19.5.0/@commitlint/config-conventional)

---
updated-dependencies:
- dependency-name: "@commitlint/config-conventional"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-11 08:54:45 +00:00
dependabot[bot]
afbdce3d5f chore(deps-dev): bump vite from 5.4.3 to 5.4.4 (#855)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.3 to 5.4.4.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.4/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.4/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-11 08:52:57 +00:00
dependabot[bot]
a7980e6941 chore(deps): bump @sentry/react from 8.29.0 to 8.30.0 (#854)
Bumps [@sentry/react](https://github.com/getsentry/sentry-javascript) from 8.29.0 to 8.30.0.
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.29.0...8.30.0)

---
updated-dependencies:
- dependency-name: "@sentry/react"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-11 08:52:42 +00:00
dependabot[bot]
7f3e4171a3 chore(deps-dev): bump @commitlint/cli from 19.4.1 to 19.5.0 (#853)
Bumps [@commitlint/cli](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli) from 19.4.1 to 19.5.0.
- [Release notes](https://github.com/conventional-changelog/commitlint/releases)
- [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/cli/CHANGELOG.md)
- [Commits](https://github.com/conventional-changelog/commitlint/commits/v19.5.0/@commitlint/cli)

---
updated-dependencies:
- dependency-name: "@commitlint/cli"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-11 08:52:23 +00:00
dependabot[bot]
7157493327 chore(deps): bump @sentry/react from 8.28.0 to 8.29.0 (#852)
Bumps [@sentry/react](https://github.com/getsentry/sentry-javascript) from 8.28.0 to 8.29.0.
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/8.28.0...8.29.0)

---
updated-dependencies:
- dependency-name: "@sentry/react"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-10 08:47:22 +00:00
gallegonovato
940af56a2b Translated using Weblate (Spanish)
Currently translated at 100.0% (500 of 500 strings)

Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/mue/mue-tab-7-1/es/
Translation: Mue/Mue Tab 7.1
2024-09-07 15:09:19 +02:00
Isaac
ea20d3e518 fix(manifest): add ID to Firefox manifest 2024-09-06 19:18:10 +01:00
Isaac
837836ab79 chore(dependencies): update lockfile 2024-09-06 19:17:47 +01:00
David Ralph
bc104c49af fix: embarrassing translation update mistake (not bumping ver for this) 2024-09-06 13:08:41 +01:00
314 changed files with 38172 additions and 23146 deletions

6
.github/CODEOWNERS vendored
View File

@@ -1,2 +1,8 @@
# Automatically assigned to any PRs
* @davidcralph @alexsparkes
# Workflow files require maintainer approval
/.github/workflows/ @davidcralph @alexsparkes
# Release process documentation
/docs/RELEASE_PROCESS.md @davidcralph @alexsparkes

65
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,65 @@
## Description
<!-- Provide a brief description of your changes -->
## Type of Change
<!-- Mark the relevant option with an 'x' -->
- [ ] 🐛 Bug fix (non-breaking change which fixes an issue)
- [ ] ✨ New feature (non-breaking change which adds functionality)
- [ ] 💥 Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] 📝 Documentation update
- [ ] 🎨 UI/UX improvement
- [ ] ⚡ Performance improvement
- [ ] 🔧 Maintenance/refactoring
## Testing
<!-- Describe the tests you ran and how to reproduce them -->
- [ ] Tested on Chrome/Edge
- [ ] Tested on Firefox
- [ ] Tested on Safari (if applicable)
- [ ] Checked console for errors
- [ ] Tested in different screen sizes
## Checklist
### General
- [ ] My code follows the project's code style
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] My changes generate no new warnings or errors
- [ ] I have tested my changes locally
### For Feature/Bug Fix PRs
- [ ] I have added/updated tests that prove my fix is effective or that my feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] I have updated the documentation accordingly
### For Release PRs (beta → main)
<!-- Only fill out if this is a release PR -->
- [ ] Version has been bumped in all necessary files
- [ ] Changelog has been updated
- [ ] Beta testing period completed (minimum X days)
- [ ] All critical bugs from beta have been resolved
- [ ] Extension has been tested by at least X beta testers
- [ ] No open P0/P1 issues blocking release
- [ ] Release notes prepared
- [ ] Store submission credentials verified
## Screenshots (if applicable)
<!-- Add screenshots to help explain your changes -->
## Related Issues
<!-- Link any related issues here -->
Closes #
Relates to #
## Additional Notes
<!-- Any additional information for reviewers -->

View File

@@ -1,17 +1 @@
version: 2
updates:
- package-ecosystem: npm
directory: "/"
schedule:
interval: daily
open-pull-requests-limit: 10
ignore:
- dependency-name: fontsource-lexend-deca
versions:
- ">= 4.a, < 5"
- dependency-name: fontsource-roboto
versions:
- ">= 4.a, < 5"
- dependency-name: react-modal
versions:
- 3.13.1

View File

@@ -5,14 +5,17 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
with:
node-version: "20.x"
bun-version: latest
- name: Install dependencies
run: npm install
run: bun install
- name: Lint
run: bun run lint
continue-on-error: true
- name: Build
run: npm run build
run: bun run build
automerge:
needs: build
runs-on: ubuntu-latest
@@ -22,6 +25,6 @@ jobs:
contents: write
steps:
- uses: fastify/github-action-merge-dependabot@v3.0.0
- uses: fastify/github-action-merge-dependabot@v3.10.1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}

170
.github/workflows/beta-release.yml vendored Normal file
View File

@@ -0,0 +1,170 @@
name: Beta Release
on:
push:
branches:
- beta
permissions:
contents: write
jobs:
build-and-release:
runs-on: ubuntu-latest
environment: beta
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: '1.3.1'
- name: Install dependencies
run: bun install
- name: Build extension
run: bun run build
env:
NODE_ENV: production
- name: Get version from package.json
id: version
run: |
VERSION=$(node -p "require('./package.json').version")
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Building version: $VERSION"
# Check if this is actually a beta version
if [[ ! "$VERSION" =~ -beta\. ]]; then
echo "❌ Version $VERSION is not a beta version (must contain '-beta.')"
echo "Skipping beta release. Use Version Bump workflow to create a beta version first."
exit 1
fi
- name: Generate changelog
id: changelog
run: |
# Get the latest beta or production tag
PREVIOUS_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "")
if [ -z "$PREVIOUS_TAG" ]; then
echo "No previous tag found, using all commits"
COMMITS=$(git log --pretty=format:"- %s (%h)" HEAD)
else
echo "Generating changelog from $PREVIOUS_TAG to HEAD"
COMMITS=$(git log --pretty=format:"- %s (%h)" ${PREVIOUS_TAG}..HEAD)
fi
# Create changelog with categorization
FEATURES=$(echo "$COMMITS" | grep -i "^- feat" || echo "")
FIXES=$(echo "$COMMITS" | grep -i "^- fix" || echo "")
CHORES=$(echo "$COMMITS" | grep -i "^- chore\|^- docs\|^- style\|^- refactor" || echo "")
OTHER=$(echo "$COMMITS" | grep -v -i "^- feat\|^- fix\|^- chore\|^- docs\|^- style\|^- refactor" || echo "")
{
echo "changelog<<EOF"
if [ -n "$FEATURES" ]; then
echo "### ✨ Features"
echo "$FEATURES"
echo ""
fi
if [ -n "$FIXES" ]; then
echo "### 🐛 Bug Fixes"
echo "$FIXES"
echo ""
fi
if [ -n "$CHORES" ]; then
echo "### 🔧 Maintenance"
echo "$CHORES"
echo ""
fi
if [ -n "$OTHER" ]; then
echo "### 📝 Other Changes"
echo "$OTHER"
fi
echo "EOF"
} >> $GITHUB_OUTPUT
- name: Check if release exists
id: check_release
run: |
if gh release view "v${{ steps.version.outputs.version }}" >/dev/null 2>&1; then
echo "exists=true" >> $GITHUB_OUTPUT
else
echo "exists=false" >> $GITHUB_OUTPUT
fi
env:
GH_TOKEN: ${{ github.token }}
- name: Create or Update GitHub Pre-Release
run: |
RELEASE_NOTES=$(cat <<EOF
## 🧪 Mue Beta v${{ steps.version.outputs.version }}
**⚠️ This is a beta release for testing purposes only.**
### Testing Instructions
1. Download the appropriate ZIP file below
2. For Chrome: Load as unpacked extension or install from [unlisted link](https://chromewebstore.google.com/detail/mue/bngmbednanpcfochchhgbkookpiaiaid) (dev team only)
3. For Firefox: Install via about:debugging → Load Temporary Add-on
4. Report issues at https://github.com/mue/mue/issues
${{ steps.changelog.outputs.changelog }}
### Installation Files
- **Chrome/Edge**: \`chrome-${{ steps.version.outputs.version }}.zip\`
- **Firefox**: \`firefox-${{ steps.version.outputs.version }}.zip\`
---
**🔗 Demo**: [demo.muetab.com](https://demo.muetab.com)
**📱 Beta Branch Demo**: [mue-git-beta-mue.vercel.app](https://mue-git-beta-mue.vercel.app)
EOF
)
if [ "${{ steps.check_release.outputs.exists }}" = "true" ]; then
echo "Updating existing release..."
gh release edit "v${{ steps.version.outputs.version }}" \
--notes "$RELEASE_NOTES" \
--prerelease
# Upload new files (will replace if they exist)
gh release upload "v${{ steps.version.outputs.version }}" \
"build/chrome-${{ steps.version.outputs.version }}.zip" \
"build/firefox-${{ steps.version.outputs.version }}.zip" \
--clobber
else
echo "Creating new release..."
gh release create "v${{ steps.version.outputs.version }}" \
"build/chrome-${{ steps.version.outputs.version }}.zip" \
"build/firefox-${{ steps.version.outputs.version }}.zip" \
--title "Beta v${{ steps.version.outputs.version }}" \
--notes "$RELEASE_NOTES" \
--prerelease
fi
env:
GH_TOKEN: ${{ github.token }}
- name: Output release info
run: |
echo "## 🎉 Beta Release Created!" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Version**: v${{ steps.version.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo "**Release URL**: https://github.com/${{ github.repository }}/releases/tag/v${{ steps.version.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### 📦 Build Artifacts" >> $GITHUB_STEP_SUMMARY
echo "- Chrome/Edge: \`chrome-${{ steps.version.outputs.version }}.zip\`" >> $GITHUB_STEP_SUMMARY
echo "- Firefox: \`firefox-${{ steps.version.outputs.version }}.zip\`" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### 🧪 Testing" >> $GITHUB_STEP_SUMMARY
echo "Share the release link with beta testers for feedback." >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### ⚠️ Next Steps" >> $GITHUB_STEP_SUMMARY
echo "1. Test the beta release thoroughly" >> $GITHUB_STEP_SUMMARY
echo "2. Gather feedback from testers" >> $GITHUB_STEP_SUMMARY
echo "3. Fix any critical issues" >> $GITHUB_STEP_SUMMARY
echo "4. When ready, create PR from \`beta\` → \`main\` for production release" >> $GITHUB_STEP_SUMMARY

194
.github/workflows/hotfix-release.yml vendored Normal file
View File

@@ -0,0 +1,194 @@
name: Hotfix Release
on:
workflow_dispatch:
inputs:
description:
description: 'Brief description of the hotfix'
required: true
branch_name:
description: 'Hotfix branch name (e.g., hotfix/critical-security-fix)'
required: true
permissions:
contents: write
pull-requests: write
jobs:
hotfix-release:
runs-on: ubuntu-latest
environment: production # Requires maintainer approval
steps:
- name: Validate branch name
run: |
if [[ ! "${{ github.event.inputs.branch_name }}" =~ ^hotfix/ ]]; then
echo "❌ Branch name must start with 'hotfix/'" >> $GITHUB_STEP_SUMMARY
exit 1
fi
- name: Checkout hotfix branch
uses: actions/checkout@v4
with:
ref: ${{ github.event.inputs.branch_name }}
fetch-depth: 0
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: '1.3.1'
- name: Configure Git
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
- name: Calculate hotfix version (auto-patch bump)
id: version
run: |
CURRENT_VERSION=$(node -p "require('./package.json').version")
echo "Current version: $CURRENT_VERSION"
# Remove any pre-release suffix
BASE_VERSION=$(echo $CURRENT_VERSION | sed 's/-.*$//')
IFS='.' read -r -a VERSION_PARTS <<< "$BASE_VERSION"
MAJOR="${VERSION_PARTS[0]}"
MINOR="${VERSION_PARTS[1]}"
PATCH="${VERSION_PARTS[2]}"
# Hotfixes always bump patch version
PATCH=$((PATCH + 1))
NEW_VERSION="${MAJOR}.${MINOR}.${PATCH}"
echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT
echo "Hotfix version will be: $NEW_VERSION"
- name: Update version in all files
run: |
# Update package.json
bun x json -I -f package.json -e "this.version='${{ steps.version.outputs.new_version }}'"
# Update manifests
bun x json -I -f manifest/chrome.json -e "this.version='${{ steps.version.outputs.new_version }}'"
bun x json -I -f manifest/firefox.json -e "this.version='${{ steps.version.outputs.new_version }}'"
bun x json -I -f safari/Mue\ Extension/Resources/manifest.json -e "this.version='${{ steps.version.outputs.new_version }}'"
# Update Safari Xcode project
sed -i "s/MARKETING_VERSION = [^;]*/MARKETING_VERSION = ${{ steps.version.outputs.new_version }}/g" safari/Mue.xcodeproj/project.pbxproj
# Update constants.js
sed -i "s/export const VERSION = '[^']*'/export const VERSION = '${{ steps.version.outputs.new_version }}'/" src/config/constants.js
- name: Install dependencies
run: bun install
- name: Build extension
run: bun run build
env:
NODE_ENV: production
- name: Commit version bump
run: |
git add package.json manifest/chrome.json manifest/firefox.json safari/Mue\ Extension/Resources/manifest.json safari/Mue.xcodeproj/project.pbxproj src/config/constants.js
git commit -m "chore: hotfix version bump to ${{ steps.version.outputs.new_version }}"
- name: Merge hotfix to main
run: |
git fetch origin main
git checkout main
git merge --no-ff ${{ github.event.inputs.branch_name }} -m "fix: merge hotfix ${{ github.event.inputs.branch_name }} (#${{ steps.version.outputs.new_version }})"
git tag -a "v${{ steps.version.outputs.new_version }}" -m "Hotfix v${{ steps.version.outputs.new_version }}: ${{ github.event.inputs.description }}"
git push origin main
git push origin "v${{ steps.version.outputs.new_version }}"
- name: Generate changelog
id: changelog
run: |
# Get commits from hotfix branch
git checkout ${{ github.event.inputs.branch_name }}
COMMITS=$(git log --pretty=format:"- %s (%h)" origin/main..${{ github.event.inputs.branch_name }})
{
echo "changelog<<EOF"
echo "### 🚨 Hotfix"
echo "${{ github.event.inputs.description }}"
echo ""
echo "### Changes"
echo "$COMMITS"
echo "EOF"
} >> $GITHUB_OUTPUT
- name: Create GitHub Release
run: |
git checkout main
RELEASE_NOTES=$(cat <<EOF
## 🚨 Mue Hotfix v${{ steps.version.outputs.new_version }}
**This is an emergency hotfix release.**
${{ steps.changelog.outputs.changelog }}
### 📦 Installation
**Browser Extensions (will be updated shortly):**
- **Chrome**: [Chrome Web Store](https://chromewebstore.google.com/detail/mue/bngmbednanpcfochchhgbkookpiaiaid)
- **Edge**: [Edge Add-ons](https://microsoftedge.microsoft.com/addons/detail/mue/aepnglgjfokepefimhbnibfjekidhmja)
- **Firefox**: [Firefox Add-ons](https://addons.mozilla.org/en-GB/firefox/addon/mue/)
**Immediate Manual Installation:**
- Download the ZIP file below for immediate deployment
- Chrome/Edge: Load unpacked extension
- Firefox: Install from about:debugging
---
**⚠️ This hotfix should be submitted to stores immediately.**
EOF
)
gh release create "v${{ steps.version.outputs.new_version }}" \
"build/chrome-${{ steps.version.outputs.new_version }}.zip" \
"build/firefox-${{ steps.version.outputs.new_version }}.zip" \
--title "🚨 Hotfix v${{ steps.version.outputs.new_version }}" \
--notes "$RELEASE_NOTES" \
--latest
env:
GH_TOKEN: ${{ github.token }}
- name: Back-merge to beta
run: |
git fetch origin beta
git checkout beta
git merge --no-ff main -m "chore: back-merge hotfix v${{ steps.version.outputs.new_version }} from main"
git push origin beta
- name: Back-merge to dev
run: |
git fetch origin dev
git checkout dev
git merge --no-ff main -m "chore: back-merge hotfix v${{ steps.version.outputs.new_version }} from main"
git push origin dev
- name: Output success summary
run: |
echo "## 🚨 Hotfix Released!" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Version**: v${{ steps.version.outputs.new_version }}" >> $GITHUB_STEP_SUMMARY
echo "**Description**: ${{ github.event.inputs.description }}" >> $GITHUB_STEP_SUMMARY
echo "**Release URL**: https://github.com/${{ github.repository }}/releases/tag/v${{ steps.version.outputs.new_version }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### ✅ Completed Actions" >> $GITHUB_STEP_SUMMARY
echo "- [x] Merged hotfix to \`main\`" >> $GITHUB_STEP_SUMMARY
echo "- [x] Created tag v${{ steps.version.outputs.new_version }}" >> $GITHUB_STEP_SUMMARY
echo "- [x] Created GitHub Release" >> $GITHUB_STEP_SUMMARY
echo "- [x] Back-merged to \`beta\` branch" >> $GITHUB_STEP_SUMMARY
echo "- [x] Back-merged to \`dev\` branch" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### 🚨 URGENT: Manual Steps Required" >> $GITHUB_STEP_SUMMARY
echo "1. **Submit to stores IMMEDIATELY**:" >> $GITHUB_STEP_SUMMARY
echo " - Go to [Submit workflow](https://github.com/${{ github.repository }}/actions/workflows/submit.yml)" >> $GITHUB_STEP_SUMMARY
echo " - Run with tag: \`${{ steps.version.outputs.new_version }}\`" >> $GITHUB_STEP_SUMMARY
echo "2. Update [muetab.com/blog/changelog](https://muetab.com/blog/changelog)" >> $GITHUB_STEP_SUMMARY
echo "3. Notify users via Discord/social media" >> $GITHUB_STEP_SUMMARY
echo "4. Delete hotfix branch: \`${{ github.event.inputs.branch_name }}\`" >> $GITHUB_STEP_SUMMARY

187
.github/workflows/production-release.yml vendored Normal file
View File

@@ -0,0 +1,187 @@
name: Production Release
on:
pull_request:
branches:
- main
types:
- closed
permissions:
contents: write
jobs:
# Only run if PR was merged (not just closed)
check-merge:
if: github.event.pull_request.merged == true && github.event.pull_request.head.ref == 'beta'
runs-on: ubuntu-latest
outputs:
should_release: ${{ steps.check.outputs.should_release }}
steps:
- name: Check if this is a beta to main merge
id: check
run: |
echo "should_release=true" >> $GITHUB_OUTPUT
echo "✅ This is a beta → main merge, proceeding with production release" >> $GITHUB_STEP_SUMMARY
build-and-release:
needs: check-merge
if: needs.check-merge.outputs.should_release == 'true'
runs-on: ubuntu-latest
environment: production # Requires manual approval from maintainers
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
ref: main
fetch-depth: 0
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: '1.3.1'
- name: Install dependencies
run: bun install
- name: Build extension
run: bun run build
env:
NODE_ENV: production
- name: Get version from package.json
id: version
run: |
VERSION=$(node -p "require('./package.json').version")
# Remove any pre-release suffix for production
STABLE_VERSION=$(echo $VERSION | sed 's/-.*$//')
echo "version=$STABLE_VERSION" >> $GITHUB_OUTPUT
echo "full_version=$VERSION" >> $GITHUB_OUTPUT
echo "Building production version: $STABLE_VERSION"
- name: Generate production changelog
id: changelog
run: |
# Get the latest production (non-beta) tag
PREVIOUS_TAG=$(git tag -l 'v*' --sort=-v:refname | grep -v 'beta\|alpha\|rc' | head -n 1 || echo "")
if [ -z "$PREVIOUS_TAG" ]; then
echo "No previous production tag found, using all commits"
COMMITS=$(git log --pretty=format:"- %s (%h)" main)
else
echo "Generating changelog from $PREVIOUS_TAG to main"
COMMITS=$(git log --pretty=format:"- %s (%h)" ${PREVIOUS_TAG}..main)
fi
# Categorize commits
FEATURES=$(echo "$COMMITS" | grep -i "^- feat" || echo "")
FIXES=$(echo "$COMMITS" | grep -i "^- fix" || echo "")
PERFORMANCE=$(echo "$COMMITS" | grep -i "^- perf" || echo "")
BREAKING=$(echo "$COMMITS" | grep -i "BREAKING CHANGE" || echo "")
{
echo "changelog<<EOF"
if [ -n "$BREAKING" ]; then
echo "### ⚠️ Breaking Changes"
echo "$BREAKING"
echo ""
fi
if [ -n "$FEATURES" ]; then
echo "### ✨ New Features"
echo "$FEATURES"
echo ""
fi
if [ -n "$FIXES" ]; then
echo "### 🐛 Bug Fixes"
echo "$FIXES"
echo ""
fi
if [ -n "$PERFORMANCE" ]; then
echo "### ⚡ Performance Improvements"
echo "$PERFORMANCE"
fi
echo "EOF"
} >> $GITHUB_OUTPUT
- name: Check if tag exists
id: check_tag
run: |
if git rev-parse "v${{ steps.version.outputs.version }}" >/dev/null 2>&1; then
echo "exists=true" >> $GITHUB_OUTPUT
else
echo "exists=false" >> $GITHUB_OUTPUT
fi
- name: Create production tag
if: steps.check_tag.outputs.exists == 'false'
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git tag -a "v${{ steps.version.outputs.version }}" -m "Release v${{ steps.version.outputs.version }}"
git push origin "v${{ steps.version.outputs.version }}"
- name: Create GitHub Release
run: |
RELEASE_NOTES=$(cat <<EOF
## 🎉 Mue v${{ steps.version.outputs.version }}
${{ steps.changelog.outputs.changelog }}
### 📦 Installation
**Browser Extensions:**
- **Chrome**: [Chrome Web Store](https://chromewebstore.google.com/detail/mue/bngmbednanpcfochchhgbkookpiaiaid)
- **Edge**: [Edge Add-ons](https://microsoftedge.microsoft.com/addons/detail/mue/aepnglgjfokepefimhbnibfjekidhmja)
- **Firefox**: [Firefox Add-ons](https://addons.mozilla.org/en-GB/firefox/addon/mue/)
**Manual Installation:**
- Download the appropriate ZIP file below
- Chrome/Edge: Load unpacked extension from extracted folder
- Firefox: Install from about:debugging → Load Temporary Add-on
### 🔗 Links
- **Demo**: [demo.muetab.com](https://demo.muetab.com)
- **Changelog**: [muetab.com/blog/changelog](https://muetab.com/blog/changelog)
- **Documentation**: [github.com/mue/mue](https://github.com/mue/mue)
---
### 📝 Build Information
- **Version**: ${{ steps.version.outputs.version }}
- **Build Date**: $(date -u +"%Y-%m-%d %H:%M:%S UTC")
- **Commit**: ${{ github.sha }}
EOF
)
gh release create "v${{ steps.version.outputs.version }}" \
"build/chrome-${{ steps.version.outputs.version }}.zip" \
"build/firefox-${{ steps.version.outputs.version }}.zip" \
--title "Mue v${{ steps.version.outputs.version }}" \
--notes "$RELEASE_NOTES" \
--latest
env:
GH_TOKEN: ${{ github.token }}
- name: Output success summary
run: |
echo "## 🚀 Production Release Published!" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Version**: v${{ steps.version.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo "**Release URL**: https://github.com/${{ github.repository }}/releases/tag/v${{ steps.version.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### 📦 Build Artifacts" >> $GITHUB_STEP_SUMMARY
echo "- Chrome/Edge: \`chrome-${{ steps.version.outputs.version }}.zip\`" >> $GITHUB_STEP_SUMMARY
echo "- Firefox: \`firefox-${{ steps.version.outputs.version }}.zip\`" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### ⚠️ Manual Steps Required" >> $GITHUB_STEP_SUMMARY
echo "1. Go to [GitHub Actions](https://github.com/${{ github.repository }}/actions/workflows/submit.yml)" >> $GITHUB_STEP_SUMMARY
echo "2. Click 'Run workflow'" >> $GITHUB_STEP_SUMMARY
echo "3. Enter tag: \`v${{ steps.version.outputs.version }}\`" >> $GITHUB_STEP_SUMMARY
echo "4. Click 'Run workflow' to submit to Chrome/Firefox/Edge stores" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### 📢 Post-Release Checklist" >> $GITHUB_STEP_SUMMARY
echo "- [ ] Submit to browser stores (see manual steps above)" >> $GITHUB_STEP_SUMMARY
echo "- [ ] Update [muetab.com/blog/changelog](https://muetab.com/blog/changelog)" >> $GITHUB_STEP_SUMMARY
echo "- [ ] Announce release on Discord/social media" >> $GITHUB_STEP_SUMMARY
echo "- [ ] Monitor issue tracker for bug reports" >> $GITHUB_STEP_SUMMARY
echo "- [ ] Merge \`main\` back to \`beta\` and \`dev\` to sync version" >> $GITHUB_STEP_SUMMARY

153
.github/workflows/version-bump.yml vendored Normal file
View File

@@ -0,0 +1,153 @@
name: Version Bump
on:
workflow_dispatch:
inputs:
bump_type:
description: 'Version bump type'
required: true
type: choice
options:
- patch # 7.5.0 -> 7.5.1 (bug fixes)
- minor # 7.5.0 -> 7.6.0 (new features)
- major # 7.5.0 -> 8.0.0 (breaking changes)
pre_release:
description: 'Pre-release label (leave empty for stable release)'
required: false
type: choice
options:
- ''
- beta
- rc
- alpha
permissions:
contents: write
jobs:
bump-version:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: '1.3.1'
- name: Configure Git
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
- name: Calculate new version
id: version
run: |
CURRENT_VERSION=$(node -p "require('./package.json').version")
echo "Current version: $CURRENT_VERSION"
# Remove any pre-release suffix for base version
BASE_VERSION=$(echo $CURRENT_VERSION | sed 's/-.*$//')
IFS='.' read -r -a VERSION_PARTS <<< "$BASE_VERSION"
# Detect if current version is already a pre-release
IS_PRERELEASE=false
case "$CURRENT_VERSION" in
*-*) IS_PRERELEASE=true ;;
esac
MAJOR="${VERSION_PARTS[0]}"
MINOR="${VERSION_PARTS[1]}"
PATCH="${VERSION_PARTS[2]}"
# If requesting a pre-release and current is already a pre-release, keep base version
# Otherwise, bump the version based on type
if [ -n "${{ github.event.inputs.pre_release }}" ] && [ "$IS_PRERELEASE" = "true" ]; then
# Keep existing base version for iterative betas (7.6.0-beta.1 -> 7.6.0-beta.2)
NEW_VERSION="$BASE_VERSION"
else
# Bump version based on type
case "${{ github.event.inputs.bump_type }}" in
major)
MAJOR=$((MAJOR + 1))
MINOR=0
PATCH=0
;;
minor)
MINOR=$((MINOR + 1))
PATCH=0
;;
patch)
PATCH=$((PATCH + 1))
;;
esac
NEW_VERSION="${MAJOR}.${MINOR}.${PATCH}"
fi
# Add pre-release label if specified
if [ -n "${{ github.event.inputs.pre_release }}" ]; then
# Get beta number by counting existing beta tags for this version
BETA_COUNT=$(git tag -l "v${NEW_VERSION}-${{ github.event.inputs.pre_release }}.*" | wc -l)
BETA_NUM=$((BETA_COUNT + 1))
NEW_VERSION="${NEW_VERSION}-${{ github.event.inputs.pre_release }}.${BETA_NUM}"
fi
echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT
echo "New version will be: $NEW_VERSION"
- name: Update package.json
run: |
bun x json -I -f package.json -e "this.version='${{ steps.version.outputs.new_version }}'"
- name: Update Chrome manifest
run: |
VERSION_WITHOUT_PRERELEASE=$(echo "${{ steps.version.outputs.new_version }}" | sed 's/-.*$//')
bun x json -I -f manifest/chrome.json -e "this.version='${VERSION_WITHOUT_PRERELEASE}'"
- name: Update Firefox manifest
run: |
VERSION_WITHOUT_PRERELEASE=$(echo "${{ steps.version.outputs.new_version }}" | sed 's/-.*$//')
bun x json -I -f manifest/firefox.json -e "this.version='${VERSION_WITHOUT_PRERELEASE}'"
- name: Update Safari manifest
run: |
VERSION_WITHOUT_PRERELEASE=$(echo "${{ steps.version.outputs.new_version }}" | sed 's/-.*$//')
bun x json -I -f safari/Mue\ Extension/Resources/manifest.json -e "this.version='${VERSION_WITHOUT_PRERELEASE}'"
- name: Update Safari Xcode project
run: |
VERSION_WITHOUT_PRERELEASE=$(echo "${{ steps.version.outputs.new_version }}" | sed 's/-.*$//')
sed -i "s/MARKETING_VERSION = [^;]*/MARKETING_VERSION = ${VERSION_WITHOUT_PRERELEASE}/g" safari/Mue.xcodeproj/project.pbxproj
- name: Update constants.js
run: |
sed -i "s/export const VERSION = '[^']*'/export const VERSION = '${{ steps.version.outputs.new_version }}'/" src/config/constants.js
- name: Commit version bump
run: |
git add package.json manifest/chrome.json manifest/firefox.json safari/Mue\ Extension/Resources/manifest.json safari/Mue.xcodeproj/project.pbxproj src/config/constants.js
git commit -m "chore: bump version to ${{ steps.version.outputs.new_version }}"
git tag -a "v${{ steps.version.outputs.new_version }}" -m "Release v${{ steps.version.outputs.new_version }}"
- name: Push changes
run: |
git push origin ${{ github.ref_name }}
git push origin "v${{ steps.version.outputs.new_version }}"
- name: Summary
run: |
echo "✅ Version bumped to ${{ steps.version.outputs.new_version }}" >> $GITHUB_STEP_SUMMARY
echo "📦 Tag created: v${{ steps.version.outputs.new_version }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Files updated:" >> $GITHUB_STEP_SUMMARY
echo "- package.json" >> $GITHUB_STEP_SUMMARY
echo "- manifest/chrome.json" >> $GITHUB_STEP_SUMMARY
echo "- manifest/firefox.json" >> $GITHUB_STEP_SUMMARY
echo "- safari/Mue Extension/Resources/manifest.json" >> $GITHUB_STEP_SUMMARY
echo "- safari/Mue.xcodeproj/project.pbxproj" >> $GITHUB_STEP_SUMMARY
echo "- src/config/constants.js" >> $GITHUB_STEP_SUMMARY

22
.gitignore vendored
View File

@@ -6,6 +6,28 @@ build/
.idea/
dist/
# Safari Extension Build Files
safari/Mue Extension/Resources/*.html
safari/Mue Extension/Resources/*.js
safari/Mue Extension/Resources/*.css
safari/Mue Extension/Resources/assets/
safari/Mue Extension/Resources/icons/
safari/Mue Extension/Resources/src/
safari/Mue Extension/Resources/_locales/
!safari/Mue Extension/Resources/manifest.json
# Xcode User Data
safari/Mue.xcodeproj/xcuserdata/
safari/Mue.xcodeproj/project.xcworkspace/xcuserdata/
*.xcuserstate
*.xcbkptlist
*.mode1v3
*.mode2v3
*.perspectivev3
*.pbxuser
safari/DerivedData/
safari/build/
# Files
package-lock.json
.stylelintcache

View File

@@ -1,4 +1 @@
#!/bin/sh
. "${dirname "$0"}/_/husky/husky.sh"
npx commitlint --edit $1
bunx --bun commitlint --edit $1

1
.husky/pre-commit Normal file
View File

@@ -0,0 +1 @@
# bun run lint

1
.nvmrc Normal file
View File

@@ -0,0 +1 @@
20.19.0

310
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,310 @@
# Contributing to Mue
Thanks for your interest in contributing to Mue! We welcome contributions from the community.
## 📋 Table of Contents
- [Code of Conduct](#code-of-conduct)
- [Getting Started](#getting-started)
- [Development Workflow](#development-workflow)
- [Branch Strategy](#branch-strategy)
- [Making Changes](#making-changes)
- [Commit Messages](#commit-messages)
- [Pull Request Process](#pull-request-process)
- [Release Process](#release-process)
## Code of Conduct
Please be respectful and constructive in your interactions with the community.
## Getting Started
### Prerequisites
- [Bun](https://bun.sh/) >= 1.3.0
- Node.js >= 20.0.0 (for some tooling)
- Git
### Setup
1. Fork the repository
2. Clone your fork:
```bash
git clone https://github.com/YOUR_USERNAME/mue.git
cd mue
```
3. Install dependencies:
```bash
bun install
```
4. Start development server:
```bash
bun run dev
```
## Development Workflow
### Scripts
- `bun run dev` - Start development server with hot reload
- `bun run dev:host` - Start development server accessible on network
- `bun run build` - Build production extension for all browsers
- `bun run lint` - Run ESLint and Stylelint
- `bun run lint:fix` - Auto-fix linting issues
- `bun run pretty` - Format code with Prettier
### Testing Your Changes
1. Load the extension in your browser:
- **Chrome/Edge**: Go to `chrome://extensions`, enable Developer mode, click "Load unpacked", select `dist` folder
- **Firefox**: Go to `about:debugging#/runtime/this-firefox`, click "Load Temporary Add-on", select any file in `dist` folder
2. Test your changes thoroughly across different browsers
## Branch Strategy
Mue uses a three-branch workflow:
```
dev (active development)
beta (release candidates)
main (production/stable)
```
### Branches
- **`dev`** - Active development branch
- All feature and bug fix PRs merge here first
- Maintainers can push directly for small fixes
- Contributors must create PRs
- CI must pass before merge
- **`beta`** - Release candidate testing
- PRs from `dev` → `beta` for release candidates
- Triggers beta release workflow
- Requires 2 maintainer approvals
- Used for testing with beta testers before production
- **`main`** - Production/stable releases
- PRs from `beta` → `main` only
- Triggers production release workflow
- Requires 2 maintainer approvals + manual environment approval
- Represents current live extension version
### Special Branches
- **`hotfix/*`** - Emergency production fixes
- Branch from `main` for critical bugs
- Triggers hotfix workflow (auto-merges to all branches)
- Maintainers only
## Making Changes
### For Contributors
1. Create a feature branch from `dev`:
```bash
git checkout dev
git pull origin dev
git checkout -b feature/your-feature-name
```
2. Make your changes following our code style
3. Test your changes locally
4. Commit your changes (see [Commit Messages](#commit-messages))
5. Push to your fork:
```bash
git push origin feature/your-feature-name
```
6. Create a Pull Request targeting the `dev` branch
### For Maintainers
Maintainers can push directly to `dev` for small fixes, or follow the contributor process for larger changes.
## Commit Messages
We use [Conventional Commits](https://www.conventionalcommits.org/) for automated changelog generation.
### Format
```
<type>(<scope>): <description>
[optional body]
[optional footer]
```
### Types
- `feat:` - New feature
- `fix:` - Bug fix
- `perf:` - Performance improvement
- `docs:` - Documentation changes
- `style:` - Code style changes (formatting, etc.)
- `refactor:` - Code refactoring
- `test:` - Adding or updating tests
- `chore:` - Maintenance tasks, dependency updates
### Examples
```bash
feat(weather): add hourly forecast widget
fix(greeting): resolve time zone display issue
perf(background): optimize image loading
docs(readme): update installation instructions
chore: bump version to 7.6.0
```
### Breaking Changes
For breaking changes, add `BREAKING CHANGE:` in the commit body:
```bash
feat(api): change settings storage format
BREAKING CHANGE: Settings format has changed. Users will need to reconfigure their settings.
```
## Pull Request Process
1. **Fill out the PR template** completely
2. **Ensure all checks pass**:
- ✅ Build succeeds
- ✅ Linting passes
- ✅ No merge conflicts
3. **Get reviews**:
- Contributors: 1 maintainer approval required
- Beta → Main: 2 maintainer approvals required
4. **Address review feedback**
5. **Squash commits** if requested (maintainers can squash on merge)
6. **Wait for merge** - maintainers will merge when ready
### PR Guidelines
- Keep PRs focused on a single feature/fix
- Include screenshots/videos for UI changes
- Update documentation if needed
- Link related issues
- Test on multiple browsers
## Release Process
### Version Numbering
We follow [Semantic Versioning](https://semver.org/):
- **Major** (8.0.0): Breaking changes, major feature overhauls
- **Minor** (7.6.0): New features, backward-compatible
- **Patch** (7.5.1): Bug fixes, small improvements
### Release Workflow (Maintainers Only)
#### 1. Development Phase
Contributors and maintainers work on `dev` branch.
#### 2. Create Beta Release
When ready for testing:
1. Run version bump workflow:
```
Actions → Version Bump → Run workflow
- Branch: dev
- Bump type: minor/major/patch
- Pre-release: beta
```
2. Create PR from `dev` → `beta`
3. Merge PR (triggers beta release workflow)
4. Share beta release with testers
5. Gather feedback and fix issues on `dev`
6. Repeat until stable
#### 3. Promote to Production
When beta is stable:
1. Create PR from `beta` → `main` with checklist:
- [ ] Beta tested for X days
- [ ] All critical bugs resolved
- [ ] Y+ testers approved
- [ ] Release notes prepared
2. Get 2 maintainer approvals
3. Merge PR (triggers production release workflow)
4. Workflow pauses for manual approval (10 min wait)
5. Approve in GitHub Actions → Environments → production
6. Release is created on GitHub
7. Manually trigger store submission:
```
Actions → Submit → Run workflow
- Enter version tag (e.g., v7.6.0)
```
#### 4. Emergency Hotfix
For critical production bugs:
1. Create hotfix branch from `main`:
```bash
git checkout main
git pull origin main
git checkout -b hotfix/critical-bug-fix
```
2. Fix the issue and commit
3. Push branch:
```bash
git push origin hotfix/critical-bug-fix
```
4. Run hotfix workflow:
```
Actions → Hotfix Release → Run workflow
- Description: Brief description
- Branch name: hotfix/critical-bug-fix
```
5. Workflow will:
- Auto-bump patch version
- Merge to `main`
- Create release
- Back-merge to `beta` and `dev`
6. Immediately submit to stores
## Questions?
- 💬 Join our [Discord](https://discord.gg/zv8C9F8) (if available)
- 📧 Email: [contact info]
- 🐛 Report bugs: [GitHub Issues](https://github.com/mue/mue/issues)
## License
By contributing, you agree that your contributions will be licensed under the BSD-3-Clause License.

11
Dockerfile Normal file
View File

@@ -0,0 +1,11 @@
FROM oven/bun:latest
WORKDIR /app
COPY . .
RUN bun install
EXPOSE 5173
CMD ["bun", "run", "dev:host"]

View File

@@ -1,7 +1,7 @@
BSD 3-Clause License
Copyright (c) 2023-2024 Kaiso One Ltd
Copyright (c) 2019-2024 The Mue Authors
Copyright (c) 2019-2026 The Mue Authors
Copyright (c) 2023-2025 Kaiso One Ltd
Copyright (c) 2018-2019 David Ralph
All rights reserved.

142
README.md
View File

@@ -1,121 +1,87 @@
<img src="assets/logo.png" align="left" width="180px" height="180px"/>
<img align="left" width="0" height="192px" hspace="10"/>
![Mue Header](assets/mue_readme.png)
> <a href="https://muetab.com/">Mue</a>
<h1 align="center">Mue</h1>
[![License](https://img.shields.io/badge/license-BSD%203-blue?style=flat-square)](/LICENSE) [![Discord](https://img.shields.io/discord/659129207208804381?label=discord&color=7289DA&style=flat-square)](https://discord.gg/zv8C9F8) [![Code Size](https://img.shields.io/github/languages/code-size/mue/mue?color=green&label=size&style=flat-square)]()
<br>
[![Microsoft Edge](https://img.shields.io/badge/dynamic/json?style=flat-square&label=microsoft%20edge&query=%24.version&url=https%3A%2F%2Fmicrosoftedge.microsoft.com%2Faddons%2Fgetproductdetailsbycrxid%2Faepnglgjfokepefimhbnibfjekidhmja)](https://microsoftedge.microsoft.com/addons/detail/aepnglgjfokepefimhbnibfjekidhmja) [![Firefox](https://img.shields.io/amo/v/mue?label=firefox&style=flat-square)](https://addons.mozilla.org/firefox/addon/mue) [![Chrome](https://img.shields.io/chrome-web-store/v/bngmbednanpcfochchhgbkookpiaiaid?label=chrome&style=flat-square)](https://chrome.google.com/webstore/detail/mue/bngmbednanpcfochchhgbkookpiaiaid)
<p align="center">A fast, open and free-to-use browser extension that gives a new, fresh and customisable tab page to modern browsers.</p>
Mue is a fast, open and free-to-use browser extension that gives a new, fresh and customisable tab page to modern browsers.
<p align="center"><a href="https://muetab.com">muetab.com</a></p>
<br>
<div align="center">
## Table of contents
[![Chrome](./assets/chrome.svg)](https://chromewebstore.google.com/detail/mue/bngmbednanpcfochchhgbkookpiaiaid)
[![Edge](./assets/edge.svg)](https://microsoftedge.microsoft.com/addons/detail/mue/aepnglgjfokepefimhbnibfjekidhmja)
[![Firefox](./assets/firefox.svg)](https://addons.mozilla.org/en-GB/firefox/addon/mue/)
- [Table of contents](#table-of-contents)
- [Screenshots](#screenshots)
- [Features](#features)
- [Planned Features](#planned-features)
- [Installation](#installation)
- [Chrome](#chrome)
- [Firefox](#firefox)
- [Edge (Chromium)](#edge-chromium)
- [Whale](#whale)
- [Other](#other)
- [Development](#development)
- [Translations](#translations)
- [Credits](#credits)
- [Developers](#developers)
- [Translators](#translators)
- [Contributors](#contributors)
- [Resources](#resources)
</div>
## Screenshots
## 🤔 Why Mue?
![Screenshot](assets/screenshot.webp)
![Settings Modal](assets/screenshot2.webp)
- Beautiful and Minimalist Design
- Customisable Layout
- Widgets (such as weather, notes, bookmarks and more)
- Privacy-Focused - does not track your browsing activity
- Extensible with the Mue Marketplace
- Open Source under the BSD-3 License
## Features
## 🌶️ Installation
- Fast and free
- Supports multiple browsers
- Actively developed and open source
- Automatically updating [API](https://github.com/mue/api) with new photos, quotes and offline mode
- Widgets such as search bar, weather, quick links, clock, date, quote, greeting
- Settings - enable/disable various features and customise parts of Mue
- Navbar with copy button, favourite background, notes feature etc
- [Marketplace](https://github.com/mue/marketplace) - download custom photo packs, quote packs and preset settings made by the community
Mue can be downloaded on the following browsers:
### Planned Features
- [Chrome](https://chromewebstore.google.com/detail/mue/bngmbednanpcfochchhgbkookpiaiaid)
- [Edge](https://microsoftedge.microsoft.com/addons/detail/mue/aepnglgjfokepefimhbnibfjekidhmja)
- [Firefox](https://addons.mozilla.org/en-GB/firefox/addon/mue/)
- [Whale](https://store.whale.naver.com/detail/ecllekeilcmicbfkkiknfdddbogibbnc)
Please see our [roadmap](https://trello.com/b/w7zhS7Hi/mue-50). We are currently working on a rewrite over on the "phoenix" branch.
and can be manually sideloaded on others using the files on [GitHub Releases](https://github.com/mue/mue/releases)
## Installation
## 🚀 Demo
_A demo of the tab can be found [here](https://demo.muetab.com), and the latest GitHub commit build [here](https://mue.vercel.app)_
A fully-featured demo of the tab extension is available in-browser at [demo.muetab.com](https://demo.muetab.com)
### Chrome
## 💻 Development
[![Chrome Web Store Logo](assets/chrome.png)](https://chrome.google.com/webstore/detail/mue/bngmbednanpcfochchhgbkookpiaiaid)
<br>
[Chrome Web Store](https://chrome.google.com/webstore/detail/mue/bngmbednanpcfochchhgbkookpiaiaid)
Install dependencies with `bun install`, and then you can run any of the following scripts as needed:
### Firefox
- `bun run dev[:host]` - start development server
- `bun run build` - build production copy of Mue
- `bun run lint[:fix]` - run linter
- `bun run pretty` - run prettier
- `bun run translations` - migrate old translation format to new
- `bun run translations:percentages` - update translation completion percentages from Weblate
[![Firefox Add-ons Logo](assets/firefox.png)](https://addons.mozilla.org/firefox/addon/mue)
<br>
[Firefox Add-ons](https://addons.mozilla.org/firefox/addon/mue)
### Contributing
### Edge (Chromium)
We welcome contributions! Please read [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines on:
- Development workflow
- Branch strategy (dev → beta → main)
- Commit message format
- Pull request process
[Microsoft Edge Addons](https://microsoftedge.microsoft.com/addons/detail/aepnglgjfokepefimhbnibfjekidhmja)
For maintainers, see [docs/RELEASE_PROCESS.md](docs/RELEASE_PROCESS.md) for release procedures.
### Whale
## 🐳 Docker development
[Whale Store](https://store.whale.naver.com/detail/ecllekeilcmicbfkkiknfdddbogibbnc)
Hot reload is available while coding.
### Other
- `docker build -t mue-app .` - build the image
[GitHub Releases](https://github.com/mue/mue/releases)
- `docker volume create dev-bun-app` - create a volume for the app
## Development
- `docker run -p 5173:5173 mue-app` - run the container
Please see the [documentation](https://docs.muetab.com/development#mue-tab).
- `docker run -p 5173:5173 \
-v $(pwd):/app \
-v dev-bun-app:/app/node_modules \
mue-app
` - run the container
### Translations
Navigate to http://localhost:5173
[![Contribute on Weblate](https://hosted.weblate.org/widgets/mue/-/open-graph.png)](https://hosted.weblate.org/engage/mue/)
## 🌍 Translations
## Credits
We use [Weblate](https://weblate.org) for translations. To get started, please visit the [project](https://hosted.weblate.org/projects/mue/) and look for the latest version to start translating Mue into your langauge.
### Developers
[David Ralph](https://github.com/davidcralph) - Lead development, photographer <br/>
[Alex Sparkes](https://github.com/alexsparkes) - Name, lead design, photographer <br/>
[Isaac Saunders](https://github.com/eartharoid) - QA, development, photographer <br/>
[Wessel Tip](https://github.com/Wessel) - Development <br/>
### Translators
[Wessel Tip](https://github.com/Wessel), [Heimen Stoffels](https://github.com/Vistaus) - Dutch <br/>
[Alex Sparkes](https://github.com/alexsparkes), [Maxime](https://github.com/exiam) - French <br/>
[Anders](https://github.com/FuryingFox) - Norwegian <br/>
[Pronin Egor](https://github.com/MrZillaGold) - Russian <br/>
[Vicente](https://github.com/Vicente015) - Spanish <br/>
[Austin Huang](https://github.com/austinhuang0131) - Chinese (Simplified) <br/>
[FreeFun](https://github.com/xXFreeFunXx) - German <br/>
[Aksal](https://github.com/aksalsf) - Indonesian <br/>
[Kağan Can Şit](https://github.com/KaganCanSit) - Turkish <br/>
efeaydal - Turkish <br/>
### Contributors
Many thanks to the photographers [here](https://api.muetab.com/images/photographers) for letting us use their wonderful photographs.
And finally, a big thank you to all the other [contributors](https://github.com/mue/mue/graphs/contributors)!
### Resources
## Attribution
[Pexels](https://pexels.com), [Unsplash](https://unsplash.com) - Stock photos used for offline mode <br/>
[Undraw](https://undraw.co) - Welcome modal images

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

66
assets/chrome.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 27 KiB

71
assets/edge.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

46
assets/firefox.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 KiB

BIN
assets/mue_readme.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

2011
bun.lock Normal file

File diff suppressed because it is too large Load Diff

469
docs/RELEASE_PROCESS.md Normal file
View File

@@ -0,0 +1,469 @@
# Mue Release Process
This document outlines the complete release process for Mue maintainers.
## 📋 Table of Contents
- [Overview](#overview)
- [Version Numbering](#version-numbering)
- [Pre-Release Checklist](#pre-release-checklist)
- [Beta Release Process](#beta-release-process)
- [Production Release Process](#production-release-process)
- [Hotfix Release Process](#hotfix-release-process)
- [Post-Release Tasks](#post-release-tasks)
- [Store Submission](#store-submission)
- [Troubleshooting](#troubleshooting)
## Overview
Mue uses a three-branch release workflow:
```
dev → beta → main
```
- **`dev`**: Active development and feature integration
- **`beta`**: Release candidates for community testing
- **`main`**: Production-ready stable releases
## Version Numbering
We follow [Semantic Versioning](https://semver.org/): `MAJOR.MINOR.PATCH`
### When to Bump
| Type | When | Example |
|------|------|---------|
| **Major** (x.0.0) | Breaking changes, API changes, major UI overhaul | 7.5.0 → 8.0.0 |
| **Minor** (0.x.0) | New features, backward-compatible changes | 7.5.0 → 7.6.0 |
| **Patch** (0.0.x) | Bug fixes, small improvements | 7.5.0 → 7.5.1 |
### Beta Versions
Beta versions follow the format: `MAJOR.MINOR.PATCH-beta.X`
Example: `7.6.0-beta.1`, `7.6.0-beta.2`
## Pre-Release Checklist
Before starting any release:
- [ ] All intended features/fixes are merged to `dev`
- [ ] No critical bugs in issue tracker
- [ ] `dev` branch builds successfully
- [ ] All CI checks passing
- [ ] Translation updates synced from Weblate (if applicable)
- [ ] Breaking changes documented
## Beta Release Process
### Step 1: Version Bump
1. Go to **Actions****Version Bump****Run workflow**
2. Configure:
- **Branch**: `dev`
- **Bump type**: Choose `patch`, `minor`, or `major`
- **Pre-release**: Select `beta`
3. Click **Run workflow**
4. Workflow will:
- Calculate new version (e.g., `7.6.0-beta.1`)
- Update all 6 version files
- Create git tag
- Push to `dev`
### Step 2: Create Beta PR
1. Go to **Pull Requests****New pull request**
2. Configure:
- Base: `beta`
- Compare: `dev`
3. Fill in PR template:
- Add changelog preview
- List major changes
- Add testing notes
4. Get 2 maintainer approvals
### Step 3: Merge and Release
1. **Merge PR** to `beta` branch
2. **Beta Release Workflow** auto-triggers:
- Builds extension for all browsers
- Creates GitHub pre-release
- Uploads Chrome/Firefox ZIPs
- Generates changelog
3. **Verify release**:
- Check [Releases page](https://github.com/mue/mue/releases)
- Download and test ZIPs
- Verify version numbers
### Step 4: Beta Testing
1. **Share with testers**:
- Post release link in Discord/testing channel
- Include installation instructions
- Provide feedback form/issue template
2. **Monitor feedback**:
- Track issues tagged with beta version
- Prioritize critical bugs
- Document all feedback
3. **Fix issues**:
- Fix bugs on `dev` branch
- Create new beta (repeat from Step 1)
- Increment beta number (7.6.0-beta.2, etc.)
4. **Minimum beta period**: 3-7 days (depending on changes)
5. **Stability criteria**:
- No P0/P1 bugs reported
- Positive feedback from 5+ testers
- All critical features tested
## Production Release Process
### Step 1: Pre-Production Checks
- [ ] Beta has been stable for minimum period
- [ ] All critical beta bugs resolved
- [ ] Release notes prepared
- [ ] Store credentials verified
- [ ] Team notified of pending release
### Step 2: Version Bump to Stable
1. Go to **Actions****Version Bump****Run workflow**
2. Configure:
- **Branch**: `beta`
- **Bump type**: Usually same as beta (minor/major/patch)
- **Pre-release**: Leave empty (stable release)
3. This updates `7.6.0-beta.X``7.6.0`
### Step 3: Create Production PR
1. Go to **Pull Requests****New pull request**
2. Configure:
- Base: `main`
- Compare: `beta`
3. Fill in **release PR checklist**:
- [ ] Beta tested for X days
- [ ] All critical bugs resolved
- [ ] 5+ beta testers approved
- [ ] Release notes prepared
- [ ] Store submission ready
- [ ] Changelog updated on website
4. Get 2 maintainer approvals
### Step 4: Merge and Release
1. **Merge PR** to `main`
2. **Production Release Workflow** starts:
- Builds extension
- Creates production tag
- Generates full changelog
- Creates GitHub release
- **Pauses for manual approval**
3. **Review in GitHub**:
- Go to **Actions****Production Release** → running workflow
- Review release notes
- Check build artifacts
- **Approve deployment** in Environments → production
4. **Review period** - Workflow waits for your approval (10 min deployment protection)
5. **Release completes**:
- GitHub release published
- ZIPs uploaded
- Tag created
### Step 5: Store Submission
**Manual submission required** (for now):
1. Go to **Actions****Submit****Run workflow**
2. Enter version tag: `v7.6.0` (include the 'v' prefix to match the release tag)
3. Click **Run workflow**
4. Monitor submission workflow:
- Chrome Web Store submission
- Firefox Add-ons submission
- Edge Add-ons submission
5. **Verify store listings**:
- Chrome: https://chromewebstore.google.com/detail/mue/bngmbednanpcfochchhgbkookpiaiaid
- Edge: https://microsoftedge.microsoft.com/addons/detail/mue/aepnglgjfokepefimhbnibfjekidhmja
- Firefox: https://addons.mozilla.org/en-GB/firefox/addon/mue/
6. **Store review times**:
- Chrome: 1-3 days
- Edge: 1-2 days
- Firefox: hours to days
### Step 6: Sync Branches
After production release, sync version to other branches:
```bash
# Update dev and beta with main
git checkout dev
git pull origin dev
git merge main
git push origin dev
git checkout beta
git pull origin beta
git merge main
git push origin beta
```
## Hotfix Release Process
### When to Use Hotfix
**Only for critical production bugs:**
- Security vulnerabilities
- Data loss bugs
- Extension completely broken
- Critical functionality broken for all users
### Process
1. **Create hotfix branch** from `main`:
```bash
git checkout main
git pull origin main
git checkout -b hotfix/brief-description
```
2. **Fix the bug**:
- Make minimal changes (hotfix only)
- Test thoroughly
- Commit with conventional format
3. **Push branch**:
```bash
git push origin hotfix/brief-description
```
4. **Run hotfix workflow**:
- Go to **Actions** → **Hotfix Release** → **Run workflow**
- **Description**: Brief bug description
- **Branch name**: `hotfix/brief-description`
- Click **Run workflow**
5. **Approve deployment**:
- Workflow pauses for approval
- Review changes carefully
- Approve in **Environments** → **production**
6. **Workflow automatically**:
- Bumps patch version (7.6.0 → 7.6.1)
- Merges to `main`
- Creates release tag
- Builds and releases
- Back-merges to `beta` and `dev`
7. **Submit to stores immediately**:
- Go to **Actions** → **Submit** → **Run workflow**
- Enter new version (e.g., `7.6.1`)
8. **Notify users**:
- Post urgent update notice
- Update website changelog
- Notify via social media if critical
9. **Clean up**:
```bash
git push origin --delete hotfix/brief-description
```
## Post-Release Tasks
After any production release:
### Immediate (within 24 hours)
- [ ] Verify store submissions completed
- [ ] Update https://muetab.com/blog/changelog
- [ ] Announce on Discord/social media
- [ ] Monitor issue tracker for new reports
- [ ] Verify demo site (demo.muetab.com) is updated
### Within 1 Week
- [ ] Review analytics for adoption rate
- [ ] Address any quick-fix bugs as patch release
- [ ] Update roadmap/milestones
- [ ] Thank beta testers and contributors
### Ongoing
- [ ] Monitor store reviews/ratings
- [ ] Respond to user feedback
- [ ] Plan next release cycle
## Store Submission
### Required Credentials
Stored in GitHub Secrets as `SUBMIT_KEYS`:
```json
{
"chrome": {
"extId": "bngmbednanpcfochchhgbkookpiaiaid",
"clientId": "...",
"clientSecret": "...",
"refreshToken": "..."
},
"firefox": {
"extId": "{ac143a20-4b61-4c81-abdd-4bff77032972}",
"jwtIssuer": "...",
"jwtSecret": "..."
},
"edge": {
"productId": "...",
"clientId": "...",
"clientSecret": "...",
"accessTokenUrl": "..."
}
}
```
### Beta Distribution
**Chrome/Edge Beta**:
- Use unlisted listing (share link with testers)
- Or use trusted testers group (max 1000)
**Firefox Beta**:
- Upload as unlisted to AMO
- Share download link from GitHub Releases
**Safari Beta**:
- Currently manual sideload from GitHub Releases
## Troubleshooting
### Build Fails
**Issue**: Build fails in workflow
**Solutions**:
1. Check CI logs for specific error
2. Run `bun run build` locally to reproduce
3. Ensure all dependencies installed
4. Check for linting errors: `bun run lint`
### Version Mismatch
**Issue**: Version numbers don't match across files
**Solutions**:
1. Re-run Version Bump workflow
2. Manually verify all 6 files:
- package.json
- manifest/chrome.json
- manifest/firefox.json
- safari/Mue Extension/Resources/manifest.json
- safari/Mue.xcodeproj/project.pbxproj
- src/config/constants.js
### Tag Already Exists
**Issue**: Git tag already exists for version
**Solutions**:
1. Delete existing tag:
```bash
git tag -d v7.6.0
git push origin :refs/tags/v7.6.0
```
2. Re-run workflow
### Store Submission Fails
**Issue**: PlasmoHQ BPP submission fails
**Solutions**:
1. Check workflow logs for specific error
2. Verify credentials in `SUBMIT_KEYS` secret
3. Check store developer console for issues
4. Try manual submission as fallback
### Merge Conflicts
**Issue**: Conflicts when merging beta → main
**Solutions**:
1. Update beta with main first:
```bash
git checkout beta
git merge main
git push origin beta
```
2. Create new PR from beta → main
## Emergency Rollback
If a production release has critical bugs:
### Option 1: Hotfix (Preferred)
Follow [Hotfix Process](#hotfix-release-process) to quickly patch and release.
### Option 2: Store Rollback
Each store allows rolling back to previous version:
**Chrome Web Store**:
1. Go to Developer Dashboard
2. Select Mue extension
3. Package → Select previous version
4. Publish
**Firefox Add-ons**:
1. Go to Developer Hub
2. Select Mue add-on
3. Manage Status & Versions
4. Enable previous version
**Edge Add-ons**:
1. Go to Partner Center
2. Select Mue extension
3. Packages → Restore previous
### Option 3: Revert and Re-release
```bash
git checkout main
git revert <commit-hash>
git push origin main
```
Then follow production release process.
## Questions?
Contact maintainers:
- @davidcralph
- @alexsparkes
Or open a discussion: https://github.com/mue/mue/discussions

84
eslint.config.js Normal file
View File

@@ -0,0 +1,84 @@
import js from '@eslint/js';
import react from 'eslint-plugin-react';
import reactHooks from 'eslint-plugin-react-hooks';
import jsxA11y from 'eslint-plugin-jsx-a11y';
import prettier from 'eslint-config-prettier';
export default [
// Ignore patterns
{
ignores: [
'**/node_modules/**',
'**/build/**',
'**/dist/**',
'**/coverage/**',
'**/*.scss',
'**/*.css',
'**/*.json',
],
},
// Base config for all JS/JSX files
{
files: ['**/*.{js,jsx,mjs}'],
languageOptions: {
ecmaVersion: 2024,
sourceType: 'module',
parserOptions: { ecmaFeatures: { jsx: true } },
globals: {
// Browser globals
window: 'readonly',
document: 'readonly',
navigator: 'readonly',
console: 'readonly',
localStorage: 'readonly',
fetch: 'readonly',
setTimeout: 'readonly',
setInterval: 'readonly',
clearInterval: 'readonly',
clearTimeout: 'readonly',
Image: 'readonly',
FileReader: 'readonly',
Blob: 'readonly',
URL: 'readonly',
TextEncoder: 'readonly',
TextDecoder: 'readonly',
DOMParser: 'readonly',
CustomEvent: 'readonly',
AbortController: 'readonly',
btoa: 'readonly',
atob: 'readonly',
// Node globals for scripts
process: 'readonly',
__dirname: 'readonly',
__filename: 'readonly',
module: 'readonly',
require: 'readonly',
},
},
plugins: { react, 'react-hooks': reactHooks, 'jsx-a11y': jsxA11y },
settings: { react: { version: 'detect' } },
rules: {
...js.configs.recommended.rules,
...react.configs.recommended.rules,
...react.configs['jsx-runtime'].rules,
...reactHooks.configs.recommended.rules,
// React specific rules
'react/prop-types': 'off', // Using PropTypes is optional
'react/react-in-jsx-scope': 'off', // Not needed with React 17+
'react/jsx-uses-react': 'off', // Not needed with React 17+
// General rules
'no-unused-vars': ['warn', { argsIgnorePattern: '^_' }],
'no-console': ['warn', { allow: ['warn', 'error'] }],
// Modern JS
'prefer-const': 'warn',
'no-var': 'error',
},
},
// Prettier config (must be last to override other formatting rules)
prettier,
];

View File

@@ -1,9 +1,26 @@
{
"compilerOptions": {
"module": "commonjs",
"target": "es6",
"baseUrl": "src"
"module": "esnext",
"target": "esnext",
"baseUrl": "src",
"jsx": "react-jsx",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"allowImportingTsExtensions": false,
"checkJs": false,
"paths": {
"@/*": ["./*"],
"i18n/*": ["./i18n/*"],
"components/*": ["./components/*"],
"assets/*": ["./assets/*"],
"config/*": ["./config/*"],
"features/*": ["./features/*"],
"lib/*": ["./lib/*"],
"scss/*": ["./scss/*"],
"translations/*": ["./i18n/locales/*"],
"utils/*": ["./utils/*"]
}
},
"include": ["src"],
"exclude": ["node_modules"]
"include": ["src/**/*"],
"exclude": ["node_modules", "dist", "build"]
}

View File

@@ -4,8 +4,9 @@
"default_locale": "en",
"name": "__MSG_name__",
"description": "__MSG_description__",
"version": "7.1.2",
"version": "7.5.0",
"homepage_url": "https://muetab.com",
"permissions": ["search"],
"action": {
"default_icon": "icons/128x128.png"
},

View File

@@ -2,7 +2,7 @@
"manifest_version": 3,
"name": "Mue",
"description": "Fast, open and free-to-use new tab page for modern browsers.",
"version": "7.1.2",
"version": "7.5.0",
"homepage_url": "https://muetab.com",
"action": {
"default_icon": "icons/128x128.png"
@@ -17,5 +17,10 @@
},
"chrome_settings_overrides": {
"homepage": "index.html"
},
"browser_specific_settings": {
"gecko": {
"id": "{ac143a20-4b61-4c81-abdd-4bff77032972}"
}
}
}

View File

@@ -9,56 +9,70 @@
"homepage": "https://muetab.com",
"bugs": "https://github.com/mue/mue/issues/new?assignees=&labels=bug&template=bug-report.md&title=%5BBUG%5D",
"license": "BSD-3-Clause",
"version": "7.1.2",
"version": "7.5.0",
"type": "module",
"packageManager": "bun@1.3.1",
"engines": {
"node": ">=20.0.0",
"bun": ">=1.3.0"
},
"dependencies": {
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@eartharoid/i18n": "1.2.1",
"@emotion/react": "^11.13.3",
"@emotion/styled": "^11.13.0",
"@floating-ui/react-dom": "2.1.1",
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.1",
"@floating-ui/react-dom": "2.1.6",
"@fontsource/lexend-deca": "5.0.14",
"@fontsource/montserrat": "5.0.19",
"@muetab/react-sortable-hoc": "^2.0.1",
"@mui/material": "6.0.2",
"@sentry/react": "^8.28.0",
"embla-carousel-autoplay": "8.2.1",
"embla-carousel-react": "8.2.1",
"@mui/material": "7.3.7",
"@sentry/react": "^10.36.0",
"embla-carousel-autoplay": "8.6.0",
"embla-carousel-react": "8.6.0",
"fast-blurhash": "^1.1.4",
"image-conversion": "^2.1.1",
"react": "^18.3.1",
"react-best-gradient-color-picker": "^3.0.10",
"react-clock": "5.0.0",
"react-dom": "^18.3.1",
"react-icons": "^5.3.0",
"react-modal": "3.16.1",
"react-toastify": "10.0.5",
"use-debounce": "^10.0.3"
"mue": "file:",
"react": "^19.2.3",
"react-best-gradient-color-picker": "^3.0.14",
"react-clock": "6.0.0",
"react-dom": "^19.2.3",
"react-icons": "^5.5.0",
"react-modal": "3.16.3",
"react-toastify": "11.0.5",
"use-debounce": "^10.1.0"
},
"devDependencies": {
"@commitlint/cli": "^19.4.1",
"@commitlint/config-conventional": "^19.4.1",
"@commitlint/cli": "^20.3.1",
"@commitlint/config-conventional": "^20.3.1",
"@eartharoid/deep-merge": "^0.0.2",
"@vitejs/plugin-react-swc": "^3.7.0",
"@eslint/js": "^9.39.2",
"@vitejs/plugin-react-swc": "^4.2.2",
"adm-zip": "0.5.16",
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
"eslint-config-react-app": "^7.0.1",
"husky": "^9.1.5",
"prettier": "^3.3.3",
"sass": "^1.78.0",
"stylelint": "^16.9.0",
"stylelint-config-standard-scss": "^13.1.0",
"stylelint-scss": "^6.5.1",
"vite": "5.4.3",
"eslint": "^9.39.2",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^7.0.1",
"husky": "^9.1.7",
"prettier": "^3.8.1",
"sass": "^1.97.3",
"stylelint": "^17.0.0",
"stylelint-config-standard-scss": "^17.0.0",
"stylelint-scss": "^7.0.0",
"vite": "^7.3.1",
"vite-plugin-progress": "^0.0.7"
},
"scripts": {
"dev": "vite",
"dev:host": "vite --host",
"translations": "cd scripts && node updatetranslations.js",
"translations": "cd scripts && node updatetranslations.cjs",
"translations:percentages": "node scripts/updateTranslationPercentages.cjs",
"build": "vite build",
"pretty": "prettier --write \"./**/*.{js,jsx,json,scss,css}\"",
"lint": "eslint \"./src/**/*.{js,jsx}\" && stylelint \"./src/**/*.{scss,css}\"",
"lint:fix": "eslint \"./src/**/*.{js,jsx}\" --fix && stylelint \"./src/**/*.{scss,css}\" --fix",
"postinstall": "husky"
"postinstall": "husky",
"prepare": "husky"
}
}

6548
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.Safari.web-extension</string>
<key>NSExtensionPrincipalClass</key>
<string>$(PRODUCT_MODULE_NAME).SafariWebExtensionHandler</string>
</dict>
</dict>
</plist>

View File

@@ -0,0 +1,23 @@
{
"manifest_version": 3,
"offline_enabled": true,
"default_locale": "en",
"name": "__MSG_name__",
"description": "__MSG_description__",
"version": "7.5.0",
"homepage_url": "https://muetab.com",
"permissions": ["search"],
"chrome_url_overrides": {
"newtab": "index.html"
},
"icons": {
"16": "icons/16x16.png",
"48": "icons/48x48.png",
"128": "icons/128x128.png"
},
"background": {
"scripts": ["background.js"],
"type": "module",
"persistent": false
}
}

View File

@@ -0,0 +1,42 @@
//
// SafariWebExtensionHandler.swift
// Mue Extension
//
// Created by David Ralph on 02/01/2026.
//
import SafariServices
import os.log
class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling {
func beginRequest(with context: NSExtensionContext) {
let request = context.inputItems.first as? NSExtensionItem
let profile: UUID?
if #available(iOS 17.0, macOS 14.0, *) {
profile = request?.userInfo?[SFExtensionProfileKey] as? UUID
} else {
profile = request?.userInfo?["profile"] as? UUID
}
let message: Any?
if #available(iOS 15.0, macOS 11.0, *) {
message = request?.userInfo?[SFExtensionMessageKey]
} else {
message = request?.userInfo?["message"]
}
os_log(.default, "Received message from browser.runtime.sendNativeMessage: %@ (profile: %@)", String(describing: message), profile?.uuidString ?? "none")
let response = NSExtensionItem()
if #available(iOS 15.0, macOS 11.0, *) {
response.userInfo = [ SFExtensionMessageKey: [ "echo": message ] ]
} else {
response.userInfo = [ "message": [ "echo": message ] ]
}
context.completeRequest(returningItems: [ response ], completionHandler: nil)
}
}

View File

@@ -0,0 +1,541 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 77;
objects = {
/* Begin PBXBuildFile section */
6373522A2F087B5E002EF039 /* Mue Extension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 637352292F087B5E002EF039 /* Mue Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
6373522B2F087B5E002EF039 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 637352072F087B5D002EF039 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 637352282F087B5E002EF039;
remoteInfo = "Mue Extension";
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
637352482F087B5E002EF039 /* Embed Foundation Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 13;
files = (
6373522A2F087B5E002EF039 /* Mue Extension.appex in Embed Foundation Extensions */,
);
name = "Embed Foundation Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
6373520F2F087B5D002EF039 /* Mue.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Mue.app; sourceTree = BUILT_PRODUCTS_DIR; };
637352292F087B5E002EF039 /* Mue Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Mue Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
637352422F087B5E002EF039 /* Exceptions for "Mue Extension" folder in "Mue Extension" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
Info.plist,
);
target = 637352282F087B5E002EF039 /* Mue Extension */;
};
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
/* Begin PBXFileSystemSynchronizedRootGroup section */
637352112F087B5D002EF039 /* Mue */ = {
isa = PBXFileSystemSynchronizedRootGroup;
path = Mue;
sourceTree = "<group>";
};
6373522D2F087B5E002EF039 /* Mue Extension */ = {
isa = PBXFileSystemSynchronizedRootGroup;
exceptions = (
637352422F087B5E002EF039 /* Exceptions for "Mue Extension" folder in "Mue Extension" target */,
);
explicitFolders = (
Resources/_locales,
Resources/assets,
Resources/icons,
Resources/src,
);
path = "Mue Extension";
sourceTree = "<group>";
};
/* End PBXFileSystemSynchronizedRootGroup section */
/* Begin PBXFrameworksBuildPhase section */
6373520C2F087B5D002EF039 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
637352262F087B5E002EF039 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
637352062F087B5D002EF039 = {
isa = PBXGroup;
children = (
637352112F087B5D002EF039 /* Mue */,
6373522D2F087B5E002EF039 /* Mue Extension */,
637352102F087B5D002EF039 /* Products */,
);
sourceTree = "<group>";
};
637352102F087B5D002EF039 /* Products */ = {
isa = PBXGroup;
children = (
6373520F2F087B5D002EF039 /* Mue.app */,
637352292F087B5E002EF039 /* Mue Extension.appex */,
);
name = Products;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
6373520E2F087B5D002EF039 /* Mue */ = {
isa = PBXNativeTarget;
buildConfigurationList = 637352492F087B5E002EF039 /* Build configuration list for PBXNativeTarget "Mue" */;
buildPhases = (
6373520B2F087B5D002EF039 /* Sources */,
6373520C2F087B5D002EF039 /* Frameworks */,
6373520D2F087B5D002EF039 /* Resources */,
637352482F087B5E002EF039 /* Embed Foundation Extensions */,
);
buildRules = (
);
dependencies = (
6373522C2F087B5E002EF039 /* PBXTargetDependency */,
);
fileSystemSynchronizedGroups = (
637352112F087B5D002EF039 /* Mue */,
);
name = Mue;
packageProductDependencies = (
);
productName = Mue;
productReference = 6373520F2F087B5D002EF039 /* Mue.app */;
productType = "com.apple.product-type.application";
};
637352282F087B5E002EF039 /* Mue Extension */ = {
isa = PBXNativeTarget;
buildConfigurationList = 637352432F087B5E002EF039 /* Build configuration list for PBXNativeTarget "Mue Extension" */;
buildPhases = (
637352252F087B5E002EF039 /* Sources */,
637352262F087B5E002EF039 /* Frameworks */,
637352272F087B5E002EF039 /* Resources */,
);
buildRules = (
);
dependencies = (
);
fileSystemSynchronizedGroups = (
6373522D2F087B5E002EF039 /* Mue Extension */,
);
name = "Mue Extension";
packageProductDependencies = (
);
productName = "Mue Extension";
productReference = 637352292F087B5E002EF039 /* Mue Extension.appex */;
productType = "com.apple.product-type.app-extension";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
637352072F087B5D002EF039 /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = 1;
LastSwiftUpdateCheck = 2620;
LastUpgradeCheck = 2620;
TargetAttributes = {
6373520E2F087B5D002EF039 = {
CreatedOnToolsVersion = 26.2;
};
637352282F087B5E002EF039 = {
CreatedOnToolsVersion = 26.2;
};
};
};
buildConfigurationList = 6373520A2F087B5D002EF039 /* Build configuration list for PBXProject "Mue" */;
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 637352062F087B5D002EF039;
minimizedProjectReferenceProxies = 1;
preferredProjectObjectVersion = 77;
productRefGroup = 637352102F087B5D002EF039 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
6373520E2F087B5D002EF039 /* Mue */,
637352282F087B5E002EF039 /* Mue Extension */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
6373520D2F087B5D002EF039 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
637352272F087B5E002EF039 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
6373520B2F087B5D002EF039 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
637352252F087B5E002EF039 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
6373522C2F087B5E002EF039 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 637352282F087B5E002EF039 /* Mue Extension */;
targetProxy = 6373522B2F087B5E002EF039 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
637352442F087B5E002EF039 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
ENABLE_APP_SANDBOX = YES;
ENABLE_HARDENED_RUNTIME = YES;
ENABLE_USER_SELECTED_FILES = readonly;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "Mue Extension/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "Mue Extension";
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright (c) 2019-2026 The Mue Authors";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@executable_path/../../../../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.14;
MARKETING_VERSION = 7.5.0;
OTHER_LDFLAGS = (
"-framework",
SafariServices,
);
PRODUCT_BUNDLE_IDENTIFIER = mueauthors.mue.extension;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
};
name = Debug;
};
637352452F087B5E002EF039 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
ENABLE_APP_SANDBOX = YES;
ENABLE_HARDENED_RUNTIME = YES;
ENABLE_USER_SELECTED_FILES = readonly;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "Mue Extension/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "Mue Extension";
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright (c) 2019-2026 The Mue Authors";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@executable_path/../../../../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.14;
MARKETING_VERSION = 7.5.0;
OTHER_LDFLAGS = (
"-framework",
SafariServices,
);
PRODUCT_BUNDLE_IDENTIFIER = mueauthors.mue.extension;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
};
name = Release;
};
637352462F087B5E002EF039 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MACOSX_DEPLOYMENT_TARGET = 26.2;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
637352472F087B5E002EF039 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MACOSX_DEPLOYMENT_TARGET = 26.2;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = macosx;
SWIFT_COMPILATION_MODE = wholemodule;
};
name = Release;
};
6373524A2F087B5E002EF039 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1;
ENABLE_APP_SANDBOX = YES;
ENABLE_HARDENED_RUNTIME = YES;
ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES;
ENABLE_USER_SELECTED_FILES = readonly;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleDisplayName = Mue;
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright (c) 2019-2026 The Mue Authors";
INFOPLIST_KEY_NSMainStoryboardFile = Main;
INFOPLIST_KEY_NSPrincipalClass = NSApplication;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
);
MARKETING_VERSION = 7.5.0;
OTHER_LDFLAGS = (
"-framework",
SafariServices,
"-framework",
WebKit,
);
PRODUCT_BUNDLE_IDENTIFIER = mueauthors.mue;
PRODUCT_NAME = "$(TARGET_NAME)";
REGISTER_APP_GROUPS = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
};
name = Debug;
};
6373524B2F087B5E002EF039 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1;
ENABLE_APP_SANDBOX = YES;
ENABLE_HARDENED_RUNTIME = YES;
ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES;
ENABLE_USER_SELECTED_FILES = readonly;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleDisplayName = Mue;
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright (c) 2019-2026 The Mue Authors";
INFOPLIST_KEY_NSMainStoryboardFile = Main;
INFOPLIST_KEY_NSPrincipalClass = NSApplication;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
);
MARKETING_VERSION = 7.5.0;
OTHER_LDFLAGS = (
"-framework",
SafariServices,
"-framework",
WebKit,
);
PRODUCT_BUNDLE_IDENTIFIER = mueauthors.mue;
PRODUCT_NAME = "$(TARGET_NAME)";
REGISTER_APP_GROUPS = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
6373520A2F087B5D002EF039 /* Build configuration list for PBXProject "Mue" */ = {
isa = XCConfigurationList;
buildConfigurations = (
637352462F087B5E002EF039 /* Debug */,
637352472F087B5E002EF039 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
637352432F087B5E002EF039 /* Build configuration list for PBXNativeTarget "Mue Extension" */ = {
isa = XCConfigurationList;
buildConfigurations = (
637352442F087B5E002EF039 /* Debug */,
637352452F087B5E002EF039 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
637352492F087B5E002EF039 /* Build configuration list for PBXNativeTarget "Mue" */ = {
isa = XCConfigurationList;
buildConfigurations = (
6373524A2F087B5E002EF039 /* Debug */,
6373524B2F087B5E002EF039 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 637352072F087B5D002EF039 /* Project object */;
}

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

View File

@@ -0,0 +1,21 @@
//
// AppDelegate.swift
// Mue
//
// Created by David Ralph on 02/01/2026.
//
import Cocoa
@main
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ notification: Notification) {
// Override point for customization after application launch.
}
func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
return true
}
}

View File

@@ -0,0 +1,11 @@
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,68 @@
{
"images" : [
{
"filename" : "icon_16x16.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "16x16"
},
{
"filename" : "icon_16x16@2x.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "16x16"
},
{
"filename" : "icon_32x32.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "32x32"
},
{
"filename" : "icon_32x32@2x.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "32x32"
},
{
"filename" : "icon_128x128.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "128x128"
},
{
"filename" : "icon_128x128@2x.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "128x128"
},
{
"filename" : "icon_256x256.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "256x256"
},
{
"filename" : "icon_256x256@2x.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "256x256"
},
{
"filename" : "icon_512x512.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "512x512"
},
{
"filename" : "icon_512x512@2x.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "512x512"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 804 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 KiB

View File

@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,20 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="24506" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="B8D-0N-5wS">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="24506"/>
<plugIn identifier="com.apple.WebKit2IBPlugin" version="24506"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Application-->
<scene sceneID="JPo-4y-FX3">
<objects>
<application id="hnw-xV-0zn" sceneMemberID="viewController">
<menu key="mainMenu" title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
<items>
<menuItem title="Mue" id="1Xt-HY-uBw">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Mue" systemMenu="apple" id="uQy-DD-JDr">
<items>
<menuItem title="About Mue" id="5kV-Vb-QxS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="Ady-hI-5gd" id="Exp-CZ-Vem"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
<menuItem title="Hide Mue" keyEquivalent="h" id="Olw-nP-bQN">
<connections>
<action selector="hide:" target="Ady-hI-5gd" id="PnN-Uc-m68"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="Ady-hI-5gd" id="VT4-aY-XCT"/>
</connections>
</menuItem>
<menuItem title="Show All" id="Kd2-mp-pUS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unhideAllApplications:" target="Ady-hI-5gd" id="Dhg-Le-xox"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
<menuItem title="Quit Mue" keyEquivalent="q" id="4sb-4s-VLi">
<connections>
<action selector="terminate:" target="Ady-hI-5gd" id="Te7-pn-YzF"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Help" id="wpr-3q-Mcd">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ">
<items>
<menuItem title="Mue Help" keyEquivalent="?" id="FKE-Sm-Kum">
<connections>
<action selector="showHelp:" target="Ady-hI-5gd" id="y7X-2Q-9no"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
<connections>
<outlet property="delegate" destination="Voe-Tx-rLC" id="PrD-fu-P6m"/>
</connections>
</application>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="Mue" customModuleProvider="target"/>
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
<customObject id="Ady-hI-5gd" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="76" y="-134"/>
</scene>
<!--Window Controller-->
<scene sceneID="R2V-B0-nI4">
<objects>
<windowController showSeguePresentationStyle="single" id="B8D-0N-5wS" sceneMemberID="viewController">
<window key="window" title="Mue" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" restorable="NO" releasedWhenClosed="NO" animationBehavior="default" id="IQv-IB-iLA">
<windowStyleMask key="styleMask" titled="YES" closable="YES"/>
<windowCollectionBehavior key="collectionBehavior" fullScreenNone="YES"/>
<rect key="contentRect" x="196" y="240" width="600" height="500"/>
<rect key="screenRect" x="0.0" y="0.0" width="1680" height="1027"/>
<connections>
<outlet property="delegate" destination="B8D-0N-5wS" id="98r-iN-zZc"/>
</connections>
</window>
<connections>
<segue destination="XfG-lQ-9wD" kind="relationship" relationship="window.shadowedContentViewController" id="cq2-FE-JQM"/>
</connections>
</windowController>
<customObject id="Oky-zY-oP4" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="75" y="250"/>
</scene>
<!--View Controller-->
<scene sceneID="hIz-AP-VOD">
<objects>
<viewController id="XfG-lQ-9wD" customClass="ViewController" customModule="Mue" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" id="m2S-Jp-Qdl">
<rect key="frame" x="0.0" y="0.0" width="600" height="500"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<wkWebView wantsLayer="YES" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="eOr-cG-IQY">
<rect key="frame" x="0.0" y="0.0" width="600" height="500"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<wkWebViewConfiguration key="configuration">
<audiovisualMediaTypes key="mediaTypesRequiringUserActionForPlayback" none="YES"/>
<wkPreferences key="preferences"/>
</wkWebViewConfiguration>
</wkWebView>
</subviews>
</view>
<connections>
<outlet property="webView" destination="eOr-cG-IQY" id="GFe-mU-dBY"/>
</connections>
</viewController>
<customObject id="rPt-NT-nkU" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="75" y="655"/>
</scene>
</scenes>
</document>

View File

@@ -0,0 +1,31 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'self' https://fonts.googleapis.com https://fonts.gstatic.com; style-src 'self' https://fonts.googleapis.com; font-src https://fonts.gstatic.com">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Lexend+Deca:wght@400;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="../Style.css">
<script src="../Script.js" defer></script>
</head>
<body>
<div class="gradient-bg"></div>
<div class="content">
<img src="../Icon.png" width="128" height="128" alt="Mue Icon">
<h1 class="title">Mue</h1>
<p class="subtitle">Fast, open and free-to-use new tab page</p>
<div class="status-container">
<p class="state-unknown">Enable Mue in Safari Extensions preferences to get started.</p>
<p class="state-on">✓ Extension is enabled and ready to use!</p>
<p class="state-off">Extension is disabled. Enable it in Safari Extensions preferences.</p>
</div>
<button class="open-preferences">Open Safari Extensions Preferences</button>
</div>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -0,0 +1,22 @@
function show(enabled, useSettingsInsteadOfPreferences) {
if (useSettingsInsteadOfPreferences) {
document.getElementsByClassName('state-on')[0].innerText = "Extension is enabled and ready to use!";
document.getElementsByClassName('state-off')[0].innerText = "Extension is disabled. Enable it in Safari Settings.";
document.getElementsByClassName('state-unknown')[0].innerText = "Enable Mue in Safari Settings to get started.";
document.getElementsByClassName('open-preferences')[0].innerText = "Open Safari Settings";
}
if (typeof enabled === "boolean") {
document.body.classList.toggle(`state-on`, enabled);
document.body.classList.toggle(`state-off`, !enabled);
} else {
document.body.classList.remove(`state-on`);
document.body.classList.remove(`state-off`);
}
}
function openPreferences() {
webkit.messageHandlers.controller.postMessage("open-preferences");
}
document.querySelector("button.open-preferences").addEventListener("click", openPreferences);

View File

@@ -0,0 +1,124 @@
* {
-webkit-user-select: none;
-webkit-user-drag: none;
cursor: default;
margin: 0;
padding: 0;
box-sizing: border-box;
}
:root {
--spacing: 20px;
--text-color: #ffffff;
--shadow: 0 4px 20px rgb(0 0 0 / 30%);
--background-color: #0A0A0A;
}
html {
height: 100%;
}
body {
height: 100%;
margin: 0;
overflow: hidden;
font-family: 'Lexend Deca', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
}
.gradient-bg {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: var(--background-color);
z-index: -1;
}
.content {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
gap: calc(var(--spacing) * 0.5);
height: 100%;
text-align: center;
color: var(--text-color);
padding: var(--spacing);
}
img {
filter: drop-shadow(var(--shadow));
margin-bottom: 5px;
}
.title {
font-size: 3em;
font-weight: 700;
margin: 0;
text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
letter-spacing: -0.5px;
}
.subtitle {
font-size: 1.2em;
font-weight: 400;
margin: 0;
opacity: 0.95;
text-shadow: 0 1px 5px rgba(0, 0, 0, 0.2);
}
.status-container {
margin: 10px 0;
min-height: 50px;
display: flex;
align-items: center;
justify-content: center;
}
.status-container p {
font-size: 1.1em;
margin: 0;
padding: 12px 24px;
background: #fff;
color: #000;
border-radius: 12px;
box-shadow: var(--shadow);
}
body:not(.state-on, .state-off) :is(.state-on, .state-off) {
display: none;
}
body.state-on :is(.state-off, .state-unknown) {
display: none;
}
body.state-off :is(.state-on, .state-unknown) {
display: none;
}
button {
font-size: 1.1em;
font-weight: 600;
padding: 12px 28px;
background: #fff;
color: #000;
border: none;
border-radius: 12px;
cursor: pointer;
transition: all 0.3s ease;
box-shadow: var(--shadow);
margin-top: 5px;
}
button:hover {
background: #f0f0f0;
transform: translateY(-2px);
box-shadow: 0 6px 25px rgb(0 0 0 / 40%);
}
button:active {
transform: translateY(0);
box-shadow: var(--shadow);
}

View File

@@ -0,0 +1,57 @@
//
// ViewController.swift
// Mue
//
// Created by David Ralph on 02/01/2026.
//
import Cocoa
import SafariServices
import WebKit
let extensionBundleIdentifier = "mueauthors.mue.Extension"
class ViewController: NSViewController, WKNavigationDelegate, WKScriptMessageHandler {
@IBOutlet var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
self.webView.navigationDelegate = self
self.webView.configuration.userContentController.add(self, name: "controller")
self.webView.loadFileURL(Bundle.main.url(forResource: "Main", withExtension: "html")!, allowingReadAccessTo: Bundle.main.resourceURL!)
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
SFSafariExtensionManager.getStateOfSafariExtension(withIdentifier: extensionBundleIdentifier) { (state, error) in
guard let state = state, error == nil else {
// Insert code to inform the user that something went wrong.
return
}
DispatchQueue.main.async {
if #available(macOS 13, *) {
webView.evaluateJavaScript("show(\(state.isEnabled), true)")
} else {
webView.evaluateJavaScript("show(\(state.isEnabled), false)")
}
}
}
}
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if (message.body as! String != "open-preferences") {
return;
}
SFSafariApplication.showPreferencesForExtension(withIdentifier: extensionBundleIdentifier) { error in
DispatchQueue.main.async {
NSApplication.shared.terminate(nil)
}
}
}
}

View File

@@ -0,0 +1,91 @@
const fs = require('fs');
const path = require('path');
const https = require('https');
// Language code mappings between Weblate and Mue
const CODE_MAPPINGS = {
de: 'de_DE',
id: 'id_ID',
nb_NO: 'no',
tr: 'tr_TR',
zh_Hans: 'zh_CN',
pt: 'pt_PT',
};
const WEBLATE_API_URL = 'https://hosted.weblate.org/api/components/mue/mue-tab-7-1/statistics/';
function fetchWeblateStats() {
return new Promise((resolve, reject) => {
const options = {
headers: {
'User-Agent': 'Mue-Translation-Update-Script',
Accept: 'application/json',
},
};
https
.get(WEBLATE_API_URL, options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
try {
const json = JSON.parse(data);
resolve(json);
} catch (e) {
reject(e);
}
});
})
.on('error', (err) => {
reject(err);
});
});
}
function mapLanguageCode(weblateCode) {
return CODE_MAPPINGS[weblateCode] || weblateCode;
}
async function updateTranslationPercentages() {
try {
console.log('Fetching translation statistics from Weblate...');
const data = await fetchWeblateStats();
const percentages = {};
data.results.forEach((lang) => {
const code = mapLanguageCode(lang.code);
percentages[code] = {
percent: Math.round(lang.translated_percent * 10) / 10, // Round to 1 decimal place
lastChange: lang.last_change,
};
});
const outputPath = path.join(__dirname, '../src/i18n/translationPercentages.json');
fs.writeFileSync(outputPath, JSON.stringify(percentages, null, 2));
fs.appendFileSync(outputPath, '\n');
console.log(`✓ Translation percentages updated successfully!`);
console.log(` Total languages: ${Object.keys(percentages).length}`);
console.log(` Output: ${outputPath}`);
// Show some examples
const sortedByPercent = Object.entries(percentages)
.sort((a, b) => b[1].percent - a[1].percent)
.slice(0, 5);
console.log('\nTop 5 translated languages:');
sortedByPercent.forEach(([code, data]) => {
console.log(` ${code}: ${data.percent}%`);
});
} catch (error) {
console.error('Error updating translation percentages:', error);
process.exit(1);
}
}
updateTranslationPercentages();

View File

@@ -6,6 +6,7 @@ import Modals from 'features/misc/modals/Modals';
import { loadSettings, moveSettings } from 'utils/settings';
import EventBus from 'utils/eventbus';
import variables from 'config/variables';
import { TranslationProvider } from 'contexts/TranslationContext';
const useAppSetup = () => {
useEffect(() => {
@@ -54,8 +55,10 @@ const App = () => {
useAppSetup();
const languagecode = localStorage.getItem('language') || 'en_GB';
return (
<>
<TranslationProvider initialLanguage={languagecode}>
{showBackground && <Background />}
<ToastContainer
position="top-center"
@@ -68,7 +71,7 @@ const App = () => {
<Widgets />
<Modals />
</div>
</>
</TranslationProvider>
);
};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 308 KiB

After

Width:  |  Height:  |  Size: 274 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 274 KiB

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 171 KiB

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 161 KiB

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

View File

@@ -3,7 +3,7 @@ import Tooltip from 'components/Elements/Tooltip/Tooltip';
const Button = forwardRef(
(
{ icon, label, type, iconPlacement, onClick, active, disabled, tooltipTitle, tooltipKey, href },
{ icon, label, type, iconPlacement, onClick, active, disabled, tooltipTitle, tooltipKey, href, style },
ref,
) => {
let className;
@@ -43,14 +43,17 @@ const Button = forwardRef(
}
const button = (
<button className={className} onClick={onClick} ref={ref} disabled={disabled}>
<button className={className} onClick={onClick} ref={ref} disabled={disabled} style={style}>
{icon}
{label}
</button>
);
const linkButton = (
<a className={className} onClick={onClick} ref={ref} disabled={disabled} href={href}>
<a className={className} onClick={onClick} ref={ref} disabled={disabled} href={href} style={style}
target="_blank"
rel="noopener noreferrer"
>
{icon}
{label}
</a>
@@ -66,6 +69,7 @@ const Button = forwardRef(
href={href}
target="_blank"
rel="noopener noreferrer"
style={style}
>
{icon}
{label}
@@ -90,4 +94,6 @@ const Button = forwardRef(
},
);
Button.displayName = 'Button';
export { Button as default, Button };

View File

@@ -1,64 +1,264 @@
import { Suspense, lazy, useState, memo, useEffect } from 'react';
import variables from 'config/variables';
import { Suspense, lazy, useState, memo } from 'react';
import { MdClose } from 'react-icons/md';
import './scss/index.scss';
import { Tooltip } from 'components/Elements';
import ModalLoader from './components/ModalLoader';
import ModalTopBar from './components/ModalTopBar';
import { TAB_TYPES } from './constants/tabConfig';
import { updateHash, parseDeepLink } from 'utils/deepLinking';
const Settings = lazy(() => import('../../../features/misc/views/Settings'));
const Addons = lazy(() => import('../../../features/misc/views/Addons'));
const Marketplace = lazy(() => import('../../../features/misc/views/Marketplace'));
const Library = lazy(() => import('../../../features/misc/views/Library'));
const Discover = lazy(() => import('../../../features/misc/views/Discover'));
const renderLoader = () => (
<div style={{ display: 'flex', width: '100%', minHeight: '100%' }}>
<div className="modalSidebar">
<span className="mainTitle">Mue</span>
</div>
<div className="modalTabContent">
<div className="emptyItems">
<div className="emptyMessage">
<div className="loaderHolder">
<div id="loader"></div>
<span className="subtitle">{variables.getMessage('modals.main.loading')}</span>
</div>
</div>
</div>
</div>
</div>
);
// Map tab types to their corresponding components
const TAB_COMPONENTS = {
[TAB_TYPES.SETTINGS]: Settings,
[TAB_TYPES.LIBRARY]: Library,
[TAB_TYPES.DISCOVER]: Discover,
};
function MainModal({ modalClose }) {
const [currentTab, setCurrentTab] = useState('settings');
function MainModal({ modalClose, deepLinkData }) {
// Initialize with deep link tab if provided, otherwise default to settings
const initialTab = deepLinkData?.tab || TAB_TYPES.SETTINGS;
const [currentTab, setCurrentTab] = useState(initialTab);
const [currentSection, setCurrentSection] = useState('');
const [currentSectionName, setCurrentSectionName] = useState('');
const [currentSubSection, setCurrentSubSection] = useState(deepLinkData?.subSection || null);
const [productView, setProductView] = useState(null);
const [resetDiscoverToAll, setResetDiscoverToAll] = useState(false);
const [navigationTrigger, setNavigationTrigger] = useState(null);
const [iframeBreadcrumbs, setIframeBreadcrumbs] = useState([]);
const changeTab = (type) => {
setCurrentTab(type);
};
// Clear product view when changing tabs
useEffect(() => {
setProductView(null);
}, [currentTab]);
const renderTab = () => {
switch (currentTab) {
case 'addons':
return <Addons changeTab={changeTab} />;
case 'marketplace':
return <Marketplace changeTab={changeTab} />;
default:
return <Settings changeTab={changeTab} />;
// Handle deep link updates (when modal opens via EventBus with new deep link)
useEffect(() => {
if (deepLinkData) {
// Update tab if different
if (deepLinkData.tab && deepLinkData.tab !== currentTab) {
setCurrentTab(deepLinkData.tab);
}
// Handle settings section navigation with subsection
if (deepLinkData.tab === TAB_TYPES.SETTINGS && deepLinkData.section) {
setNavigationTrigger({
type: 'settings-section',
data: deepLinkData.section,
timestamp: Date.now(),
});
// Set sub-section if present
if (deepLinkData.subSection) {
setCurrentSubSection(deepLinkData.subSection);
}
}
}
}, [deepLinkData]);
// Clear hash when modal closes
useEffect(() => {
return () => {
// When modal unmounts, clear the hash
if (window.location.hash) {
window.history.replaceState(null, null, window.location.pathname);
}
};
}, []);
useEffect(() => {
// Listen for browser back/forward navigation via popstate
const handlePopState = () => {
const linkData = window.location.hash ? parseDeepLink(window.location.hash) : null;
if (linkData) {
// Update tab if different
if (linkData.tab && linkData.tab !== currentTab) {
setCurrentTab(linkData.tab);
}
// Handle settings section navigation
if (linkData.tab === TAB_TYPES.SETTINGS && linkData.section) {
setNavigationTrigger({
type: 'settings-section',
data: linkData.section,
timestamp: Date.now(),
});
// Set sub-section if present in hash
setCurrentSubSection(linkData.subSection || null);
return;
}
// Handle product and collection navigation
if (linkData.itemId && linkData.collection && linkData.fromCollection) {
// Product viewed from within a collection
// First set collection state, then navigate to product
setNavigationTrigger({
type: 'collection',
data: linkData.collection,
timestamp: Date.now(),
});
// Small delay to ensure collection state is set before navigating to product
setTimeout(() => {
setNavigationTrigger({
type: 'product',
data: {
id: linkData.itemId,
type: linkData.category,
},
timestamp: Date.now(),
});
}, 100);
} else if (linkData.itemId) {
// Product navigation (standalone)
setNavigationTrigger({
type: 'product',
data: {
id: linkData.itemId,
type: linkData.category,
},
timestamp: Date.now(),
});
} else if (linkData.collection) {
// Collection page navigation
setNavigationTrigger({
type: 'collection',
data: linkData.collection,
timestamp: Date.now(),
});
} else {
// Back to main view (clear collection state)
setProductView(null);
setNavigationTrigger({
type: 'main',
data: { clearCollection: true },
timestamp: Date.now(),
});
}
}
};
window.addEventListener('popstate', handlePopState);
return () => window.removeEventListener('popstate', handlePopState);
}, [currentTab]);
const handleChangeTab = (newTab) => {
setCurrentTab(newTab);
// Update URL hash when tab changes
if (newTab === TAB_TYPES.DISCOVER) {
updateHash(`#${newTab}/all`);
} else if (newTab === TAB_TYPES.LIBRARY) {
updateHash(`#${newTab}/added`);
} else {
updateHash(`#${newTab}`);
}
};
const handleSectionChange = (section, sectionName) => {
setCurrentSection(section);
setCurrentSectionName(sectionName);
// Clear sub-section when changing sections
setCurrentSubSection(null);
// Update URL hash when section changes
if (currentTab === TAB_TYPES.DISCOVER) {
// For Discover tab, update with the section type
const sectionMap = {
[variables.getMessage('modals.main.marketplace.all')]: 'all',
[variables.getMessage('modals.main.marketplace.photo_packs')]: 'photo_packs',
[variables.getMessage('modals.main.marketplace.quote_packs')]: 'quote_packs',
[variables.getMessage('modals.main.marketplace.preset_settings')]: 'preset_settings',
[variables.getMessage('modals.main.marketplace.collections')]: 'collections',
};
const sectionKey = sectionMap[section];
if (sectionKey) {
updateHash(`#${currentTab}/${sectionKey}`);
}
} else if (currentTab === TAB_TYPES.SETTINGS && sectionName) {
// For Settings tab, update with the section name
updateHash(`#${currentTab}/${sectionName}`, false);
}
};
const handleSubSectionChange = (subSection, sectionName) => {
setCurrentSubSection(subSection);
// Update URL hash when sub-section changes
if (currentTab === TAB_TYPES.SETTINGS && sectionName) {
if (subSection) {
updateHash(`#${currentTab}/${sectionName}/${subSection}`);
} else {
// Going back to section, remove sub-section from hash
updateHash(`#${currentTab}/${sectionName}`);
}
}
};
const handleProductView = (product) => {
setProductView(product);
// URL hash is already updated by child components (Browse.jsx)
// Browser history automatically tracks hash changes
};
const handleResetDiscoverToAll = () => {
setResetDiscoverToAll(true);
setTimeout(() => setResetDiscoverToAll(false), 100);
};
const handleBack = () => {
// Clear iframe breadcrumbs when navigating back
setIframeBreadcrumbs([]);
window.history.back();
};
const handleForward = () => {
window.history.forward();
};
// Browser manages history state, so we always show buttons enabled
// Browser will handle whether there's actually history to go back/forward
const canGoBack = true;
const canGoForward = true;
const TabComponent = TAB_COMPONENTS[currentTab] || Settings;
return (
<div className="frame">
<Tooltip
style={{ position: 'absolute', top: '1rem', right: '1rem' }}
title={variables.getMessage('modals.welcome.buttons.close')}
key="closeTooltip"
>
<span className="closeModal" onClick={modalClose}>
<MdClose />
</span>
</Tooltip>
<Suspense fallback={renderLoader()}>{renderTab()}</Suspense>
<ModalTopBar
currentTab={currentTab}
currentSection={currentSection}
currentSectionName={currentSectionName}
currentSubSection={currentSubSection}
productView={productView}
iframeBreadcrumbs={iframeBreadcrumbs}
onTabChange={handleChangeTab}
onSubSectionChange={handleSubSectionChange}
onClose={modalClose}
onBack={handleBack}
onForward={handleForward}
canGoBack={canGoBack}
canGoForward={canGoForward}
/>
<div style={{ flex: 1, display: 'flex', overflow: 'hidden', minHeight: 0 }}>
<Suspense fallback={<ModalLoader currentTab={currentTab} />}>
<TabComponent
key={currentTab}
changeTab={handleChangeTab}
deepLinkData={deepLinkData}
currentTab={currentTab}
onSectionChange={handleSectionChange}
onSubSectionChange={handleSubSectionChange}
currentSubSection={currentSubSection}
onProductView={handleProductView}
onBreadcrumbsChange={setIframeBreadcrumbs}
resetToAll={resetDiscoverToAll}
onResetToAll={handleResetDiscoverToAll}
navigationTrigger={navigationTrigger}
/>
</Suspense>
</div>
</div>
);
}
const MemoizedMainModal = memo(MainModal);
export { MemoizedMainModal as default, MemoizedMainModal as MainModal };
export default memo(MainModal);

View File

@@ -1,103 +1,38 @@
import variables from 'config/variables';
import { memo, useState, useEffect } from 'react';
import {
MdSettings as Settings,
MdWidgets as Addons,
MdShoppingBasket as Marketplace,
MdMenu as Navbar,
MdEmojiPeople as Greeting,
MdAccessAlarm as Time,
MdOutlineFormatQuote as Quote,
MdLink as QuickLinks,
MdDateRange as Date,
MdOutlineTextsms as Message,
MdOutlinePhoto as Background,
MdSearch,
MdCloudQueue as Weather,
MdFormatPaint as Appearance,
MdTranslate as Language,
MdOutlineSettings as Advanced,
MdBugReport as Experimental,
MdOutlineAssessment as Stats,
MdOutlineNewReleases as Changelog,
MdInfoOutline as About,
MdOutlineExtension as Added,
MdAddCircleOutline as Create,
MdViewAgenda as Overview,
MdCollectionsBookmark as Collections,
} from 'react-icons/md';
const iconMapping = {
[variables.getMessage('modals.main.marketplace.product.overview')]: <Overview />,
[variables.getMessage('modals.main.navbar.settings')]: <Settings />,
[variables.getMessage('modals.main.navbar.addons')]: <Addons />,
[variables.getMessage('modals.main.navbar.marketplace')]: <Marketplace />,
[variables.getMessage('modals.main.settings.sections.appearance.navbar.title')]: <Navbar />,
[variables.getMessage('modals.main.settings.sections.greeting.title')]: <Greeting />,
[variables.getMessage('modals.main.settings.sections.time.title')]: <Time />,
[variables.getMessage('modals.main.settings.sections.quicklinks.title')]: <QuickLinks />,
[variables.getMessage('modals.main.settings.sections.quote.title')]: <Quote />,
[variables.getMessage('modals.main.settings.sections.date.title')]: <Date />,
[variables.getMessage('modals.main.settings.sections.message.title')]: <Message />,
[variables.getMessage('modals.main.settings.sections.background.title')]: <Background />,
[variables.getMessage('modals.main.settings.sections.search.title')]: <MdSearch />,
[variables.getMessage('modals.main.settings.sections.weather.title')]: <Weather />,
[variables.getMessage('modals.main.settings.sections.appearance.title')]: <Appearance />,
[variables.getMessage('modals.main.settings.sections.language.title')]: <Language />,
[variables.getMessage('modals.main.settings.sections.advanced.title')]: <Advanced />,
[variables.getMessage('modals.main.settings.sections.stats.title')]: <Stats />,
[variables.getMessage('modals.main.settings.sections.experimental.title')]: <Experimental />,
[variables.getMessage('modals.main.settings.sections.changelog.title')]: <Changelog />,
[variables.getMessage('modals.main.settings.sections.about.title')]: <About />,
[variables.getMessage('modals.main.addons.added')]: <Added />,
[variables.getMessage('modals.main.addons.create.title')]: <Create />,
[variables.getMessage('modals.main.marketplace.all')]: <Addons />,
[variables.getMessage('modals.main.marketplace.photo_packs')]: <Background />,
[variables.getMessage('modals.main.marketplace.quote_packs')]: <Quote />,
[variables.getMessage('modals.main.marketplace.preset_settings')]: <Advanced />,
[variables.getMessage('modals.main.marketplace.collections')]: <Collections />,
};
import { useT } from 'contexts/TranslationContext';
import { getIconComponent, DIVIDER_LABELS } from '../constants/tabConfig';
function Tab({ label, currentTab, onClick, navbarTab }) {
const t = useT();
const [isExperimental, setIsExperimental] = useState(true);
useEffect(() => {
setIsExperimental(localStorage.getItem('experimental') !== 'false');
}, []);
let className = navbarTab ? 'navbar-item' : 'tab-list-item';
if (currentTab === label) {
className += navbarTab ? ' navbar-item-active' : ' tab-list-active';
}
// Get the icon component for this label (label is already translated)
const IconComponent = getIconComponent(label, { getMessage: t });
const icon = iconMapping[label];
const divider = [
variables.getMessage('modals.main.settings.sections.weather.title'),
variables.getMessage('modals.main.settings.sections.language.title'),
variables.getMessage('modals.main.marketplace.all'),
variables.getMessage('modals.main.settings.sections.experimental.title'),
].includes(label);
// Determine if this label should have a divider after it
const hasDivider = DIVIDER_LABELS.some((key) => t(key) === label);
const mue = [
variables.getMessage('modals.main.marketplace.product.overview'),
variables.getMessage('modals.main.addons.added'),
variables.getMessage('modals.main.marketplace.all'),
].includes(label);
// Build className
const baseClass = navbarTab ? 'navbar-item' : 'tab-list-item';
const activeClass = navbarTab ? 'navbar-item-active' : 'tab-list-active';
const className = `${baseClass}${currentTab === label ? ` ${activeClass}` : ''}`;
if (
label === variables.getMessage('modals.main.settings.sections.experimental.title') &&
!isExperimental
) {
// Hide experimental tab if experimental mode is disabled
const isExperimentalTab = label === t('modals.main.settings.sections.experimental.title');
if (isExperimentalTab && !isExperimental) {
return <hr />;
}
return (
<>
{mue && <span className="mainTitle">Mue</span>}
<button className={className} onClick={() => onClick(label)}>
{icon} <span>{label}</span>
{IconComponent && <IconComponent />} <span>{label}</span>
</button>
{divider && <hr />}
{hasDivider && <hr />}
</>
);
}

View File

@@ -1,100 +1,142 @@
import { useState, useEffect, useRef } from 'react';
import { useT } from 'contexts/TranslationContext';
import variables from 'config/variables';
import React, { useState, useEffect } from 'react';
import {
MdSettings,
MdOutlineShoppingBasket,
MdOutlineExtension,
MdRefresh,
MdClose,
} from 'react-icons/md';
import Tab from './Tab';
import { Button } from 'components/Elements';
import ReminderInfo from '../components/ReminderInfo';
import ErrorBoundary from '../../../../features/misc/modals/ErrorBoundary';
import { TAB_TYPES } from '../constants/tabConfig';
const Tabs = (props) => {
const [currentTab, setCurrentTab] = useState(props.children[0].props.label);
const [currentName, setCurrentName] = useState(props.children[0].props.name);
const Tabs = ({
children,
navbar = false,
currentTab: activeTab,
onSectionChange,
resetToFirst,
deepLinkData,
navigationTrigger,
sections,
}) => {
const t = useT();
const onClick = (tab, name) => {
// Find initial section from deep link if available
const getInitialSection = () => {
if (deepLinkData?.section && sections) {
const section = sections.find((s) => s.name === deepLinkData.section);
if (section) {
return {
label: t(section.label),
name: section.name,
};
}
}
return {
label: children[0]?.props.label,
name: children[0]?.props.name,
};
};
const initial = getInitialSection();
const [currentTab, setCurrentTab] = useState(initial.label);
const [currentName, setCurrentName] = useState(initial.name);
const [showReminder, setShowReminder] = useState(localStorage.getItem('showReminder') === 'true');
const contentRef = useRef(null);
const handleTabClick = (tab, name) => {
if (name !== currentName) {
variables.stats.postEvent('tab', `Opened ${name}`);
}
setCurrentTab(tab);
setCurrentName(name);
// Scroll content to top when changing tabs
if (contentRef.current) {
contentRef.current.scrollTop = 0;
}
// Notify parent of section change with both label and name
if (onSectionChange) {
onSectionChange(tab, name);
}
};
const hideReminder = () => {
localStorage.setItem('showReminder', false);
document.querySelector('.reminder-info').style.display = 'none';
// Notify parent of initial section on mount
useEffect(() => {
if (onSectionChange && currentTab) {
onSectionChange(currentTab, currentName);
}
}, []);
// Update labels when language changes
useEffect(() => {
if (sections && currentName) {
const section = sections.find((s) => s.name === currentName);
if (section) {
const newLabel = t(section.label);
setCurrentTab(newLabel);
}
}
}, [t, sections, currentName]);
// Handle navigation trigger for settings sections (popstate)
useEffect(() => {
if (navigationTrigger?.type === 'settings-section' && sections) {
const section = sections.find((s) => s.name === navigationTrigger.data);
if (section) {
const label = t(section.label);
setCurrentTab(label);
setCurrentName(section.name);
// Scroll content to top when navigating via browser history
if (contentRef.current) {
contentRef.current.scrollTop = 0;
}
}
}
}, [navigationTrigger, sections, t]);
// Reset to first tab when requested
useEffect(() => {
if (resetToFirst) {
setCurrentTab(children[0]?.props.label);
setCurrentName(children[0]?.props.name);
// Scroll content to top when resetting to first tab
if (contentRef.current) {
contentRef.current.scrollTop = 0;
}
if (onSectionChange) {
onSectionChange(children[0]?.props.label, children[0]?.props.name);
}
}
}, [resetToFirst]);
const handleHideReminder = () => {
localStorage.setItem('showReminder', 'false');
setShowReminder(false);
};
const navbarButtons = [
{
tab: 'settings',
icon: <MdSettings />,
},
{
tab: 'addons',
icon: <MdOutlineExtension />,
},
{
tab: 'marketplace',
icon: <MdOutlineShoppingBasket />,
},
];
const reminderInfo = (
<div
className="reminder-info"
style={{ display: localStorage.getItem('showReminder') === 'true' ? 'flex' : 'none' }}
>
<div className="shareHeader">
<span className="title">{variables.getMessage('modals.main.settings.reminder.title')}</span>
<span className="closeModal" onClick={hideReminder}>
<MdClose />
</span>
</div>
<span className="subtitle">
{variables.getMessage('modals.main.settings.reminder.message')}
</span>
<button onClick={() => window.location.reload()}>
<MdRefresh />
{variables.getMessage('modals.main.error_boundary.refresh')}
</button>
</div>
);
// Show sidebar for Settings and Discover tabs
const showSidebar = activeTab === TAB_TYPES.SETTINGS || activeTab === TAB_TYPES.DISCOVER;
return (
<div style={{ display: 'flex', width: '100%', minHeight: '100%' }}>
<div className="modalSidebar">
{props.children.map((tab, index) => (
<Tab
currentTab={currentTab}
key={index}
label={tab.props.label}
onClick={(nextTab) => onClick(nextTab, tab.props.name)}
navbarTab={props.navbar || false}
/>
))}
{reminderInfo}
</div>
<div className="modalTabContent">
<div className="modalNavbar">
{navbarButtons.map(({ tab, icon }, index) => (
<Button
type="navigation"
onClick={() => props.changeTab(tab)}
icon={icon}
label={variables.getMessage(`modals.main.navbar.${tab}`)}
active={props.current === tab}
key={`${tab}-${index}`}
<div style={{ display: 'flex', width: '100%', height: '100%', overflow: 'hidden' }}>
{showSidebar ? (
<div className="modalSidebar">
{children.map((tab, index) => (
<Tab
key={index}
currentTab={currentTab}
label={tab.props.label}
onClick={(nextTab) => handleTabClick(nextTab, tab.props.name)}
navbarTab={navbar}
/>
))}
<ReminderInfo isVisible={showReminder} onHide={handleHideReminder} />
</div>
{props.children.map((tab, index) => {
) : null}
<div className="modalTabContent" ref={contentRef}>
{children.map((tab, index) => {
if (tab.props.label !== currentTab) {
return undefined;
return null;
}
return (

View File

@@ -0,0 +1,22 @@
import variables from 'config/variables';
import SidebarSkeleton from './SidebarSkeleton';
const ModalLoader = ({ currentTab }) => (
<div style={{ display: 'flex', width: '100%', minHeight: '100%' }}>
<div className="modalSidebar">
<SidebarSkeleton currentTab={currentTab} />
</div>
<div className="modalTabContent">
<div className="emptyItems">
<div className="emptyMessage">
<div className="loaderHolder">
<div id="loader"></div>
<span className="subtitle">{variables.getMessage('modals.main.loading')}</span>
</div>
</div>
</div>
</div>
</div>
);
export default ModalLoader;

View File

@@ -0,0 +1,20 @@
import variables from 'config/variables';
import { Button } from 'components/Elements';
import { NAVBAR_BUTTONS } from '../constants/tabConfig';
const ModalNavbar = ({ currentTab, onChangeTab }) => (
<div className="modalNavbar">
{NAVBAR_BUTTONS.map(({ tab, icon: Icon, messageKey }) => (
<Button
key={tab}
type="navigation"
onClick={() => onChangeTab(tab)}
icon={<Icon />}
label={variables.getMessage(messageKey)}
active={currentTab === tab}
/>
))}
</div>
);
export default ModalNavbar;

View File

@@ -0,0 +1,228 @@
import { useT } from 'contexts/TranslationContext';
import { MdClose, MdChevronRight, MdArrowBack, MdArrowForward } from 'react-icons/md';
import { Tooltip, Button } from 'components/Elements';
import { NAVBAR_BUTTONS } from '../constants/tabConfig';
import mueAboutIcon from 'assets/icons/mue_about.png';
// Map marketplace types to translation keys
const MARKETPLACE_TYPE_TO_KEY = {
photo_packs: 'modals.main.marketplace.photo_packs',
photos: 'modals.main.marketplace.photo_packs',
quote_packs: 'modals.main.marketplace.quote_packs',
quotes: 'modals.main.marketplace.quote_packs',
preset_settings: 'modals.main.marketplace.preset_settings',
settings: 'modals.main.marketplace.preset_settings',
collections: 'modals.main.marketplace.collections',
all: 'modals.main.marketplace.all',
};
function ModalTopBar({
currentTab,
currentSection,
currentSectionName,
currentSubSection,
productView,
iframeBreadcrumbs,
onTabChange,
onSubSectionChange,
onClose,
onBack,
onForward,
canGoBack,
canGoForward,
}) {
const t = useT();
// Get the current tab label
const currentTabButton = NAVBAR_BUTTONS.find(({ tab }) => tab === currentTab);
const currentTabLabel = currentTabButton ? t(currentTabButton.messageKey) : '';
// Utility function to get translated sub-section label
const getSubSectionLabel = (subSection, sectionName) => {
if (!subSection || !sectionName) return subSection;
// Use the same translation pattern as the section components
const translationKey = `modals.main.settings.sections.${sectionName}.${subSection}.title`;
const translated = t(translationKey);
// If translation key is returned as-is or empty, it means translation doesn't exist
// Fall back to capitalized sub-section name
if (!translated || translated === translationKey) {
return subSection.charAt(0).toUpperCase() + subSection.slice(1);
}
return translated;
};
// Determine breadcrumb path with click handlers
const breadcrumbPath = [];
if (currentTabLabel) {
breadcrumbPath.push({
label: currentTabLabel,
onClick: productView ? productView.onBackToAll : null, // Clickable if viewing a product
});
// Check if we have iframe breadcrumbs (from Discover iframe)
// If so, only use the last item (the item name) and keep our section
if (iframeBreadcrumbs && iframeBreadcrumbs.length > 0) {
// Get the last breadcrumb item (the item name)
const lastCrumb = iframeBreadcrumbs[iframeBreadcrumbs.length - 1];
// Add current section if available and different from the last crumb
if (currentSection && currentSection !== lastCrumb.label) {
breadcrumbPath.push({
label: currentSection,
onClick: () => onBack(), // Clickable to go back
});
}
// Add the item name from iframe
breadcrumbPath.push({
label: lastCrumb.label,
onClick: null, // Current item - not clickable
});
} else if (productView) {
// If viewing a collection page itself (not a product within it)
if (productView.isCollection) {
// Show: Discover > Collection Name
breadcrumbPath.push({
label: productView.collectionTitle || productView.name,
onClick: null, // Current page - not clickable
});
} else {
// Viewing a product
// Show: Discover > Collection/Category > Product
if (productView.fromCollection && productView.collectionTitle) {
// If from a collection, show collection name
breadcrumbPath.push({
label: productView.collectionTitle,
onClick: productView.onBack || null,
});
} else {
// Otherwise show category
const categoryKey = MARKETPLACE_TYPE_TO_KEY[productView.type];
if (categoryKey) {
breadcrumbPath.push({
label: t(categoryKey),
onClick: productView.onBack || null,
});
}
}
// Add product name as final breadcrumb
breadcrumbPath.push({
label: productView.name,
onClick: null, // Current item - not clickable
});
}
} else if (currentSection) {
// Show: Tab > Section or Tab > Section > Sub-Section
breadcrumbPath.push({
label: currentSection,
onClick: currentSubSection ? () => onSubSectionChange(null) : null, // Clickable if sub-section is active
});
// Add sub-section if present
if (currentSubSection) {
breadcrumbPath.push({
label: getSubSectionLabel(currentSubSection, currentSectionName),
onClick: null, // Current sub-section - not clickable
});
}
}
}
return (
<div className="modalTopBar">
<div className="topBarLeft">
<div className="navigationButtons">
<Tooltip title="Back" key="backTooltip">
<button
className="navButton"
onClick={onBack}
disabled={!canGoBack}
aria-label="Navigate back"
>
<MdArrowBack />
</button>
</Tooltip>
<Tooltip title="Forward" key="forwardTooltip">
<button
className="navButton"
onClick={onForward}
disabled={!canGoForward}
aria-label="Navigate forward"
>
<MdArrowForward />
</button>
</Tooltip>
</div>
<img
src={mueAboutIcon}
alt="Mue"
className="topBarLogo"
draggable={false}
/>
{breadcrumbPath.length > 0 && (
<nav className="breadcrumbs" aria-label="Breadcrumb navigation">
{breadcrumbPath.map((item, index) => {
const isLast = index === breadcrumbPath.length - 1;
const isClickable = item.onClick !== null;
return (
<span key={index} className="breadcrumb-segment">
{isClickable ? (
<span
className={`breadcrumb-item breadcrumb-clickable`}
onClick={item.onClick}
onKeyDown={(e) => {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
item.onClick();
}
}}
role="button"
tabIndex={0}
aria-label={`Navigate to ${item.label}`}
>
{item.label}
</span>
) : (
<span
className={`breadcrumb-item ${isLast ? 'breadcrumb-current' : ''}`}
aria-current={isLast ? 'page' : undefined}
>
{item.label}
</span>
)}
{!isLast && <MdChevronRight className="breadcrumb-separator" aria-hidden="true" />}
</span>
);
})}
</nav>
)}
</div>
<div className="topBarRight">
<div className="topBarNavigation">
{NAVBAR_BUTTONS.map(({ tab, icon: Icon, messageKey }) => (
<Button
key={tab}
type="navigation"
onClick={() => onTabChange(tab)}
active={currentTab === tab}
icon={<Icon />}
label={t(messageKey)}
/>
))}
</div>
<Tooltip title={t('modals.welcome.buttons.close')} key="closeTooltip">
<span className="closeModal" onClick={onClose}>
<MdClose />
</span>
</Tooltip>
</div>
</div>
);
}
export default ModalTopBar;

View File

@@ -0,0 +1,28 @@
import variables from 'config/variables';
import { MdRefresh, MdClose } from 'react-icons/md';
const ReminderInfo = ({ isVisible, onHide }) => {
if (!isVisible) {
return null;
}
return (
<div className="reminder-info">
<div className="shareHeader">
<span className="title">{variables.getMessage('modals.main.settings.reminder.title')}</span>
<span className="closeModal" onClick={onHide}>
<MdClose />
</span>
</div>
<span className="subtitle">
{variables.getMessage('modals.main.settings.reminder.message')}
</span>
<button onClick={() => window.location.reload()}>
<MdRefresh />
{variables.getMessage('modals.main.error_boundary.refresh')}
</button>
</div>
);
};
export default ReminderInfo;

View File

@@ -0,0 +1,50 @@
import { TAB_TYPES } from '../constants/tabConfig';
// Tab-specific configurations with exact divider positions
const TAB_CONFIGS = {
[TAB_TYPES.SETTINGS]: {
itemCount: 16, // Excluding experimental
dividerPositions: [10, 12], // After Weather, Language
textWidths: [80, 100, 70, 90, 85, 75, 80, 95, 90, 75, 85, 90, 85, 80, 70, 95], // Fixed widths in pixels
},
[TAB_TYPES.DISCOVER]: {
itemCount: 5,
dividerPositions: [0], // After "All"
textWidths: [60, 95, 95, 110, 90], // Fixed widths
},
[TAB_TYPES.LIBRARY]: {
itemCount: 0, // Library doesn't show sidebar
dividerPositions: [],
textWidths: [],
},
};
const SidebarSkeleton = ({ currentTab = TAB_TYPES.SETTINGS }) => {
const config = TAB_CONFIGS[currentTab] || TAB_CONFIGS[TAB_TYPES.SETTINGS];
// Library tab doesn't show sidebar
if (config.itemCount === 0) {
return null;
}
return (
<div className="sidebarSkeleton">
{Array.from({ length: config.itemCount }).map((_, index) => {
const hasDivider = config.dividerPositions.includes(index);
const textWidth = config.textWidths[index] || 80;
return (
<div key={index}>
<div className="skeletonItem">
<div className="iconPlaceholder pulse" />
<div className="textPlaceholder pulse" style={{ width: `${textWidth}px` }} />
</div>
{hasDivider && <hr className="skeletonDivider" />}
</div>
);
})}
</div>
);
};
export default SidebarSkeleton;

View File

@@ -0,0 +1,3 @@
export { default as ModalLoader } from './ModalLoader';
export { default as ModalNavbar } from './ModalNavbar';
export { default as ReminderInfo } from './ReminderInfo';

View File

@@ -0,0 +1,160 @@
import {
MdSettings,
MdWidgets,
MdShoppingBasket,
MdTune,
MdBookmarks,
MdExplore,
MdMenu,
MdEmojiPeople,
MdAccessAlarm,
MdOutlineFormatQuote,
MdLink,
MdDateRange,
MdOutlineTextsms,
MdOutlinePhoto,
MdSearch,
MdCloudQueue,
MdFormatPaint,
MdTranslate,
MdOutlineSettings,
MdBugReport,
MdOutlineAssessment,
MdOutlineNewReleases,
MdInfoOutline,
MdOutlineExtension,
MdAddCircleOutline,
MdViewAgenda,
MdCollectionsBookmark,
} from 'react-icons/md';
// Tab type constants
export const TAB_TYPES = {
SETTINGS: 'settings',
LIBRARY: 'library',
DISCOVER: 'discover',
};
// Icon component mapping - using component references instead of elements
export const ICON_COMPONENTS = {
SETTINGS: MdTune,
LIBRARY: MdBookmarks,
DISCOVER: MdExplore,
NAVBAR: MdMenu,
GREETING: MdEmojiPeople,
TIME: MdAccessAlarm,
QUOTE: MdOutlineFormatQuote,
QUICKLINKS: MdLink,
DATE: MdDateRange,
MESSAGE: MdOutlineTextsms,
BACKGROUND: MdOutlinePhoto,
SEARCH: MdSearch,
WEATHER: MdCloudQueue,
APPEARANCE: MdFormatPaint,
LANGUAGE: MdTranslate,
ADVANCED: MdOutlineSettings,
EXPERIMENTAL: MdBugReport,
STATS: MdOutlineAssessment,
CHANGELOG: MdOutlineNewReleases,
ABOUT: MdInfoOutline,
ADDED: MdOutlineExtension,
CREATE: MdAddCircleOutline,
OVERVIEW: MdViewAgenda,
COLLECTIONS: MdCollectionsBookmark,
};
// Message keys for icon mapping
export const MESSAGE_KEYS = {
OVERVIEW: 'modals.main.marketplace.product.overview',
SETTINGS: 'modals.main.navbar.settings',
LIBRARY: 'modals.main.navbar.library',
DISCOVER: 'modals.main.navbar.discover',
NAVBAR: 'modals.main.settings.sections.appearance.navbar.title',
GREETING: 'modals.main.settings.sections.greeting.title',
TIME: 'modals.main.settings.sections.time.title',
QUICKLINKS: 'modals.main.settings.sections.quicklinks.title',
QUOTE: 'modals.main.settings.sections.quote.title',
DATE: 'modals.main.settings.sections.date.title',
MESSAGE: 'modals.main.settings.sections.message.title',
BACKGROUND: 'modals.main.settings.sections.background.title',
SEARCH: 'modals.main.settings.sections.search.title',
WEATHER: 'modals.main.settings.sections.weather.title',
APPEARANCE: 'modals.main.settings.sections.appearance.title',
LANGUAGE: 'modals.main.settings.sections.language.title',
ADVANCED: 'modals.main.settings.sections.advanced.title',
STATS: 'modals.main.settings.sections.stats.title',
EXPERIMENTAL: 'modals.main.settings.sections.experimental.title',
CHANGELOG: 'modals.main.settings.sections.changelog.title',
ABOUT: 'modals.main.settings.sections.about.title',
ADDED: 'modals.main.addons.added',
CREATE: 'modals.main.addons.create.title',
ALL_MARKETPLACE: 'modals.main.marketplace.all',
PHOTO_PACKS: 'modals.main.marketplace.photo_packs',
QUOTE_PACKS: 'modals.main.marketplace.quote_packs',
PRESET_SETTINGS: 'modals.main.marketplace.preset_settings',
COLLECTIONS: 'modals.main.marketplace.collections',
};
// Helper to get icon component by translated label
// This function builds a map at runtime using variables.getMessage
export const getIconComponent = (label, variables) => {
const iconMap = {
[variables.getMessage(MESSAGE_KEYS.OVERVIEW)]: ICON_COMPONENTS.OVERVIEW,
[variables.getMessage(MESSAGE_KEYS.SETTINGS)]: ICON_COMPONENTS.SETTINGS,
[variables.getMessage(MESSAGE_KEYS.LIBRARY)]: ICON_COMPONENTS.LIBRARY,
[variables.getMessage(MESSAGE_KEYS.DISCOVER)]: ICON_COMPONENTS.DISCOVER,
[variables.getMessage(MESSAGE_KEYS.NAVBAR)]: ICON_COMPONENTS.NAVBAR,
[variables.getMessage(MESSAGE_KEYS.GREETING)]: ICON_COMPONENTS.GREETING,
[variables.getMessage(MESSAGE_KEYS.TIME)]: ICON_COMPONENTS.TIME,
[variables.getMessage(MESSAGE_KEYS.QUICKLINKS)]: ICON_COMPONENTS.QUICKLINKS,
[variables.getMessage(MESSAGE_KEYS.QUOTE)]: ICON_COMPONENTS.QUOTE,
[variables.getMessage(MESSAGE_KEYS.DATE)]: ICON_COMPONENTS.DATE,
[variables.getMessage(MESSAGE_KEYS.MESSAGE)]: ICON_COMPONENTS.MESSAGE,
[variables.getMessage(MESSAGE_KEYS.BACKGROUND)]: ICON_COMPONENTS.BACKGROUND,
[variables.getMessage(MESSAGE_KEYS.SEARCH)]: ICON_COMPONENTS.SEARCH,
[variables.getMessage(MESSAGE_KEYS.WEATHER)]: ICON_COMPONENTS.WEATHER,
[variables.getMessage(MESSAGE_KEYS.APPEARANCE)]: ICON_COMPONENTS.APPEARANCE,
[variables.getMessage(MESSAGE_KEYS.LANGUAGE)]: ICON_COMPONENTS.LANGUAGE,
[variables.getMessage(MESSAGE_KEYS.ADVANCED)]: ICON_COMPONENTS.ADVANCED,
[variables.getMessage(MESSAGE_KEYS.STATS)]: ICON_COMPONENTS.STATS,
[variables.getMessage(MESSAGE_KEYS.EXPERIMENTAL)]: ICON_COMPONENTS.EXPERIMENTAL,
[variables.getMessage(MESSAGE_KEYS.CHANGELOG)]: ICON_COMPONENTS.CHANGELOG,
[variables.getMessage(MESSAGE_KEYS.ABOUT)]: ICON_COMPONENTS.ABOUT,
[variables.getMessage(MESSAGE_KEYS.ADDED)]: ICON_COMPONENTS.ADDED,
[variables.getMessage(MESSAGE_KEYS.CREATE)]: ICON_COMPONENTS.CREATE,
[variables.getMessage(MESSAGE_KEYS.ALL_MARKETPLACE)]: ICON_COMPONENTS.LIBRARY,
[variables.getMessage(MESSAGE_KEYS.PHOTO_PACKS)]: ICON_COMPONENTS.BACKGROUND,
[variables.getMessage(MESSAGE_KEYS.QUOTE_PACKS)]: ICON_COMPONENTS.QUOTE,
[variables.getMessage(MESSAGE_KEYS.PRESET_SETTINGS)]: ICON_COMPONENTS.ADVANCED,
[variables.getMessage(MESSAGE_KEYS.COLLECTIONS)]: ICON_COMPONENTS.COLLECTIONS,
};
return iconMap[label];
};
// Navbar configuration
export const NAVBAR_BUTTONS = [
{
tab: TAB_TYPES.SETTINGS,
icon: ICON_COMPONENTS.SETTINGS,
messageKey: 'modals.main.navbar.settings',
},
{
tab: TAB_TYPES.LIBRARY,
icon: ICON_COMPONENTS.LIBRARY,
messageKey: 'modals.main.navbar.library',
},
{
tab: TAB_TYPES.DISCOVER,
icon: ICON_COMPONENTS.DISCOVER,
messageKey: 'modals.main.navbar.discover',
},
];
// Labels that should have dividers after them
export const DIVIDER_LABELS = [
'modals.main.settings.sections.weather.title',
'modals.main.settings.sections.language.title',
'modals.main.marketplace.all',
'modals.main.settings.sections.experimental.title',
];

View File

@@ -1 +1 @@
export * from './Main';
export { default as MainModal } from './Main';

View File

@@ -1,11 +1,14 @@
@import 'scss/variables';
@import 'modules/sidebar';
@import 'modules/navbar';
@import 'modules/modalTabContent';
@import 'modules/links';
@import 'modules/scrollbars';
@import 'settings/main';
@import 'marketplace/main';
@use 'sass:map';
@use 'scss/variables' as *;
@use 'modules/topBar' as *;
@use 'modules/sidebar' as *;
@use 'modules/navbar' as *;
@use 'modules/modalTabContent' as *;
@use 'modules/links' as *;
@use 'modules/scrollbars' as *;
@use 'settings/main' as *;
@use 'marketplace/main' as *;
// Fixed: Added sass:map module
.Overlay {
position: fixed;
@@ -26,9 +29,9 @@
opacity: 1;
z-index: -2;
transition-timing-function: ease-in;
border-radius: map-get($modal, 'border-radius');
border-radius: map.get($modal, 'border-radius');
user-select: none;
overflow-y: auto;
overflow: hidden;
transform: scale(0);
transition: all 0.3s cubic-bezier(0.47, 1.64, 0.41, 0.8);
@@ -86,6 +89,11 @@
height: 80vh;
width: clamp(60vw, 1400px, 90vw);
-webkit-backdrop-filter: blur(16px) saturate(180%);
backdrop-filter: blur(16px) saturate(180%);
overflow: hidden;
border-radius: 12px;
@include themed {
background-color: t($modal-background);
}

View File

@@ -1,21 +1,14 @@
// this file is too long
@import 'modules/item';
@import 'modules/buttons';
@import 'modules/lightbox';
@import 'scss/variables';
@use 'modules/item' as *;
@use 'modules/buttons' as *;
@use 'modules/lightbox' as *;
@use 'scss/variables' as *;
.creatorItems {
.item {
flex-flow: row !important;
}
.item-back {
margin: 0 !important;
filter: blur(40px) saturate(180%) brightness(90%) !important;
height: 15px !important;
width: 200px !important;
}
.item-icon {
margin: 0 !important;
}
@@ -38,26 +31,24 @@
border-radius: 12px;
width: auto;
cursor: pointer;
transition: 0.5s;
transition: transform 300ms cubic-bezier(0.4, 0, 0.2, 1);
display: flex;
flex-flow: column;
align-items: center;
text-align: center;
align-items: flex-start;
gap: 15px;
background-position: center;
background-repeat: no-repeat;
background-size: cover;
padding: 1.5rem;
will-change: transform;
transform: translate3d(0, 0, 0); // Force GPU acceleration
@include themed {
background-color: t($modal-secondaryColour);
box-shadow: 0 0 0 1px t($modal-sidebarActive);
&:hover {
background-color: t($modal-sidebarActive);
img {
background-color: t($modal-sidebarActive);
}
transform: translate3d(0, -5px, 0);
}
}
@@ -65,34 +56,19 @@
margin-top: 7px;
}
.item-back {
filter: blur(60px) saturate(180%) brightness(90%);
position: absolute;
object-fit: cover !important;
height: 90px;
width: 100px;
border-radius: 100px;
transition: 0.5s;
margin-top: 30px;
}
.item-icon {
object-fit: cover !important;
height: 60px !important;
width: 60px !important;
border-radius: 12px;
transition: 0.5s;
margin-top: 25px;
}
.card-details {
z-index: 1;
padding: 10px;
margin-bottom: 24px;
display: flex;
flex-flow: column;
gap: 5px;
align-items: center;
align-items: flex-start;
.card-title {
font-size: 18px;
@@ -106,8 +82,16 @@
}
}
.card-type {
margin-top: 8px;
.card-chips {
margin-top: 20px;
display: flex;
flex-flow: row;
gap: 8px;
flex-wrap: wrap;
}
.card-type,
.card-collection {
font-size: 12px;
font-weight: bolder;
@@ -120,6 +104,39 @@
background-color: rgb(255 255 255 / 10%);
border: 1px solid rgb(209 213 219 / 30%);
}
.card-collection {
@include themed {
background-color: rgb(255 255 255 / 15%);
border: 1px solid rgb(209 213 219 / 40%);
}
}
}
.item-installed-badge {
position: absolute;
top: 12px;
right: 12px;
display: flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
border-radius: 50%;
border: 2px solid rgba(255, 255, 255, 0.4);
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);
z-index: 2;
pointer-events: none;
will-change: transform;
svg {
color: white;
font-size: 20px;
}
}
&:hover .item-installed-badge {
transform: scale(1.05);
}
}
}
@@ -128,30 +145,124 @@
display: flex;
flex-flow: row;
justify-content: space-between;
align-items: flex-start;
gap: 30px;
flex-wrap: wrap;
.itemShowcase {
.itemContent {
display: flex;
flex-flow: column;
gap: 25px;
width: 60%;
max-width: 650px;
.description {
max-lines: 3;
font-size: 16px;
}
flex: 1;
img {
width: 100%;
height: auto;
border-radius: 12px;
}
table {
table-layout: fixed;
width: 100%;
max-width: 650px !important;
word-wrap: break-word !important;
font-size: 16px;
border-collapse: collapse;
}
.itemTop {
display: flex;
flex-direction: column;
gap: 18px;
}
.itemTabs {
display: flex;
flex-wrap: wrap;
gap: 12px;
.itemTab {
border-radius: 999px;
padding: 0.55rem 1.3rem;
border: 1px solid transparent;
background: transparent;
font-weight: 600;
cursor: pointer;
transition:
transform 0.2s ease,
box-shadow 0.2s ease;
@include themed {
color: t($subColor);
border-color: rgb(255 255 255 / 10%);
background-color: rgb(255 255 255 / 5%);
}
&:hover {
transform: translateY(-1px);
@include themed {
border-color: rgb(255 255 255 / 18%);
}
}
&.active {
@include themed {
color: t($color);
background-color: t($modal-sidebarActive);
border-color: transparent;
}
}
}
}
.tabContent {
display: flex;
flex-direction: column;
gap: 25px;
}
.itemHighlights {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: 18px;
.highlightCard {
display: flex;
flex-direction: column;
gap: 6px;
padding: 18px;
border-radius: 14px;
border: 1px solid transparent;
@include themed {
background-color: t($modal-secondaryColour);
border-color: rgb(255 255 255 / 8%);
box-shadow: 0 0 0 1px t($modal-sidebarActive);
}
.highlightLabel {
font-size: 14px;
@include themed {
color: t($subColor);
}
}
.highlightValue {
font-size: 30px;
font-weight: 600;
@include themed {
color: t($color);
}
}
}
}
.marketplaceDetails {
.moreInfo {
margin-top: 10px;
}
}
}
@@ -160,8 +271,9 @@
background-repeat: no-repeat;
background-size: cover;
border-radius: 15px;
width: 30%;
max-width: 300px;
flex: 0 0 300px;
width: 300px;
max-width: 100%;
max-height: 700px;
.front {
@@ -173,6 +285,7 @@
width: 100%;
box-sizing: border-box !important;
border-radius: 12px 12px 0 0;
-webkit-backdrop-filter: blur(40px) saturate(150%) brightness(75%);
backdrop-filter: blur(40px) saturate(150%) brightness(75%);
@include themed {
@@ -186,7 +299,7 @@
border-radius: 12px;
box-shadow: 0 5px 25px black;
aspect-ratio: 1 / 1;
object-fit: contain;
object-fit: cover;
}
.divider {
@@ -252,6 +365,7 @@
flex-flow: column;
text-align: center;
align-items: center;
-webkit-user-select: none;
user-select: none;
img {
@@ -365,6 +479,7 @@ p.author {
.nice-tag {
border-radius: 150px;
padding: 1px 12px;
-webkit-backdrop-filter: blur(16px) saturate(180%);
backdrop-filter: blur(16px) saturate(180%);
background-color: rgb(255 255 255 / 10%);
border: 1px solid rgb(209 213 219 / 30%);
@@ -420,6 +535,7 @@ p.author {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 5;
line-clamp: 5;
}
}
@@ -517,3 +633,61 @@ p.author {
margin-bottom: 0 !important;
}
}
.filter-options-container {
display: flex;
flex-flow: row;
gap: 20px;
margin: 20px 0;
align-items: center;
justify-content: space-between;
}
.filter-chips {
display: flex;
flex-flow: row;
gap: 12px;
align-items: center;
.filter-chip {
all: unset;
padding: 8px 20px;
border-radius: 24px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
white-space: nowrap;
-webkit-user-select: none;
user-select: none;
@include themed {
background-color: t($modal-sidebarActive);
color: t($color);
}
&:hover {
@include themed {
background-color: rgba(255, 255, 255, 0.15);
}
}
&.active {
@include themed {
background-color: #fff;
color: #000;
}
&:hover {
@include themed {
background-color: #f0f0f0;
}
}
}
&:focus-visible {
outline: 2px solid rgba(255, 255, 255, 0.5);
outline-offset: 2px;
}
}
}

View File

@@ -1,3 +1,5 @@
@use 'scss/variables' as *;
.updateCheck {
flex-flow: row !important;
}
@@ -23,25 +25,39 @@
.btn-navigation {
@include modal-button(standard);
padding: 0 15px;
padding: 10px 20px;
border-radius: 12px !important;
transition: all 0.2s ease;
position: relative;
@include themed {
background: t($modal-secondaryColour) !important;
border-radius: t($borderRadius) !important;
box-shadow: t($boxShadow) !important;
border: 0 !important;
background: transparent !important;
border: none !important;
box-shadow: none !important;
}
&:hover {
background: t($modal-sidebarActive) !important;
}
.light & {
background: transparent !important;
border: none !important;
}
.dark & {
background: transparent !important;
border: none !important;
}
&:hover {
svg {
background: var(--tab-active);
@include themed {
background: rgba(0, 0, 0, 0.04) !important;
}
color: var(--modal-text);
.light & {
background: rgba(0, 0, 0, 0.04) !important;
}
.dark & {
background: rgba(255, 255, 255, 0.06) !important;
}
}
span,
@@ -51,7 +67,10 @@
svg {
font-size: 1.2em !important;
color: var(--photo-info);
@include themed {
color: t($color);
}
}
}
@@ -64,7 +83,18 @@
.btn-navigation-active {
@include themed {
background: t($modal-sidebarActive) !important;
background: rgba(0, 0, 0, 0.06) !important;
box-shadow: none !important;
}
.light & {
background: rgba(0, 0, 0, 0.06) !important;
border: none !important;
}
.dark & {
background: rgba(255, 255, 255, 0.1) !important;
border: none !important;
}
}
@@ -131,6 +161,7 @@ a.btn-collection {
height: 40px;
display: grid;
place-content: center;
border-radius: 8px !important;
@include modal-button(standard);
}

View File

@@ -1,3 +1,5 @@
@use 'scss/variables' as *;
.side {
float: right;
margin-left: 20px;
@@ -72,6 +74,8 @@ p.description {
display: flex;
flex-flow: row;
justify-content: space-between;
flex-wrap: wrap;
align-items: center;
gap: 25px;
.itemWarning {
@@ -165,6 +169,7 @@ p.description {
gap: 15px;
.subtitle {
-webkit-user-select: text !important;
user-select: text !important;
}
}

View File

@@ -1,3 +1,5 @@
@use 'scss/variables' as *;
.lightBoxModal {
margin: auto;
max-width: 60%;

View File

@@ -1,4 +1,4 @@
@import 'scss/variables';
@use 'scss/variables' as *;
.modalTabContent {
width: 100% !important;
@@ -8,12 +8,17 @@
} */
@include themed {
padding: 1rem 3rem 3rem;
padding: 1rem 2rem 5rem;
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
overflow-y: auto;
background: t($modal-background);
margin: 0;
border-radius: t($borderRadius);
@extend %tabText;
hr {
@@ -25,7 +30,6 @@
.settingsRow {
display: flex;
align-items: center;
min-height: 100px;
justify-content: space-between;
transition: 0.4s ease-in-out;
@@ -38,6 +42,10 @@
border-bottom: none;
}
&:last-child {
margin-bottom: 2rem;
}
.content {
display: flex;
flex-flow: column;
@@ -163,6 +171,12 @@ table {
gap: 25px;
padding: 25px;
justify-content: space-between;
cursor: default !important;
user-select: auto;
&:active {
cursor: default !important;
}
@include themed {
background: t($modal-sidebar);

View File

@@ -1,4 +1,4 @@
@import 'scss/variables';
@use 'scss/variables' as *;
::-webkit-scrollbar {
width: 6px;

View File

@@ -1,25 +1,18 @@
@import 'scss/variables';
@use 'scss/variables' as *;
.modalSidebar {
@include themed {
top: 0;
left: 0;
position: sticky;
position: relative;
margin: 0;
padding: 0 5px;
// padding: 1rem 1.5rem 4rem 1.5rem;
padding: 0.5rem 0 0 0.5rem;
background: t($modal-sidebar);
border-radius: 12px 0 0 12px;
overflow: hidden auto;
height: 80vh;
overflow-y: auto;
overflow-x: hidden;
height: 100%;
min-width: 250px;
.mainTitle {
text-align: center;
font-size: 35px;
display: flex;
justify-content: center;
padding: 25px;
}
flex-shrink: 0;
svg {
margin-left: 20px;
@@ -52,6 +45,10 @@
min-width: calc(100% - 1.2em);
text-align: left;
&:last-child {
margin-bottom: 1rem;
}
&:hover {
background: t($modal-sidebarActive);
}
@@ -77,3 +74,54 @@
margin-left: 0 !important;
margin-right: 0 !important;
}
// Sidebar skeleton loader
.sidebarSkeleton {
padding: 0.5rem 0.2rem;
.skeletonItem {
display: flex;
align-items: center;
padding: 0.5rem;
margin: 0.2rem;
pointer-events: none;
.iconPlaceholder {
width: 17px;
height: 17px;
border-radius: 6px;
margin-left: 20px;
margin-right: 20px;
flex-shrink: 0;
@include themed {
background: t($modal-sidebarActive);
}
}
.textPlaceholder {
height: 18px;
border-radius: 6px;
@include themed {
background: t($modal-sidebarActive);
}
}
}
.skeletonDivider {
@include themed {
height: 1px;
background: linear-gradient(
90deg,
transparent 0%,
t($modal-sidebarActive) 20%,
t($modal-sidebarActive) 80%,
transparent 100%
);
margin: 0.5rem 1.75rem;
border: none;
opacity: 0.6;
}
}
}

View File

@@ -0,0 +1,147 @@
@use 'scss/variables' as *;
.modalTopBar {
position: relative;
flex-shrink: 0;
z-index: 100;
display: flex;
align-items: center;
justify-content: space-between;
padding: 1.5rem 1.5rem;
// width: 100%;
-webkit-backdrop-filter: blur(16px) saturate(180%);
backdrop-filter: blur(16px) saturate(180%);
@include themed {
background-color: t($modal-background);
border-bottom: 1px solid t($modal-sidebarActive);
}
.topBarLeft {
display: flex;
align-items: center;
flex-shrink: 0;
gap: 1rem;
.navigationButtons {
display: flex;
gap: 0.25rem;
.navButton {
display: grid;
place-items: center;
padding: 0.5rem;
border-radius: 8px;
cursor: pointer;
border: none;
background: none;
transition: 0.3s;
@include themed {
color: t($color);
}
svg {
font-size: 1.2rem;
}
&:hover:not(:disabled) {
@include themed {
background: t($modal-sidebarActive);
}
}
&:disabled {
opacity: 0.3;
cursor: not-allowed;
}
}
}
.topBarLogo {
height: 32px;
width: auto;
}
.breadcrumbs {
display: flex;
align-items: center;
gap: 0;
font-size: 0.95rem;
font-weight: 500;
.breadcrumb-segment {
display: flex;
align-items: center;
// gap: 0.5rem;
}
.breadcrumb-item {
@include themed {
color: t($subColor);
}
white-space: nowrap;
transition: opacity 0.2s;
}
.breadcrumb-clickable {
cursor: pointer;
&:hover {
opacity: 0.7;
text-decoration: underline;
}
}
.breadcrumb-separator {
@include themed {
color: t($subColor);
}
opacity: 0.5;
font-size: 1.2rem;
margin: 0 0.25rem;
}
.breadcrumb-current {
@include themed {
color: t($color);
}
font-weight: 600;
}
}
}
.topBarRight {
display: flex;
align-items: center;
gap: 0.75rem;
flex-shrink: 0;
.topBarNavigation {
display: flex;
flex-flow: row;
gap: 0.5rem;
}
.closeModal {
display: grid;
place-items: center;
padding: 0.4em;
border-radius: 12px;
cursor: pointer;
transition: 0.5s;
flex-shrink: 0;
svg {
font-size: 1.5em;
}
&:hover {
@include themed {
background: t($modal-sidebarActive);
}
}
}
}
}

View File

@@ -1,9 +1,9 @@
@import 'scss/variables';
@import 'modules/material-ui';
@import 'modules/tabs/about';
@import 'modules/tabs/changelog';
@import 'modules/tabs/order';
@import 'modules/tabs/stats';
@use 'scss/variables' as *;
@use 'modules/material-ui' as *;
@use 'modules/tabs/about' as *;
@use 'modules/tabs/changelog' as *;
@use 'modules/tabs/order' as *;
@use 'modules/tabs/stats' as *;
input {
/* colour picker */
@@ -130,9 +130,9 @@ h4 {
}
.customcss textarea {
font-family: Consolas, 'Andale Mono WT', 'Andale Mono', 'Lucida Console', 'Lucida Sans Typewriter',
'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Liberation Mono', 'Nimbus Mono L', Monaco,
'Courier New', Courier, monospace !important;
font-family: Consolas, 'Andale Mono WT', 'Andale Mono', 'Lucida Console',
'Lucida Sans Typewriter', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Liberation Mono',
'Nimbus Mono L', Monaco, 'Courier New', Courier, monospace !important;
}
.preferences {
@@ -144,3 +144,40 @@ h4 {
pointer-events: none;
transition: 0.4s ease-in-out;
}
// Warning banner (used in Search settings and potentially others)
.itemWarning {
padding: 10px 20px;
display: flex;
flex-flow: row;
gap: 15px;
align-items: center;
.text {
display: flex;
flex-flow: column;
.header {
font-weight: 600;
margin-bottom: 5px;
}
}
svg {
@include themed {
background-image: t($slightGradient);
box-shadow: t($boxShadow);
}
padding: 7px;
border-radius: 100%;
font-size: 24px;
min-width: 24px;
}
@include themed {
background: t($modal-sidebar);
border-radius: t($borderRadius);
box-shadow: 0 0 0 1px t($modal-sidebarActive);
}
}

View File

@@ -1,6 +1,6 @@
/* these are overrides for the material ui default styles */
@import 'scss/variables';
@use 'scss/variables' as *;
.MuiCheckbox-colorPrimary.Mui-checked,
.MuiSwitch-colorPrimary.Mui-checked,
@@ -47,6 +47,10 @@ legend {
margin-top: 10px !important;
}
.settingsRow .action .MuiFormControlLabel-root {
margin-top: 10px !important;
}
.checkbox svg {
@include themed {
fill: t($color) !important;
@@ -158,6 +162,12 @@ legend,
.MuiFormControlLabel-root {
width: 100%;
}
p {
@include themed {
color: t($subColor) !important;
}
}
}
.css-w66kx-MuiChip-root {

View File

@@ -1,3 +1,5 @@
@use 'scss/variables' as *;
.aboutLink {
&:hover {
opacity: 0.8;
@@ -29,6 +31,8 @@
img {
width: 75px;
height: auto;
opacity: 0;
animation: fadeIn 0.5s ease-in-out forwards;
@include themed {
border-radius: t($borderRadius);
@@ -36,6 +40,17 @@
}
}
@keyframes fadeIn {
from {
opacity: 0;
transform: scale(0.9);
}
to {
opacity: 1;
transform: scale(1);
}
}
.subtitle-photographers {
font-size: 16px;

View File

@@ -1,3 +1,5 @@
@use 'scss/variables' as *;
.updateChangelog {
max-width: 75%;
margin-top: 15px;

View File

@@ -1,4 +1,4 @@
@import 'scss/variables';
@use 'scss/variables' as *;
.sortableItem {
cursor: move;
@@ -46,7 +46,7 @@
.images-row {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
padding: 20px;
grid-gap: 20px;

Some files were not shown because too many files have changed in this diff Show More