From 37241289ee7716c407c401f54d8a53bc1e0d8bd9 Mon Sep 17 00:00:00 2001 From: David Ralph Date: Sun, 8 Jan 2023 21:56:16 +0000 Subject: [PATCH 01/31] Mue 7.0 (#334) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: add work in progress 7.0 code Co-authored-by: Alex Sparkes * chore: add notice * fix: add missing alias to webpack config * Added floating UI to package.json * fix: modal navbar * fix: port welcome modal fix from 6.0.5 Co-authored-by: David Ralph * feat: about, remove redundancy - Remove redundant background option - about tab UI improvements - improve widget order UI.. to be completed later * feat: update slider + create - got rid of commented out css - update about tab UI - add reset icon to reset text - change link colour - add number to show value on slider - reorder greeting settings to make a bit more sense * fix: author loading before quote - Make author div not load if quote is empty - photoinformation taking too much of the screen - more transitions and consistent transitions - running prettier across all files Co-authored-by: David Ralph * fix: various fixes, add microphone active border etc Co-authored-by: David Ralph * fix: various fixes, add microphone active border etc * fix: slider text, quote - Quote was being irritating on lower resolutions and would make it so the text for author would go outside - Text on slider was getting jammed together * build: replace webpack with vite (WIP) * feat: Reminder settings UI * feat: pomodoro UI + general changes - Remove settingsitem line at end - Convert more divs to settingsitem - Pomodoro Settings - Add more descriptions - Changes loaders Co-authored-by: David Ralph * build: add stylelint Co-authored-by: David Ralph * refactor: cleanup and remove unused stuff * fix: marketplace quote images, offline background img and quotes, remove placeholder text * fix: vite extension build, add source to photo info * fix: welcome modal bugs, about tab issues * fix: offline mode fixes, about tab fix, update modal text * feat: rolling out share modal for photoinfo * fix: fix markeplace item grid * feat: custom background drag and drop, error reporting, better ui, new settings, fixes * fix: add link modal, marketplace - Addons title - icon for check for updates - update add link modal - improve the style of the smaller modals - Link back to create tab on marketplace * fix: welcome modal size * feat: upload image compression, todo drag and drop, fixes Co-authored-by: Alex Sparkes * fix: various modal tab fixes and changes, reorder some settings, fix marketplace * feat: install multiple quote packs in marketplace etc (WIP) * feat: info tooltip * fix: todo ordering - start work on improving loaders, error messages etc * fix: build problem try 1 * fix: attempt 2 * feat: improve navigability of complex settings - start work on reducing popin of certain elements * feat: add data section to advanced with sync Co-authored-by: David Ralph * chore: improve background back btn, update dependencies * feat: add custom changes to drag and drop, refactor search, comments, video upload check (untested) * fix: photo info share modal, navbar, remove unused code * fix: sidebar bug, tab name translation * feat: weather sizing, achievements * feat: consistent header for sub sections - fixed achievements grid - added more achievements - altered achievements style - made header of background subsection consistent with advanced * feat(translations): first half of 7.0 translation support * feat(translations): add 7.0 support for most settings and some of marketplace * feat(translations): bug fixes, more 7.0 support * fix: background upload, finish 7.0 translation support * fix(translations): modal error fixes * feat: background settings improvements Co-authored-by: David Ralph * Turkish_Language_Support_Added (#285) * Turkish_Language_Support_Added The necessary files were updated with the Turkish translation file. * Word_Corrections * fix: overflow of custom images + visual * fix: change start command * fix: create tab * fix: various modal fixes and improvements Co-authored-by: Alex Sparkes * fix: consistency across tabs * fix: add missing updated code from live share * fix: quote skeleton * feat: redo of message UI & widget order experiment * fix: sideload tab and file uploads * feat: make overview tab use actual elements * feat: achievements system works * fix: custom search engine settings, marketplace translation * Grammar_and_Simplification_for_Turkish_Language (#290) * Turkish_Language_Support_Added The necessary files were updated with the Turkish translation file. * Word_Corrections * Turkish_Simplification_and_Editing * Update_tr_TR Letter Layout for Interface Compatibility * Last_Check_tr_TR It looks good for now. Co-authored-by: David Ralph * feat: new collection design, improvements Co-authored-by: David Ralph Co-authored-by: Isaac * Fix: marketplace fixes Co-authored-by: Isaac * fix: collection gradient * feat: marketplace item page experimentation * fix: item page carousel * fix: marketplace QoL * feat: get collection data from api * fix: my add-ons tab, remove unused code * chore(deps): update package.json * fix: commence work on welcome modal * fix: welcome modal scroll problem on lower res * feat: welcome modal first page redesign * feat: clock changes * feat: vertical clock * fix: rename to vertical clock * fix: lazy repair of the share modal * feat: collection news alt * fix: remove unused code, change Turkish name * fix: message length Co-authored-by: David Ralph * fix: overview tab Co-authored-by: David Ralph * fix: various fixes and improvements Co-authored-by: David Ralph * fix: various welcome modal fixes - fix links - fix style choice - change how theme selector works * fix: weather * polish * fix: message * fix: minor fixes and cleanup * feat(translations): support for new strings * fix: use localised wikipedia for api, remove unused icons * Remove photo info width * Update PhotoInformation.jsx * fix: weather bug * fix: addons not being uninstalled correctly * fix: quote showing icon from incorrect quote pack * fix: lil photo info bug Co-authored-by: David Ralph * refactor: cleanup various files * refactor: clean translation system and more widget stuff * fix(translations): fix issues caused by refactor * perf: experimental upgrade to deps and fix esbuild warnings * fix: weather * fix: icon bug & small cleanup * fix: show photoinformation setting * chore(manifest): Upgrade to v3 Not sure if it is correct, security policy likely isn't. * fix: add missing translations, fix birthday * fix: translation display bug, marketplace error, cleanup carousel * fix(translations): add missing, fix weather location * fix: marketplace collections, weather settings * fix: marketplace translations * fix: cleanup code and fix weather etc Co-authored-by: Alex Sparkes * fix: clock colour among other things Co-authored-by: David Ralph * fix: navbar zoom * fix: remove unused & bugged feature * fix: clean up some CSS * we don't talk about underscores * fix: interval * overview changes Co-authored-by: David Ralph * fix: collection refresh and item language display * add: type of item marketplace * fix: search autocomplete error * feat: missing translation * fix: background refresh spam effects issue * fix: various fixes Co-authored-by: David Ralph * fix: various fixes * fix: experimental fix for interval * fix: small line missed * chore: update i18n on 7.0, fix link not opening in new tab * fix: interval not appearing for marketplace * fix: various fixes and remove unused code * fix: custom quote, message, move sideload etc * fix: update styling on custom quote settings etc * feat(dev): add commitlint * fix: background interval Co-authored-by: David Ralph * feat: overhaul of quick links * feat: search for marketplace * fix: marketplace + more - Fix clock zoom - Fix 0th birthday bug - marketplace search style - marketplace search not sensitive to case * fix: baidu search bug - reported via google chrome store reviews Co-authored-by: David Ralph * fix: some quotes have newlines at the end * fix: quote image copyright text * feat: edit quicklink * fix: adding links works again * fix: missing translation on item page - change position of close button on modal * fix: carousel and quicklink translations * fix: missing translations * fix: weather tooltip * feat: quote UI consistent with other elements * fix: quote UI text colour * fix: UX improvements to custom backgrounds * fix: numerous background interval fixes * fix: comment out code causing flash thank you rooray * feat: move all sideload logic to added, drag and drop upload, update deps * fix: background marketplace interval * fix: sideload error modal styling Co-authored-by: David Ralph * perf: major widget refactoring * perf: use memo, fix quicklinks key err * chore: update quicklink and autocomplete apis * fix: marketplace undefined errors * fix: optimise and repair marketplace Co-authored-by: Alex Sparkes * chore: run prettier * fix: search dropdown, missing translations, overview date * fix: background interval bug - took far too long * Add Español (Latinoamérica) (#319) * Add Español (Latinoamérica) * Update es-419.json * Update es-419.json * feat: upgrade to API v2 * fix: news on overview * feat: attempt image blur * fix: background blur transition * fix: quote cleanup and test * fix: various - temporarily comment out quote interval - fix background transition on firefox * fix: background transition compatibility * fix: update API URL * feat: don't show image again * fix: background categories * fix: improve category chip styling * fix: move tooltips photo info * fix: tooltip width photoinformation * fix: use AVIF if supported * fix: the previous fix (it broke non-AVIF browsers) * fix: favouriting images * fix: revoke the image blob * fix: classic photo info - plus the testing option of 10 seconds for interval * fix: quote language settings * fix: "Refresh Page Page" with en_US locale * fix: don't get quote twice * fix: allow map for Mue images * feat: pre-fetch image data from API so the blur hash is instantly available * feat: pre-fetch quote data from API * fix: don't show "N/A" * feat: `photoMap` true by default * feat: don't get the same image twice in a row Works with Mue API only, not Unsplash and not photo packs. * fix: don't get the same image twice in a row * chore: update dependencies, change compression, remove unneeded about string * fix: #320 by adding new ignore list * fix: es_419 locale, run prettier, remove unused line * fix: build error due to top level await * fix: pnpm lock was ice cold * fix: overview style - driving home for christmas - 7.0 is christmas - that is song lyric * fix: missing translations, create tab back button * fix: remove placeholder string * fix: photographers list * fix: don't set location to "N/A" * fix: translation bugs * chore: update dependencies etc * fix: start fixing photo map * TR Translation Update (#329) * Update tr_TR.json TR translate file update. * tr_TR.json File Update - Check One Vercel * Check Translate * Translation edit after bug fix. First review. * , Check * , Check * , Check * 330 issue fixed, translate added Signed-off-by: Kağan Can Şit * fix: typo * feat: improve collection gradient * feat: modernisation of modal theme colours * fix: light theme fixes * feat: make the marketplace look stunning * feat: make marketplace item pages prettier and add setting values table on pre-set settings page. * chore: comment out broken interval feature Signed-off-by: Kağan Can Şit Signed-off-by: David Ralph Co-authored-by: Alex Sparkes Co-authored-by: Kağan Can Şit Co-authored-by: Isaac Co-authored-by: Isaac Co-authored-by: alexsparkes Co-authored-by: BloodDragooner2 <117775945+BloodDragooner2@users.noreply.github.com> --- .commitlintrc.json | 3 + .eslintrc.js | 2 +- .gitignore | 7 +- .husky/commit-msg.sh | 4 + .prettierrc.json | 7 + .stylelintrc.json | 3 + README.md | 77 +- babel.config.js | 6 - index.html | 40 + manifest/_locales/tr_TR/messages.json | 8 + manifest/background-chrome.js | 2 +- manifest/background-firefox.js | 2 +- manifest/chrome.json | 12 +- manifest/firefox.json | 11 +- package.json | 20 +- pnpm-lock.yaml | 5806 +++++++++++++++++ postcss.config.js | 3 + public/icons/logo_horizontal.png | Bin 10097 -> 0 bytes public/icons/mue_dark.png | Bin 0 -> 5616 bytes public/icons/mue_light.png | Bin 0 -> 5526 bytes public/icons/undraw_making_art.svg | 1 + public/index.html | 34 - scripts/updatetranslations.js | 5 +- src/App.jsx | 102 +- .../helpers/autocomplete/Autocomplete.jsx | 40 +- .../helpers/autocomplete/autocomplete.scss | 36 +- src/components/helpers/carousel/Carousel.jsx | 80 + src/components/helpers/carousel/carousel.scss | 78 + .../helpers/notification/notification.jsx | 18 + src/components/helpers/preview/Preview.jsx | 18 +- src/components/helpers/preview/preview.scss | 21 +- .../helpers/sharemodal/ShareModal.jsx | 114 + .../helpers/sharemodal/sharemodal.scss | 93 + src/components/helpers/tooltip/Tooltip.jsx | 45 +- .../helpers/tooltip/infoTooltip.jsx | 47 + src/components/helpers/tooltip/tooltip.scss | 143 +- src/components/modals/ErrorBoundary.jsx | 46 +- src/components/modals/Modals.jsx | 47 +- src/components/modals/main/Main.jsx | 86 +- .../modals/main/marketplace/Item.jsx | 328 +- .../modals/main/marketplace/Items.jsx | 124 +- .../modals/main/marketplace/Lightbox.jsx | 11 +- .../main/marketplace/SideloadFailedModal.jsx | 31 +- .../main/marketplace/sections/Added.jsx | 216 +- .../main/marketplace/sections/Create.jsx | 543 +- .../main/marketplace/sections/Marketplace.jsx | 298 +- .../main/marketplace/sections/Sideload.jsx | 67 - src/components/modals/main/scss/index.scss | 350 +- .../modals/main/scss/marketplace/_main.scss | 606 +- .../scss/marketplace/modules/_buttons.scss | 41 +- .../scss/marketplace/modules/_featured.scss | 5 +- .../main/scss/marketplace/modules/_item.scss | 135 +- .../scss/marketplace/modules/_lightbox.scss | 2 +- .../modals/main/scss/modules/_navbar.scss | 60 +- .../modals/main/scss/modules/_scrollbars.scss | 15 +- .../modals/main/scss/modules/_sidebar.scss | 148 +- .../main/scss/modules/_tab-content.scss | 178 +- .../modals/main/scss/settings/_buttons.scss | 121 - .../modals/main/scss/settings/_main.scss | 172 +- .../scss/settings/modules/_material-ui.scss | 77 +- .../main/scss/settings/modules/_reminder.scss | 14 - .../scss/settings/modules/_resetmodal.scss | 27 - .../scss/settings/modules/tabs/_about.scss | 42 +- .../settings/modules/tabs/_changelog.scss | 5 +- .../scss/settings/modules/tabs/_order.scss | 192 +- ...-picker-gradient-picker-custom-styles.scss | 11 +- .../modals/main/settings/Checkbox.jsx | 35 +- .../modals/main/settings/ChipSelect.jsx | 55 + .../modals/main/settings/Dropdown.jsx | 37 +- .../modals/main/settings/FileUpload.jsx | 50 +- .../modals/main/settings/Header.jsx | 81 +- .../modals/main/settings/KeybindInput.jsx | 24 - src/components/modals/main/settings/Radio.jsx | 54 +- .../modals/main/settings/ResetModal.jsx | 44 +- .../modals/main/settings/SettingsItem.jsx | 15 + .../modals/main/settings/Slider.jsx | 50 +- .../modals/main/settings/Switch.jsx | 34 +- src/components/modals/main/settings/Text.jsx | 47 +- .../modals/main/settings/sections/About.jsx | 359 +- .../main/settings/sections/Advanced.jsx | 149 +- .../main/settings/sections/Appearance.jsx | 244 +- .../main/settings/sections/Changelog.jsx | 110 +- .../modals/main/settings/sections/Date.jsx | 124 +- .../main/settings/sections/Experimental.jsx | 73 +- .../main/settings/sections/Greeting.jsx | 75 +- .../main/settings/sections/Keybinds.jsx | 148 - .../main/settings/sections/Language.jsx | 58 +- .../modals/main/settings/sections/Message.jsx | 106 +- .../modals/main/settings/sections/Navbar.jsx | 106 +- .../modals/main/settings/sections/Order.jsx | 96 - .../main/settings/sections/Overview.jsx | 195 + .../main/settings/sections/QuickLinks.jsx | 294 +- .../modals/main/settings/sections/Quote.jsx | 279 +- .../modals/main/settings/sections/Search.jsx | 110 +- .../modals/main/settings/sections/Stats.jsx | 196 +- .../modals/main/settings/sections/Time.jsx | 186 +- .../modals/main/settings/sections/Weather.jsx | 214 +- .../settings/sections/advanced/Advanced.jsx | 161 + .../main/settings/sections/advanced/Data.jsx | 64 + .../sections/background/Background.jsx | 574 +- .../settings/sections/background/Colour.jsx | 127 +- .../settings/sections/background/Custom.jsx | 243 +- .../sections/background/CustomURLModal.jsx | 48 +- .../sections/overview_skeletons/Clock.jsx | 31 + .../sections/overview_skeletons/Date.jsx | 7 + .../sections/overview_skeletons/Greeting.jsx | 7 + .../sections/overview_skeletons/Message.jsx | 14 + .../overview_skeletons/QuickLinks.jsx | 26 + .../sections/overview_skeletons/Quote.jsx | 21 + .../settings/sections/quicklinks/AddModal.jsx | 59 + src/components/modals/main/tabs/Addons.jsx | 19 +- .../modals/main/tabs/Marketplace.jsx | 31 +- src/components/modals/main/tabs/Settings.jsx | 125 +- .../modals/main/tabs/backend/Tab.jsx | 149 +- .../modals/main/tabs/backend/Tabs.jsx | 80 +- src/components/modals/welcome/ProgressBar.jsx | 10 +- src/components/modals/welcome/Welcome.jsx | 83 +- .../modals/welcome/WelcomeSections.jsx | 350 +- src/components/modals/welcome/welcome.scss | 324 +- src/components/widgets/Widgets.jsx | 101 +- .../widgets/background/Background.jsx | 474 +- .../widgets/background/Favourite.jsx | 87 +- .../widgets/background/Maximise.jsx | 41 +- .../widgets/background/PhotoInformation.jsx | 402 +- .../background/scss/_photoinformation.scss | 276 +- .../widgets/background/scss/index.scss | 20 +- src/components/widgets/greeting/Greeting.jsx | 48 +- src/components/widgets/greeting/greeting.scss | 1 + src/components/widgets/message/Message.jsx | 25 +- src/components/widgets/message/message.scss | 1 + src/components/widgets/navbar/Navbar.jsx | 135 +- src/components/widgets/navbar/Notes.jsx | 164 +- src/components/widgets/navbar/Todo.jsx | 225 + .../widgets/navbar/scss/_notes.scss | 96 +- src/components/widgets/navbar/scss/_todo.scss | 63 + src/components/widgets/navbar/scss/index.scss | 76 +- .../widgets/quicklinks/QuickLinks.jsx | 187 +- .../widgets/quicklinks/quicklinks.scss | 183 +- src/components/widgets/quote/Quote.jsx | 446 +- src/components/widgets/quote/quote.scss | 144 +- src/components/widgets/search/Search.jsx | 169 +- .../search/autocomplete_providers.json | 17 - src/components/widgets/search/search.scss | 141 +- .../widgets/search/search_engines.json | 3 +- src/components/widgets/time/Clock.jsx | 113 +- src/components/widgets/time/Date.jsx | 62 +- src/components/widgets/time/clock.scss | 31 +- src/components/widgets/weather/Expanded.jsx | 110 + src/components/widgets/weather/Weather.jsx | 172 +- .../widgets/weather/WeatherIcon.jsx | 57 +- .../widgets/weather/WindDirectionIcon.jsx | 57 +- src/components/widgets/weather/weather.scss | 154 +- src/{index.js => index.jsx} | 116 +- src/modules/constants.js | 21 +- src/modules/default_settings.json | 24 +- src/modules/helpers/background/avif.js | 11 + src/modules/helpers/background/rgbToHsv.js | 4 +- src/modules/helpers/background/setRgba.js | 2 +- src/modules/helpers/background/widget.js | 63 +- src/modules/helpers/date.js | 6 +- src/modules/helpers/eventbus.js | 10 +- src/modules/helpers/experimental.js | 5 +- src/modules/helpers/interval.js | 27 - src/modules/helpers/marketplace.js | 85 +- .../achievement_translations/de_DE.json | 8 + .../achievement_translations/en_GB.json | 8 + .../achievement_translations/en_US.json | 8 + .../settings/achievement_translations/es.json | 8 + .../settings/achievement_translations/fr.json | 8 + .../achievement_translations/id_ID.json | 8 + .../achievement_translations/index.js | 27 + .../settings/achievement_translations/nl.json | 8 + .../settings/achievement_translations/no.json | 8 + .../settings/achievement_translations/ru.json | 8 + .../achievement_translations/tr_TR.json | 8 + .../achievement_translations/zh_CN.json | 8 + .../helpers/settings/achievements.json | 52 + src/modules/helpers/settings/index.js | 48 +- src/modules/helpers/settings/modals.js | 87 +- src/modules/helpers/stats.js | 2 +- src/modules/languages.json | 16 +- src/modules/translations.js | 29 + src/modules/variables.js | 7 +- src/scss/_mixins.scss | 23 + src/scss/_themes.scss | 37 - src/scss/{modules => }/_toast.scss | 12 +- src/scss/_variables.scss | 294 +- src/scss/index.scss | 215 +- src/scss/modules/_buttons.scss | 112 - src/translations/de_DE.json | 1221 ++-- src/translations/en_GB.json | 251 +- src/translations/en_US.json | 256 +- src/translations/es.json | 254 +- src/translations/es_419.json | 739 +++ src/translations/fr.json | 1220 ++-- src/translations/id_ID.json | 254 +- src/translations/nl.json | 254 +- src/translations/no.json | 254 +- src/translations/ru.json | 1221 ++-- src/translations/tr_TR.json | 1257 ++-- src/translations/zh_CN.json | 254 +- vite.config.js | 27 + webpack.config.js | 84 - 203 files changed, 23281 insertions(+), 7056 deletions(-) create mode 100644 .commitlintrc.json create mode 100644 .husky/commit-msg.sh create mode 100644 .prettierrc.json create mode 100644 .stylelintrc.json delete mode 100644 babel.config.js create mode 100644 index.html create mode 100644 manifest/_locales/tr_TR/messages.json create mode 100644 pnpm-lock.yaml create mode 100644 postcss.config.js delete mode 100644 public/icons/logo_horizontal.png create mode 100644 public/icons/mue_dark.png create mode 100644 public/icons/mue_light.png create mode 100644 public/icons/undraw_making_art.svg delete mode 100644 public/index.html create mode 100644 src/components/helpers/carousel/Carousel.jsx create mode 100644 src/components/helpers/carousel/carousel.scss create mode 100644 src/components/helpers/notification/notification.jsx create mode 100644 src/components/helpers/sharemodal/ShareModal.jsx create mode 100644 src/components/helpers/sharemodal/sharemodal.scss create mode 100644 src/components/helpers/tooltip/infoTooltip.jsx delete mode 100644 src/components/modals/main/marketplace/sections/Sideload.jsx delete mode 100644 src/components/modals/main/scss/settings/_buttons.scss delete mode 100644 src/components/modals/main/scss/settings/modules/_reminder.scss create mode 100644 src/components/modals/main/settings/ChipSelect.jsx delete mode 100644 src/components/modals/main/settings/KeybindInput.jsx create mode 100644 src/components/modals/main/settings/SettingsItem.jsx delete mode 100644 src/components/modals/main/settings/sections/Keybinds.jsx delete mode 100644 src/components/modals/main/settings/sections/Order.jsx create mode 100644 src/components/modals/main/settings/sections/Overview.jsx create mode 100644 src/components/modals/main/settings/sections/advanced/Advanced.jsx create mode 100644 src/components/modals/main/settings/sections/advanced/Data.jsx create mode 100644 src/components/modals/main/settings/sections/overview_skeletons/Clock.jsx create mode 100644 src/components/modals/main/settings/sections/overview_skeletons/Date.jsx create mode 100644 src/components/modals/main/settings/sections/overview_skeletons/Greeting.jsx create mode 100644 src/components/modals/main/settings/sections/overview_skeletons/Message.jsx create mode 100644 src/components/modals/main/settings/sections/overview_skeletons/QuickLinks.jsx create mode 100644 src/components/modals/main/settings/sections/overview_skeletons/Quote.jsx create mode 100644 src/components/modals/main/settings/sections/quicklinks/AddModal.jsx create mode 100644 src/components/widgets/navbar/Todo.jsx create mode 100644 src/components/widgets/navbar/scss/_todo.scss delete mode 100644 src/components/widgets/search/autocomplete_providers.json create mode 100644 src/components/widgets/weather/Expanded.jsx rename src/{index.js => index.jsx} (50%) create mode 100644 src/modules/helpers/background/avif.js delete mode 100644 src/modules/helpers/interval.js create mode 100644 src/modules/helpers/settings/achievement_translations/de_DE.json create mode 100644 src/modules/helpers/settings/achievement_translations/en_GB.json create mode 100644 src/modules/helpers/settings/achievement_translations/en_US.json create mode 100644 src/modules/helpers/settings/achievement_translations/es.json create mode 100644 src/modules/helpers/settings/achievement_translations/fr.json create mode 100644 src/modules/helpers/settings/achievement_translations/id_ID.json create mode 100644 src/modules/helpers/settings/achievement_translations/index.js create mode 100644 src/modules/helpers/settings/achievement_translations/nl.json create mode 100644 src/modules/helpers/settings/achievement_translations/no.json create mode 100644 src/modules/helpers/settings/achievement_translations/ru.json create mode 100644 src/modules/helpers/settings/achievement_translations/tr_TR.json create mode 100644 src/modules/helpers/settings/achievement_translations/zh_CN.json create mode 100644 src/modules/helpers/settings/achievements.json create mode 100644 src/modules/translations.js delete mode 100644 src/scss/_themes.scss rename src/scss/{modules => }/_toast.scss (69%) delete mode 100644 src/scss/modules/_buttons.scss create mode 100644 src/translations/es_419.json create mode 100644 vite.config.js delete mode 100644 webpack.config.js diff --git a/.commitlintrc.json b/.commitlintrc.json new file mode 100644 index 00000000..c30e5a97 --- /dev/null +++ b/.commitlintrc.json @@ -0,0 +1,3 @@ +{ + "extends": ["@commitlint/config-conventional"] +} diff --git a/.eslintrc.js b/.eslintrc.js index 59e8ed8b..861ebe4e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,4 +1,4 @@ module.exports = { extends: 'react-app', - parser: '@babel/eslint-parser' + parser: '@babel/eslint-parser', }; diff --git a/.gitignore b/.gitignore index ffc1931a..c6e8c984 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,10 @@ # Directories node_modules/ +.history/ .vscode/ build/ +.idea/ +dist/ # Files package-lock.json @@ -9,6 +12,6 @@ yarn-error.log .eslintcache stats.json yarn.lock +keys.json +.DS_Store *.zip - -keys.json \ No newline at end of file diff --git a/.husky/commit-msg.sh b/.husky/commit-msg.sh new file mode 100644 index 00000000..93396fde --- /dev/null +++ b/.husky/commit-msg.sh @@ -0,0 +1,4 @@ +#!/bin/sh +. "${dirname "$0"}/_/husky/husky.sh" + +npx commitlint --edit $1 \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 00000000..e09edeb6 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,7 @@ +{ + "printWidth": 100, + "trailingComma": "all", + "tabWidth": 2, + "semi": true, + "singleQuote": true +} diff --git a/.stylelintrc.json b/.stylelintrc.json new file mode 100644 index 00000000..fac097b7 --- /dev/null +++ b/.stylelintrc.json @@ -0,0 +1,3 @@ +{ + "extends": ["stylelint-config-standard-scss", "stylelint-config-prettier-scss"] +} diff --git a/README.md b/README.md index 4084c857..fdf2124b 100644 --- a/README.md +++ b/README.md @@ -11,65 +11,77 @@ Mue is a fast, open and free-to-use browser extension that gives a new, fresh an
-## NOTICE -This is the branch with the currently deployed Mue code. All development is currently occuring in the 7.0 branch. Please open pull requests to that branch only. - ## Table of contents -* [Screenshots](#screenshot) -* [Features](#features) - * [Planned Features](#planned-features) -* [Installation](#installation) - * [Chrome](#chrome) - * [Firefox](#firefox) - * [Edge Chromium](#edge-chromium) - * [Whale](#whale) - * [Other](#other) -* [Contributing](#development) - * [Translations](#translations) -* [Credits](#credits) - * [Developers](#developers) - * [Translators](#translators) - * [Contributors](#contributors) - * [Resources](#resources) + +- [NOTICE](#notice) +- [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) + ## Screenshots + ![Screenshot](assets/screenshot.webp) ![Settings Modal](assets/screenshot2.webp) ## Features -* 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 + +- 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 ### Planned Features + Please see our [roadmap](https://trello.com/b/w7zhS7Hi/mue-50). ## Installation -*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 demo of the tab can be found [here](https://demo.muetab.com), and the latest GitHub commit build [here](https://mue.vercel.app)_ + ### Chrome + [![Chrome Web Store Logo](assets/chrome.png)](https://chrome.google.com/webstore/detail/mue/bngmbednanpcfochchhgbkookpiaiaid)
[Chrome Web Store](https://chrome.google.com/webstore/detail/mue/bngmbednanpcfochchhgbkookpiaiaid) ### Firefox + [![Firefox Add-ons Logo](assets/firefox.png)](https://addons.mozilla.org/firefox/addon/mue)
[Firefox Add-ons](https://addons.mozilla.org/firefox/addon/mue) ### Edge (Chromium) + [Microsoft Edge Addons](https://microsoftedge.microsoft.com/addons/detail/aepnglgjfokepefimhbnibfjekidhmja) ### Whale + [Whale Store](https://store.whale.naver.com/detail/ecllekeilcmicbfkkiknfdddbogibbnc) ### Other + [GitHub Releases](https://github.com/mue/mue/releases) ## Development + Please see the [documentation](https://docs.muetab.com/development#mue-tab). ### Translations @@ -77,12 +89,16 @@ Please see the [documentation](https://docs.muetab.com/development#mue-tab). [![Contribute on Weblate](https://hosted.weblate.org/widgets/mue/-/open-graph.png)](https://hosted.weblate.org/engage/mue/) ## Credits + ### Developers + [David Ralph](https://github.com/davidcralph) - Lead development, photographer
[Alex Sparkes](https://github.com/alexsparkes) - Name, lead design, photographer
[Isaac Saunders](https://github.com/eartharoid) - QA, development, photographer
[Wessel Tip](https://github.com/Wessel) - Development
+ ### Translators + [Wessel Tip](https://github.com/Wessel), [Heimen Stoffels](https://github.com/Vistaus) - Dutch
[Alex Sparkes](https://github.com/alexsparkes), [Maxime](https://github.com/exiam) - French
[Anders](https://github.com/FuryingFox) - Norwegian
@@ -91,13 +107,16 @@ Please see the [documentation](https://docs.muetab.com/development#mue-tab). [Austin Huang](https://github.com/austinhuang0131) - Chinese (Simplified)
[FreeFun](https://github.com/xXFreeFunXx) - German
[Aksal](https://github.com/aksalsf) - Indonesian
+[Kağan Can Şit](https://github.com/KaganCanSit) - Turkish
efeaydal - Turkish
- ### 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 + [Pexels](https://pexels.com), [Unsplash](https://unsplash.com) - Stock photos used for offline mode
[Undraw](https://undraw.co) - Welcome modal images diff --git a/babel.config.js b/babel.config.js deleted file mode 100644 index 0f2c9a3f..00000000 --- a/babel.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - presets: ['@babel/preset-env', ['@babel/preset-react', { - runtime: 'automatic' - }]], - plugins: ['@babel/transform-runtime', '@babel/plugin-transform-react-inline-elements', '@babel/plugin-transform-react-constant-elements'] -}; diff --git a/index.html b/index.html new file mode 100644 index 00000000..fc076809 --- /dev/null +++ b/index.html @@ -0,0 +1,40 @@ + + + + + + + + New Tab + + + + +
+ + + diff --git a/manifest/_locales/tr_TR/messages.json b/manifest/_locales/tr_TR/messages.json new file mode 100644 index 00000000..edb8c284 --- /dev/null +++ b/manifest/_locales/tr_TR/messages.json @@ -0,0 +1,8 @@ +{ + "name": { + "message": "Mue" + }, + "description": { + "message": "Modern tarayıcılar için hızlı, açık ve kullanımı ücretsiz yeni sekme sayfası." + } +} diff --git a/manifest/background-chrome.js b/manifest/background-chrome.js index 569cc7c9..d53119bd 100644 --- a/manifest/background-chrome.js +++ b/manifest/background-chrome.js @@ -4,7 +4,7 @@ chrome.runtime.setUninstallURL('https://muetab.com/uninstall'); chrome.runtime.onInstalled.addListener((details) => { if (details.reason === 'install') { chrome.tabs.create({ - url: chrome.runtime.getURL('index.html') + url: chrome.runtime.getURL('index.html'), }); } }); diff --git a/manifest/background-firefox.js b/manifest/background-firefox.js index 286b64a1..d4d7c792 100644 --- a/manifest/background-firefox.js +++ b/manifest/background-firefox.js @@ -4,7 +4,7 @@ browser.runtime.setUninstallURL('https://muetab.com/uninstall'); browser.runtime.onInstalled.addListener((details) => { if (details.reason === 'install') { browser.tabs.create({ - url: browser.runtime.getURL('index.html') + url: browser.runtime.getURL('index.html'), }); } }); diff --git a/manifest/chrome.json b/manifest/chrome.json index 730d024a..b36f21be 100644 --- a/manifest/chrome.json +++ b/manifest/chrome.json @@ -1,12 +1,16 @@ { - "manifest_version": 2, + "manifest_version": 3, "offline_enabled": true, "default_locale": "en", "name": "__MSG_name__", "description": "__MSG_description__", +<<<<<<< HEAD + "version": "7.0.0", +======= "version": "6.0.6", +>>>>>>> main "homepage_url": "https://muetab.com", - "browser_action": { + "action": { "default_icon": "icons/128x128.png" }, "chrome_url_overrides": { @@ -17,9 +21,7 @@ "48": "icons/48x48.png", "128": "icons/128x128.png" }, - "content_security_policy": "script-src 'self' https://api.bing.com https://www.google.com; object-src 'self'", "background": { - "persistent": false, - "scripts": [ "background-chrome.js" ] + "service_worker": "background-chrome.js" } } diff --git a/manifest/firefox.json b/manifest/firefox.json index 2295efe8..141ceef7 100644 --- a/manifest/firefox.json +++ b/manifest/firefox.json @@ -1,10 +1,14 @@ { - "manifest_version": 2, + "manifest_version": 3, "name": "Mue", "description": "Fast, open and free-to-use new tab page for modern browsers.", +<<<<<<< HEAD + "version": "7.0.0", +======= "version": "6.0.6", +>>>>>>> main "homepage_url": "https://muetab.com", - "browser_action": { + "action": { "default_icon": "icons/128x128.png" }, "chrome_url_overrides": { @@ -17,6 +21,5 @@ }, "chrome_settings_overrides": { "homepage": "index.html" - }, - "content_security_policy": "script-src 'self' https://api.bing.com https://www.google.com; object-src 'self'" + } } diff --git a/package.json b/package.json index b6660bd4..edcc8733 100644 --- a/package.json +++ b/package.json @@ -28,13 +28,8 @@ "react-toastify": "9.1.1" }, "devDependencies": { - "@babel/core": "^7.17.9", - "@babel/eslint-parser": "^7.17.0", - "@babel/plugin-transform-react-constant-elements": "^7.17.6", - "@babel/plugin-transform-react-inline-elements": "^7.16.7", - "@babel/plugin-transform-runtime": "^7.17.0", - "@babel/preset-env": "^7.16.11", - "@babel/preset-react": "^7.16.7", + "@commitlint/cli": "^17.3.0", + "@commitlint/config-conventional": "^17.3.0", "@eartharoid/deep-merge": "^0.0.2", "babel-loader": "^9.0.0", "copy-webpack-plugin": "9.1.0", @@ -51,11 +46,14 @@ "webpack-dev-server": "^4.8.1" }, "scripts": { - "start": "webpack serve", + "dev": "vite", "updatetranslations": "cd scripts && node updatetranslations.js", - "build": "webpack --mode=production", - "chrome": "cp manifest/chrome.json build/manifest.json && cp -r manifest/_locales build/_locales && cp manifest/background-chrome.js build/background-chrome.js", - "firefox": "rm -rf build/_locales && cp manifest/firefox.json build/manifest.json" + "build": "vite build", + "chrome": "cp manifest/chrome.json dist/manifest.json && cp -r manifest/_locales dist/_locales && cp manifest/background-chrome.js dist/background-chrome.js", + "firefox": "rm -rf dist/_locales && cp manifest/firefox.json dist/manifest.json", + "pretty": "prettier --write \"./**/*.{js,jsx,json,scss}\"", + "stylelint": "npx stylelint \"**/*.scss\"", + "postinstall": "husky install" }, "browserslist": { "production": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..5bd3d715 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,5806 @@ +lockfileVersion: 5.4 + +specifiers: + '@commitlint/cli': ^17.3.0 + '@commitlint/config-conventional': ^17.3.0 + '@eartharoid/deep-merge': ^0.0.2 + '@eartharoid/i18n': 1.2.1 + '@emotion/react': ^11.10.5 + '@emotion/styled': ^11.10.5 + '@floating-ui/react-dom': ^1.0.1 + '@fontsource/lexend-deca': 4.5.12 + '@fontsource/montserrat': 4.5.13 + '@mui/material': 5.11.1 + '@sentry/react': ^7.21.1 + '@vitejs/plugin-react': 3.0.0 + embla-carousel-autoplay: ^7.0.5 + embla-carousel-react: ^7.0.5 + eslint: ^8.30.0 + eslint-config-react-app: ^7.0.1 + fast-blurhash: ^1.1.2 + husky: ^8.0.2 + image-conversion: ^2.1.1 + prettier: ^2.8.1 + react: ^18.2.0 + react-clock: 4.0.0 + react-color-gradient-picker: 0.1.2 + react-dom: ^18.2.0 + react-icons: ^4.6.0 + react-modal: 3.16.1 + react-sortable-hoc: 2.0.0 + react-toastify: 9.1.1 + sass: ^1.57.1 + stylelint: ^14.16.0 + stylelint-config-prettier-scss: ^0.0.1 + stylelint-config-standard-scss: ^6.1.0 + vite: 4.0.3 + +dependencies: + '@eartharoid/i18n': 1.2.1 + '@emotion/react': 11.10.5_react@18.2.0 + '@emotion/styled': 11.10.5_hp5f5nkljdiwilp4rgxyefcplu + '@floating-ui/react-dom': 1.0.1_biqbaboplfbrettd7655fr4n2y + '@fontsource/lexend-deca': 4.5.12 + '@fontsource/montserrat': 4.5.13 + '@mui/material': 5.11.1_5rzy53przelm5jchjmb5vr6dxy + '@sentry/react': 7.24.2_react@18.2.0 + embla-carousel-autoplay: 7.0.5 + embla-carousel-react: 7.0.5_react@18.2.0 + fast-blurhash: 1.1.2 + image-conversion: 2.1.1 + react: 18.2.0 + react-clock: 4.0.0_biqbaboplfbrettd7655fr4n2y + react-color-gradient-picker: 0.1.2_biqbaboplfbrettd7655fr4n2y + react-dom: 18.2.0_react@18.2.0 + react-icons: 4.6.0_react@18.2.0 + react-modal: 3.16.1_biqbaboplfbrettd7655fr4n2y + react-sortable-hoc: 2.0.0_biqbaboplfbrettd7655fr4n2y + react-toastify: 9.1.1_biqbaboplfbrettd7655fr4n2y + +devDependencies: + '@commitlint/cli': 17.3.0 + '@commitlint/config-conventional': 17.3.0 + '@eartharoid/deep-merge': 0.0.2 + '@vitejs/plugin-react': 3.0.0_vite@4.0.3 + eslint: 8.30.0 + eslint-config-react-app: 7.0.1_eslint@8.30.0 + husky: 8.0.2 + prettier: 2.8.1 + sass: 1.57.1 + stylelint: 14.16.0 + stylelint-config-prettier-scss: 0.0.1_stylelint@14.16.0 + stylelint-config-standard-scss: 6.1.0_stylelint@14.16.0 + vite: 4.0.3_sass@1.57.1 + +packages: + + /@ampproject/remapping/2.2.0: + resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.1.1 + '@jridgewell/trace-mapping': 0.3.14 + dev: true + + /@babel/code-frame/7.18.6: + resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + + /@babel/compat-data/7.20.10: + resolution: {integrity: sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core/7.18.6: + resolution: {integrity: sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.20.7 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.18.6 + '@babel/helper-module-transforms': 7.20.7 + '@babel/helpers': 7.20.7 + '@babel/parser': 7.20.7 + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.10 + '@babel/types': 7.20.7 + convert-source-map: 1.8.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/core/7.20.7: + resolution: {integrity: sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.20.7 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.7 + '@babel/helper-module-transforms': 7.20.7 + '@babel/helpers': 7.20.7 + '@babel/parser': 7.20.7 + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.10 + '@babel/types': 7.20.7 + convert-source-map: 1.8.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/eslint-parser/7.18.2_krbl7gjo3afxleq6arh2klsyza: + resolution: {integrity: sha512-oFQYkE8SuH14+uR51JVAmdqwKYXGRjEXx7s+WiagVjqQ+HPE+nnwyF2qlVG8evUsUHmPcA+6YXMEDbIhEyQc5A==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': '>=7.11.0' + eslint: ^7.5.0 || ^8.0.0 + dependencies: + '@babel/core': 7.18.6 + eslint: 8.30.0 + eslint-scope: 5.1.1 + eslint-visitor-keys: 2.1.0 + semver: 6.3.0 + dev: true + + /@babel/generator/7.20.7: + resolution: {integrity: sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.7 + '@jridgewell/gen-mapping': 0.3.2 + jsesc: 2.5.2 + dev: true + + /@babel/helper-annotate-as-pure/7.18.6: + resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.7 + dev: true + + /@babel/helper-builder-binary-assignment-operator-visitor/7.18.6: + resolution: {integrity: sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-explode-assignable-expression': 7.18.6 + '@babel/types': 7.20.7 + dev: true + + /@babel/helper-compilation-targets/7.20.7_@babel+core@7.18.6: + resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.20.10 + '@babel/core': 7.18.6 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.4 + lru-cache: 5.1.1 + semver: 6.3.0 + dev: true + + /@babel/helper-compilation-targets/7.20.7_@babel+core@7.20.7: + resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.20.10 + '@babel/core': 7.20.7 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.4 + lru-cache: 5.1.1 + semver: 6.3.0 + dev: true + + /@babel/helper-create-class-features-plugin/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-member-expression-to-functions': 7.18.6 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-create-regexp-features-plugin/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-annotate-as-pure': 7.18.6 + regexpu-core: 5.1.0 + dev: true + + /@babel/helper-define-polyfill-provider/0.3.1_@babel+core@7.20.7: + resolution: {integrity: sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.7 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/traverse': 7.20.10 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-environment-visitor/7.18.9: + resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-explode-assignable-expression/7.18.6: + resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.7 + dev: true + + /@babel/helper-function-name/7.19.0: + resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.20.7 + '@babel/types': 7.20.7 + dev: true + + /@babel/helper-hoist-variables/7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.7 + dev: true + + /@babel/helper-member-expression-to-functions/7.18.6: + resolution: {integrity: sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.7 + dev: true + + /@babel/helper-module-imports/7.18.6: + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.7 + + /@babel/helper-module-transforms/7.20.7: + resolution: {integrity: sha512-FNdu7r67fqMUSVuQpFQGE6BPdhJIhitoxhGzDbAXNcA07uoVG37fOiMk3OSV8rEICuyG6t8LGkd9EE64qIEoIA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-simple-access': 7.20.2 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.10 + '@babel/types': 7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-optimise-call-expression/7.18.6: + resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.7 + dev: true + + /@babel/helper-plugin-utils/7.19.0: + resolution: {integrity: sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-remap-async-to-generator/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-wrap-function': 7.18.6 + '@babel/types': 7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-replace-supers/7.18.6: + resolution: {integrity: sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-member-expression-to-functions': 7.18.6 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/traverse': 7.20.10 + '@babel/types': 7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-simple-access/7.20.2: + resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.7 + dev: true + + /@babel/helper-skip-transparent-expression-wrappers/7.18.6: + resolution: {integrity: sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.7 + dev: true + + /@babel/helper-split-export-declaration/7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.7 + dev: true + + /@babel/helper-string-parser/7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier/7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option/7.18.6: + resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-wrap-function/7.18.6: + resolution: {integrity: sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.19.0 + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.10 + '@babel/types': 7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helpers/7.20.7: + resolution: {integrity: sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.10 + '@babel/types': 7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight/7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/parser/7.20.7: + resolution: {integrity: sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.20.7 + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.6 + '@babel/plugin-proposal-optional-chaining': 7.18.6_@babel+core@7.20.7 + dev: true + + /@babel/plugin-proposal-async-generator-functions/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-remap-async-to-generator': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-create-class-features-plugin': 7.18.6_@babel+core@7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-create-class-features-plugin': 7.18.6_@babel+core@7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-decorators/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-gAdhsjaYmiZVxx5vTMiRfj31nB7LhwBJFMSLzeDxc7X4tKLixup0+k9ughn0RcpBrv9E3PBaXJW7jF5TCihAOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-create-class-features-plugin': 7.18.6_@babel+core@7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/plugin-syntax-decorators': 7.18.6_@babel+core@7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.7 + dev: true + + /@babel/plugin-proposal-export-namespace-from/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.7 + dev: true + + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.7 + dev: true + + /@babel/plugin-proposal-logical-assignment-operators/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.7 + dev: true + + /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.7 + dev: true + + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.7 + dev: true + + /@babel/plugin-proposal-object-rest-spread/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.20.10 + '@babel/core': 7.20.7 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.7 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.20.7 + dev: true + + /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.7 + dev: true + + /@babel/plugin-proposal-optional-chaining/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.6 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.7 + dev: true + + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-create-class-features-plugin': 7.18.6_@babel+core@7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.18.6_@babel+core@7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.20.7: + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.20.7: + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.20.7: + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-decorators/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-fqyLgjcxf/1yhyZ6A+yo1u9gJ7eleFQod2lkaUsF9DQ7sbbY3Ligym3L0+I2c0WmqNKDpoD9UTb1AKP3qRMOAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.20.7: + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.20.7: + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-flow/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-import-assertions/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.20.7: + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-jsx/7.18.6: + resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.20.7: + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.20.7: + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.20.7: + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.20.7: + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.20.7: + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.20.7: + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.20.7: + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.20.7: + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-typescript/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-remap-async-to-generator': 7.18.6_@babel+core@7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-block-scoping/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-classes/7.18.8_@babel+core@7.20.7: + resolution: {integrity: sha512-RySDoXdF6hgHSHuAW4aLGyVQdmvEX/iJtjVre52k0pxRq4hzqze+rAVP++NmNv596brBpYmaiKgTZby7ziBnVg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-computed-properties/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-destructuring/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-duplicate-keys/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-flow-strip-types/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-wE0xtA7csz+hw4fKPwxmu5jnzAsXPIO57XnRwzXP3T19jWh1BODnPGoG9xKYwvAwusP7iUktHayRFbMPGtODaQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-flow': 7.18.6_@babel+core@7.20.7 + dev: true + + /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.20.7: + resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-function-name/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.7 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-literals/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-module-transforms': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-commonjs/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-module-transforms': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-simple-access': 7.20.2 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-systemjs/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-validator-identifier': 7.19.1 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-module-transforms': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-parameters/7.18.8_@babel+core@7.20.7: + resolution: {integrity: sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-react-display-name/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.20.7 + dev: true + + /@babel/plugin-transform-react-jsx-self/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-react-jsx-source/7.19.6_@babel+core@7.20.7: + resolution: {integrity: sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-react-jsx/7.19.0_@babel+core@7.20.7: + resolution: {integrity: sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.7 + '@babel/types': 7.20.7 + dev: true + + /@babel/plugin-transform-react-pure-annotations/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + regenerator-transform: 0.15.0 + dev: true + + /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-runtime/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-8uRHk9ZmRSnWqUgyae249EJZ94b0yAGLBIqzZzl+0iEdbno55Pmlt/32JZsHwXD9k/uZj18Aqqk35wBX4CBTXA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + babel-plugin-polyfill-corejs2: 0.3.1_@babel+core@7.20.7 + babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.20.7 + babel-plugin-polyfill-regenerator: 0.3.1_@babel+core@7.20.7 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-spread/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.6 + dev: true + + /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-template-literals/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-typeof-symbol/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-typescript/7.18.8_@babel+core@7.20.7: + resolution: {integrity: sha512-p2xM8HI83UObjsZGofMV/EdYjamsDm6MoN3hXPYIT0+gxIoopE+B7rPYKAxfrz9K9PK7JafTTjqYC6qipLExYA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-create-class-features-plugin': 7.18.6_@babel+core@7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-unicode-escapes/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/preset-env/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.20.10 + '@babel/core': 7.20.7 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-validator-option': 7.18.6 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-async-generator-functions': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-export-namespace-from': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-logical-assignment-operators': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-object-rest-spread': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-optional-chaining': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.7 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.7 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.7 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.7 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.7 + '@babel/plugin-syntax-import-assertions': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.7 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.7 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.7 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.7 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.7 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.7 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.7 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.7 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.7 + '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-block-scoping': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-classes': 7.18.8_@babel+core@7.20.7 + '@babel/plugin-transform-computed-properties': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-destructuring': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-duplicate-keys': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.20.7 + '@babel/plugin-transform-function-name': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-literals': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-modules-amd': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-modules-systemjs': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-named-capturing-groups-regex': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.20.7 + '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-spread': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-template-literals': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-typeof-symbol': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-unicode-escapes': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.20.7 + '@babel/preset-modules': 0.1.5_@babel+core@7.20.7 + '@babel/types': 7.20.7 + babel-plugin-polyfill-corejs2: 0.3.1_@babel+core@7.20.7 + babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.20.7 + babel-plugin-polyfill-regenerator: 0.3.1_@babel+core@7.20.7 + core-js-compat: 3.23.4 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-modules/0.1.5_@babel+core@7.20.7: + resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.7 + '@babel/types': 7.20.7 + esutils: 2.0.3 + dev: true + + /@babel/preset-react/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-validator-option': 7.18.6 + '@babel/plugin-transform-react-display-name': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.20.7 + '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-react-pure-annotations': 7.18.6_@babel+core@7.20.7 + dev: true + + /@babel/preset-typescript/7.18.6_@babel+core@7.20.7: + resolution: {integrity: sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-validator-option': 7.18.6 + '@babel/plugin-transform-typescript': 7.18.8_@babel+core@7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/runtime-corejs3/7.18.6: + resolution: {integrity: sha512-cOu5wH2JFBgMjje+a+fz2JNIWU4GzYpl05oSob3UDvBEh6EuIn+TXFHMmBbhSb+k/4HMzgKCQfEEDArAWNF9Cw==} + engines: {node: '>=6.9.0'} + dependencies: + core-js-pure: 3.23.4 + regenerator-runtime: 0.13.11 + dev: true + + /@babel/runtime/7.18.6: + resolution: {integrity: sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.9 + dev: false + + /@babel/runtime/7.20.0: + resolution: {integrity: sha512-NDYdls71fTXoU8TZHfbBWg7DiZfNzClcKui/+kyi6ppD2L1qnWW3VV6CjtaBXSUGGhiTWJ6ereOIkUvenif66Q==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.11 + dev: true + + /@babel/runtime/7.20.6: + resolution: {integrity: sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.11 + + /@babel/template/7.20.7: + resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/parser': 7.20.7 + '@babel/types': 7.20.7 + dev: true + + /@babel/traverse/7.20.10: + resolution: {integrity: sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.20.7 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.20.7 + '@babel/types': 7.20.7 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types/7.20.7: + resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + + /@commitlint/cli/17.3.0: + resolution: {integrity: sha512-/H0md7TsKflKzVPz226VfXzVafJFO1f9+r2KcFvmBu08V0T56lZU1s8WL7/xlxqLMqBTVaBf7Ixtc4bskdEEZg==} + engines: {node: '>=v14'} + hasBin: true + dependencies: + '@commitlint/format': 17.0.0 + '@commitlint/lint': 17.3.0 + '@commitlint/load': 17.3.0 + '@commitlint/read': 17.2.0 + '@commitlint/types': 17.0.0 + execa: 5.1.1 + lodash.isfunction: 3.0.9 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.5.1 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /@commitlint/config-conventional/17.3.0: + resolution: {integrity: sha512-hgI+fN5xF8nhS9uG/V06xyT0nlcyvHHMkq0kwRSr96vl5BFlRGaL2C0/YY4kQagfU087tmj01bJkG9Ek98Wllw==} + engines: {node: '>=v14'} + dependencies: + conventional-changelog-conventionalcommits: 5.0.0 + dev: true + + /@commitlint/config-validator/17.1.0: + resolution: {integrity: sha512-Q1rRRSU09ngrTgeTXHq6ePJs2KrI+axPTgkNYDWSJIuS1Op4w3J30vUfSXjwn5YEJHklK3fSqWNHmBhmTR7Vdg==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.0.0 + ajv: 8.11.0 + dev: true + + /@commitlint/ensure/17.3.0: + resolution: {integrity: sha512-kWbrQHDoW5veIUQx30gXoLOCjWvwC6OOEofhPCLl5ytRPBDAQObMbxTha1Bt2aSyNE/IrJ0s0xkdZ1Gi3wJwQg==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.0.0 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + dev: true + + /@commitlint/execute-rule/17.0.0: + resolution: {integrity: sha512-nVjL/w/zuqjCqSJm8UfpNaw66V9WzuJtQvEnCrK4jDw6qKTmZB+1JQ8m6BQVZbNBcwfYdDNKnhIhqI0Rk7lgpQ==} + engines: {node: '>=v14'} + dev: true + + /@commitlint/format/17.0.0: + resolution: {integrity: sha512-MZzJv7rBp/r6ZQJDEodoZvdRM0vXu1PfQvMTNWFb8jFraxnISMTnPBWMMjr2G/puoMashwaNM//fl7j8gGV5lA==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.0.0 + chalk: 4.1.2 + dev: true + + /@commitlint/is-ignored/17.2.0: + resolution: {integrity: sha512-rgUPUQraHxoMLxiE8GK430HA7/R2vXyLcOT4fQooNrZq9ERutNrP6dw3gdKLkq22Nede3+gEHQYUzL4Wu75ndg==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.0.0 + semver: 7.3.7 + dev: true + + /@commitlint/lint/17.3.0: + resolution: {integrity: sha512-VilOTPg0i9A7CCWM49E9bl5jytfTvfTxf9iwbWAWNjxJ/A5mhPKbm3sHuAdwJ87tDk1k4j8vomYfH23iaY+1Rw==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/is-ignored': 17.2.0 + '@commitlint/parse': 17.2.0 + '@commitlint/rules': 17.3.0 + '@commitlint/types': 17.0.0 + dev: true + + /@commitlint/load/17.3.0: + resolution: {integrity: sha512-u/pV6rCAJrCUN+HylBHLzZ4qj1Ew3+eN9GBPhNi9otGxtOfA8b+8nJSxaNbcC23Ins/kcpjGf9zPSVW7628Umw==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/config-validator': 17.1.0 + '@commitlint/execute-rule': 17.0.0 + '@commitlint/resolve-extends': 17.3.0 + '@commitlint/types': 17.0.0 + '@types/node': 14.18.29 + chalk: 4.1.2 + cosmiconfig: 7.1.0 + cosmiconfig-typescript-loader: 4.1.0_4lm4arzx5mlrrw2miwgsddghji + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + resolve-from: 5.0.0 + ts-node: 10.9.1_ck2axrxkiif44rdbzjywaqjysa + typescript: 4.8.3 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /@commitlint/message/17.2.0: + resolution: {integrity: sha512-/4l2KFKxBOuoEn1YAuuNNlAU05Zt7sNsC9H0mPdPm3chOrT4rcX0pOqrQcLtdMrMkJz0gC7b3SF80q2+LtdL9Q==} + engines: {node: '>=v14'} + dev: true + + /@commitlint/parse/17.2.0: + resolution: {integrity: sha512-vLzLznK9Y21zQ6F9hf8D6kcIJRb2haAK5T/Vt1uW2CbHYOIfNsR/hJs0XnF/J9ctM20Tfsqv4zBitbYvVw7F6Q==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.0.0 + conventional-changelog-angular: 5.0.13 + conventional-commits-parser: 3.2.4 + dev: true + + /@commitlint/read/17.2.0: + resolution: {integrity: sha512-bbblBhrHkjxra3ptJNm0abxu7yeAaxumQ8ZtD6GIVqzURCETCP7Dm0tlVvGRDyXBuqX6lIJxh3W7oyKqllDsHQ==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/top-level': 17.0.0 + '@commitlint/types': 17.0.0 + fs-extra: 10.1.0 + git-raw-commits: 2.0.11 + minimist: 1.2.6 + dev: true + + /@commitlint/resolve-extends/17.3.0: + resolution: {integrity: sha512-Lf3JufJlc5yVEtJWC8o4IAZaB8FQAUaVlhlAHRACd0TTFizV2Lk2VH70et23KgvbQNf7kQzHs/2B4QZalBv6Cg==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/config-validator': 17.1.0 + '@commitlint/types': 17.0.0 + import-fresh: 3.3.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + dev: true + + /@commitlint/rules/17.3.0: + resolution: {integrity: sha512-s2UhDjC5yP2utx3WWqsnZRzjgzAX8BMwr1nltC0u0p8T/nzpkx4TojEfhlsOUj1t7efxzZRjUAV0NxNwdJyk+g==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/ensure': 17.3.0 + '@commitlint/message': 17.2.0 + '@commitlint/to-lines': 17.0.0 + '@commitlint/types': 17.0.0 + execa: 5.1.1 + dev: true + + /@commitlint/to-lines/17.0.0: + resolution: {integrity: sha512-nEi4YEz04Rf2upFbpnEorG8iymyH7o9jYIVFBG1QdzebbIFET3ir+8kQvCZuBE5pKCtViE4XBUsRZz139uFrRQ==} + engines: {node: '>=v14'} + dev: true + + /@commitlint/top-level/17.0.0: + resolution: {integrity: sha512-dZrEP1PBJvodNWYPOYiLWf6XZergdksKQaT6i1KSROLdjf5Ai0brLOv5/P+CPxBeoj3vBxK4Ax8H1Pg9t7sHIQ==} + engines: {node: '>=v14'} + dependencies: + find-up: 5.0.0 + dev: true + + /@commitlint/types/17.0.0: + resolution: {integrity: sha512-hBAw6U+SkAT5h47zDMeOu3HSiD0SODw4Aq7rRNh1ceUmL7GyLKYhPbUvlRWqZ65XjBLPHZhFyQlRaPNz8qvUyQ==} + engines: {node: '>=v14'} + dependencies: + chalk: 4.1.2 + dev: true + + /@cspotcode/source-map-support/0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@csstools/selector-specificity/2.0.2_tbwh2mpcdwdeb2slx6bobindua: + resolution: {integrity: sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + postcss-selector-parser: ^6.0.10 + dependencies: + postcss: 8.4.19 + postcss-selector-parser: 6.0.11 + dev: true + + /@eartharoid/deep-merge/0.0.2: + resolution: {integrity: sha512-t7kmNd6m7BOGxf25tE1YBhPZbgMEsXZT0tQyVV/Mlo+rcPEmiEEc6HV1DBnYm63MvMpgTk4o6yBkeAJYCMzvNg==} + dev: true + + /@eartharoid/i18n/1.2.1: + resolution: {integrity: sha512-nMQdHrGgpw+vNL5DbivELW2K3KAUGaMvTjjmFsEPf8mUW8+LAgRjvfFn2gkJq1mnlD6HoqUaHqEL4YpWr2T5MA==} + dev: false + + /@emotion/babel-plugin/11.10.5: + resolution: {integrity: sha512-xE7/hyLHJac7D2Ve9dKroBBZqBT7WuPQmWcq7HSGb84sUuP4mlOWoB8dvVfD9yk5DHkU1m6RW7xSoDtnQHNQeA==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/helper-module-imports': 7.18.6 + '@babel/plugin-syntax-jsx': 7.18.6 + '@babel/runtime': 7.20.6 + '@emotion/hash': 0.9.0 + '@emotion/memoize': 0.8.0 + '@emotion/serialize': 1.1.1 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.8.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.1.3 + dev: false + + /@emotion/cache/11.10.5: + resolution: {integrity: sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==} + dependencies: + '@emotion/memoize': 0.8.0 + '@emotion/sheet': 1.2.1 + '@emotion/utils': 1.2.0 + '@emotion/weak-memoize': 0.3.0 + stylis: 4.1.3 + dev: false + + /@emotion/hash/0.9.0: + resolution: {integrity: sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==} + dev: false + + /@emotion/is-prop-valid/1.2.0: + resolution: {integrity: sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==} + dependencies: + '@emotion/memoize': 0.8.0 + dev: false + + /@emotion/memoize/0.8.0: + resolution: {integrity: sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==} + dev: false + + /@emotion/react/11.10.5_react@18.2.0: + resolution: {integrity: sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A==} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.18.6 + '@emotion/babel-plugin': 11.10.5 + '@emotion/cache': 11.10.5 + '@emotion/serialize': 1.1.1 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.0_react@18.2.0 + '@emotion/utils': 1.2.0 + '@emotion/weak-memoize': 0.3.0 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + dev: false + + /@emotion/serialize/1.1.1: + resolution: {integrity: sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==} + dependencies: + '@emotion/hash': 0.9.0 + '@emotion/memoize': 0.8.0 + '@emotion/unitless': 0.8.0 + '@emotion/utils': 1.2.0 + csstype: 3.1.1 + dev: false + + /@emotion/sheet/1.2.1: + resolution: {integrity: sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==} + dev: false + + /@emotion/styled/11.10.5_hp5f5nkljdiwilp4rgxyefcplu: + resolution: {integrity: sha512-8EP6dD7dMkdku2foLoruPCNkRevzdcBaY6q0l0OsbyJK+x8D9HWjX27ARiSIKNF634hY9Zdoedh8bJCiva8yZw==} + peerDependencies: + '@babel/core': ^7.0.0 + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.18.6 + '@emotion/babel-plugin': 11.10.5 + '@emotion/is-prop-valid': 1.2.0 + '@emotion/react': 11.10.5_react@18.2.0 + '@emotion/serialize': 1.1.1 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.0_react@18.2.0 + '@emotion/utils': 1.2.0 + react: 18.2.0 + dev: false + + /@emotion/unitless/0.8.0: + resolution: {integrity: sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==} + dev: false + + /@emotion/use-insertion-effect-with-fallbacks/1.0.0_react@18.2.0: + resolution: {integrity: sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + dev: false + + /@emotion/utils/1.2.0: + resolution: {integrity: sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==} + dev: false + + /@emotion/weak-memoize/0.3.0: + resolution: {integrity: sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==} + dev: false + + /@esbuild/android-arm/0.16.10: + resolution: {integrity: sha512-RmJjQTRrO6VwUWDrzTBLmV4OJZTarYsiepLGlF2rYTVB701hSorPywPGvP6d8HCuuRibyXa5JX4s3jN2kHEtjQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64/0.16.10: + resolution: {integrity: sha512-47Y+NwVKTldTlDhSgJHZ/RpvBQMUDG7eKihqaF/u6g7s0ZPz4J1vy8A3rwnnUOF2CuDn7w7Gj/QcMoWz3U3SJw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64/0.16.10: + resolution: {integrity: sha512-C4PfnrBMcuAcOurQzpF1tTtZz94IXO5JmICJJ3NFJRHbXXsQUg9RFG45KvydKqtFfBaFLCHpduUkUfXwIvGnRg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64/0.16.10: + resolution: {integrity: sha512-bH/bpFwldyOKdi9HSLCLhhKeVgRYr9KblchwXgY2NeUHBB/BzTUHtUSBgGBmpydB1/4E37m+ggXXfSrnD7/E7g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64/0.16.10: + resolution: {integrity: sha512-OXt7ijoLuy+AjDSKQWu+KdDFMBbdeaL6wtgMKtDUXKWHiAMKHan5+R1QAG6HD4+K0nnOvEJXKHeA9QhXNAjOTQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64/0.16.10: + resolution: {integrity: sha512-shSQX/3GHuspE3Uxtq5kcFG/zqC+VuMnJkqV7LczO41cIe6CQaXHD3QdMLA4ziRq/m0vZo7JdterlgbmgNIAlQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64/0.16.10: + resolution: {integrity: sha512-5YVc1zdeaJGASijZmTzSO4h6uKzsQGG3pkjI6fuXvolhm3hVRhZwnHJkforaZLmzvNv5Tb7a3QL2FAVmrgySIA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm/0.16.10: + resolution: {integrity: sha512-c360287ZWI2miBnvIj23bPyVctgzeMT2kQKR+x94pVqIN44h3GF8VMEs1SFPH1UgyDr3yBbx3vowDS1SVhyVhA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64/0.16.10: + resolution: {integrity: sha512-2aqeNVxIaRfPcIaMZIFoblLh588sWyCbmj1HHCCs9WmeNWm+EIN0SmvsmPvTa/TsNZFKnxTcvkX2eszTcCqIrA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32/0.16.10: + resolution: {integrity: sha512-sqMIEWeyrLGU7J5RB5fTkLRIFwsgsQ7ieWXlDLEmC2HblPYGb3AucD7inw2OrKFpRPKsec1l+lssiM3+NV5aOw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.16.10: + resolution: {integrity: sha512-O7Pd5hLEtTg37NC73pfhUOGTjx/+aXu5YoSq3ahCxcN7Bcr2F47mv+kG5t840thnsEzrv0oB70+LJu3gUgchvg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el/0.16.10: + resolution: {integrity: sha512-FN8mZOH7531iPHM0kaFhAOqqNHoAb6r/YHW2ZIxNi0a85UBi2DO4Vuyn7t1p4UN8a4LoAnLOT1PqNgHkgBJgbA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64/0.16.10: + resolution: {integrity: sha512-Dg9RiqdvHOAWnOKIOTsIx8dFX9EDlY2IbPEY7YFzchrCiTZmMkD7jWA9UdZbNUygPjdmQBVPRCrLydReFlX9yg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64/0.16.10: + resolution: {integrity: sha512-XMqtpjwzbmlar0BJIxmzu/RZ7EWlfVfH68Vadrva0Wj5UKOdKvqskuev2jY2oPV3aoQUyXwnMbMrFmloO2GfAw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x/0.16.10: + resolution: {integrity: sha512-fu7XtnoeRNFMx8DjK3gPWpFBDM2u5ba+FYwg27SjMJwKvJr4bDyKz5c+FLXLUSSAkMAt/UL+cUbEbra+rYtUgw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64/0.16.10: + resolution: {integrity: sha512-61lcjVC/RldNNMUzQQdyCWjCxp9YLEQgIxErxU9XluX7juBdGKb0pvddS0vPNuCvotRbzijZ1pzII+26haWzbA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64/0.16.10: + resolution: {integrity: sha512-JeZXCX3viSA9j4HqSoygjssdqYdfHd6yCFWyfSekLbz4Ef+D2EjvsN02ZQPwYl5a5gg/ehdHgegHhlfOFP0HCA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64/0.16.10: + resolution: {integrity: sha512-3qpxQKuEVIIg8SebpXsp82OBrqjPV/OwNWmG+TnZDr3VGyChNnGMHccC1xkbxCHDQNnnXjxhMQNyHmdFJbmbRA==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64/0.16.10: + resolution: {integrity: sha512-z+q0xZ+et/7etz7WoMyXTHZ1rB8PMSNp/FOqURLJLOPb3GWJ2aj4oCqFCjPwEbW1rsT7JPpxeH/DwGAWk/I1Bg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64/0.16.10: + resolution: {integrity: sha512-+YYu5sbQ9npkNT9Dec+tn1F/kjg6SMgr6bfi/6FpXYZvCRfu2YFPZGb+3x8K30s8eRxFpoG4sGhiSUkr1xbHEw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32/0.16.10: + resolution: {integrity: sha512-Aw7Fupk7XNehR1ftHGYwUteyJ2q+em/aE+fVU3YMTBN2V5A7Z4aVCSV+SvCp9HIIHZavPFBpbdP3VfjQpdf6Xg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64/0.16.10: + resolution: {integrity: sha512-qddWullt3sC1EIpfHvCRBq3H4g3L86DZpD6n8k2XFjFVyp01D++uNbN1hT/JRsHxTbyyemZcpwL5aRlJwc/zFw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint/eslintrc/1.4.0: + resolution: {integrity: sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.4.0 + globals: 13.19.0 + ignore: 5.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@floating-ui/core/1.0.4: + resolution: {integrity: sha512-FPFLbg2b06MIw1dqk2SOEMAMX3xlrreGjcui5OTxfBDtaKTmh0kioOVjT8gcfl58juawL/yF+S+gnq8aUYQx/Q==} + dev: false + + /@floating-ui/dom/1.0.9: + resolution: {integrity: sha512-nF9P6/BoARdt+h+CdUW3td4EUVngeDONCGuzRgnZveRZiJETx63cxhinE0JaPPC2tbcdTY9IGZocS5/7ag3xRg==} + dependencies: + '@floating-ui/core': 1.0.4 + dev: false + + /@floating-ui/react-dom/1.0.1_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-UW0t1Gi8ikbDRr8cQPVcqIDMBwUEENe5V4wlHWdrJ5egFnRQFBV9JirauTBFI6S8sM1qFUC1i+qa3g87E6CLTw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/dom': 1.0.9 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + dev: false + + /@fontsource/lexend-deca/4.5.12: + resolution: {integrity: sha512-s2YGWrMlrthMU0zV9JlB1a/Bjy6C8cWXJYkz0KTmNO3rN3LOYwm4H4bLFRkZaqw+LoNrivm8uMS0AtdmDTp6xg==} + dev: false + + /@fontsource/montserrat/4.5.13: + resolution: {integrity: sha512-/XlcNsMFjdWX4Away8Ax/4NgND8Ckk9gVDwgz1sfxF6h+gFHChLOV0IvPrUfCQjZ1F35igg+nR9bSxmjsYEskQ==} + dev: false + + /@humanwhocodes/config-array/0.11.8: + resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer/1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema/1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@jridgewell/gen-mapping/0.1.1: + resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/gen-mapping/0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.14 + dev: true + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array/1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/trace-mapping/0.3.14: + resolution: {integrity: sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/trace-mapping/0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@mui/base/5.0.0-alpha.111_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-2wfIPpl97S4dPzD0QOM3UIzQ/EuXCYQvHmXxTpfKxev/cfkzOe7Ik/McoYUBbtM1bSOqH3W276R/L2LF9cyXqQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.20.6 + '@emotion/is-prop-valid': 1.2.0 + '@mui/types': 7.2.3 + '@mui/utils': 5.11.1_react@18.2.0 + '@popperjs/core': 2.11.6 + clsx: 1.2.1 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + react-is: 18.2.0 + dev: false + + /@mui/core-downloads-tracker/5.11.1: + resolution: {integrity: sha512-QVqVNlZ2K+LqUDE5kFgYd0r4KekR/dv2cNYbAutQWbfOA8VPVUVrDz0ELrEcoe8TjM/CwnsmGvaDh/YSNl/ALA==} + dev: false + + /@mui/material/5.11.1_5rzy53przelm5jchjmb5vr6dxy: + resolution: {integrity: sha512-yaZiXvcrl2vgUK+VO24780BWRgwdAMmAyuMVZnRTts1Yu0tWd6PjIYq2ZtaOlpj6/LbaSS+Q2kSfxYnDQ20CEQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.20.6 + '@emotion/react': 11.10.5_react@18.2.0 + '@emotion/styled': 11.10.5_hp5f5nkljdiwilp4rgxyefcplu + '@mui/base': 5.0.0-alpha.111_biqbaboplfbrettd7655fr4n2y + '@mui/core-downloads-tracker': 5.11.1 + '@mui/system': 5.11.1_dovxhg2tvkkxkdnqyoum6wzcxm + '@mui/types': 7.2.3 + '@mui/utils': 5.11.1_react@18.2.0 + '@types/react-transition-group': 4.4.5 + clsx: 1.2.1 + csstype: 3.1.1 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + react-is: 18.2.0 + react-transition-group: 4.4.5_biqbaboplfbrettd7655fr4n2y + dev: false + + /@mui/private-theming/5.11.1_react@18.2.0: + resolution: {integrity: sha512-nnHg7kA5RwFRhy0wiDYe59sLCVGORpPypL1JcEdhv0+N0Zbmc2E/y4z2zqMRZ62MAEscpro7cQbvv244ThA84A==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.20.6 + '@mui/utils': 5.11.1_react@18.2.0 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@mui/styled-engine/5.11.0_dovxhg2tvkkxkdnqyoum6wzcxm: + resolution: {integrity: sha512-AF06K60Zc58qf0f7X+Y/QjaHaZq16znliLnGc9iVrV/+s8Ln/FCoeNuFvhlCbZZQ5WQcJvcy59zp0nXrklGGPQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.4.1 + '@emotion/styled': ^11.3.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + dependencies: + '@babel/runtime': 7.20.6 + '@emotion/cache': 11.10.5 + '@emotion/react': 11.10.5_react@18.2.0 + '@emotion/styled': 11.10.5_hp5f5nkljdiwilp4rgxyefcplu + csstype: 3.1.1 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@mui/system/5.11.1_dovxhg2tvkkxkdnqyoum6wzcxm: + resolution: {integrity: sha512-BEA2S0hay8n8CcZftkeAVsi0nsb5ZjdnZRCahv5lX7QJYwDjO4ucJ6lnvxHe2v/9Te1LLjTO7ojxu/qM6CE5Cg==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.20.6 + '@emotion/react': 11.10.5_react@18.2.0 + '@emotion/styled': 11.10.5_hp5f5nkljdiwilp4rgxyefcplu + '@mui/private-theming': 5.11.1_react@18.2.0 + '@mui/styled-engine': 5.11.0_dovxhg2tvkkxkdnqyoum6wzcxm + '@mui/types': 7.2.3 + '@mui/utils': 5.11.1_react@18.2.0 + clsx: 1.2.1 + csstype: 3.1.1 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@mui/types/7.2.3: + resolution: {integrity: sha512-tZ+CQggbe9Ol7e/Fs5RcKwg/woU+o8DCtOnccX6KmbBc7YrfqMYEYuaIcXHuhpT880QwNkZZ3wQwvtlDFA2yOw==} + peerDependencies: + '@types/react': '*' + peerDependenciesMeta: + '@types/react': + optional: true + dev: false + + /@mui/utils/5.11.1_react@18.2.0: + resolution: {integrity: sha512-lMAPgIJoil8V9ZxsMbEflMsvZmWcHbRVMc4JDY9jPO9V4welpF43h/O267b1RqlcRnC5MEbVQV605GYkTZY29Q==} + engines: {node: '>=12.0.0'} + peerDependencies: + react: ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.20.6 + '@types/prop-types': 15.7.5 + '@types/react-is': 17.0.3 + prop-types: 15.8.1 + react: 18.2.0 + react-is: 18.2.0 + dev: false + + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.13.0 + dev: true + + /@popperjs/core/2.11.6: + resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==} + dev: false + + /@rushstack/eslint-patch/1.1.4: + resolution: {integrity: sha512-LwzQKA4vzIct1zNZzBmRKI9QuNpLgTQMEjsQLf3BXuGYb3QPTP4Yjf6mkdX+X1mYttZ808QpOwAzZjv28kq7DA==} + dev: true + + /@sentry/browser/7.24.2: + resolution: {integrity: sha512-X6NbQT0Dp+h54j73TPLgWf3yyLyTZGJI5WQSGEsNIroqhVzD3UF8M+E+3roYpSJDDyYdfuM+WBme+MYkmeqHIw==} + engines: {node: '>=8'} + dependencies: + '@sentry/core': 7.24.2 + '@sentry/types': 7.24.2 + '@sentry/utils': 7.24.2 + tslib: 1.14.1 + dev: false + + /@sentry/core/7.24.2: + resolution: {integrity: sha512-CDfrVvr3PQ0qImJv7/6yN/5hxhwxy1HicxTL9K5RwSDoXqgK3kUGv/WmTvPNIVB2RQKodLwzS2T52NFRxRoqNw==} + engines: {node: '>=8'} + dependencies: + '@sentry/types': 7.24.2 + '@sentry/utils': 7.24.2 + tslib: 1.14.1 + dev: false + + /@sentry/react/7.24.2_react@18.2.0: + resolution: {integrity: sha512-NK4/SDIWyQVYdi/EPfHfp7d0+flGNHbBuqV/GG/+CLSekUCuACsczSEWgMSyEad4ptbF9850yt5WN15oL5vAXg==} + engines: {node: '>=8'} + peerDependencies: + react: 15.x || 16.x || 17.x || 18.x + dependencies: + '@sentry/browser': 7.24.2 + '@sentry/types': 7.24.2 + '@sentry/utils': 7.24.2 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + tslib: 1.14.1 + dev: false + + /@sentry/types/7.24.2: + resolution: {integrity: sha512-x2LEnKBPzUVzTGspvB0CjZmt1dWeJsLVHGeDKPUMUm004nIscFCxJsmYefqaJQdaIUMqDit5ApwcmKchuK6VKQ==} + engines: {node: '>=8'} + dev: false + + /@sentry/utils/7.24.2: + resolution: {integrity: sha512-VuuYEF39v43Qk6YZMid8Em/N0HqCsS5ItuTSvunMtBai2dzDAIkJ2LqemF95wWFAXrzpLy4Nx3QyGVHayMn31A==} + engines: {node: '>=8'} + dependencies: + '@sentry/types': 7.24.2 + tslib: 1.14.1 + dev: false + + /@tsconfig/node10/1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: true + + /@tsconfig/node12/1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + + /@tsconfig/node14/1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + + /@tsconfig/node16/1.0.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + dev: true + + /@types/json-schema/7.0.11: + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + dev: true + + /@types/json5/0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/minimist/1.2.2: + resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + dev: true + + /@types/node/14.18.29: + resolution: {integrity: sha512-LhF+9fbIX4iPzhsRLpK5H7iPdvW8L4IwGciXQIOEcuF62+9nw/VQVsOViAOOGxY3OlOKGLFv0sWwJXdwQeTn6A==} + dev: true + + /@types/normalize-package-data/2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + dev: true + + /@types/parse-json/4.0.0: + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + + /@types/prop-types/15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + dev: false + + /@types/react-is/17.0.3: + resolution: {integrity: sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==} + dependencies: + '@types/react': 18.0.15 + dev: false + + /@types/react-transition-group/4.4.5: + resolution: {integrity: sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==} + dependencies: + '@types/react': 18.0.15 + dev: false + + /@types/react/18.0.15: + resolution: {integrity: sha512-iz3BtLuIYH1uWdsv6wXYdhozhqj20oD4/Hk2DNXIn1kFsmp9x8d9QB6FnPhfkbhd2PgEONt9Q1x/ebkwjfFLow==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.2 + csstype: 3.1.1 + dev: false + + /@types/scheduler/0.16.2: + resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} + dev: false + + /@typescript-eslint/eslint-plugin/5.30.6_vkwc4bxqxepa4ve5c5e2o3abca: + resolution: {integrity: sha512-J4zYMIhgrx4MgnZrSDD7sEnQp7FmhKNOaqaOpaoQ/SfdMfRB/0yvK74hTnvH+VQxndZynqs5/Hn4t+2/j9bADg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/parser': 5.30.6_eslint@8.30.0 + '@typescript-eslint/scope-manager': 5.30.6 + '@typescript-eslint/type-utils': 5.30.6_eslint@8.30.0 + '@typescript-eslint/utils': 5.30.6_eslint@8.30.0 + debug: 4.3.4 + eslint: 8.30.0 + functional-red-black-tree: 1.0.1 + ignore: 5.2.1 + regexpp: 3.2.0 + semver: 7.3.7 + tsutils: 3.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/experimental-utils/5.30.6_eslint@8.30.0: + resolution: {integrity: sha512-bqvT+0L8IjtW7MCrMgm9oVNxs4g7mESro1mm5c1/SNfTnHuFTf9OUX1WzVkTz75M9cp//UrTrSmGvK48NEKshQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@typescript-eslint/utils': 5.30.6_eslint@8.30.0 + eslint: 8.30.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/parser/5.30.6_eslint@8.30.0: + resolution: {integrity: sha512-gfF9lZjT0p2ZSdxO70Xbw8w9sPPJGfAdjK7WikEjB3fcUI/yr9maUVEdqigBjKincUYNKOmf7QBMiTf719kbrA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.30.6 + '@typescript-eslint/types': 5.30.6 + '@typescript-eslint/typescript-estree': 5.30.6 + debug: 4.3.4 + eslint: 8.30.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager/5.30.6: + resolution: {integrity: sha512-Hkq5PhLgtVoW1obkqYH0i4iELctEKixkhWLPTYs55doGUKCASvkjOXOd/pisVeLdO24ZX9D6yymJ/twqpJiG3g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.30.6 + '@typescript-eslint/visitor-keys': 5.30.6 + dev: true + + /@typescript-eslint/type-utils/5.30.6_eslint@8.30.0: + resolution: {integrity: sha512-GFVVzs2j0QPpM+NTDMXtNmJKlF842lkZKDSanIxf+ArJsGeZUIaeT4jGg+gAgHt7AcQSFwW7htzF/rbAh2jaVA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/utils': 5.30.6_eslint@8.30.0 + debug: 4.3.4 + eslint: 8.30.0 + tsutils: 3.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types/5.30.6: + resolution: {integrity: sha512-HdnP8HioL1F7CwVmT4RaaMX57RrfqsOMclZc08wGMiDYJBsLGBM7JwXM4cZJmbWLzIR/pXg1kkrBBVpxTOwfUg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree/5.30.6: + resolution: {integrity: sha512-Z7TgPoeYUm06smfEfYF0RBkpF8csMyVnqQbLYiGgmUSTaSXTP57bt8f0UFXstbGxKIreTwQCujtaH0LY9w9B+A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.30.6 + '@typescript-eslint/visitor-keys': 5.30.6 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.3.7 + tsutils: 3.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils/5.30.6_eslint@8.30.0: + resolution: {integrity: sha512-xFBLc/esUbLOJLk9jKv0E9gD/OH966M40aY9jJ8GiqpSkP2xOV908cokJqqhVd85WoIvHVHYXxSFE4cCSDzVvA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.11 + '@typescript-eslint/scope-manager': 5.30.6 + '@typescript-eslint/types': 5.30.6 + '@typescript-eslint/typescript-estree': 5.30.6 + eslint: 8.30.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.30.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys/5.30.6: + resolution: {integrity: sha512-41OiCjdL2mCaSDi2SvYbzFLlqqlm5v1ZW9Ym55wXKL/Rx6OOB1IbuFGo71Fj6Xy90gJDFTlgOS+vbmtGHPTQQA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.30.6 + eslint-visitor-keys: 3.3.0 + dev: true + + /@vitejs/plugin-react/3.0.0_vite@4.0.3: + resolution: {integrity: sha512-1mvyPc0xYW5G8CHQvJIJXLoMjl5Ct3q2g5Y2s6Ccfgwm45y48LBvsla7az+GkkAtYikWQ4Lxqcsq5RHLcZgtNQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 + dependencies: + '@babel/core': 7.20.7 + '@babel/plugin-transform-react-jsx-self': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-react-jsx-source': 7.19.6_@babel+core@7.20.7 + magic-string: 0.27.0 + react-refresh: 0.14.0 + vite: 4.0.3_sass@1.57.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@wojtekmaj/date-utils/1.0.3: + resolution: {integrity: sha512-1VPkkTBk07gMR1fjpBtse4G+oJqpmE+0gUFB0dg3VIL7qJmUVaBoD/vlzMm/jNeOPfvlmerl1lpnsZyBUFIRuw==} + dev: false + + /JSONStream/1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: true + + /acorn-jsx/5.3.2_acorn@8.8.0: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.8.0 + dev: true + + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn/8.8.0: + resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ajv/6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv/8.11.0: + resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /anymatch/3.1.2: + resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /arg/4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /argparse/2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /aria-query/4.2.2: + resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==} + engines: {node: '>=6.0'} + dependencies: + '@babel/runtime': 7.20.6 + '@babel/runtime-corejs3': 7.18.6 + dev: true + + /array-ify/1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + dev: true + + /array-includes/3.1.5: + resolution: {integrity: sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 + get-intrinsic: 1.1.2 + is-string: 1.0.7 + dev: true + + /array-union/2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array.prototype.flat/1.3.0: + resolution: {integrity: sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.flatmap/1.3.0: + resolution: {integrity: sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 + es-shim-unscopables: 1.0.0 + dev: true + + /arrify/1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /ast-types-flow/0.0.7: + resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} + dev: true + + /astral-regex/2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + dev: true + + /axe-core/4.4.3: + resolution: {integrity: sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==} + engines: {node: '>=4'} + dev: true + + /axobject-query/2.2.0: + resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==} + dev: true + + /babel-plugin-dynamic-import-node/2.3.3: + resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} + dependencies: + object.assign: 4.1.2 + dev: true + + /babel-plugin-macros/3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + dependencies: + '@babel/runtime': 7.20.6 + cosmiconfig: 7.1.0 + resolve: 1.22.1 + + /babel-plugin-polyfill-corejs2/0.3.1_@babel+core@7.20.7: + resolution: {integrity: sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.20.10 + '@babel/core': 7.20.7 + '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.20.7 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3/0.5.2_@babel+core@7.20.7: + resolution: {integrity: sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.20.7 + core-js-compat: 3.23.4 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator/0.3.1_@babel+core@7.20.7: + resolution: {integrity: sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.7 + '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-transform-react-remove-prop-types/0.4.24: + resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} + dev: true + + /babel-preset-react-app/10.0.1: + resolution: {integrity: sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==} + dependencies: + '@babel/core': 7.20.7 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-decorators': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-optional-chaining': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-flow-strip-types': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-react-display-name': 7.18.6_@babel+core@7.20.7 + '@babel/plugin-transform-runtime': 7.18.6_@babel+core@7.20.7 + '@babel/preset-env': 7.18.6_@babel+core@7.20.7 + '@babel/preset-react': 7.18.6_@babel+core@7.20.7 + '@babel/preset-typescript': 7.18.6_@babel+core@7.20.7 + '@babel/runtime': 7.20.0 + babel-plugin-macros: 3.1.0 + babel-plugin-transform-react-remove-prop-types: 0.4.24 + transitivePeerDependencies: + - supports-color + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /balanced-match/2.0.0: + resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + dev: true + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browserslist/4.21.4: + resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001426 + electron-to-chromium: 1.4.284 + node-releases: 2.0.6 + update-browserslist-db: 1.0.10_browserslist@4.21.4 + dev: true + + /call-bind/1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.1.2 + dev: true + + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /camelcase-keys/6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase/5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /caniuse-lite/1.0.30001426: + resolution: {integrity: sha512-n7cosrHLl8AWt0wwZw/PJZgUg3lV0gk9LMI7ikGJwhyhgsd2Nb65vKvmSexCqq/J7rbH3mFG6yZZiPR5dLPW5A==} + dev: true + + /chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.2 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /cliui/7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clsx/1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + dev: false + + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name/1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /colord/2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + dev: true + + /compare-func/2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: true + + /concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /confusing-browser-globals/1.0.11: + resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + dev: true + + /conventional-changelog-angular/5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + dev: true + + /conventional-changelog-conventionalcommits/5.0.0: + resolution: {integrity: sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + lodash: 4.17.21 + q: 1.5.1 + dev: true + + /conventional-commits-parser/3.2.4: + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /convert-source-map/1.8.0: + resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} + dependencies: + safe-buffer: 5.1.2 + + /core-js-compat/3.23.4: + resolution: {integrity: sha512-RkSRPe+JYEoflcsuxJWaiMPhnZoFS51FcIxm53k4KzhISCBTmaGlto9dTIrYuk0hnJc3G6pKufAKepHnBq6B6Q==} + dependencies: + browserslist: 4.21.4 + semver: 7.0.0 + dev: true + + /core-js-pure/3.23.4: + resolution: {integrity: sha512-lizxkcgj3XDmi7TUBFe+bQ1vNpD5E4t76BrBWI3HdUxdw/Mq1VF4CkiHzIKyieECKtcODK2asJttoofEeUKICQ==} + requiresBuild: true + dev: true + + /cosmiconfig-typescript-loader/4.1.0_4lm4arzx5mlrrw2miwgsddghji: + resolution: {integrity: sha512-HbWIuR5O+XO5Oj9SZ5bzgrD4nN+rfhrm2PMb0FVx+t+XIvC45n8F0oTNnztXtspWGw0i2IzHaUWFD5LzV1JB4A==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=7' + ts-node: '>=10' + typescript: '>=3' + dependencies: + '@types/node': 14.18.29 + cosmiconfig: 7.1.0 + ts-node: 10.9.1_ck2axrxkiif44rdbzjywaqjysa + typescript: 4.8.3 + dev: true + + /cosmiconfig/7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + /create-require/1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /cross-spawn/7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /css-functions-list/3.1.0: + resolution: {integrity: sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==} + engines: {node: '>=12.22'} + dev: true + + /cssesc/3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /csstype/3.1.1: + resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} + dev: false + + /damerau-levenshtein/1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + dev: true + + /dargs/7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + dev: true + + /debug/2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug/3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /decamelize-keys/1.1.0: + resolution: {integrity: sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize/1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /deep-is/0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /define-properties/1.1.4: + resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: true + + /diff/4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /dir-glob/3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine/2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine/3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dom-helpers/5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dependencies: + '@babel/runtime': 7.20.6 + csstype: 3.1.1 + dev: false + + /dot-prop/5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: true + + /electron-to-chromium/1.4.284: + resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} + dev: true + + /embla-carousel-autoplay/7.0.5: + resolution: {integrity: sha512-3tvlhJuBvyj99k/SBIHTZ1dNdAVjK0LOH1NFXbV5GCaaeyENHt1Uv/h5C2+fHdMGLovUs5PeuwCQL1LFnjz/xw==} + peerDependencies: + embla-carousel: 7.0.5 + dev: false + + /embla-carousel-react/7.0.5_react@18.2.0: + resolution: {integrity: sha512-qhw980gKj7G+O5d3WSwj0TyhcbpGP3DqJPiAatt1t3wEEcZqn7csaIfLh4e1N/0kna9sZfZZRzz+//NSrUodSg==} + peerDependencies: + react: ^16.8.0 || ^17.0.1 || ^18.0.0 + dependencies: + embla-carousel: 7.0.5 + react: 18.2.0 + dev: false + + /embla-carousel/7.0.5: + resolution: {integrity: sha512-loRcu0La0F7bhEMwbvgpi14iaaIEdwacH1xoplnaYfwN4KMgECkiuLgu4lx+v6MYd6lSpg/bw7ZxEuLUwYjavg==} + dev: false + + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /emoji-regex/9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /error-ex/1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + + /es-abstract/1.20.1: + resolution: {integrity: sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + es-to-primitive: 1.2.1 + function-bind: 1.1.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.1.2 + get-symbol-description: 1.0.0 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-symbols: 1.0.3 + internal-slot: 1.0.3 + is-callable: 1.2.4 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-weakref: 1.0.2 + object-inspect: 1.12.2 + object-keys: 1.1.1 + object.assign: 4.1.2 + regexp.prototype.flags: 1.4.3 + string.prototype.trimend: 1.0.5 + string.prototype.trimstart: 1.0.5 + unbox-primitive: 1.0.2 + dev: true + + /es-shim-unscopables/1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + dependencies: + has: 1.0.3 + dev: true + + /es-to-primitive/1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.4 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /esbuild/0.16.10: + resolution: {integrity: sha512-z5dIViHoVnw2l+NCJ3zj5behdXjYvXne9gL18OOivCadXDUhyDkeSvEtLcGVAJW2fNmh33TDUpsi704XYlDodw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.16.10 + '@esbuild/android-arm64': 0.16.10 + '@esbuild/android-x64': 0.16.10 + '@esbuild/darwin-arm64': 0.16.10 + '@esbuild/darwin-x64': 0.16.10 + '@esbuild/freebsd-arm64': 0.16.10 + '@esbuild/freebsd-x64': 0.16.10 + '@esbuild/linux-arm': 0.16.10 + '@esbuild/linux-arm64': 0.16.10 + '@esbuild/linux-ia32': 0.16.10 + '@esbuild/linux-loong64': 0.16.10 + '@esbuild/linux-mips64el': 0.16.10 + '@esbuild/linux-ppc64': 0.16.10 + '@esbuild/linux-riscv64': 0.16.10 + '@esbuild/linux-s390x': 0.16.10 + '@esbuild/linux-x64': 0.16.10 + '@esbuild/netbsd-x64': 0.16.10 + '@esbuild/openbsd-x64': 0.16.10 + '@esbuild/sunos-x64': 0.16.10 + '@esbuild/win32-arm64': 0.16.10 + '@esbuild/win32-ia32': 0.16.10 + '@esbuild/win32-x64': 0.16.10 + dev: true + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp/1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp/4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /eslint-config-react-app/7.0.1_eslint@8.30.0: + resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} + engines: {node: '>=14.0.0'} + peerDependencies: + eslint: ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/core': 7.18.6 + '@babel/eslint-parser': 7.18.2_krbl7gjo3afxleq6arh2klsyza + '@rushstack/eslint-patch': 1.1.4 + '@typescript-eslint/eslint-plugin': 5.30.6_vkwc4bxqxepa4ve5c5e2o3abca + '@typescript-eslint/parser': 5.30.6_eslint@8.30.0 + babel-preset-react-app: 10.0.1 + confusing-browser-globals: 1.0.11 + eslint: 8.30.0 + eslint-plugin-flowtype: 8.0.3_eslint@8.30.0 + eslint-plugin-import: 2.26.0_vkwc4bxqxepa4ve5c5e2o3abca + eslint-plugin-jest: 25.7.0_3ftqz7icbtmyqg6nqjchwoahum + eslint-plugin-jsx-a11y: 6.6.0_eslint@8.30.0 + eslint-plugin-react: 7.30.1_eslint@8.30.0 + eslint-plugin-react-hooks: 4.6.0_eslint@8.30.0 + eslint-plugin-testing-library: 5.5.1_eslint@8.30.0 + transitivePeerDependencies: + - '@babel/plugin-syntax-flow' + - '@babel/plugin-transform-react-jsx' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + dev: true + + /eslint-import-resolver-node/0.3.6: + resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==} + dependencies: + debug: 3.2.7 + resolve: 1.22.1 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils/2.7.3_bsugbhruclroeiaqnd7gqoy7ya: + resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 5.30.6_eslint@8.30.0 + debug: 3.2.7 + eslint-import-resolver-node: 0.3.6 + find-up: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-flowtype/8.0.3_eslint@8.30.0: + resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@babel/plugin-syntax-flow': ^7.14.5 + '@babel/plugin-transform-react-jsx': ^7.14.9 + eslint: ^8.1.0 + dependencies: + eslint: 8.30.0 + lodash: 4.17.21 + string-natural-compare: 3.0.1 + dev: true + + /eslint-plugin-import/2.26.0_vkwc4bxqxepa4ve5c5e2o3abca: + resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 5.30.6_eslint@8.30.0 + array-includes: 3.1.5 + array.prototype.flat: 1.3.0 + debug: 2.6.9 + doctrine: 2.1.0 + eslint: 8.30.0 + eslint-import-resolver-node: 0.3.6 + eslint-module-utils: 2.7.3_bsugbhruclroeiaqnd7gqoy7ya + has: 1.0.3 + is-core-module: 2.9.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.5 + resolve: 1.22.1 + tsconfig-paths: 3.14.1 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-jest/25.7.0_3ftqz7icbtmyqg6nqjchwoahum: + resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^4.0.0 || ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 5.30.6_vkwc4bxqxepa4ve5c5e2o3abca + '@typescript-eslint/experimental-utils': 5.30.6_eslint@8.30.0 + eslint: 8.30.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /eslint-plugin-jsx-a11y/6.6.0_eslint@8.30.0: + resolution: {integrity: sha512-kTeLuIzpNhXL2CwLlc8AHI0aFRwWHcg483yepO9VQiHzM9bZwJdzTkzBszbuPrbgGmq2rlX/FaT2fJQsjUSHsw==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + '@babel/runtime': 7.20.0 + aria-query: 4.2.2 + array-includes: 3.1.5 + ast-types-flow: 0.0.7 + axe-core: 4.4.3 + axobject-query: 2.2.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 8.30.0 + has: 1.0.3 + jsx-ast-utils: 3.3.2 + language-tags: 1.0.5 + minimatch: 3.1.2 + semver: 6.3.0 + dev: true + + /eslint-plugin-react-hooks/4.6.0_eslint@8.30.0: + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.30.0 + dev: true + + /eslint-plugin-react/7.30.1_eslint@8.30.0: + resolution: {integrity: sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.5 + array.prototype.flatmap: 1.3.0 + doctrine: 2.1.0 + eslint: 8.30.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.2 + minimatch: 3.1.2 + object.entries: 1.1.5 + object.fromentries: 2.0.5 + object.hasown: 1.1.1 + object.values: 1.1.5 + prop-types: 15.8.1 + resolve: 2.0.0-next.4 + semver: 6.3.0 + string.prototype.matchall: 4.0.7 + dev: true + + /eslint-plugin-testing-library/5.5.1_eslint@8.30.0: + resolution: {integrity: sha512-plLEkkbAKBjPxsLj7x4jNapcHAg2ernkQlKKrN2I8NrQwPISZHyCUNvg5Hv3EDqOQReToQb5bnqXYbkijJPE/g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} + peerDependencies: + eslint: ^7.5.0 || ^8.0.0 + dependencies: + '@typescript-eslint/utils': 5.30.6_eslint@8.30.0 + eslint: 8.30.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /eslint-scope/5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope/7.1.1: + resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils/3.0.0_eslint@8.30.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.30.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /eslint-visitor-keys/2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + + /eslint-visitor-keys/3.3.0: + resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint/8.30.0: + resolution: {integrity: sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 1.4.0 + '@humanwhocodes/config-array': 0.11.8 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.1.1 + eslint-utils: 3.0.0_eslint@8.30.0 + eslint-visitor-keys: 3.3.0 + espree: 9.4.0 + esquery: 1.4.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.19.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.1 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-sdsl: 4.1.5 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree/9.4.0: + resolution: {integrity: sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.8.0 + acorn-jsx: 5.3.2_acorn@8.8.0 + eslint-visitor-keys: 3.3.0 + dev: true + + /esquery/1.4.0: + resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse/4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse/4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse/5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /esutils/2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /execa/5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /exenv/1.2.2: + resolution: {integrity: sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==} + dev: false + + /fast-blurhash/1.1.2: + resolution: {integrity: sha512-lJVOgYSlahqkRhrKumNx/SGB2F/qS0D1z7xjGYjb5EZJRtlzySGMniZjkQ9h9Rv8sPmM/V9orEgRiMwazDNH6A==} + dev: false + + /fast-deep-equal/3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-glob/3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify/2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein/2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastest-levenshtein/1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + dev: true + + /fastq/1.13.0: + resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} + dependencies: + reusify: 1.0.4 + dev: true + + /file-entry-cache/6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-root/1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: false + + /find-up/2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + dependencies: + locate-path: 2.0.0 + dev: true + + /find-up/4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up/5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache/3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.6 + rimraf: 3.0.2 + dev: true + + /flatted/3.2.6: + resolution: {integrity: sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==} + dev: true + + /fs-extra/10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.10 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + /function.prototype.name/1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 + functions-have-names: 1.2.3 + dev: true + + /functional-red-black-tree/1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + dev: true + + /functions-have-names/1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /gensync/1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-caller-file/2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-intrinsic/1.1.2: + resolution: {integrity: sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.3 + dev: true + + /get-stream/6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-symbol-description/1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.2 + dev: true + + /get-user-locale/1.4.0: + resolution: {integrity: sha512-gQo03lP1OArHLKlnoglqrGGl7b04u2EP9Xutmp72cMdtrrSD7ZgIsCsUKZynYWLDkVJW33Cj3pliP7uP0UonHQ==} + dependencies: + lodash.once: 4.1.1 + dev: false + + /git-raw-commits/2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent/6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /global-dirs/0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + dependencies: + ini: 1.3.8 + dev: true + + /global-modules/2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + dependencies: + global-prefix: 3.0.0 + dev: true + + /global-prefix/3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + dev: true + + /globals/11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals/13.19.0: + resolution: {integrity: sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globby/11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.12 + ignore: 5.2.1 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globjoin/0.1.4: + resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} + dev: true + + /graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: true + + /grapheme-splitter/1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true + + /hard-rejection/2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /has-bigints/1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors/1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.1.2 + dev: true + + /has-symbols/1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag/1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + + /hoist-non-react-statics/3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + dev: false + + /hosted-git-info/2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hosted-git-info/4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /html-tags/3.2.0: + resolution: {integrity: sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==} + engines: {node: '>=8'} + dev: true + + /human-signals/2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /husky/8.0.2: + resolution: {integrity: sha512-Tkv80jtvbnkK3mYWxPZePGFpQ/tT3HNSs/sasF9P2YfkMezDl3ON37YN6jUUI4eTg5LcyVynlb6r4eyvOmspvg==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /ignore/5.2.1: + resolution: {integrity: sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==} + engines: {node: '>= 4'} + dev: true + + /image-conversion/2.1.1: + resolution: {integrity: sha512-hnMOmP7q2jxA+52FZ+wHNhg3fdFRlgfngsQH2JQHEQkafY7tj/8F15e6Rv/RxDegc872jvyaRHwMbkTZK1Cjbg==} + dev: false + + /immutable/4.1.0: + resolution: {integrity: sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==} + dev: true + + /import-fresh/3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /import-lazy/4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + dev: true + + /imurmurhash/0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string/4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /ini/1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /internal-slot/1.0.3: + resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.1.2 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + + /invariant/2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /is-arrayish/0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + /is-bigint/1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-boolean-object/1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-callable/1.2.4: + resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==} + engines: {node: '>= 0.4'} + dev: true + + /is-core-module/2.9.0: + resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} + dependencies: + has: 1.0.3 + + /is-date-object/1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-negative-zero/2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object/1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-obj/2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true + + /is-path-inside/3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj/1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-plain-object/5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: true + + /is-regex/1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-shared-array-buffer/1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-stream/2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-string/1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-symbol/1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-text-path/1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + dependencies: + text-extensions: 1.9.0 + dev: true + + /is-weakref/1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + dev: true + + /isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /js-sdsl/4.1.5: + resolution: {integrity: sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==} + dev: true + + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml/4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsesc/0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: true + + /jsesc/2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-parse-even-better-errors/2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-schema-traverse/0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse/1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /json-stable-stringify-without-jsonify/1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5/1.0.1: + resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} + hasBin: true + dependencies: + minimist: 1.2.6 + dev: true + + /json5/2.2.1: + resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonfile/6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.10 + dev: true + + /jsonparse/1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: true + + /jsx-ast-utils/3.3.2: + resolution: {integrity: sha512-4ZCADZHRkno244xlNnn4AOG6sRQ7iBZ5BbgZ4vW4y5IZw7cVUD1PPeblm1xx/nfmMxPdt/LHsXZW8z/j58+l9Q==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.5 + object.assign: 4.1.2 + dev: true + + /kind-of/6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /known-css-properties/0.26.0: + resolution: {integrity: sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==} + dev: true + + /language-subtag-registry/0.3.22: + resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + dev: true + + /language-tags/1.0.5: + resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} + dependencies: + language-subtag-registry: 0.3.22 + dev: true + + /levn/0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lines-and-columns/1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /locate-path/2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path/5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path/6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.camelcase/4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true + + /lodash.debounce/4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: true + + /lodash.isfunction/3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + dev: true + + /lodash.isplainobject/4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: true + + /lodash.kebabcase/4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + dev: true + + /lodash.merge/4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.mergewith/4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + dev: true + + /lodash.once/4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + dev: false + + /lodash.snakecase/4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + dev: true + + /lodash.startcase/4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + dev: true + + /lodash.truncate/4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + dev: true + + /lodash.uniq/4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: true + + /lodash.upperfirst/4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + dev: true + + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /loose-envify/1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + + /lru-cache/5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /magic-string/0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /make-error/1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /map-obj/1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj/4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /mathml-tag-names/2.1.3: + resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} + dev: true + + /meow/8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.0 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /meow/9.0.0: + resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize: 1.2.0 + decamelize-keys: 1.1.0 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /merge-stream/2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mimic-fn/2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /min-indent/1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist-options/4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist/1.2.6: + resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + dev: true + + /ms/2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /nanoid/3.3.4: + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /natural-compare/1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /node-releases/2.0.6: + resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} + dev: true + + /normalize-package-data/2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.1 + semver: 5.7.1 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data/3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.9.0 + semver: 7.3.7 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path/4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /object-assign/4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-inspect/1.12.2: + resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} + dev: true + + /object-keys/1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign/4.1.2: + resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.entries/1.1.5: + resolution: {integrity: sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 + dev: true + + /object.fromentries/2.0.5: + resolution: {integrity: sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 + dev: true + + /object.hasown/1.1.1: + resolution: {integrity: sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==} + dependencies: + define-properties: 1.1.4 + es-abstract: 1.20.1 + dev: true + + /object.values/1.1.5: + resolution: {integrity: sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 + dev: true + + /once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime/5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /optionator/0.9.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + dev: true + + /p-limit/1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + dependencies: + p-try: 1.0.0 + dev: true + + /p-limit/2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit/3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate/2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + dependencies: + p-limit: 1.3.0 + dev: true + + /p-locate/4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate/5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-try/1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + dev: true + + /p-try/2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /parent-module/1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + + /parse-json/5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.18.6 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + /path-exists/3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + dev: true + + /path-exists/4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key/3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-type/4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /postcss-media-query-parser/0.2.3: + resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} + dev: true + + /postcss-resolve-nested-selector/0.1.1: + resolution: {integrity: sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==} + dev: true + + /postcss-safe-parser/6.0.0_postcss@8.4.19: + resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.3.3 + dependencies: + postcss: 8.4.19 + dev: true + + /postcss-scss/4.0.4: + resolution: {integrity: sha512-aBBbVyzA8b3hUL0MGrpydxxXKXFZc5Eqva0Q3V9qsBOLEMsjb6w49WfpsoWzpEgcqJGW4t7Rio8WXVU9Gd8vWg==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.3.3 + dev: true + + /postcss-selector-parser/6.0.11: + resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-value-parser/4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + + /postcss/8.4.19: + resolution: {integrity: sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.4 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /postcss/8.4.20: + resolution: {integrity: sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.4 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prelude-ls/1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier/2.8.1: + resolution: {integrity: sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /prop-types/15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + /punycode/2.1.1: + resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + engines: {node: '>=6'} + dev: true + + /q/1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + dev: true + + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru/4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /react-clock/4.0.0_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-CBevN5B40TDUegSWzXk6bSwXhYzyerL9JGTme8GMAY0zO4FiEhVTGN1uzgC0rn/oSAMJw3M5wSf/OJpp9vcN2Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@wojtekmaj/date-utils': 1.0.3 + clsx: 1.2.1 + get-user-locale: 1.4.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + dev: false + + /react-color-gradient-picker/0.1.2_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-/woJfVZbp/lEwqdNfk/vxmuUj7K9imyF6C5mrsfvwvtF1uFr7THHRyEDPLZd4mD9N3opPl6Z7G7SZrFQ8qBq9w==} + peerDependencies: + react: ^16.13.1 + react-dom: ^16.13.1 + dependencies: + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + dev: false + + /react-dom/18.2.0_react@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react-icons/4.6.0_react@18.2.0: + resolution: {integrity: sha512-rR/L9m9340yO8yv1QT1QurxWQvWpbNHqVX0fzMln2HEb9TEIrQRGsqiNFQfiv9/JEUbyHmHPlNTB2LWm2Ttz0g==} + peerDependencies: + react: '*' + dependencies: + react: 18.2.0 + dev: false + + /react-is/16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + /react-is/18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: false + + /react-lifecycles-compat/3.0.4: + resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} + dev: false + + /react-modal/3.16.1_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==} + engines: {node: '>=8'} + peerDependencies: + react: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 + react-dom: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 + dependencies: + exenv: 1.2.2 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + react-lifecycles-compat: 3.0.4 + warning: 4.0.3 + dev: false + + /react-refresh/0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + dev: true + + /react-sortable-hoc/2.0.0_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-JZUw7hBsAHXK7PTyErJyI7SopSBFRcFHDjWW5SWjcugY0i6iH7f+eJkY8cJmGMlZ1C9xz1J3Vjz0plFpavVeRg==} + peerDependencies: + react: ^16.3.0 || ^17.0.0 + react-dom: ^16.3.0 || ^17.0.0 + dependencies: + '@babel/runtime': 7.18.6 + invariant: 2.2.4 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + dev: false + + /react-toastify/9.1.1_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-pkFCla1z3ve045qvjEmn2xOJOy4ZciwRXm1oMPULVkELi5aJdHCN/FHnuqXq8IwGDLB7PPk2/J6uP9D8ejuiRw==} + peerDependencies: + react: '>=16' + react-dom: '>=16' + dependencies: + clsx: 1.2.1 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + dev: false + + /react-transition-group/4.4.5_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + dependencies: + '@babel/runtime': 7.20.6 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + dev: false + + /react/18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /read-pkg-up/7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg/5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /readable-stream/3.6.0: + resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /redent/3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /regenerate-unicode-properties/10.0.1: + resolution: {integrity: sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: true + + /regenerate/1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: true + + /regenerator-runtime/0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + /regenerator-runtime/0.13.9: + resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==} + dev: false + + /regenerator-transform/0.15.0: + resolution: {integrity: sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==} + dependencies: + '@babel/runtime': 7.20.6 + dev: true + + /regexp.prototype.flags/1.4.3: + resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + functions-have-names: 1.2.3 + dev: true + + /regexpp/3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: true + + /regexpu-core/5.1.0: + resolution: {integrity: sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.0.1 + regjsgen: 0.6.0 + regjsparser: 0.8.4 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.0.0 + dev: true + + /regjsgen/0.6.0: + resolution: {integrity: sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==} + dev: true + + /regjsparser/0.8.4: + resolution: {integrity: sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + + /require-directory/2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string/2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + /resolve-from/5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-global/1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + dependencies: + global-dirs: 0.1.1 + dev: true + + /resolve/1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.9.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /resolve/2.0.0-next.4: + resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} + hasBin: true + dependencies: + is-core-module: 2.9.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup/3.8.1: + resolution: {integrity: sha512-4yh9eMW7byOroYcN8DlF9P/2jCpu6txVIHjEqquQVSx7DI0RgyCCN3tjrcy4ra6yVtV336aLBB3v2AarYAxePQ==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-buffer/5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /sass/1.57.1: + resolution: {integrity: sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==} + engines: {node: '>=12.0.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + immutable: 4.1.0 + source-map-js: 1.0.2 + dev: true + + /scheduler/0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /semver/5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver/6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver/7.0.0: + resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} + hasBin: true + dev: true + + /semver/7.3.7: + resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /shebang-command/2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex/3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /side-channel/1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.2 + object-inspect: 1.12.2 + dev: true + + /signal-exit/3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /slash/3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi/4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map/0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + dev: false + + /spdx-correct/3.1.1: + resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.11 + dev: true + + /spdx-exceptions/2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse/3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.11 + dev: true + + /spdx-license-ids/3.0.11: + resolution: {integrity: sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==} + dev: true + + /split2/3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + dependencies: + readable-stream: 3.6.0 + dev: true + + /string-natural-compare/3.0.1: + resolution: {integrity: sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==} + dev: true + + /string-width/4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string.prototype.matchall/4.0.7: + resolution: {integrity: sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 + get-intrinsic: 1.1.2 + has-symbols: 1.0.3 + internal-slot: 1.0.3 + regexp.prototype.flags: 1.4.3 + side-channel: 1.0.4 + dev: true + + /string.prototype.trimend/1.0.5: + resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 + dev: true + + /string.prototype.trimstart/1.0.5: + resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 + dev: true + + /string_decoder/1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-bom/3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-final-newline/2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-indent/3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments/3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /style-search/0.1.0: + resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==} + dev: true + + /stylelint-config-prettier-scss/0.0.1_stylelint@14.16.0: + resolution: {integrity: sha512-lBAYG9xYOh2LeWEPC/64xeUxwOTnQ8nDyBijQoWoJb10/bMGrUwnokpt8jegGck2Vbtxh6XGwH63z5qBcVHreQ==} + engines: {node: '>= 12'} + hasBin: true + peerDependencies: + stylelint: '>=11.0.0' + dependencies: + stylelint: 14.16.0 + stylelint-config-prettier: 9.0.3_stylelint@14.16.0 + dev: true + + /stylelint-config-prettier/9.0.3_stylelint@14.16.0: + resolution: {integrity: sha512-5n9gUDp/n5tTMCq1GLqSpA30w2sqWITSSEiAWQlpxkKGAUbjcemQ0nbkRvRUa0B1LgD3+hCvdL7B1eTxy1QHJg==} + engines: {node: '>= 12'} + hasBin: true + peerDependencies: + stylelint: '>=11.0.0' + dependencies: + stylelint: 14.16.0 + dev: true + + /stylelint-config-recommended-scss/8.0.0_stylelint@14.16.0: + resolution: {integrity: sha512-BxjxEzRaZoQb7Iinc3p92GS6zRdRAkIuEu2ZFLTxJK2e1AIcCb5B5MXY9KOXdGTnYFZ+KKx6R4Fv9zU6CtMYPQ==} + peerDependencies: + postcss: ^8.3.3 + stylelint: ^14.10.0 + peerDependenciesMeta: + postcss: + optional: true + dependencies: + postcss-scss: 4.0.4 + stylelint: 14.16.0 + stylelint-config-recommended: 9.0.0_stylelint@14.16.0 + stylelint-scss: 4.3.0_stylelint@14.16.0 + dev: true + + /stylelint-config-recommended/9.0.0_stylelint@14.16.0: + resolution: {integrity: sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ==} + peerDependencies: + stylelint: ^14.10.0 + dependencies: + stylelint: 14.16.0 + dev: true + + /stylelint-config-standard-scss/6.1.0_stylelint@14.16.0: + resolution: {integrity: sha512-iZ2B5kQT2G3rUzx+437cEpdcnFOQkwnwqXuY8Z0QUwIHQVE8mnYChGAquyKFUKZRZ0pRnrciARlPaR1RBtPb0Q==} + peerDependencies: + postcss: ^8.3.3 + stylelint: ^14.14.0 + peerDependenciesMeta: + postcss: + optional: true + dependencies: + stylelint: 14.16.0 + stylelint-config-recommended-scss: 8.0.0_stylelint@14.16.0 + stylelint-config-standard: 29.0.0_stylelint@14.16.0 + dev: true + + /stylelint-config-standard/29.0.0_stylelint@14.16.0: + resolution: {integrity: sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==} + peerDependencies: + stylelint: ^14.14.0 + dependencies: + stylelint: 14.16.0 + stylelint-config-recommended: 9.0.0_stylelint@14.16.0 + dev: true + + /stylelint-scss/4.3.0_stylelint@14.16.0: + resolution: {integrity: sha512-GvSaKCA3tipzZHoz+nNO7S02ZqOsdBzMiCx9poSmLlb3tdJlGddEX/8QzCOD8O7GQan9bjsvLMsO5xiw6IhhIQ==} + peerDependencies: + stylelint: ^14.5.1 + dependencies: + lodash: 4.17.21 + postcss-media-query-parser: 0.2.3 + postcss-resolve-nested-selector: 0.1.1 + postcss-selector-parser: 6.0.11 + postcss-value-parser: 4.2.0 + stylelint: 14.16.0 + dev: true + + /stylelint/14.16.0: + resolution: {integrity: sha512-X6uTi9DcxjzLV8ZUAjit1vsRtSwcls0nl07c9rqOPzvpA8IvTX/xWEkBRowS0ffevRrqkHa/ThDEu86u73FQDg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dependencies: + '@csstools/selector-specificity': 2.0.2_tbwh2mpcdwdeb2slx6bobindua + balanced-match: 2.0.0 + colord: 2.9.3 + cosmiconfig: 7.1.0 + css-functions-list: 3.1.0 + debug: 4.3.4 + fast-glob: 3.2.12 + fastest-levenshtein: 1.0.16 + file-entry-cache: 6.0.1 + global-modules: 2.0.0 + globby: 11.1.0 + globjoin: 0.1.4 + html-tags: 3.2.0 + ignore: 5.2.1 + import-lazy: 4.0.0 + imurmurhash: 0.1.4 + is-plain-object: 5.0.0 + known-css-properties: 0.26.0 + mathml-tag-names: 2.1.3 + meow: 9.0.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.19 + postcss-media-query-parser: 0.2.3 + postcss-resolve-nested-selector: 0.1.1 + postcss-safe-parser: 6.0.0_postcss@8.4.19 + postcss-selector-parser: 6.0.11 + postcss-value-parser: 4.2.0 + resolve-from: 5.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + style-search: 0.1.0 + supports-hyperlinks: 2.3.0 + svg-tags: 1.0.0 + table: 6.8.1 + v8-compile-cache: 2.3.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /stylis/4.1.3: + resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==} + dev: false + + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-hyperlinks/2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /svg-tags/1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + dev: true + + /table/6.8.1: + resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} + engines: {node: '>=10.0.0'} + dependencies: + ajv: 8.11.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /text-extensions/1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + dev: true + + /text-table/0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /through/2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + + /through2/4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + dependencies: + readable-stream: 3.6.0 + dev: true + + /to-fast-properties/2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /trim-newlines/3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /ts-node/10.9.1_ck2axrxkiif44rdbzjywaqjysa: + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 14.18.29 + acorn: 8.8.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.8.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tsconfig-paths/3.14.1: + resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.1 + minimist: 1.2.6 + strip-bom: 3.0.0 + dev: true + + /tslib/1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + /tsutils/3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + dev: true + + /type-check/0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest/0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: true + + /type-fest/0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest/0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest/0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /typescript/4.8.3: + resolution: {integrity: sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /unbox-primitive/1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /unicode-canonical-property-names-ecmascript/2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + dev: true + + /unicode-match-property-ecmascript/2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.0.0 + dev: true + + /unicode-match-property-value-ecmascript/2.0.0: + resolution: {integrity: sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==} + engines: {node: '>=4'} + dev: true + + /unicode-property-aliases-ecmascript/2.0.0: + resolution: {integrity: sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==} + engines: {node: '>=4'} + dev: true + + /universalify/2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /update-browserslist-db/1.0.10_browserslist@4.21.4: + resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.4 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /uri-js/4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.1.1 + dev: true + + /util-deprecate/1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /v8-compile-cache-lib/3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /v8-compile-cache/2.3.0: + resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} + dev: true + + /validate-npm-package-license/3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.1.1 + spdx-expression-parse: 3.0.1 + dev: true + + /vite/4.0.3_sass@1.57.1: + resolution: {integrity: sha512-HvuNv1RdE7deIfQb8mPk51UKjqptO/4RXZ5yXSAvurd5xOckwS/gg8h9Tky3uSbnjYTgUm0hVCet1cyhKd73ZA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.16.10 + postcss: 8.4.20 + resolve: 1.22.1 + rollup: 3.8.1 + sass: 1.57.1 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /warning/4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /which-boxed-primitive/1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which/1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which/2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /word-wrap/1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + dev: true + + /wrap-ansi/7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /write-file-atomic/4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /y18n/5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist/3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yaml/1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + /yargs-parser/20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs-parser/21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs/17.5.1: + resolution: {integrity: sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==} + engines: {node: '>=12'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yn/3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue/0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 00000000..9361eff3 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,3 @@ +module.exports = { + plugins: {}, +}; diff --git a/public/icons/logo_horizontal.png b/public/icons/logo_horizontal.png deleted file mode 100644 index e5c643c61c64052e1091fe7ede891876b3beb011..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10097 zcmcIqdpr|r`0sRc4k4u+xt(-D#VUjt<(ed+Q>WC_DVI_dGPB{7=8`0oA*@K3Q*lmH z5}OlA7$YRa8Zxc1xotDH{oY;7s?+&>et-P_&|>fNzR&wS-{<>0&-=a!dv-f1%CC^0 zGiQ#X^A3BDIdkTc!T(?XxDfoi(J`qJeEbmN;bc3fuu=09_+`G|cGvB5=KP(kFnx3Z z`2D9dI}U`*nWI!C{Q03K=-zSg$DczTehc*s@(qO_4fdIH=IDvQP@_Pf&|gf9HW_W< z?fz+S&YZQq&i32)hQo%syIW5GdX9S5MP*gp1KsUEAXN5j>uEh=lH~Yt=!|*!pJ%qA zR{eP4)xM<#T~D8{i}oz9b4|T5P&sTA^rr3b^}56Ba&A8=ydA%~^7Wx%Tt|Qo!4HZY zvKY_|Y2a!6irrghj5U3wiPYl!K+UEauDiaoz~lbj|A&vpJ-%xNT3#xAj_BfIT29R=p z{gnKNmF#l{JL+IZ?gDWSSa|auT_<-=<9u1MbtrG_h1>K6GE1nU8M|bs(MS1R$hj0B zzXL&WuuIVVXhxapk8@?oPIIXezV_Yy`1ts1YA};)uif`irdEBqvckyIew4xR;o2Ll zB4*C)j-D(oIdV@W`mbo&Mem`XHSF%Wdf~FF+>|#u$b5a-d8q=17c1e0Uk~3wnR=yq z{I>Z!!8%mcfeuCbUVD4{It9pzlPd#pdLHp9qelc4KaoTCh0WUR;E!m=!6O2Ba^|dk z6jCbLt_H7noc&AiD<>BBSVOw0R$F~k``oGhLh}v1cRQb*GM zQCl82Sg)rmvE$c#*hKR#j~XU>9(UI|d7%;>9KJvImx5XSiUW#cQi-t)3JIrK=yhiQ zni0*3rd=@Na3`$|dn`N%;@h4a(dK0A3?0whs|qvuV)+$AH%)M3Pkqfpi}T<3U&-=c z3-R@SM{CnT2N}d!r(FVokZjHdISE-t2>EAsnWLqC1D)q(toii88K;7g4Z_t_31j*w zoh`FU5-cL)Jv8YyXa@F!(27DW-^4PHu-=;anjbI5uJBJ6E+(f!p!C2htIUY2Cz|{` z+ySr@&fb9LT5mH@W(n>>1RtFQ!x#bQI9E_M(iu<`xq#t4S2WoQVk0@LZ%=dJ$(sjG z=4F;^+H&q7kqJs0p-(nA;a)4*KT`chOn|ktcg7eIbHm=?=eG${tc1y16`ydbMfy$y*4ao_i_? z`Y0ER8DHFHMh0*f7nt`%lRP-F(C}UYFHfu0c1-gMgtGf2C6jhbByyXn$Y%W>)_re( zq|E+=_$?RY8laH*TCMiRT5~%cTunS(P14k8?P@X}j8`QDx#;An)=V)D$dmt)b9-On zT^y6;f5&cH*}VkcKNCcdORY3}-{lg{iOsyNJ>y7K!W!j@{qxX4L89^e$OUlsrKDeh z#n9Xd2Z~qSEz<2gX5Ovky<4V&xpN#?)r__e4pxkWDOO_G9*u@Jdj#dL;0jSw5y09A#@ zUyKXNaHh?yX-n}MWg<=Ya9EC(@!N0{pKgQ;W(5kW*iXdaBk|?O{)hb?{Wa=@tVN_- z)VoaH-`}kK%iM;ytDYn0XFXb*RjV-Z*#+nn1fftgq$=y{FoMR_1~uZv4JnjoIXrSoHpy{YfI5VCp2aZ`J*r7R72a{puX-^Oq4Ks?s(|zodH7PxG>1bEV$jB&`2JggJr|`F6POL+%am1{Uk-wEBG-%v~=sV+xV* z)Ra7mH!W2I!hVm$!gcLNNws+3|bpCUs1D8JAocZd#F5CZ-P=KdweI-0osF zwjAfgj-~GN)J5503-XbLv!Q+PSlGl{;^{IaM$?L1ych?w^fP*!*GH%O(SM>h*E)}Ve1vGd-~=8NMvp2XUmwMY9WKoi z(nAv%>0p9P^k+%)nAoQ$;)9Mq--u|bP6e)o{HJSmadA%v0$cRXvX+lbe;aNhAQMbN zvL`k6f{=IT^eA?RI8eGYhHn09675BZ3n_`G7D)r$j#74l;*-pa8_zqwacYoby9zM> zWa;;jwJxgyIQoGlIs~($|oqH;QOkgIvu7UHsJ!#uOY*lVoh)->`{ z62tu~-WH>m-b}jvg~F>*MRuWb!*@+`eXiOnNf^yvt9#XwhId<^J4q5a;8=0B*6%EI zlh{^MeMl``G^3|ksXU`QMu03d7Hs-cCGdrMNJgY-=?~FF1#-bxyawO^K$y%p2PzY! zlO^-_Fcm(dlnCQA&`)!W8Z(al*z=j%l8k&uumkmusG5;PFmfFC$)R>5$c@v7giH+i ziTrtS0aJ0xAjwaCHk!&aa$*E!af5&S<%s*ZxvYF}Os>z;{^o2gCCZp$+CiNd*u&}3 z0rME3*jK_n__X!yoc{ZeZ;cz&=1tt$r3*abb_gRO&s(R)$|BH-)fu_PzHHG|7GF?XaBvPnZ>zPoW z7m4BG^6H=ZJ0u@YUn!AbMRV_RHTP7)rR7tLnkvhOE}yN^YTp*34kExU3>1kZX+ zeUq4abn{FgdM_cguiQz|V0o?}ZQdcJ&hU(T7%UaQv;^&W+2#52v!Vw`A zW5Q{>oS=1i{8FM(2W^uh6}qSBzetc>!`^D|ie}hMc}Jf+8yv8`-IH9{%*XGs!7)B` z9P(95inwNn4{^tuZe^U0XtOs)+=_|>UH(y4zo_==sDd9z7iJ!6mXL&;Ik31vrT1

HE#JRJQ2}zO7jUeUH-H8e*Rj2mn!Xjr z5mD-`W@;1a`9&k!@X~&%-l~}Dh*mQ?1Ii-a2wo|r63*}!!0wUjy2Gv8nKxFJVwGu` ziQLQ0?cq|VsuFy(J45m->$M4%hK4fa{7Vs^+g=r2NoeX=kT3=Bn+mGn=%|&CKJa$0 zID}bC&f}@dv9H;R7Fdx(`jutoaX1bdlA)yo#WuGiqzlZVrvDbyY+d=8^MKV#YUus` zZr1lmZyxa#2aws!p5tg11I;}>?Khou=>2+~i8_bK-A>+A84IT){7Fgj5F{tJxOkRL z%5S&53(1F0-n4$a-7-zFGgFOLGGg$ZNoHHu)Hv4rd(6rOjklQH+GqyX-w%k7+45cu z1_Wn9@oiN#p6}Mz6joU05Z=z4ko10_Wf*J9)mR35_7BLGUHQzzIzzj*`1=79{~Vbl zN4p*q(Vu61Q6xc)$gWjj(-SI7h<3=pz2O~p?1Qtg042Hn#UR=$jbh`Dn>heMU4_*} z^**eZ_nfS0DT&<0+=Ei=OJU(Ga+HFad0ZtNsY>{qpHsVVh^R1OsTG+cM|*-L^^JvO zbZ?B{n{Xqf(upz(6cqT(MvkPelUfbFmAh5BHGtsOhYQKfv7~KEBJ@aiKFdd|m4`~* zDQJakPzONe$rH_u$78|<&|DRv#sRrYIqx+AiR4C`M8wL`eqB1#0uRXe-icCX-I;l+ zsj+;I4QoSGq|xw`2k<`QkW3!yUQP3$y7oOuD-62xOp%`+$6fhv-Pev!fbj02Z6f(G zGfNw%+g%+=OlfF{&ILrdtXAX;%3NV)O0I-Q&Y0iN)*D+-FY|&9OfIoDj_Yu8B#{-N zHPZb{J-CrpM80;}E$VEn z&GZk>qu)VM=HUd=YoD;Gdo_hoI@s$~^uBy5<4W$wZ=>MQ2fz(O?wrEpu(be0kX8n< zC)escsrD!<#*>8YTW!5QuA}XH(nx0b!Gp0v{-nw@h_h&HvA#&Et;RR@&qX;J;c!mS zFelRJ|G}IsM%C2*&1J`0`}EuUjDs_v#u0q0ajSm;WsLIe{{&^R*T?}2B5VazpwExy z^;!da{%_PG1Fwqw$i>*}iO8Jcd7LK}M1ITQU z3#U6ZeX$zQXzPeOvX~C@W4(JDrJ)83>%HicDXlmq9fvfqN^T^77z=*Hw_ipxGhdI; ztT2*ecWOafq~Hpc))7SQZknF!PY_YD^#wr7N;R>Vdio{zH-<-~ge@(01u0 zqV9kAQPi7j%*RWWzo@ezELsKsvvu?U(`0bfsu{?aA=IoPn2xI2uH6&n-L4!{3)a*^ zo36o9Y54tn!R5-uM)TSsh{%Uf9(jz~le9xRVHZQ5vjZ@HRa>&T^RKB(t6PT6R9;7I%OKjF=RNDGsFS!QU z4oCOXxtB9ghzhKvf`*l>Ga+H&4Cqs!zuN~qJ_8>uJmC`eo%Pz`Cf_k>mm0Lf)R%Os zfqtGVp-|%PzzG_uMR;0|xhy=b7x(Mm0;(eUXma{B4r!uQLgBx&+Q7**VxiCky)q^c z1=@1wqE&?a$Bx4MAG{}d-y*@5H}s((A`KlO;Tj_U$bs6XaeH^+J>@5V*k zjFQZNBLz)-u4xPRcC&N*&~vUy(!6{V4?iJmcQOW{}e>Q0+&GcK9;X8>op~u>o_5uy?ffWJ@LiMhw)RxU@Y)?75B+ zNP%pF4Ow!Y?0z6$SP)G%R>Rzhf$9wd$q}FhdD46+H`ZInH4^jLqx`NOF2ITRd()xs z#PUa^*J#{3h;6NR@aCJjVB@DvFnYMD60RZnNw}L^Gx=cDwpk7Cen$iA!hfPvb_!}2 zw+g8`X<+m?D{VE)Oqr|BUo@E}n&*h$%sk&5dQi~bG@sMJ-$S=^Ea3}U!qL-c^--?os<*l47{t{i)}&1RQU z#lu8ja2_%yIskh-rQ-(KDU;q;&#jQadwNl{W@pH|lI1vfPF8^??K2=q_R;JHukjKW z65OJv-s?W&%~rLB0hyBvnYhLlJ*#*ND*Og_r3panx=p8gV%ZlXAT`NMSP#*9BTao) z2kegT=zuz$6dCXVG3_3t+`4{l!#-Pu=!-qpgGOswIcxToLFOV%-|$6FQ|<|D5i3H!W{yu$>mH`|yd-fmZ!0TVyBvS&?ZWLRs( z1{!GEs-G>Vu75#ixszGVT01vQHSJ@}$YQ#qH-9Ij$KYBlqXepc3>R?nrk=R5>%jvR zkf$%HjOLIG(DUjf4v6jl4J#L2W*ikPAr5O!7$*AyLi{~DXIj;7Lp6P%|NX^*ge|C+ zJ2tOMT{a>4dl_4rE{jneMt82?EIge!D( zqoS8mH=O3+ULo#u2ELfwX^cE!VyEH1Tjs=Pc}jj0=`^^z%O0gP&|}>zw)!i9HQy$g z`ziWXF)GVOTQ#2?&Oj+r|9nCJ+cTs%W?)`&v`vrEs5cKl+qlEUk1@>0$Gn|qAjrKNy;UyP zP}jv)WWUF|do{J6c_T~`Jx}sz(r%g#EaxJ)sI$;tA!g*dp@A-%)loQ$eQHtd3OKhFwf$QQsyE6u$$F28Z zBG;KVQ7LHdb;l543TxT`?7rR~HsXK`TF|gwe3#o1>EEM23_cy2f&^z|}s z1Gn&ifrb!^{4l%>Esde4hfT` zX73w)$Z{h_m9dc{+Fg$Dl>gEtK;5W%>UC^~P7>>hRj8i$nz4SE=XlUw#Kbb*6)PWL z(dYtuiPYMPL+&2(FCBzQZqto?KuLE%KFY0NA=e6Y$e;tJosTdi<%E~m`D~fCI9q(z z=T@2IokAGH?7Lg7AKz3?zIC9^3>@HeyNPXISs*NXU0yKmw{FA6snPVtnqZ*L{`h<= zsEsSzxcY5Nmff$+;4{+w2Uhsjv_vB4dmBK_CLI{-h(ZezDp_C4$+-C3V8>ly^ z^h?7tSjLlXI~+F;;qVQuAWL4*IfLETItPtMY)LFk7~_ z^>YcLeb~3x^aDBVa!d87nrAyMjyVYgT}vXIfDr;_^^7VvMYxSxluvnNM(UUTqCV`z z9-h~ISb{4g{}+JqP|k9dTESdfW{yr0>B%|~Iu&9LOk{!krgo^^v&Wv2$0{QfEp zQTqNmvVKspkmo&_-8rRH3BJ^4qJF1;W0h^01P}CFzZP8iAdlRvKr`4wIykHQf5?{ZNhfF6}Rz0ZTPrwC~>-z&IyQ2Bj9pE2{J;C{N74Ox z7bD_d8&G`MsP$<7lyHHdZ9n8Lb~Si^qzkJ|w7t6HM`Lu5@P*R4a{91pg#E#rOhfP; z8jb1Z9g?@!Rony2rIJ!vsbF_?$9(b74PYqMlc{pzkIEA8#7K2H?B@&iy85U@@FeLd z1-){|>I*Ypgt1G$JJ1J?KcegUuk&x5pI|@pMg4HZrUg1F3;%uocDTn^ip-s6c=J6# zQnRgfGSxB763&k|o1$kX^QzWSN*ScG;6%nPeabqqzeq<%#|r2oOzG&(c+lq0 znHXr}Spj_>+UJa)sg5RH<$&N49UV^@fPk9?O|4FAxQm$!GX7<>i0B%k=J0f6L`^HRXL;^Yl-V!J zu2Ku{1%yl;b}~z8>-b}ay`9~}bXNCKkU=2m9%8oRUdP7j&eQkiw!s`0uN5DxOWiWr z?d+X%EU(?OF0b{E*tpRi7E|LsS`%td*``n_vXAl~Es__>OJsg9Sg$A`F^FsBKJGK)uk7Q63%7tJ1O0xC)jK z^$E`#x9m3D;Yj7^ak|U49Z>5CGPyCKM|QOISQVXf*xB9|0Ox~iPBx7#eY_u3ZE%@O z&iStib{7fL?4PF3fZfe`8wia}QddfN-ere%OAoGWY*;XHDt8^oYvqkk)NcIogZCPX z3d$s7RlUHyAF54fKR()$tQaFtyOv5MTc^x&aQ;S?%XLHu{jPa87VvBzccc5iW6QzV ztKi-Ti-XgjrJpi#CPYm?5p>fTOrb4CY%iCm-q(QhENuD@4whX7^NU&M%xa4vEbZ-6 zeY6m-8cG_TFtbuV25)tWu?%2yHE3%wM4Wxi%#Tto60`_qv4g z^JQ%e&MBJ)R-NYGVqc!{Fl&CO!NcN$U# zu>6(h0l##J@w(53zcI!^oBEz#&3{^VGNK61F0ob~7|je*PbsPJ_VK(`hP;4TcgWe> zEs5`iP`e*%pUlT^i(k{U^s_apwmV{%LAXRrPa3)vE8eKsud$-V5|S$9Cc~>UQ9>#BIsX;+!BwkL}7HWzHIJ z(yJpoe<@)8Ln;iqQogmN#tO6(y|st3%m*0 z6vrxD8xwBYtxaOa-mt8${Nk&wxYUs<0C7Xi`<+qr&~sMe3*)0FclvL(?!U+Xs=|d1 z%m?|SlL*1yq-AD|DER69aAY=Df~V7=k4?XUxD3gQlqHx_S>VW9jfeIjV%5>9LaewujGDUqX^71i!*Dyu5mf z+jop_@qQ^mW$BOwjWJ*R3O`^5c8(slB}G=2 z0_9fncfgyMHdV0-+bk{RwrxSSL^`a${r*Nl_YD|q(

;cHZ2)dqdvk!I%R6p8P|P z#E+eumNQk+)2Hpv%!N(amd{@;$+{@%`btmA3O>aIql2?5h#OopnLK3{BpSn=69i*p z;}ZGuhdmi;UdeT|Q#!)@cW3w4Pk-#HkI%X-sA{B8X8Z=5Vh?|JPqtB1I2Ww>;u0Wj z)_Y8x(?+!1_&Si%eK_95X4hTxnq2WHI7W$Ljvh+!@t&<|a{ zhx58n4ahfmNLTTTi~Oj*02v3YE8AaZ*Fl5=6_6^Hjx*7YjozfRP#Co-8aZVUx9Gnp zFa%u$yEFJR`>QKl;6Iadv(*)i>S|r6y?792zVPa}d=~nPtM@l9WT#gpld8oXIAp|% zVf%BU*Ms7X$@3ts0JvgJYK9((9rM~}k(kmnVrD=ipVV*nOu))XNCC9`yB)|dukews zdK-kg7JcneW(jnuEySg5C5vj^qu`SxpV0spA~RNX7zV;Mh7EZkZGLWlcQ0>AvuJ&z z{(*Se{4%jWOud!6)rH@lSS8pzV(Y`^Bh1cDv#x=kONFE)2Z7g9;DkdAdJO!p9w^2aCR&jDDXiU{7m~lylZYu4!-E%0)4a% z{6LbJEB^vH6@r1}{~0Rh7CiJh8iF>wZEAfJVJ6)@i(>2(0;NNe$c|;@J;!G;-qLboALdiHr496#Y@h{C6+MPx_&oF;-5KX_AU;7}1;{{ezTbaAs8GTr># z*LNSz{bmHxCYu6uuVEGBs39H#iSqZcMFu82UVZ&pz2sRvNGZo{dtvJ<7-{xMiwlv} z4x}13ijCnxy{0`#vATxMZt7QSlQ(H5%imS`hK+Z_LsHL9MOot9Y3x9amXK*0%V&_;!3vlGPWY7$ww07&_ek&gCfJkn>15F=lfDlhonCRgV z^AxK(vpS1Zl!ey!JSS%yHkvJdv-WjR#T%H(<$Y_5Olk`eFaEm+?*#3M_0IMu3l<-b zw!@OUwl6x9XeUTJog_^)j6?uNrp~6~x;XxXV}7O_G4&baHytmLQ|1_pQ~Gy=-@?CX>x>Luu53;Dju~}5_;^Pmr{7b(CyliI4!HeNgCT0ja zYwm|OiE=mL_<_!W!u5fUNaPfnmaj=gyX(zAK5d7>$8NLa-2aI0e&4$)p<62NQ3$B^ zhJVEyF37i-jk1f||xlhCsU@dR1s86;jku(rTbukFh(p{233inTq6#^kE%%bwin zGxjhGYjKL#wswQBr@|uZD6G}hV|?R+;{`OQvZyMg0!!z=zePWHmqKIzImSk;khn70 zj}Oy&6tTm7ya~p%!y5$TlH!-wf!X58nNf?5xrjYRQgN)SMy>-U@GE|{xO0^YmcI{Y z1meLM;cpS%FXoJmO>%&8-}hY`h@RRKO0_s+~i~IOe*XN>f&=YGrmKEurE>c5IoJUfuN5|ePge`)(%)t){&~8 z%%Cd&?3($6sLw@C@n9Z}2;tUAWYbh;;SqCU(e>M<$b(7!5n4fF9l%#*9J8lGPfe!j zALn!hQZOyAEL%g<{+YF7`xo>^v#Ak5UG4{#vP4R4a8m)?k<{{ggNPRq13d?Bei89U z8JO*245!>%qJQM|e0i@_3$#2Wb%@tx6ZF>jnp`a@bagx{Qe|7rXQ;5P5RZv8@x&{;dwPd_BYIaa+7M^)PQNVf^cLg_FM{ zPPATO&z(fk6tP0Jq#{+gA;+zcu#V}*sb&1KhOovnfDZ|?LPR8sgjy%}F#YQW9J}%A zCsfka#YCoTs)ZKvK$b+dapVtj|IU>z`Vy6N<#VD+I;VPB%3I)>^2y7Q6a~*+)mh|& zu)%13`nb2iy4(mp!~KH?e@}1f#tw_u`F()`cT$#bv`X*(B?hi=fc?25WmxnqVg%2= z56w_jgD%mYA^KaaYK=*oXLhVOZ!K{$xH}g>IXp}qt?s4s(L!qCn7j{N&=St1^5Bi0 zIdb*9aJ<`7w!?TElxOIIs9N^(hy;pdBn!~&8V+v)rP}I-_Owi7DAs&T*!r80wpi-k zi@zKs@r7aQf-lEE1@(mq)?Dd?p2xp8f7KK~TMxC~wXsWM&`PG6ZUqhEE||b+{3*Uo z6stpQxDZs2qZ*RPRhQYQ6WbFk|bxqwO`1VY? za5gm^KWN)2Hm~s?rK3{>Zvq^gSpb&AK8 z@CE<))l7Z46knEi-bG&Ka$fJ7+JtS$S&XzoyYX1xJ`V%oA2D_?I$4W=woeFrL?ZO? z%fQ_((o3hHmBgAlJrvPm@r(kgM{zRKd+Lk)1#=C`@-(mTK?puJtir7(|F&cN;Ju-& zGnebdT(^Ra(gLKn+(UUao2Y>fBrV?FRpwMKD_>=<-_e~HJUwzy}qGMY8Y0affYPPFmhFe)|ZbpT$-evPr(Q)j38HzdWpn5NedVIyVi?%Ks zD#v-QPqq6$-7Zc=n-2L4jH@y8vlo^^l~jpEu@&Lhhv7YMh}#Pzef!*;;mE05m_G{+ z)`MS%=GE3hFGxIZr$1&2Zn>kX@>wuB;D$08I&$9joGlA$^gvI;G{`gD6@D{M$T??Y zXZB8oux3RZ@uz)@6Xp*BlQ4e7rcA!>&k=m>`)MS8usk%YUaW4O!_F=ym`N31#wcTC z#`;Bz?FN}+?%?mZI5Y(et_JR5`o`N*BJzrH5UISsn=rF=2cO`-z<#wTmyRg8=X%B6 zIv~V}lx6@~mFa5uAQ1o?8|9WBgWCt}mF>NyU(1@jk|sMWoM+T)BQg{GnI5cJ4TL-- zbq)D$<`xWbbRPn$BI}5Yxx0DVzb=(#e>zlAqsr+8Ncf@mmVdX#$9;kzk;1m8|1Fwt zCiA|n`Y!0#AGxs;lYN743?3PU6)V##BF5reUeEvk-ko3G?1?Mq>zPz+!>cp>2Uf`4 zM3FJASsuI8ip%v7^KU1A-M}NIiNx)^GJ8=l6HNoCA1UART!u7=$|?RfGfV}*v%UMD z+4I)sVIg_;nvv1tYPRx?A+<<UNH36)%~$qW0xh%0b?wJm}J!oMryJcg{)YhH{MC zh+Kh~fu(yl>PgY72NxFQ78QPpmu9DxLg_TclJk=9(GwcoY(|FyhPX;D2eYQNUhsJy z$|x0~cQ@)v{)0umMGN=KRPOpVf@1mM+w=bHBTUE$2KY4M<;U|DcZd@VT-_XBveR^1 zt%%UXg2dpTY+3K$dpSU!DxY`hPjKLi0Yan^AOZ0@+(wlGf6YX zQSH`psMp&-P|p`pB@aV_s57Q%%60n^>0%jO$gj0C75Ft$Tr2OV-o8B|+pXX-b+ zNwRs|CcK*-rc3k7OQy9Sv(WierxADL705zp)NgKBe`V(5D}a#v?nyw;^P2O;Z2aMQ z%J-Emjug=K*+fHAbRobUIk#-34uX*#gTF`1rS@fQ^8di;hMGh>@)2HYuxO1nvV$#V z(MJS$jH4#d+%S07c}(0zJ6;!88)TYn4`m@lWx16l4C;^bNEs1YVd@eOq`RePVKH#L zhc+>3Zg9U_RvCvUP4X4i3gQHdX(^ITH*mF`b^8@_kS}`Ksayt(DG-bmWOo~2As~`j zx7&(DnWtZstsp&gc?vr%We%kdWoUT$$u{6St|}s)&tDeq6g~N3aJsOS#z27L9^lV_ z^?iOA&#LBDu8h8xC8{vVMlZT4ha5MqvJ1!)powSsD2=QEZ3~40FUC3>clEcZdbMbj z5K0|oOH&2G(#dueJDs+zu2ak(Y@|QF`+41Q_d$B)N|wR+t|u_Ms}epTA@6Xs3yh>D w)=Hj+HMHLqmKnrQ`U0IpYX3oyMNiKu?5a-ro)4&{{lcXK?iwO0H60@U2eso8Y5)KL literal 0 HcmV?d00001 diff --git a/public/icons/mue_light.png b/public/icons/mue_light.png new file mode 100644 index 0000000000000000000000000000000000000000..91739000df3fb660f66fa3579adcea63686a4b9f GIT binary patch literal 5526 zcmX9?XH-*J7X@Ub2c!%_2>8%}kuKfPhD0O`Qlv-+QHt~;p%>8*Py~VqD7}Q6A z0%^B)Y+GAT%~`G^>APb-8QdS%eF9oJ#V!@ZqbqZ<3d`XgC4AcO@z#|bF*!W(c<1!sB1k@9w_YfED{Vw} zhfps(aQv~%c+{}w88OXI7^*8}VLN%Sd$)0|E3Ja#+D+!A-EfHsJzJ3wapFGIPpJp8 zPpsfENfR-;0i*TkNvjtYx{(WJ`O^4db&{tyUFP+Z^T)QQ6=_>%tinPZ016X>i#Im; zAYwJ2CekPnwa0^kKA^ExunDkfWCu|1)$UL<3MIHb5S(R3a=w2Sc3F|i=nU)objzeB z(8XwaKS&q6t~?#AMhkfGe>T3KSrmAhVAH*?pAV&rDz!g;9=Vmsk7Ch}HKPvbPuyPb zN6$(|mOn#-FwuV|E7RCqyRzt>yttE2d3EdhtIQk zbjSdf7!j)`EvRaF(X(=cPhh+dK6QA&!;lPuw&`91(XnsD$+x^?fxTl~*Um54^%f%6 zhWmQ~H5GNmnFZGvibb8WIscj?cU{w=DlJ#4&9lWC1FBHUoX)s@56p7dg)KkOm1NM( z-!$l&NsabG)+d4SD@|8KdFH?XUSK6VBiZZ^nW*;{Z43bQtFa5UoPw^`su%iZqc8r( zU&Dv-0fHz5XY(G*n6xLa9tu;gC0YKIX6%`e(f#PLPddZ5ZHhmnv_3^TlBl$@MTgkZ z)wTMJvxP_GmE&JP5CW!1`ih4QpoPF+U`tvq%?yQ2#o2;t$BA{L6!BpGSWGz;w9-%l zOi@p-0$mHF#Z`32>muYLx`GIBTB6fz0+dF1o(YfpZ7$rL>+!8or6d8J7o>D zv`4UbL&e?M(DI(Vo|XBkQB1J5TC$9;6!z_HcU8Ag=w{$%zu#?q?cYQXZrl>yQ2Lbp zf(xD`pW9e?Y9J@(%q`_%8Gp*ohRa)&=TPGPFJWw{vw3o%^B8+aHst3>@E$QSn5UoA zcWP*-{|FJuT=e2GjSLw=K&I8&N>0pSj*zAs8 zJkwdqoO^Lh&=$6HMrHJ8G+qFky`Mu1&a^|Y^IpqM+`GSrdYDcv6-FG|vXCwpLpqk}(o`a2lEZXNq zYMP2}8EkWTS9ih{jZ&=k@fuSB{d8N9a|ReCnH%4V)gZ08U$fi`d_KpammgE zm1Jkr?ANxIuFW)=-V3h2Y$+>22&3_xjndL_!Uhx)-{4cAhTu~YBBuG^-0aT|LJxh` z-?;l;j_U+xMgB4ScJ)0gE}S_$B*kMs-fxPoIRFdY^Iv5iO;Iiv&%jK`{wTY!4?!v4 zHKpGTRnItTyXIcKPw!>e+gRi%T^RlETqD*6rQOg&)aD+j`~f0(NB*H=RTl@klIQ!6 zZaUg3bSBrWT_@}!WnEzr%t&a1`}6;}e#Pm?w}ocvXKHkE?8zze7=dk?X2U;;f7b}$ z#U;$jy>gxG)rPJwJDGTpvQNC^Yk|w#e>c%qYqgd(t=iFSk|>*4NJ#+17!g7h%mn%e z^6ICzhe|_(xtI;1ILkm(fsoyT#66h}y@j0CD0Aa0iHq*?NFbJd>(EBDnytjG^?#Im z|7KU-c-PC9YmAZb5A5vtDd!mFIggjNj^TEawAh41Jcef{_Izh@SfrZKp=mx5Q!^uG zlv;Ih(f%05J&-VoDoqKo{nHy}dV!?^?dqsxH(7_jLAs)0TyQ7`!^>e|Q9QufOpSaUlH&;F;iT&k|+R)zq%Q$V^yM6=vi@1)RjPY;0Rz_!W|EgbP3w>ap zxu>ulKC@y$NRGP zN3CQ0s<%?es8&K*h(g>*SljS`6N49S{P7p~=k8p7v8~OF8Un=ye4Ph>+|IV4=p%s* zVj>Livwn|`DMNX!IU5<~jMj4>Of|$=O2Py!480JyrRQABwhsq3LD4fBtsh%2bbBPS zzje4GYTFhS>8iDAilxb4mVvMg5{TZL*v-A=9FdyupOoD1eK zu9fRp%0 zBFco9AU7uqmQHEHHx=jv*=Y&=l!Vfbv4*%BMu)`I18D86W5DHp1KzFW285`YkT!Mr zu}L7%gA{M#>^Yrz0UndR{7}&w1xh%LsIUXWXNZ^i=rsxL2X>yvOrGr7h^kZj4<6Lm#rg+sw-?!|fBWcA(;PMaKLG$p|u&ZM3 z)W}6M*+d_DQccC0CAta^T$Zr#F-Z)x6FYx~>u1OiX8M78<4!VJUI6Rl2@n9|v{moS zW#li#jjKK*sFR6nRoAJJowXcxcD&CyY$i9RXvD9rz2Zqh?DP=kNE(Y*bs3$FSE*{d zdNYGQhC4Mlt!*Aiblx-zKj0t0^lVz64+eJcx z*H>zvD$``tEZ%A|j?$)q`#*3BJo^xq-u|{fq=mVf$<5%&0t|wxd&&kac7)&<)M*JQ zKES2gq6OvUdU~Ufxa_avUnKNRn_N$yJ;kB43ZF=!Z$3A1V(^*MdXv1@)^Cfq%0A+ zXHU8ggK*430fD6vZXTybM#o$we(!*76T}s+M=~b=sUOG@oM7sOm>aBaXY3EDcIZw#r`^*jAA0p4sH9O9QjL!cYI;f_Vi=2N{geFZ}b@*bYKm0 zJESnO*#E{ei;aQ2^r4C+@Uv;#2_R|`{6piXz%1Y0-=SJug!-JRe4RNkq1#z+`-n}JZ(K;DKTEcR_;swaT znqv&4R7j3Hz>sc{S-K#Wv*yP2jdDA2fm@=OsXR|W&W%_-g6O+MIyxACImd!R&;FB-|PO)mjN?1wkP^Aq`$XD z@JUExw}aCcbNZ#-M?gnogKBsgqwF;v*@uS?%4k4ogQRW~oaUg@%5WPShTjT=iJ*a? zuJ4$Z*&|7<+xl|iqI2=)ZS52CXfN+pev8#WVJSK&*1rAn_DLPpJtl(B$19$FK)2QA zygVZ}l%du_Y~fXu17cXF&2PK^k*wN!TA?JFL6g>Y)qc89AT41tvxeYn%ldhyNK^9A zUVOnhj6AVjCJo!O0CTk&^t<7t8V}z3tK_gF6;`5WOZ;aE>>M#^5P8|M&*?JCovtk7 zI4?dVg?xDyu(7tDF^Hec`>DR5#N!a7y#LC%F?LBY`N&rfT}2)jc5Bl6*7$^j=p7cn z46c%lKR?X19_mT+H}8_@bL4NmPgKFz{A_whEdECBCTSM3lZTl7nD9VG0+>hS+^ql3 zN_v|T(r6imrhLK{iy3lh^%!3;gD^U{!TcKskq{%2J6&LJFNS1sB1|*Ts{Q#vE@>kO z=aIQ#&Oz+497+b`{x}jZB%XhqmcYJIKrb0xQwiUJo7N4q@2lvx-{S}#UJW9cI0bCj zJAK-0!ge$epO@jar~!)?SN!+I$pbkPd`3x%+^)Ig1@{6*cHsWeoyaB%m68kFzXCZN zeVb=p&kU|}$`*pMTHNvYMbU@jZ#LbawU+|p`u%}7ar5p!7CHBVq2FJ5^Wi#1brlXw zSDDR3CS<175X1BQb4J(y<+vZ+?Heh{hpv+Q!Blq2RaGW>u;P1*a1j``~F z3wH}eb=X{?@du_#K^tzn&Ems}c;edNfS=)7C*}w(n-76fxIG!FWA%nZU)JLociARtdNym}CWtaMv+DNu?(Pt(a_fZLdm~%5bN8^#%npk> zncj=%d!i?jKhn=DYY4)W=&C)~gEUT;)tH6V@AsRTq-u}HhP%{2qMIUvr|ZMV3yOs& zZJ473noLmp+fcN01mc$2spizu()__UpnmGHOi?WIZ-L`1E*uF}wI?}72{jC5ftgNm z#XeQWyPnX9sR$`QCr%GJqZ4Lc)^re`52^d`A}il~_6OVZDuj&Sg?NaYX>8cQf>j4+=FwF49^c}lRXK|&sa|_-O&Uq2 zoTP{5DS|2Dl`Y8E03;rx-22xT2=A+zP{9Q`>&SlVe-O-qlzjUcjluMm4C1<~xLM-{ zZpw@RzzMtQs21TP-Db8p_XXSnk_lu}W^QGu?LfWb)Y`j#Vt7LF~l)VKKs^W-U9A?IFPX@=Sn@qczw+Ge?JaPhmifD#{$z5NSM{juSd$L$*FRi z#;w}lw%F99o*r(}pd!1r{y}6=J$GLDR{B=n?=N4yCq#{$r)Tv%g}~0Df6c52odf5c zL!Vh#6^?2inMR6vS-BBy=4eU^Z+81lyZ+ySQ+K_QAvH&P4m6B?g(k@~27&!F->^v9 z#Zo*-oN1}G^=v5f!#$O~l?*tFJ7Si9oQ+l}G1|ds%PHDT>TCUQ=$45O7PLFdtZBh_ z2NDna&TN{=o>hdD_vFRbx<>%khp1%GcVMG^m literal 0 HcmV?d00001 diff --git a/public/icons/undraw_making_art.svg b/public/icons/undraw_making_art.svg new file mode 100644 index 00000000..692111bd --- /dev/null +++ b/public/icons/undraw_making_art.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/index.html b/public/index.html deleted file mode 100644 index f80906d9..00000000 --- a/public/index.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - New Tab - - - -

Error

-

You need to enable JavaScript to use Mue

-

Having trouble? Contact us: https://muetab.com/contact

- -
- - diff --git a/scripts/updatetranslations.js b/scripts/updatetranslations.js index 0c77d415..448928fe 100644 --- a/scripts/updatetranslations.js +++ b/scripts/updatetranslations.js @@ -7,7 +7,10 @@ fs.readdirSync('../src/translations').forEach((file) => { return; } - const newdata = merge(require('../src/translations/en_GB.json'), require('../src/translations/' + file)); + const newdata = merge( + require('../src/translations/en_GB.json'), + require('../src/translations/' + file), + ); fs.writeFileSync('../src/translations/' + file, JSON.stringify(newdata, null, 2)); // add new line fs.appendFileSync('../src/translations/' + file, '\n'); diff --git a/src/App.jsx b/src/App.jsx index fafea95e..784206dd 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,46 +1,56 @@ -import variables from 'modules/variables'; -import { PureComponent } from 'react'; -import { ToastContainer } from 'react-toastify'; - -import Background from 'components/widgets/background/Background'; -import Widgets from 'components/widgets/Widgets'; -import Modals from 'components/modals/Modals'; - -import { loadSettings, moveSettings } from 'modules/helpers/settings'; - -import EventBus from 'modules/helpers/eventbus'; - -export default class App extends PureComponent { - componentDidMount() { - // 4.0 -> 5.0 (the key below is only on 5.0) - // now featuring 5.0 -> 5.1 - // the firstRun check was moved here because the old function was useless - if (!localStorage.getItem('firstRun') || !localStorage.getItem('stats')) { - moveSettings(); - window.location.reload(); - } - - loadSettings(); - - EventBus.on('refresh', (data) => { - if (data === 'other') { - loadSettings(true); - } - }); - - variables.stats.tabLoad(); - } - - render() { - return ( - <> - {(localStorage.getItem('background') === 'true') ? : null} - -
- - -
- - ); - } -} +import variables from 'modules/variables'; +import { PureComponent } from 'react'; +import { ToastContainer } from 'react-toastify'; + +import Background from 'components/widgets/background/Background'; +import Widgets from 'components/widgets/Widgets'; +import Modals from 'components/modals/Modals'; + +import { loadSettings, moveSettings } from 'modules/helpers/settings'; + +import EventBus from 'modules/helpers/eventbus'; + +export default class App extends PureComponent { + componentDidMount() { + // 4.0 -> 5.0 (the key below is only on 5.0) + // now featuring 5.0 -> 5.1 + // the firstRun check was moved here because the old function was useless + if (!localStorage.getItem('firstRun') || !localStorage.getItem('stats')) { + moveSettings(); + window.location.reload(); + } + + loadSettings(); + + EventBus.on('refresh', (data) => { + if (data === 'other') { + loadSettings(true); + } + }); + + variables.stats.tabLoad(); + } + + componentWillUnmount() { + EventBus.off('refresh'); + } + + render() { + return ( + <> + {localStorage.getItem('background') === 'true' ? : null} + +
+ + +
+ + ); + } +} diff --git a/src/components/helpers/autocomplete/Autocomplete.jsx b/src/components/helpers/autocomplete/Autocomplete.jsx index c94afee7..40dfd67f 100644 --- a/src/components/helpers/autocomplete/Autocomplete.jsx +++ b/src/components/helpers/autocomplete/Autocomplete.jsx @@ -10,20 +10,22 @@ export default class Autocomplete extends PureComponent { this.state = { filtered: [], input: '', - autocompleteDisabled: (localStorage.getItem('autocomplete') !== 'true') + autocompleteDisabled: localStorage.getItem('autocomplete') !== 'true', }; } onChange = (e) => { if (this.state.autocompleteDisabled) { return this.setState({ - input: e.target.value + input: e.target.value, }); } this.setState({ - filtered: this.props.suggestions.filter((suggestion) => suggestion.toLowerCase().indexOf(e.target.value.toLowerCase()) > -1), - input: e.target.value + filtered: this.props.suggestions.filter( + (suggestion) => suggestion.toLowerCase().indexOf(e.target.value.toLowerCase()) > -1, + ), + input: e.target.value, }); this.props.onChange(e.target.value); @@ -32,14 +34,14 @@ export default class Autocomplete extends PureComponent { onClick = (e) => { this.setState({ filtered: [], - input: e.target.innerText + input: e.target.innerText, }); this.props.onClick({ preventDefault: () => e.preventDefault(), target: { - value: e.target.innerText - } + value: e.target.innerText, + }, }); }; @@ -47,7 +49,7 @@ export default class Autocomplete extends PureComponent { EventBus.on('refresh', (data) => { if (data === 'search') { this.setState({ - autocompleteDisabled: (localStorage.getItem('autocomplete') !== 'true') + autocompleteDisabled: localStorage.getItem('autocomplete') !== 'true', }); } }); @@ -63,21 +65,29 @@ export default class Autocomplete extends PureComponent { // length will only be > 0 if enabled if (this.state.filtered.length > 0 && this.state.input.length > 0) { autocomplete = ( -
    +
    {this.state.filtered.map((suggestion) => ( -
  • +
    {suggestion} -
  • +
    ))} -
+ ); } return ( - <> - +
+ {autocomplete} - +
); } } diff --git a/src/components/helpers/autocomplete/autocomplete.scss b/src/components/helpers/autocomplete/autocomplete.scss index c86bf5c9..fac9621e 100644 --- a/src/components/helpers/autocomplete/autocomplete.scss +++ b/src/components/helpers/autocomplete/autocomplete.scss @@ -1,23 +1,19 @@ +@use 'scss/variables'; + .suggestions { + @extend %basic; text-align: left; - font-size: calc(5px + 1.2vmin); - background-color: rgba(255, 255, 255, 0.8); - color: black; border-top-width: 0; list-style: none; - margin-top: 40px; - max-height: 143px; overflow: hidden; position: relative; display: inline-block; - margin-left: 40px; - border-radius: 24px; - width: 430px; - opacity: 0; + opacity: 1; + margin-top: 5px; - li { - padding: 0.5rem; - padding-left: 20px; + div { + padding: 0.5rem 0.5rem 0.5rem 20px; + font-size: 0.6em; &:hover { background-color: rgba(255, 255, 255, 0.8); @@ -27,24 +23,22 @@ } .searchBar { - input[type=text]:focus+.suggestions { + input[type='text']:focus + .suggestions { opacity: 1; } } -@media screen and (min-width: 1400px) { - .suggestions { - margin-top: 50px; - } -} - .dark .suggestions { - background-color: rgba(0, 0, 0, 0.5); + background: rgba(0, 0, 0, 0.7); color: white; li { &:hover { - background-color: rgba(0, 0, 0, 0.5); + background: rgba(0, 0, 0, 0.7); } } } + +.micActive { + box-shadow: 0px 0px 50px 1px #e74c3c !important; +} diff --git a/src/components/helpers/carousel/Carousel.jsx b/src/components/helpers/carousel/Carousel.jsx new file mode 100644 index 00000000..2ff9d8f3 --- /dev/null +++ b/src/components/helpers/carousel/Carousel.jsx @@ -0,0 +1,80 @@ +import React, { useState, useEffect, useCallback, useRef, memo } from 'react'; +import { MdOutlineArrowForwardIos, MdOutlineArrowBackIos } from 'react-icons/md'; +import useEmblaCarousel from 'embla-carousel-react'; +import Autoplay from 'embla-carousel-autoplay'; + +import './carousel.scss'; + +function EmblaCarousel({ data }) { + const autoplay = useRef( + Autoplay({ delay: 3000, stopOnInteraction: false }, (emblaRoot) => emblaRoot.parentElement), + ); + + const [emblaRef, emblaApi] = useEmblaCarousel({ loop: false }, [autoplay.current]); + const [prevBtnEnabled, setPrevBtnEnabled] = useState(false); + const [nextBtnEnabled, setNextBtnEnabled] = useState(false); + + const scroll = useCallback( + (direction) => { + if (!emblaApi) { + return; + } + + if (direction === 'next') { + emblaApi.scrollNext(); + } else { + emblaApi.scrollPrev(); + } + autoplay.current.reset(); + }, + [emblaApi], + ); + + const onSelect = useCallback(() => { + if (!emblaApi) { + return; + } + setPrevBtnEnabled(emblaApi.canScrollPrev()); + setNextBtnEnabled(emblaApi.canScrollNext()); + }, [emblaApi]); + + useEffect(() => { + if (!emblaApi) { + return; + } + onSelect(); + emblaApi.on('select', onSelect); + }, [emblaApi, onSelect]); + + return ( +
+
+
+ {data.map((photo, index) => ( +
+
+ Marketplace example screenshot +
+
+ ))} +
+
+ + +
+ ); +} + +export default memo(EmblaCarousel); diff --git a/src/components/helpers/carousel/carousel.scss b/src/components/helpers/carousel/carousel.scss new file mode 100644 index 00000000..a1ec752e --- /dev/null +++ b/src/components/helpers/carousel/carousel.scss @@ -0,0 +1,78 @@ +.carousel { + position: relative; + width: 100%; + margin-left: 5px; +} + +.carousel_viewport { + overflow: hidden; + width: 100%; + &.is-draggable { + cursor: move; + cursor: grab; + } + &.is-dragging { + cursor: grabbing; + } + border-radius: 15px !important; +} + +.carousel_container { + display: flex; + user-select: none; + -webkit-touch-callout: none; + -khtml-user-select: none; + -webkit-tap-highlight-color: transparent; + margin-left: -10px; +} + +.carousel_slide { + position: relative; + min-width: 100%; + padding-left: 10px; + img { + position: absolute; + display: block; + top: 50%; + left: 50%; + width: auto; + min-height: 100%; + min-width: 100%; + max-width: none; + transform: translate(-50%, -50%); + } +} + +.carousel_slide_inner { + position: relative; + overflow: hidden; + height: 250px; +} + +.carousel_button { + outline: 0; + cursor: pointer; + touch-action: manipulation; + position: absolute; + z-index: 1; + top: 50%; + transform: translateY(-50%); + border: 0; + width: 30px !important; + height: 30px !important; + display: grid; + place-items: center; + justify-content: center; + align-items: center; + padding: 0; + &:disabled { + cursor: default; + opacity: 0.3; + } + &.prev { + left: 27px; + } + &.next { + right: 27px; + } +} diff --git a/src/components/helpers/notification/notification.jsx b/src/components/helpers/notification/notification.jsx new file mode 100644 index 00000000..a94fb5d4 --- /dev/null +++ b/src/components/helpers/notification/notification.jsx @@ -0,0 +1,18 @@ +import { memo } from 'react'; + +import variables from 'modules/variables'; +import './preview.scss'; + +function Notification(props) { + return ( +
+ {variables.getMessage('modals.main.settings.reminder.title')} + {variables.getMessage('modals.welcome.preview.description')} + +
+ ); +} + +export default memo(Notification); diff --git a/src/components/helpers/preview/Preview.jsx b/src/components/helpers/preview/Preview.jsx index 7846e7d7..e5789d8a 100644 --- a/src/components/helpers/preview/Preview.jsx +++ b/src/components/helpers/preview/Preview.jsx @@ -1,15 +1,17 @@ +import { memo } from 'react'; import variables from 'modules/variables'; - import './preview.scss'; -export default function Preview(props) { - const getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - +function Preview(props) { return ( -
-

{getMessage('modals.main.settings.reminder.title')}

-

{getMessage('modals.welcome.preview.description')}

- +
+ {variables.getMessage('modals.main.settings.reminder.title')} + {variables.getMessage('modals.welcome.preview.description')} +
); } + +export default memo(Preview); diff --git a/src/components/helpers/preview/preview.scss b/src/components/helpers/preview/preview.scss index b06e77ba..13a1eef8 100644 --- a/src/components/helpers/preview/preview.scss +++ b/src/components/helpers/preview/preview.scss @@ -1,17 +1,22 @@ +@import 'scss/variables'; + .preview-mode { + @extend %basic; position: absolute; - bottom: 20px; - right: 20px; + bottom: 1rem; + right: 1rem; padding: 15px; - color: var(--modal-text); - background: var(--background); - max-width: 300px; - border-radius: .7em; + max-width: 250px; + border-radius: 12px; z-index: 999; text-align: left; cursor: default; + display: flex; + flex-flow: column; + gap: 15px; - h1 { - font-size: 1rem; + button { + @include basicIconButton(10px, 14px, ui); + gap: 20px; } } diff --git a/src/components/helpers/sharemodal/ShareModal.jsx b/src/components/helpers/sharemodal/ShareModal.jsx new file mode 100644 index 00000000..6b565b6c --- /dev/null +++ b/src/components/helpers/sharemodal/ShareModal.jsx @@ -0,0 +1,114 @@ +import { memo } from 'react'; +import variables from 'modules/variables'; +import { MdClose, MdEmail, MdContentCopy } from 'react-icons/md'; +import { FaTwitter, FaFacebookF } from 'react-icons/fa'; +import { AiFillWechat } from 'react-icons/ai'; +import { SiTencentqq } from 'react-icons/si'; +import Tooltip from '../tooltip/Tooltip'; +import { toast } from 'react-toastify'; + +import './sharemodal.scss'; + +function ShareModal({ modalClose, data }) { + const copyLink = () => { + navigator.clipboard.writeText(data); + toast(variables.getMessage('modals.share.copy_link')); + }; + + // look into what's wrong with this + try { + if (!data.data) { + data.data.name = 'this image'; + } + } catch (e) {} + + return ( +
+
+

{variables.getMessage('widgets.quote.share')}

+ +
+ +
+
+
+
+ + + + + + + + + + + + + + + +
+
+ + + + +
+
+ ); +} + +export default memo(ShareModal); diff --git a/src/components/helpers/sharemodal/sharemodal.scss b/src/components/helpers/sharemodal/sharemodal.scss new file mode 100644 index 00000000..51830566 --- /dev/null +++ b/src/components/helpers/sharemodal/sharemodal.scss @@ -0,0 +1,93 @@ +@import '../../../scss/variables'; + +.smallModal { + @extend %tabText; + display: flex; + flex-flow: column; + gap: 15px; + padding: 15px; + width: 320px; + @include themed() { + background: t($modal-background); + } + .resetFooter { + display: flex; + flex-flow: row; + justify-content: flex-end; + gap: 20px; + button { + gap: 20px; + display: flex; + flex-flow: row; + } + } + .textButton { + @include basicIconButton(11px, 1.3rem, modal-text); + border: none !important; + } + .tooltipTitle { + @include themed() { + background: t($modal-sidebar); + box-shadow: 0 0 0 1px t($modal-sidebarActive); + color: t($color); + } + } + .buttons { + justify-content: space-between; + display: flex; + gap: 15px; + } + button { + place-items: center; + display: grid; + @include basicIconButton(11px, 1.3rem, modal); + } + .copy { + display: flex; + flex-flow: row; + gap: 15px; + input[type='text'] { + @include themed() { + background: t($modal-sidebar); + border-radius: t($borderRadius); + box-shadow: 0 0 0 4px t($modal-sidebarActive); + padding: 11px; + flex: 1; + color: t($color); + } + border: none; + outline: none; + } + } + input[type='text'] { + @include themed() { + background: t($modal-sidebar); + border-radius: t($borderRadius); + box-shadow: 0 0 0 4px t($modal-sidebarActive); + padding: 11px; + flex: 1; + color: t($color); + } + border: none; + outline: none; + } + .close { + padding: 15px; + place-items: center; + display: grid; + cursor: pointer; + &:hover { + @include themed() { + background: t($modal-sidebar); + border-radius: t($borderRadius); + } + } + } +} + +.shareHeader { + display: flex; + flex-flow: row; + justify-content: space-between; + align-items: center; +} diff --git a/src/components/helpers/tooltip/Tooltip.jsx b/src/components/helpers/tooltip/Tooltip.jsx index 482e2815..61a55d39 100644 --- a/src/components/helpers/tooltip/Tooltip.jsx +++ b/src/components/helpers/tooltip/Tooltip.jsx @@ -1,10 +1,45 @@ +import { useState, memo } from 'react'; +import { useFloating, flip, offset, shift } from '@floating-ui/react-dom'; import './tooltip.scss'; -export default function Tooltip({ children, title }) { +function Tooltip({ children, title, style, placement, subtitle }) { + const [showTooltip, setShowTooltip] = useState(false); + const { x, y, reference, floating, strategy } = useFloating({ + placement: placement || 'bottom', + middleware: [flip(), offset(15), shift()], + }); + return ( -
- {children} - {title} -
+ <> +
setShowTooltip(true)} + onMouseLeave={() => setShowTooltip(false)} + onFocus={() => setShowTooltip(true)} + onBlur={() => setShowTooltip(false)} + ref={reference} + > + {children} +
+ {showTooltip && ( + + {title} + {subtitle} + + )} + ); } + +export default memo(Tooltip); diff --git a/src/components/helpers/tooltip/infoTooltip.jsx b/src/components/helpers/tooltip/infoTooltip.jsx new file mode 100644 index 00000000..02dad8f7 --- /dev/null +++ b/src/components/helpers/tooltip/infoTooltip.jsx @@ -0,0 +1,47 @@ +import variables from 'modules/variables'; +import { useState, memo } from 'react'; +import { useFloating, flip, offset, shift } from '@floating-ui/react-dom'; +import { MdClose, MdInfo, MdOpenInNew } from 'react-icons/md'; +import Tooltip from './Tooltip'; + +import './tooltip.scss'; + +function InfoTooltip({ title, style, placement, subtitle }) { + const [showTooltip, setShowTooltip] = useState(false); + const { x, y, reference, floating, strategy } = useFloating({ + placement: placement || 'top-start', + middleware: [flip(), offset(10), shift()], + }); + + return ( +
+ setShowTooltip(true)} /> + {showTooltip && ( +
+
+ {title} + +
setShowTooltip(false)}> + +
+
+
+ {subtitle} + + {variables.getMessage('modals.main.settings.open_knowledgebase')} + +
+ )} +
+ ); +} + +export default memo(InfoTooltip); diff --git a/src/components/helpers/tooltip/tooltip.scss b/src/components/helpers/tooltip/tooltip.scss index 661e1db9..3c62ba30 100644 --- a/src/components/helpers/tooltip/tooltip.scss +++ b/src/components/helpers/tooltip/tooltip.scss @@ -1,37 +1,128 @@ -// todo: possibly add tooltip placement option +@import 'scss/variables'; + .tooltip { position: relative; - display: inline-block; + display: grid; +} - .tooltipTitle { - min-width: 60px; - background-color: rgba(255, 255, 255, 0.89); - color: #000; - text-align: center; - font-size: 0.6rem; - border-radius: 6px; - padding: 5px 0; - position: absolute; - z-index: 1; - top: 100%; - left: 50%; - margin-left: -30px; - visibility: hidden; - cursor: initial; - user-select: none; +@keyframes floating { + 0% { + transform: translate(0, -5px); opacity: 0; - transition: 0.2s; } - &:hover { - .tooltipTitle { - visibility: visible; - opacity: 1; + 100% { + transform: translate(0, -0px); + opacity: 1; + } +} + +.tooltipTitle { + @extend %basic; + text-align: center; + font-size: 0.6rem; + padding: 5px 10px; + position: absolute; + z-index: 1; + /*top: 100%; + left: 50%; + margin-top: 15px; + margin-left: -30px;*/ + cursor: initial; + user-select: none; + opacity: 1; + animation-name: floating; + animation-duration: 0.3s; + animation-timing-function: ease-in; +} + +#modal { + .tooltipTitle { + @include themed() { + background: t($modal-sidebar); + box-shadow: 0 0 0 1px t($modal-sidebarActive); + color: t($color); } } } -.dark .tooltipTitle { - background-color: rgba(0, 0, 0, 0.79); - color: #fff; +#root { + .tooltipTitle { + @extend %basic; + } +} + +.tooltipTitle:before { + transform: scale3d(0.2, 0.2, 1); + transition: all 0.2s ease-in-out; +} +.tooltipTitle:after { + transform: translate3d(0, 6px, 0); + transition: all 0.1s ease-in-out; +} +.tooltipTitle:hover:before, +.tooltipTitle:hover:after { + opacity: 1; + transform: scale3d(1, 1, 1); +} +.tooltipTitle:hover:after { + transition: all 0.2s 0.1s ease-in-out; +} + +#arrow { + position: absolute; + background: #333; + width: 8px; + height: 8px; + transform: rotate(45deg); +} + +.infoTooltip { + position: relative; + display: grid; +} + +.infoTooltipTitle { + min-width: 200px; + text-align: center; + position: absolute; + z-index: 1; + cursor: initial; + user-select: none; + opacity: 1; + text-align: left; + padding: 25px; + display: flex; + justify-content: center; + flex-flow: column; + gap: 10px; + @include themed() { + background-color: t($modal-background); + border-radius: t($borderRadius); + box-shadow: 0 0 0 1px t($modal-sidebarActive); + } + .tooltipHeader { + display: flex; + flex-flow: row; + align-items: center; + gap: 25px; + } + .link { + display: flex; + gap: 10px; + align-items: center; + } + .close { + font-size: 20px; + padding: 15px; + place-items: center; + display: grid; + cursor: pointer; + &:hover { + @include themed() { + background: t($modal-sidebar); + border-radius: t($borderRadius); + } + } + } } diff --git a/src/components/modals/ErrorBoundary.jsx b/src/components/modals/ErrorBoundary.jsx index e757a881..a39709ca 100644 --- a/src/components/modals/ErrorBoundary.jsx +++ b/src/components/modals/ErrorBoundary.jsx @@ -1,32 +1,60 @@ import variables from 'modules/variables'; import { PureComponent } from 'react'; import { MdErrorOutline } from 'react-icons/md'; +import { captureException } from '@sentry/react'; export default class ErrorBoundary extends PureComponent { constructor(props) { super(props); this.state = { - error: false + error: false, + errorData: '', + showReport: true, }; } static getDerivedStateFromError(error) { console.log(error); variables.stats.postEvent('modal', 'Error occurred'); - return { - error: true + return { + error: true, + errorData: error, }; } + reportError() { + captureException(this.state.errorData); + this.setState({ + showReport: false, + }); + } + render() { if (this.state.error) { return ( -
-
- -

{variables.language.getMessage(variables.languagecode, 'modals.main.error_boundary.title')}

-

{variables.language.getMessage(variables.languagecode, 'modals.main.error_boundary.message')}

- +
+
+ + + {variables.getMessage('modals.main.error_boundary.title')} + + + {variables.getMessage('modals.main.error_boundary.message')} + +
+ {this.state.showReport ? ( + + ) : ( + + {variables.getMessage('modals.main.error_boundary.sent')} + + )} + +
); diff --git a/src/components/modals/Modals.jsx b/src/components/modals/Modals.jsx index 7c5f118c..2cc5dfb8 100644 --- a/src/components/modals/Modals.jsx +++ b/src/components/modals/Modals.jsx @@ -1,7 +1,6 @@ import variables from 'modules/variables'; import { PureComponent } from 'react'; import Modal from 'react-modal'; -//import Hotkeys from 'react-hot-keys'; import Main from './main/Main'; import Navbar from '../widgets/navbar/Navbar'; @@ -18,14 +17,17 @@ export default class Modals extends PureComponent { mainModal: false, updateModal: false, welcomeModal: false, - preview: false + preview: false, }; } componentDidMount() { - if (localStorage.getItem('showWelcome') === 'true' && window.location.search !== '?nointro=true') { + if ( + localStorage.getItem('showWelcome') === 'true' && + window.location.search !== '?nointro=true' + ) { this.setState({ - welcomeModal: true + welcomeModal: true, }); variables.stats.postEvent('modal', 'Opened welcome'); } @@ -45,7 +47,7 @@ export default class Modals extends PureComponent { closeWelcome() { localStorage.setItem('showWelcome', false); this.setState({ - welcomeModal: false + welcomeModal: false, }); EventBus.dispatch('refresh', 'widgetsWelcomeDone'); EventBus.dispatch('refresh', 'widgets'); @@ -57,14 +59,14 @@ export default class Modals extends PureComponent { localStorage.setItem('welcomePreview', true); this.setState({ welcomeModal: false, - preview: true + preview: true, }); EventBus.dispatch('refresh', 'widgetsWelcome'); } toggleModal(type, action) { this.setState({ - [type]: action + [type]: action, }); if (action !== false) { @@ -75,15 +77,32 @@ export default class Modals extends PureComponent { render() { return ( <> - {this.state.welcomeModal === false ? this.toggleModal(modal, true)}/> : null} - this.toggleModal('mainModal', false)} isOpen={this.state.mainModal} className='Modal mainModal' overlayClassName='Overlay' ariaHideApp={false}> -
this.toggleModal('mainModal', false)}/> + {this.state.welcomeModal === false ? ( + this.toggleModal(modal, true)} /> + ) : null} + this.toggleModal('mainModal', false)} + isOpen={this.state.mainModal} + className="Modal mainModal" + overlayClassName="Overlay" + ariaHideApp={false} + > +
this.toggleModal('mainModal', false)} /> - this.closeWelcome()} isOpen={this.state.welcomeModal} className='Modal welcomemodal mainModal' overlayClassName='Overlay welcomeoverlay' shouldCloseOnOverlayClick={false} ariaHideApp={false}> - this.closeWelcome()} modalSkip={() => this.previewWelcome()}/> + this.closeWelcome()} + isOpen={this.state.welcomeModal} + className="Modal welcomemodal mainModal" + overlayClassName="Overlay mainModal" + shouldCloseOnOverlayClick={false} + ariaHideApp={false} + > + this.closeWelcome()} modalSkip={() => this.previewWelcome()} /> - {this.state.preview ? window.location.reload()}/> : null} - {/*variables.keybinds.toggleModal && variables.keybinds.toggleModal !== '' ? this.toggleModal('mainModal', (this.state.mainModal === true ? false : true))}/> : null*/} + {this.state.preview ? window.location.reload()} /> : null} ); } diff --git a/src/components/modals/main/Main.jsx b/src/components/modals/main/Main.jsx index c53b3e62..151e8ea6 100644 --- a/src/components/modals/main/Main.jsx +++ b/src/components/modals/main/Main.jsx @@ -1,56 +1,72 @@ import variables from 'modules/variables'; -import { Suspense, lazy } from 'react'; +import { Suspense, lazy, useState } from 'react'; + +import { memo } from 'react'; +import { MdClose } from 'react-icons/md'; import Tabs from './tabs/backend/Tabs'; import './scss/index.scss'; +import Tooltip from '../../helpers/tooltip/Tooltip'; // Lazy load all the tabs instead of the modal itself const Settings = lazy(() => import('./tabs/Settings')); const Addons = lazy(() => import('./tabs/Addons')); const Marketplace = lazy(() => import('./tabs/Marketplace')); -const renderLoader = () => ( - -
-
-
-

{variables.language.getMessage(variables.languagecode, 'modals.main.loading')}

+const renderLoader = (current) => ( + +
+
+
+
+
+ {variables.getMessage('modals.main.loading')} +
-
+
); -export default function MainModal({ modalClose }) { - const display = (localStorage.getItem('showReminder') === 'true') ? 'block' : 'none'; +function MainModal({ modalClose }) { + const [currentTab, setCurrentTab] = useState(0); + + const changeTab = (type) => { + switch (type) { + case 'settings': + setCurrentTab(); + break; + case 'addons': + setCurrentTab(); + break; + case 'marketplace': + setCurrentTab(); + break; + default: + break; + } + }; + + if (currentTab === 0) { + setCurrentTab(); + } return ( - <> - × - -
- - - -
-
- - - -
-
- - - -
-
-
-

{variables.language.getMessage(variables.languagecode, 'modals.main.settings.reminder.title')}

-

{variables.language.getMessage(variables.languagecode, 'modals.main.settings.reminder.message')}

- -
- +
+ + + + + + {currentTab} +
); } + +export default memo(MainModal); diff --git a/src/components/modals/main/marketplace/Item.jsx b/src/components/modals/main/marketplace/Item.jsx index 85c252e0..384c43b5 100644 --- a/src/components/modals/main/marketplace/Item.jsx +++ b/src/components/modals/main/marketplace/Item.jsx @@ -1,50 +1,71 @@ import variables from 'modules/variables'; import { PureComponent, Fragment } from 'react'; +import Tooltip from '../../../helpers/tooltip/Tooltip'; +import ImageCarousel from '../../../helpers/carousel/Carousel'; import { toast } from 'react-toastify'; -import { MdArrowBack } from 'react-icons/md'; +import { + MdIosShare, + MdFlag, + MdAccountCircle, + MdBugReport, + MdFormatQuote, + MdImage, + MdTranslate, + MdOutlineKeyboardArrowRight, + MdExpandMore, + MdExpandLess, + MdStyle, +} from 'react-icons/md'; import Modal from 'react-modal'; import { install, uninstall } from 'modules/helpers/marketplace'; -import Lightbox from './Lightbox'; +import ShareModal from '../../../helpers/sharemodal/ShareModal'; export default class Item extends PureComponent { constructor(props) { super(props); this.state = { showLightbox: false, - showUpdateButton: (this.props.addonInstalled === true && this.props.addonInstalledVersion !== this.props.data.version) + showUpdateButton: + this.props.addonInstalled === true && + this.props.addonInstalledVersion !== this.props.data.version, + showMore: false, + shareModal: false, + count: 5, }; } updateAddon() { uninstall(this.props.data.type, this.props.data.display_name); install(this.props.data.type, this.props.data); - toast(variables.language.getMessage(variables.languagecode, 'toasts.updated')); - this.setState({ - showUpdateButton: false + toast(variables.getMessage('toasts.updated')); + this.setState({ + showUpdateButton: false, }); } - render() { - const getMessage = (text) => variables.language.getMessage(variables.languagecode, text); + toggleShowMore() { + if (this.state.showMore === true) { + this.setState({ showMore: false }); + } else { + this.setState({ showMore: true }); + } + } + incrementCount(type) { + if (this.state.count !== this.props.data.data[type].length) { + this.setState({ count: this.props.data.data[type].length }); + } else { + this.setState({ count: 5 }); + } + } + + render() { if (!this.props.data.display_name) { return null; } - let warningHTML; - if (this.props.data.quote_api) { - warningHTML = ( -
-
    -
  • {getMessage('modals.main.marketplace.product.quote_warning.title')}
  • -
  • {getMessage('modals.main.marketplace.product.quote_warning.description')}
  • -
-
- ); - } - // prevent console error let iconsrc = variables.constants.DDG_IMAGE_PROXY + this.props.data.icon; if (!this.props.data.icon) { @@ -54,48 +75,241 @@ export default class Item extends PureComponent { let updateButton; if (this.state.showUpdateButton) { updateButton = ( - -

-
); - } - + } + return ( -
-
- -
-

{this.props.data.display_name}

- {this.props.button} - {updateButton} -

- {iconsrc ? product this.setState({ showLightbox: true })}/> : null} -
-
-
    -
  • {getMessage('modals.main.marketplace.product.version')}
  • - {updateButton ?
  • {this.props.data.version} (Installed: {this.props.data.addonInstalledVersion})
  • :
  • {this.props.data.version}
  • } -
    -
  • {getMessage('modals.main.marketplace.product.author')}
  • -
  • {this.props.data.author}
  • -
-
-
- {warningHTML} -
-
-

-
-
-

{getMessage('modals.main.marketplace.product.overview')}

-

-
- this.setState({ showLightbox: false })} isOpen={this.state.showLightbox} className='Modal lightboxmodal' overlayClassName='Overlay resetoverlay' ariaHideApp={false}> - this.setState({ showLightbox: false })} img={iconsrc}/> +
+ this.setState({ shareModal: false })} + > + this.setState({ shareModal: false })} + /> +
+ + + {variables.getMessage('modals.main.navbar.marketplace')} + + {this.props.data.display_name} + +
+
+
+ {this.props.data.data.photos ? ( +
+
+ +
+
+ ) : null} + {this.props.data.data.settings ? ( + product this.setState({ showLightbox: true })} + /> + ) : null} + {this.props.data.data.quotes ? ( + <> + + + + + + {this.props.data.data.quotes.slice(0, this.state.count).map((quote, index) => ( + + + + + ))} +
{variables.getMessage('modals.main.settings.sections.quote.title')}{variables.getMessage('modals.main.settings.sections.quote.author')}
{quote.quote}{quote.author}
+
+ this.incrementCount('quotes')}> + {this.state.count !== this.props.data.data.quotes.length ? ( + <> + {' '} + {variables.getMessage('modals.main.marketplace.product.show_all')} + + ) : ( + <> + {' '} + {variables.getMessage('modals.main.marketplace.product.show_less')} + + )} + +
+ + ) : null} + {this.props.data.data.settings ? ( + <> + + + + + + {Object.entries(this.props.data.data.settings).slice(0, this.state.count).map(([key, value]) => ( + + + + + ))} +
{variables.getMessage('modals.main.marketplace.product.setting')}{variables.getMessage('modals.main.marketplace.product.value')}
{key}{value}
+
+ this.incrementCount('settings')}> + {this.state.count !== this.props.data.data.settings.length ? ( + <> + {' '} + {variables.getMessage('modals.main.marketplace.product.show_all')} + + ) : ( + <> + {' '} + {variables.getMessage('modals.main.marketplace.product.show_less')} + + )} + +
+ + ) : null} +
+

+ {variables.getMessage('modals.main.marketplace.product.description')} +

+

+

+
+
+ +
+ + {variables.getMessage('modals.main.marketplace.product.version')} + + {updateButton ? ( + + {this.props.data.version} (Installed: {this.props.data.addonInstalledVersion}) + + ) : ( + {this.props.data.version} + )} +
+
+
+ +
+ + {variables.getMessage('modals.main.marketplace.product.author')} + + {this.props.data.author} +
+
+ {this.props.data.data.quotes ? ( +
+ +
+ + {variables.getMessage('modals.main.marketplace.product.no_quotes')} + + {this.props.data.data.quotes.length} +
+
+ ) : null} + {this.props.data.data.photos ? ( +
+ +
+ + {variables.getMessage('modals.main.marketplace.product.no_images')} + + {this.props.data.data.photos.length} +
+
+ ) : null} + {this.props.data.data.quotes && this.props.data.data.language !== '' ? ( +
+ +
+ + {variables.getMessage('modals.main.settings.sections.language.title')} + + {this.props.data.data.language} +
+
+ ) : null} +
+ +
+ + {' '} + {variables.getMessage('modals.main.settings.sections.background.type.title')} + + + {' '} + {variables.getMessage( + 'modals.main.addons.create.types.' + this.props.data.data.type, + ) || 'marketplace'} + +
+
+
+
+
+
+ icon + {this.props.button} +
+ + + + + + +
+ {this.props.data.data.collection ? ( +
+ + {variables.getMessage('modals.main.marketplace.product.part_of')} + + {this.props.data.data.collection} + +
+ ) : null} +
+
+
); } diff --git a/src/components/modals/main/marketplace/Items.jsx b/src/components/modals/main/marketplace/Items.jsx index dea35446..80e43796 100644 --- a/src/components/modals/main/marketplace/Items.jsx +++ b/src/components/modals/main/marketplace/Items.jsx @@ -1,17 +1,121 @@ import variables from 'modules/variables'; +import React, { memo } from 'react'; +import { MdAutoFixHigh, MdOutlineArrowForward, MdOutlineOpenInNew } from 'react-icons/md'; -export default function Items({ items, toggleFunction }) { +function Items({ + type, + items, + collection, + toggleFunction, + collectionFunction, + onCollection, + filter, +}) { return ( -
- {items.map((item) => ( -
toggleFunction(item.name)} key={item.name}> - icon -
-

{item.display_name || item.name}

-

{item.author}

+ <> + {(type === 'all' && !onCollection && (filter === null || filter === '')) || + (type === 'collections' && !onCollection && (filter === null || filter === '')) ? ( + <> +
+
+ {collection.display_name} + {collection.description} +
+ {collection.news === true ? ( + + {variables.getMessage('modals.main.marketplace.learn_more')} + + ) : ( + + )}
+ + ) : null} +
+ {items + ?.filter( + (item) => + item.name.toLowerCase().includes(filter.toLowerCase()) || + filter === '' || + item.author.toLowerCase().includes(filter.toLowerCase()) || + item.type.toLowerCase().includes(filter.toLowerCase()), + ) + .map((item) => { + console.log(item, item.type.split('_')[0].endsWith('s') + ? item.type.split('_')[0] + : item.type.split('_')[0] + 's'); return ( +
toggleFunction(item)} key={item.name}> + + icon +
+ {item.display_name || item.name} + {variables.getMessage('modals.main.marketplace.by', {author: item.author})} + { + type === 'all' && !onCollection + ? + {variables.getMessage(`modals.main.addons.create.types.${ + item.type.split('_')[0] === "preset" + ? "settings" + : item.type.split('_')[0] + 's' + }`)} + + : null} + +
+
+ )})} +
+
+ {type === 'all' && !onCollection ? ( +
+ + {variables.getMessage('modals.main.marketplace.cant_find')} + + {variables.getMessage('modals.main.marketplace.knowledgebase_one') + ' '} + + {variables.getMessage('modals.main.marketplace.knowledgebase_two')} + + {' ' + variables.getMessage('modals.main.marketplace.knowledgebase_three')} +
- ))} -
+ ) : null} + ); } + +export default memo(Items); diff --git a/src/components/modals/main/marketplace/Lightbox.jsx b/src/components/modals/main/marketplace/Lightbox.jsx index 9f6cba49..07631e2c 100644 --- a/src/components/modals/main/marketplace/Lightbox.jsx +++ b/src/components/modals/main/marketplace/Lightbox.jsx @@ -1,12 +1,17 @@ +import { memo } from 'react'; import variables from 'modules/variables'; -export default function Lightbox({ modalClose, img }) { +function Lightbox({ modalClose, img }) { variables.stats.postEvent('modal', 'Opened lightbox'); return ( <> - × - Item screenshot + + × + + Item screenshot ); } + +export default memo(Lightbox); diff --git a/src/components/modals/main/marketplace/SideloadFailedModal.jsx b/src/components/modals/main/marketplace/SideloadFailedModal.jsx index 514f89a0..04007a43 100644 --- a/src/components/modals/main/marketplace/SideloadFailedModal.jsx +++ b/src/components/modals/main/marketplace/SideloadFailedModal.jsx @@ -1,20 +1,25 @@ +import { memo } from 'react'; import variables from 'modules/variables'; import { MdClose } from 'react-icons/md'; +import Tooltip from '../../../helpers/tooltip/Tooltip'; -export default function SideloadFailedModal({ modalClose, reason }) { - const getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - +function SideloadFailedModal({ modalClose, reason }) { return ( - <> -

{getMessage('modals.main.error_boundary.title')}

- {getMessage('modals.main.addons.sideload.failed')} -

- {reason} -
- +
+
+ {variables.getMessage('modals.main.error_boundary.title')} + +
+ +
+
- + {variables.getMessage('modals.main.addons.sideload.failed')} + {reason} +
); } + +export default memo(SideloadFailedModal); diff --git a/src/components/modals/main/marketplace/sections/Added.jsx b/src/components/modals/main/marketplace/sections/Added.jsx index 0408b6ae..a9e68638 100644 --- a/src/components/modals/main/marketplace/sections/Added.jsx +++ b/src/components/modals/main/marketplace/sections/Added.jsx @@ -1,64 +1,111 @@ import variables from 'modules/variables'; import { PureComponent } from 'react'; -import { MdLocalMall } from 'react-icons/md'; +import { MdUpdate, MdOutlineExtensionOff, MdCode } from 'react-icons/md'; import { toast } from 'react-toastify'; +import Modal from 'react-modal'; +import SideloadFailedModal from '../SideloadFailedModal'; +import FileUpload from '../../settings/FileUpload'; import Item from '../Item'; import Items from '../Items'; import Dropdown from '../../settings/Dropdown'; -import { uninstall, urlParser } from 'modules/helpers/marketplace'; +import { install, uninstall, urlParser } from 'modules/helpers/marketplace'; export default class Added extends PureComponent { - getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - - constructor() { - super(); + constructor(props) { + super(props); this.state = { installed: JSON.parse(localStorage.getItem('installed')), item: {}, - button: '' + button: '', + showFailed: false, + failedReason: '', }; this.buttons = { - uninstall: , + uninstall: ( + + ), }; } + installAddon(input) { + let failedReason = ''; + if (!input.name) { + failedReason = variables.getMessage('modals.main.addons.sideload.errors.no_name'); + } else if (!input.author) { + failedReason = variables.getMessage('modals.main.addons.sideload.errors.no_author'); + } else if (!input.type) { + failedReason = variables.getMessage('modals.main.addons.sideload.errors.no_type'); + } else if (!input.version) { + failedReason = variables.getMessage('modals.main.addons.sideload.errors.no_version'); + } else if ( + input.type === 'photos' && + (!input.photos || + !input.photos.length || + !input.photos[0].url || + !input.photos[0].url.default || + !input.photos[0].photographer || + !input.photos[0].location) + ) { + failedReason = variables.getMessage('modals.main.addons.sideload.errors.invalid_photos'); + } else if ( + input.type === 'quotes' && + (!input.quotes || !input.quotes.length || !input.quotes[0].quote || !input.quotes[0].author) + ) { + failedReason = variables.getMessage('modals.main.addons.sideload.errors.invalid_quotes'); + } + + if (failedReason !== '') { + return this.setState({ + failedReason, + showFailed: true, + }); + } + + install(input.type, input); + toast(variables.getMessage('toasts.installed')); + variables.stats.postEvent('marketplace', 'Sideload'); + } + toggle(type, data) { if (type === 'item') { const installed = JSON.parse(localStorage.getItem('installed')); - const info = installed.find((i) => i.name === data); + const info = { + data: installed.find((i) => i.name === data.name), + }; this.setState({ item: { - type: info.type, - name: data, - display_name: info.name, - author: info.author, - description: urlParser(info.description.replace(/\n/g, '
')), + type: info.data.type, + display_name: info.data.name, + author: info.data.author, + description: urlParser(info.data.description.replace(/\n/g, '
')), //updated: info.updated, - version: info.version, - icon: info.screenshot_url, - quote_api: info.quote_api || null + version: info.data.version, + icon: info.data.screenshot_url, + data: info.data, }, - button: this.buttons.uninstall + button: this.buttons.uninstall, }); variables.stats.postEvent('marketplace', 'Item viewed'); } else { this.setState({ - item: {} + item: {}, }); } } uninstall() { uninstall(this.state.item.type, this.state.item.display_name); - - toast(this.getMessage('toasts.uninstalled')); + + toast(variables.getMessage('toasts.uninstalled')); this.setState({ button: '', - installed: JSON.parse(localStorage.getItem('installed')) + installed: JSON.parse(localStorage.getItem('installed')), }); variables.stats.postEvent('marketplace', 'Uninstall'); @@ -84,7 +131,7 @@ export default class Added extends PureComponent { } this.setState({ - installed: installed + installed, }); if (sendEvent) { @@ -95,18 +142,22 @@ export default class Added extends PureComponent { updateCheck() { let updates = 0; this.state.installed.forEach(async (item) => { - const data = await (await fetch(variables.constants.MARKETPLACE_URL + '/item/' + item.name)).json(); + const data = await ( + await fetch(variables.constants.MARKETPLACE_URL + '/item/' + item.name) + ).json(); if (data.version !== item.version) { updates++; } }); - - if (updates > 0) { - toast(this.getMessage('modals.main.addons.updates_available', { - amount: updates - })); + + if (updates > 0) { + toast( + variables.getMessage('modals.main.addons.updates_available', { + amount: updates, + }), + ); } else { - toast(this.getMessage('modals.main.addons.no_updates')); + toast(variables.getMessage('modals.main.addons.no_updates')); } } @@ -115,33 +166,106 @@ export default class Added extends PureComponent { } render() { + const sideLoadBackendElements = () => ( + <> + this.setState({ showFailed: false })} + isOpen={this.state.showFailed} + className="Modal resetmodal mainModal resetmodal" + overlayClassName="Overlay resetoverlay" + ariaHideApp={false} + > + this.setState({ showFailed: false })} + reason={this.state.failedReason} + /> + + this.installAddon(JSON.parse(e))} + /> + + ); + if (this.state.installed.length === 0) { return ( -
-
- -

{this.getMessage('modals.main.addons.empty.title')}

-

{this.getMessage('modals.main.addons.empty.description')}

+ <> +
+ {variables.getMessage('modals.main.navbar.addons')}
-
+
+ {sideLoadBackendElements()} + +
+
+
+ + + {variables.getMessage('modals.main.addons.empty.title')} + + + {variables.getMessage('modals.main.addons.empty.description')} + +
+
+ ); } if (this.state.item.display_name) { - return this.toggle()} />; + return ( + this.toggle()} + /> + ); } return ( <> - this.sortAddons(value)}> - - - - - - -
- this.toggle('item', input)} /> + {variables.getMessage('modals.main.addons.added')} +
+ {sideLoadBackendElements()} +
+ + +
+ this.sortAddons(value)} + > + + + + + +
+ this.toggle('item', input)} + /> ); } diff --git a/src/components/modals/main/marketplace/sections/Create.jsx b/src/components/modals/main/marketplace/sections/Create.jsx index 0b1e6c2f..80ec1c19 100644 --- a/src/components/modals/main/marketplace/sections/Create.jsx +++ b/src/components/modals/main/marketplace/sections/Create.jsx @@ -1,3 +1,4 @@ +// todo: refactor all of this import variables from 'modules/variables'; import { PureComponent } from 'react'; import { @@ -5,15 +6,20 @@ import { MdOutlineInsertPhoto as Photos, MdOutlineFormatQuote as Quotes, MdUpload as ImportIcon, - MdDownload as ExportIcon + MdDownload as ExportIcon, + MdArrowBack, + MdDownload, + MdOpenInNew, } from 'react-icons/md'; import { TextField } from '@mui/material'; import { toast } from 'react-toastify'; +import SettingsItem from '../../../main/settings/SettingsItem'; import { saveFile } from 'modules/helpers/settings/modals'; +import InfoTooltip from '../../../../helpers/tooltip/infoTooltip'; +import Tooltip from '../../../../helpers/tooltip/Tooltip'; import FileUpload from '../../settings/FileUpload'; -import Dropdown from '../../settings/Dropdown'; import '../../../welcome/welcome.scss'; @@ -29,37 +35,53 @@ export default class Create extends PureComponent { version: '', author: '', icon_url: '', - screenshot_url: '' + screenshot_url: '', }, addonData: '', settingsClasses: { current: 'toggle lightTheme', - json: 'toggle lightTheme' - } + json: 'toggle lightTheme', + }, }; } - changeTab(tab, type) { + changeTab(tab, type) { if (type) { - return this.setState({ + return this.setState({ currentTab: tab, addonMetadata: { - type: type - } + type, + }, + }); + } else { + this.setState({ + currentTab: tab, }); } - - this.setState({ - currentTab: tab - }); } importSettings(input) { const data = input || localStorage; let settings = {}; + const ignore = [ + 'statsData', + 'firstRun', + 'showWelcome', + 'language', + 'installed', + 'stats', + 'backup_settings', + 'showReminder', + 'experimental', + 'debugtimeout', + 'quoteLanguage', + 'birthday', + 'location', + 'greetingName', + 'backgroundStartTime', + ]; Object.keys(data).forEach((key) => { - if (key === 'statsData' || key === 'firstRun' || key === 'showWelcome' || key === 'language' || key === 'installed' || key === 'stats' || key === 'backup_settings' || key === 'showReminder' - || key === 'experimental' || key === 'debugtimeout' || key === 'quotelanguage') { + if (ignore.includes(key)) { return; } settings[key] = localStorage.getItem(key); @@ -69,63 +91,19 @@ export default class Create extends PureComponent { addonData: settings, settingsClasses: { current: input ? 'toggle lightTheme active' : 'toggle lightTheme', - json: input ? 'toggle lightTheme active' : 'toggle lightTheme' - } + json: input ? 'toggle lightTheme active' : 'toggle lightTheme', + }, }); - toast(variables.language.getMessage(variables.languagecode, 'toasts.imported')); - } - - updateQuotePackType(type) { - if (type === 'quotePack') { - this.setState({ - addonMetadata: { - type, - name: this.state.addonMetadata.name, - description: this.state.addonMetadata.description, - version: this.state.addonMetadata.version, - author: this.state.addonMetadata.author, - icon_url: this.state.addonMetadata.icon_url, - screenshot_url: this.state.addonMetadata.screenshot_url, - quotes: [] - } - }); - } else { - this.setState({ - addonMetadata: { - type, - name: this.state.addonMetadata.name, - description: this.state.addonMetadata.description, - version: this.state.addonMetadata.version, - author: this.state.addonMetadata.author, - icon_url: this.state.addonMetadata.icon_url, - screenshot_url: this.state.addonMetadata.screenshot_url - }, - addonData: { - url: '', - name: '', - author: '' - } - }); - } - } - - updateQuotePackAPI(type, data) { - this.setState({ - addonData: { - url: (type === 'url') ? data : this.state.addonData.url || '', - name: (type === 'name') ? data : this.state.addonData.name || '', - author: (type === 'author') ? data : this.state.addonData.author || '', - } - }); + toast(variables.getMessage('toasts.imported')); } importQuotes() { this.setState({ - addonData: JSON.parse(localStorage.getItem('customQuote')) || [] + addonData: JSON.parse(localStorage.getItem('customQuote')) || [], }); - toast(variables.language.getMessage(variables.languagecode, 'toasts.imported')); + toast(variables.getMessage('toasts.imported')); } importPhotos() { @@ -137,198 +115,399 @@ export default class Create extends PureComponent { photographer: '???', location: '???', url: { - default: item - } - } + default: item, + }, + }; }); - toast(variables.language.getMessage(variables.languagecode, 'toasts.imported')); + toast(variables.getMessage('toasts.imported')); } catch (e) { console.log(e); - toast(variables.language.getMessage(variables.languagecode, 'toasts.error')); + toast(variables.getMessage('toasts.error')); } this.setState({ - addonData: data + addonData: data, }); } downloadAddon() { - saveFile({ - name: this.state.addonMetadata.name, - description: this.state.addonMetadata.description, - type: (this.state.addonMetadata.type === 'quote_api') ? 'quotes' : this.state.addonMetadata.type, - version: this.state.addonMetadata.version, - author: this.state.addonMetadata.author, - icon_url: this.state.addonMetadata.icon_url, - screenshot_url: this.state.addonMetadata.screenshot_url, - [this.state.addonMetadata.type]: this.state.addonData - }, this.state.addonMetadata.name + '.json'); + saveFile( + { + name: this.state.addonMetadata.name, + description: this.state.addonMetadata.description, + type: this.state.addonMetadata.type, + version: this.state.addonMetadata.version, + author: this.state.addonMetadata.author, + icon_url: this.state.addonMetadata.icon_url, + screenshot_url: this.state.addonMetadata.screenshot_url, + [this.state.addonMetadata.type]: this.state.addonData, + }, + this.state.addonMetadata.name + '.json', + ); } render() { let tabContent; - const getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - const chooseType = ( <> -

{getMessage('modals.main.settings.sections.time.type')}

-
-
-
this.changeTab(2, 'photos')}> - - {getMessage('modals.main.marketplace.photo_packs')} + {/*
+
+ Help Centre + + Home of all docs and guides on creating addons for Mue's marketplace + +
+ +
*/} +
+
+
this.changeTab(2, 'photos')}> + + {variables.getMessage('modals.main.marketplace.photo_packs')}
-
this.changeTab(2, 'quotes')}> - - {getMessage('modals.main.marketplace.quote_packs')} -
-
this.changeTab(2, 'settings')}> - - {getMessage('modals.main.marketplace.preset_settings')} +
this.changeTab(2, 'quotes')}> + + {variables.getMessage('modals.main.marketplace.quote_packs')} +
+
this.changeTab(2, 'settings')}> + + {variables.getMessage('modals.main.marketplace.preset_settings')}
); - // todo: find a better way to do all this - const nextDescriptionDisabled = (this.state.addonMetadata.name !== undefined && + const nextDescriptionDisabled = !( + this.state.addonMetadata.name !== undefined && this.state.addonMetadata.description !== undefined && - this.state.addonMetadata.version !== undefined && this.state.addonMetadata.author !== undefined && - this.state.addonMetadata.icon_url !== undefined && this.state.addonMetadata.screenshot_url !== undefined) - ? false : true; - + this.state.addonMetadata.version !== undefined && + this.state.addonMetadata.author !== undefined && + this.state.addonMetadata.icon_url !== undefined && + this.state.addonMetadata.screenshot_url !== undefined + ); + const setMetadata = (data, type) => { this.setState({ addonMetadata: { - name: (type === 'name') ? data : this.state.addonMetadata.name, - description: (type === 'description') ? data : this.state.addonMetadata.description, - version: (type === 'version') ? data : this.state.addonMetadata.version, - author: (type === 'author') ? data : this.state.addonMetadata.author, - icon_url: (type === 'icon_url') ? data : this.state.addonMetadata.icon_url, - screenshot_url: (type === 'screenshot_url') ? data : this.state.addonMetadata.screenshot_url, - type: this.state.addonMetadata.type - } + name: type === 'name' ? data : this.state.addonMetadata.name, + description: type === 'description' ? data : this.state.addonMetadata.description, + version: type === 'version' ? data : this.state.addonMetadata.version, + author: type === 'author' ? data : this.state.addonMetadata.author, + icon_url: type === 'icon_url' ? data : this.state.addonMetadata.icon_url, + screenshot_url: + type === 'screenshot_url' ? data : this.state.addonMetadata.screenshot_url, + type: this.state.addonMetadata.type, + }, }); }; - const writeDescription = ( + const writeDescription = ( <> -

{getMessage('modals.main.marketplace.product.information')}

- setMetadata(e.target.value, 'name')}/> - setMetadata(e.target.value, 'version')}/> - setMetadata(e.target.value, 'author')}/> - setMetadata(e.target.value, 'icon_url')}/> - setMetadata(e.target.value, 'screenshot_url')}/> - setMetadata(e.target.value, 'description')}/> -
- - +
+
+ + {variables.getMessage( + 'modals.main.addons.create.types.' + this.state.addonMetadata.type, + ) || 'marketplace'} + + + {variables.getMessage( + 'modals.main.addons.create.descriptions.' + this.state.addonMetadata.type, + ) || 'marketplace'} + +
+ +
+ + setMetadata(e.target.value, 'name')} + /> + +
+
+ + {variables.getMessage('modals.main.marketplace.product.version')} + + + + +
+
+ setMetadata(e.target.value, 'version')} + /> +
+
+ + setMetadata(e.target.value, 'author')} + /> + + + setMetadata(e.target.value, 'icon_url')} + /> + + + setMetadata(e.target.value, 'screenshot_url')} + /> + + + setMetadata(e.target.value, 'description')} + /> + +
+ + +
); // settings - const nextSettingsDisabled = (this.state.addonData === '') ? true : false; + const nextSettingsDisabled = this.state.addonData === ''; const importSettings = ( <> -

{getMessage('modals.welcome.sections.settings.title')}

-
-
-
this.importSettings()}> - - {getMessage('modals.main.addons.create.settings.current')} -
-
document.getElementById('file-input').click()}> - - {getMessage('modals.main.addons.create.settings.json')} + +
+
+
this.importSettings()} + > + + {variables.getMessage('modals.main.addons.create.settings.current')} +
+
document.getElementById('file-input').click()} + > + + {variables.getMessage('modals.main.addons.create.settings.json')} +
+
+ + this.importSettings(JSON.parse(e))} + /> + +
+ +
- this.importSettings(JSON.parse(e.target.result))} /> -

- - ); - + // quotes - const nextQuotesDisabled = ((this.state.addonMetadata.type === 'quote_api' && this.state.addonData.url !== '' && this.state.addonData.name !== '' && this.state.addonData.author !== '') - || (this.state.addonMetadata.type === 'quotes' && this.state.addonData.quotes !== '')) ? false : true; + const nextQuotesDisabled = !( + this.state.addonMetadata.type === 'quotes' && this.state.addonData.quotes !== '' + ); const addQuotes = ( <> -

{getMessage('modals.main.addons.create.quotes.title')}

- this.updateQuotePackType(e)}> - - - - {this.state.addonMetadata.type === 'quote_api' ? <> - this.updateQuotePack(e.target.value, 'url')}/> - this.updateQuotePack(e.target.value, 'name')}/> - this.updateQuotePack(e.target.value, 'author')}/> -

- : <> -
-
-
this.importQuotes()} className='toggle lightTheme' style={{ width: '60%', margin: '10px 0 10px 0' }}> - - {getMessage('modals.main.addons.create.settings.current')} + + +
+
+
this.importQuotes()} + className="toggle lightTheme" + style={{ width: '60%', margin: '10px 0 10px 0' }} + > + + {variables.getMessage('modals.main.addons.create.settings.current')} +
+
+
+ +
-
- } - - ); // photos - const nextPhotosDisabled = (this.state.addonData.photos !== '' && this.state.addonData.photos !== []) ? false : true; + const nextPhotosDisabled = !(this.state.addonData.photos !== ''); const addPhotos = ( <> -

{getMessage('modals.main.addons.create.photos.title')}

-
-
-
this.importPhotos()} className='toggle lightTheme' style={{ width: '60%', margin: '10px 0 10px 0' }}> - - {getMessage('modals.main.addons.create.settings.current')} + +
+
+
this.importPhotos()} + className="toggle lightTheme" + style={{ width: '60%', margin: '10px 0 10px 0' }} + > + + {variables.getMessage('modals.main.addons.create.settings.current')} +
+
+
+
+ +
-
- - ); const downloadAddon = ( <> -
-
-
this.downloadAddon()} className='toggle lightTheme' style={{ width: '60%', margin: '10px 0 10px 0' }}> - - {getMessage('modals.main.addons.create.finish.download')} +
+
+ + {variables.getMessage('modals.main.addons.create.publishing.title')} + + + {variables.getMessage('modals.main.addons.create.publishing.subtitle')} + +
+ +
+ +
+
+
this.downloadAddon()} + className="toggle lightTheme" + style={{ width: '60%', margin: '10px 0 10px 0' }} + > + + {variables.getMessage('modals.main.addons.create.finish.download')} +
+
+
+
-
- ); switch (this.state.currentTab) { - case 2: tabContent = writeDescription; break; - case 'settings': tabContent = importSettings; break; - case 'quotes': tabContent = addQuotes; break; - case 'photos': tabContent = addPhotos; break; - case 3: tabContent = downloadAddon; break; - default: tabContent = chooseType; + case 2: + tabContent = writeDescription; + break; + case 'settings': + tabContent = importSettings; + break; + case 'quotes': + tabContent = addQuotes; + break; + case 'photos': + tabContent = addPhotos; + break; + case 3: + tabContent = downloadAddon; + break; + default: + tabContent = chooseType; } return ( <> -

{getMessage('modals.main.addons.create.other_title')}

+
+ {this.state.currentTab !== 1 && ( +
+ + this.changeTab(1)} + /> + +
+ )} + + {variables.getMessage('modals.main.addons.create.other_title')} + +
{tabContent} ); diff --git a/src/components/modals/main/marketplace/sections/Marketplace.jsx b/src/components/modals/main/marketplace/sections/Marketplace.jsx index 9d6ef109..8b30da9d 100644 --- a/src/components/modals/main/marketplace/sections/Marketplace.jsx +++ b/src/components/modals/main/marketplace/sections/Marketplace.jsx @@ -1,7 +1,13 @@ import variables from 'modules/variables'; import { PureComponent } from 'react'; import { toast } from 'react-toastify'; -import { MdWifiOff, MdLocalMall } from 'react-icons/md'; +import { + MdWifiOff, + MdLocalMall, + MdOutlineKeyboardArrowRight, + MdSearch, + MdOutlineArrowForward, +} from 'react-icons/md'; import Item from '../Item'; import Items from '../Items'; @@ -10,8 +16,6 @@ import Dropdown from '../../settings/Dropdown'; import { install, urlParser, uninstall } from 'modules/helpers/marketplace'; export default class Marketplace extends PureComponent { - getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - constructor() { super(); this.state = { @@ -19,11 +23,21 @@ export default class Marketplace extends PureComponent { button: '', featured: {}, done: false, - item: {} + item: {}, + collection: false, + filter: '', }; this.buttons = { - uninstall: , - install: + uninstall: ( + + ), + install: ( + + ), }; this.controller = new AbortController(); } @@ -33,10 +47,18 @@ export default class Marketplace extends PureComponent { let info; // get item info try { - info = await (await fetch(`${variables.constants.MARKETPLACE_URL}/item/${this.props.type}/${data}`, { signal: this.controller.signal })).json(); + let type = this.props.type; + if (type === 'all' || type === 'collections') { + type = data.type; + } + info = await ( + await fetch(`${variables.constants.MARKETPLACE_URL}/item/${type}/${data.name}`, { + signal: this.controller.signal, + }) + ).json(); } catch (e) { if (this.controller.signal.aborted === false) { - return toast(this.getMessage('toasts.error')); + return toast(variables.getMessage('toasts.error')); } } @@ -73,22 +95,57 @@ export default class Marketplace extends PureComponent { icon: info.data.screenshot_url, data: info.data, addonInstalled, - addonInstalledVersion + addonInstalledVersion, + api_name: data.name, }, - button: button + button: button, }); variables.stats.postEvent('marketplace-item', `${this.state.item.display_name} viewed`); + } else if (type === 'collection') { + this.setState({ + done: false, + }); + const collection = await ( + await fetch(`${variables.constants.MARKETPLACE_URL}/collection/${data}`, { + signal: this.controller.signal, + }) + ).json(); + this.setState({ + items: collection.data.items, + collectionTitle: collection.data.name, + collectionDescription: collection.data.description, + collectionImg: collection.data.img, + collection: true, + done: true, + }); } else { this.setState({ - item: {} + item: {}, }); } } async getItems() { - const { data } = await (await fetch(variables.constants.MARKETPLACE_URL + '/items/' + this.props.type, { signal: this.controller.signal })).json(); - const featured = await (await fetch(variables.constants.MARKETPLACE_URL + '/featured', { signal: this.controller.signal })).json(); + const dataURL = + this.props.type === 'collections' + ? variables.constants.MARKETPLACE_URL + '/collections' + : variables.constants.MARKETPLACE_URL + '/items/' + this.props.type; + const { data } = await ( + await fetch(dataURL, { + signal: this.controller.signal, + }) + ).json(); + const featured = await ( + await fetch(variables.constants.MARKETPLACE_URL + '/featured', { + signal: this.controller.signal, + }) + ).json(); + const collections = await ( + await fetch(variables.constants.MARKETPLACE_URL + '/collections', { + signal: this.controller.signal, + }) + ).json(); if (this.controller.signal.aborted === true) { return; @@ -98,7 +155,8 @@ export default class Marketplace extends PureComponent { items: data, oldItems: data, featured: featured.data, - done: true + collections: collections.data, + done: true, }); this.sortMarketplace(localStorage.getItem('sortMarketplace'), false); @@ -111,13 +169,16 @@ export default class Marketplace extends PureComponent { uninstall(this.state.item.type, this.state.item.display_name); } - toast(this.getMessage('toasts.' + type + 'ed')); + toast(variables.getMessage('toasts.' + type + 'ed')); this.setState({ - button: (type === 'install') ? this.buttons.uninstall : this.buttons.install + button: type === 'install' ? this.buttons.uninstall : this.buttons.install, }); - variables.stats.postEvent('marketplace-item', `${this.state.item.display_name} ${(type === 'install' ? 'installed': 'uninstalled')}`); - variables.stats.postEvent('marketplace', (type === 'install' ? 'Install': 'Uninstall')); + variables.stats.postEvent( + 'marketplace-item', + `${this.state.item.display_name} ${type === 'install' ? 'installed' : 'uninstalled'}`, + ); + variables.stats.postEvent('marketplace', type === 'install' ? 'Install' : 'Uninstall'); } sortMarketplace(value, sendEvent) { @@ -140,7 +201,7 @@ export default class Marketplace extends PureComponent { this.setState({ items: items, - sortType: value + sortType: value, }); if (sendEvent) { @@ -148,6 +209,21 @@ export default class Marketplace extends PureComponent { } } + returnToMain() { + this.setState({ + items: this.state.oldItems, + collection: false, + }); + } + + reloadItems() { + this.setState({ + done: false, + }); + + this.getItems(); + } + componentDidMount() { if (navigator.onLine === false || localStorage.getItem('offlineMode') === 'true') { return; @@ -164,24 +240,40 @@ export default class Marketplace extends PureComponent { render() { const errorMessage = (msg) => { return ( -
-
- {msg} + <> +
+ + {variables.getMessage('modals.main.navbar.marketplace')} +
-
+
+
{msg}
+
+ ); }; if (navigator.onLine === false || localStorage.getItem('offlineMode') === 'true') { - return errorMessage(<> - -

{this.getMessage('modals.main.marketplace.offline.title')}

-

{this.getMessage('modals.main.marketplace.offline.description')}

- ); + return errorMessage( + <> + +

{variables.getMessage('modals.main.marketplace.offline.title')}

+

+ {variables.getMessage('modals.main.marketplace.offline.description')} +

+ , + ); } if (this.state.done === false) { - return errorMessage(

{this.getMessage('modals.main.loading')}

); + return errorMessage( + <> +
+
+ {variables.getMessage('modals.main.loading')} +
+ , + ); } const featured = () => { @@ -191,40 +283,154 @@ export default class Marketplace extends PureComponent { }; return ( -
+

{this.state.featured.title}

{this.state.featured.name}

- +
); - } + }; - if (this.state.items.length === 0) { + if (this.state.items?.length === 0) { return ( <> {featured()} - {errorMessage(<> - -

{this.getMessage('modals.main.addons.empty.title')}

-

{this.getMessage('modals.main.marketplace.no_items')}

- )} + {errorMessage( + <> + +

{variables.getMessage('modals.main.addons.empty.title')}

+

+ {variables.getMessage('modals.main.marketplace.no_items')} +

+ , + )} ); } if (this.state.item.display_name) { - return this.toggle()} addonInstalled={this.state.item.addonInstalled} addonInstalledVersion={this.state.item.addonInstalledVersion}/>; + return ( + this.toggle()} + addonInstalled={this.state.item.addonInstalled} + addonInstalledVersion={this.state.item.addonInstalledVersion} + icon={this.state.item.screenshot_url} + /> + ); } return ( <> - {featured()} -
- this.sortMarketplace(value)}> - - - - this.toggle('item', input)} /> + {this.state.collection === true ? ( + <> +
+ this.returnToMain()}> + + {variables.getMessage('modals.main.navbar.marketplace')} + + {' '} + {variables.getMessage('modals.main.marketplace.collection')} + +
+
+
+ {this.state.collectionTitle} + {this.state.collectionDescription} +
+
+ {variables.getMessage('modals.main.marketplace.collection')} +
+
+ + ) : ( + <> +
+ + {variables.getMessage('modals.main.navbar.marketplace')} + +
+
+ {this.props.type !== 'collections' ? ( +
+
+ this.setState({ filter: event.target.value })} + /> + + + {/* this.reloadItems()}> + {variables.getMessage('widgets.navbar.tooltips.refresh')} + */} +
+ ) : null} + this.sortMarketplace(value)} + > + + + +
+ + )} + {this.props.type === 'collections' && !this.state.collection ? ( + this.state.items.map((item) => ( + <> + {!item.news ? ( +
+
+ {item.display_name} + {item.description} +
+ +
+ ) : null} + + )) + ) : ( + this.toggle('item', input)} + collectionFunction={(input) => this.toggle('collection', input)} + filter={this.state.filter} + /> + )} ); } diff --git a/src/components/modals/main/marketplace/sections/Sideload.jsx b/src/components/modals/main/marketplace/sections/Sideload.jsx deleted file mode 100644 index e7affd72..00000000 --- a/src/components/modals/main/marketplace/sections/Sideload.jsx +++ /dev/null @@ -1,67 +0,0 @@ -import variables from 'modules/variables'; -import { PureComponent } from 'react'; -import { MdIntegrationInstructions } from 'react-icons/md'; -import { toast } from 'react-toastify'; -import Modal from 'react-modal'; - -import SideloadFailedModal from '../SideloadFailedModal'; - -import FileUpload from '../../settings/FileUpload'; - -import { install } from 'modules/helpers/marketplace'; - -export default class Sideload extends PureComponent { - getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - - constructor(props) { - super(props); - this.state = { - showFailed: false, - failedReason: '' - } - } - - installAddon(input) { - let failedReason = ''; - if (!input.name) { - failedReason = this.getMessage('modals.main.addons.sideload.errors.no_name'); - } else if (!input.author) { - failedReason = this.getMessage('modals.main.addons.sideload.errors.no_author'); - } else if (!input.type) { - failedReason = this.getMessage('modals.main.addons.sideload.errors.no_type'); - } else if (!input.version) { - failedReason = this.getMessage('modals.main.addons.sideload.errors.no_version'); - } else if (input.type === 'photos' && (!input.photos || !input.photos.length || !input.photos[0].url || !input.photos[0].url.default || !input.photos[0].photographer || !input.photos[0].location)) { - failedReason = this.getMessage('modals.main.addons.sideload.errors.invalid_photos'); - } else if (input.type === 'quotes' && (!input.quotes || !input.quotes.length || !input.quotes[0].quote || !input.quotes[0].author)) { - failedReason = this.getMessage('modals.main.addons.sideload.errors.invalid_quotes'); - } - - if (failedReason !== '') { - return this.setState({ - failedReason, - showFailed: true - }); - } - - install(input.type, input); - toast(this.getMessage('toasts.installed')); - variables.stats.postEvent('marketplace', 'Sideload'); - } - - render() { - return ( -
-
- this.installAddon(JSON.parse(e.target.result))} /> - -

{this.getMessage('modals.main.addons.sideload.title')}

- -
- this.setState({ showFailed: false })} isOpen={this.state.showFailed} className='Modal resetmodal mainModal sideloadModal' overlayClassName='Overlay resetoverlay' ariaHideApp={false}> - this.setState({ showFailed: false })} reason={this.state.failedReason}/> - -
- ); - } -} diff --git a/src/components/modals/main/scss/index.scss b/src/components/modals/main/scss/index.scss index a03e7fc0..bbccdb61 100644 --- a/src/components/modals/main/scss/index.scss +++ b/src/components/modals/main/scss/index.scss @@ -1,4 +1,4 @@ -@import '../../../../scss/variables'; +@import 'scss/variables'; @import 'modules/sidebar'; @import 'modules/navbar'; @@ -7,46 +7,9 @@ @import 'modules/scrollbars'; @import 'settings/main'; -@import 'settings/buttons'; @import 'marketplace/main'; -.Modal { - color: var(--modal-text); - background-color: var(--background); - box-shadow: 0 0 20px rgba(0, 0, 0, 0.3); - border: none; - opacity: 1; - z-index: -2; - transition-timing-function: ease-in; - border-radius: map-get($modal, 'border-radius'); - user-select: none; - scrollbar-width: thin; - scrollbar-color: #34495e #bdc3c7; - position: relative; - - &:focus { - outline: 0; - } -} - -.closeModal { - position: absolute; - top: 1rem; - right: 2rem; - font-size: 4em; - cursor: pointer; - - &:hover { - color: grey; - } -} - -.ReactModal__Html--open, -.ReactModal__Body--open { - overflow: hidden; -} - .Overlay { position: fixed; z-index: 100; @@ -56,18 +19,53 @@ bottom: 0; width: 100vw; height: 100vh; - display: flex; - align-items: baseline; - justify-content: center; + display: grid; + place-items: center; } -.ReactModal__Content { - box-shadow: 0 0 30px 0 rgba(0, 0, 0, 0.25); - overflow-y: auto; - position: relative; +.Modal { + @include themed() { + color: t($color); + } + box-shadow: 0 0 20px rgba(0, 0, 0, 0.3); + opacity: 1; + z-index: -2; + transition-timing-function: ease-in; + border-radius: map-get($modal, 'border-radius'); + user-select: none; + overflow-y: auto; transform: scale(0); - transition: all 300ms cubic-bezier(0.47, 1.64, 0.41, 0.8); + transition: all 0.3s cubic-bezier(0.47, 1.64, 0.41, 0.8); + + &:focus { + outline: 0; + } +} + +.closePositioning { + position: absolute; + top: 3rem; + right: 3rem; +} + +.closeModal { + display: grid; + place-items: center; + padding: 0.5em; + border-radius: 12px; + cursor: pointer; + svg { + font-size: 2em; + } + &:hover { + background: rgba(121, 121, 121, 0.226); + } +} + +.ReactModal__Html--open, +.ReactModal__Body--open { + overflow: hidden; } /* modal transition */ @@ -81,32 +79,11 @@ transform: scale(0); } -@media only screen and (max-height: 700px) { - .ReactModal__Content { - min-height: 500px; - max-height: calc(100vh - 30vh); - } -} - -/* main modal */ -.mainModal { - padding: 25px; -} - #modal { - position: absolute; - margin: auto; - top: 0; - right: 0; - bottom: 0; - left: 0; - height: 80%; - width: 60%; -} - -@media (max-width: 1700px) { - #modal { - width: 80% !important; + height: 80vh; + width: clamp(60vw, 1200px, 90vw); + @include themed() { + background-color: t($modal-background); } } @@ -130,12 +107,227 @@ h5 { font-size: 0.8rem; } -.tab-content { - hr { - height: 5px; - background: rgba(196, 196, 196, 0.74); - outline: none; - border: none; - margin: 50px 0 30px 0; +.loaderHolder { + display: flex; + gap: 15px; + flex-flow: column; + align-items: center; +} + +#loader { + display: inline-block; + width: 50px; + height: 50px; + @include themed() { + border: 3px solid t($modal-sidebar); + border-radius: 50%; + border-top-color: t($modal-sidebarActive); } -} \ No newline at end of file + animation: spin 1s ease-in-out infinite; + -webkit-animation: spin 1s ease-in-out infinite; +} + +@keyframes spin { + to { + -webkit-transform: rotate(360deg); + } +} +@-webkit-keyframes spin { + to { + -webkit-transform: rotate(360deg); + } +} + +.headerExtras { + display: flex; + flex-flow: column; + gap: -1px; + padding: 10px 0; + div:nth-child(1) { + display: flex; + flex-flow: column; + gap: 10px; + } + form { + margin-top: 10px; + } + .link { + display: flex; + flex-flow: row; + gap: 15px; + align-items: center; + } +} + +.marketplaceCondition { + display: flex; + flex-flow: row !important; + gap: -1px; + justify-content: space-between; + align-items: center; +} + +.languageSettings { + margin-bottom: 15px; + .MuiFormGroup-root { + gap: 5px; + } + .MuiFormControl-root { + width: 100% !important; + gap: 15px; + .MuiFormControlLabel-root { + display: flex; + flex-direction: row-reverse; + justify-content: space-between; + padding: 5px 5px 5px 20px; + @include themed() { + background: t($modal-sidebar); + border-radius: t($borderRadius); + &:hover { + background: t($modal-sidebarActive); + } + } + } + } +} + +.sliderTitle { + width: 100%; + display: flex; + justify-content: space-between; + padding: 15px 0 15px 0; + .link { + display: flex; + flex-flow: row; + gap: 15px; + align-items: center; + } +} + +.moreSettings { + cursor: pointer; + display: flex; + flex-flow: row; + justify-content: space-between; + padding: 25px; + margin-top: 20px; + @include themed() { + background: t($modal-sidebar); + border-radius: t($borderRadius); + box-shadow: 0 0 0 1px t($modal-sidebarActive); + &:hover { + background: t($modal-sidebarActive); + } + } + svg { + font-size: 20px; + } + .left { + display: flex; + flex-flow: row; + align-items: center; + gap: 25px; + } + .content { + display: flex; + flex-flow: column; + } + .action { + display: flex; + flex-flow: row; + gap: 20px; + align-items: center; + } +} + +.reminder-info { + display: flex; + flex-flow: column; + position: absolute; + bottom: 0; + padding: 15px; + gap: 15px; + @include themed() { + background-color: t($modal-sidebarActive); + border-radius: t($borderRadius); + } + button { + @include basicIconButton(5px, 5px, modal); + display: flex; + justify-content: center; + gap: 15px; + svg { + margin: 0 !important; + } + } + @extend %tabText; +} + +.quoteSkeleton { + margin-top: 5px; + display: flex; + flex-flow: column; + gap: 5px; + align-items: center; + div { + display: flex; + flex-flow: row; + } + .text { + display: flex; + flex-flow: column; + padding: 5px; + } + .skeletonAuthor { + font-size: smaller; + padding: 5px; + display: flex; + flex-flow: row; + align-items: center; + gap: 25px; + padding: 0 20px 0 5px; + svg { + @include themed() { + background-color: t($modal-sidebar); + padding: 10px; + border-radius: t($borderRadius); + place-items: center; + } + } + @include themed() { + background-color: t($modal-sidebarActive); + border-radius: t($borderRadius); + } + .title { + font-size: medium !important; + } + .subtitle { + font-size: smaller !important; + } + } +} + +.quickLinksSkeleton { + .circles { + display: flex; + flex-flow: row; + gap: 5px; + div { + margin-top: 10px; + padding: 3px; + height: 20px; + width: 20px; + border-radius: 100%; + display: grid; + place-items: center; + @include themed() { + background-color: t($modal-sidebarActive); + } + } + } +} + +.clockSkeleton { + font-size: 30px !important; + font-weight: bold; +} diff --git a/src/components/modals/main/scss/marketplace/_main.scss b/src/components/modals/main/scss/marketplace/_main.scss index 148b60f2..836e2635 100644 --- a/src/components/modals/main/scss/marketplace/_main.scss +++ b/src/components/modals/main/scss/marketplace/_main.scss @@ -1,104 +1,297 @@ +// this file is too long @import 'modules/item'; @import 'modules/buttons'; @import 'modules/featured'; @import 'modules/lightbox'; +@import 'scss/variables'; .items { - display: inline-grid; - grid-template-columns: repeat(4, 1fr); + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + grid-gap: 1.5rem; margin-top: 15px; + margin-bottom: 30px; .item { position: relative; border-radius: 12px; - height: 80px; - width: 260px; - background: var(--sidebar); + width: auto; cursor: pointer; - margin-right: 20px; - margin-top: 20px; + transition: 0.5s; + display: flex; + flex-flow: column; + align-items: center; + text-align: center; + gap: 15px; + background-position: center; + background-repeat: no-repeat; + background-size: cover; - img { - height: 80px; - width: 80px; - border-radius: 12px 0 0 12px; - background: white; - } - - h4 { - font-size: 20px; - line-height: 20px; - font-weight: 600; - } - - img, - .details { - display: inline; - } - - .details { - position: absolute; - left: 85px; - top: -15px; - - img { - margin-left: 10px; - height: 15px; + @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); + } } } - p { - margin-top: 5px; - line-height: 20px; + .tags { + margin-top: 7px; + } + + .item-back { + filter: blur(60px) saturate(180%) brightness(90%); + -webkit-filter: blur(60px) saturate(180%) brightness(90%); + position: absolute; + object-fit: cover !important; + height: 90px !important; + width: 100px !important; + 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 { + padding: 10px; + margin-bottom: 24px; + display: flex; + flex-flow: column; + gap: 5px; + + .card-title { + font-size: 18px; + } + + .card-subtitle { + font-size: 14px; + + @include themed() { + color: t($subColor); + } + } + + .card-type { + margin-top: 8px; + font-size: 12px; + font-weight: bolder; + @include themed() { + color: t($subColor); + } + border-radius: 150px; + padding: 2px 8px; + backdrop-filter: blur(16px) saturate(180%); + -webkit-backdrop-filter: blur(16px) saturate(180%); + background-color: rgba(255, 255, 255, 0.1); + border: 1px solid rgba(209, 213, 219, 0.3); + } + } + } +} + +.itemPage { + display: flex; + flex-flow: row; + justify-content: space-between; + + .itemShowcase { + display: flex; + flex-flow: column; + gap: 25px; + width: 60%; + max-width: 650px; + + .description { + max-lines: 3; + font-size: 16px; + } + + img { + width: 100%; + height: auto; + } + + table { + table-layout: fixed; + width: 100%; + max-width: 650px !important; + word-wrap: break-word !important; + } + } + + .itemInfo { + background-position: center; + background-repeat: no-repeat; + background-size: cover; + border-radius: 15px; + width: 25%; + max-height: 450px; + + .front { + padding: 20px; + height: 100%; + display: flex; + flex-flow: column; + gap: 15px; + width: 100%; + box-sizing: border-box !important; + border-radius: 12px 12px 0 0; + backdrop-filter: blur(40px) saturate(150%) brightness(75%); + -webkit-backdrop-filter: blur(40px) saturate(150%) brightness(75%); + @include themed() { + background-image: linear-gradient(to bottom, transparent, t($modal-background)); + } + } + + + .icon { + width: 100%; + height: auto; + border-radius: 12px; + box-shadow: 0 5px 25px black; + } + + .divider { + text-transform: uppercase; + + @include themed() { + color: t($subColor); + } + } + + .iconButtons { + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: 1fr; + grid-gap: 20px; + button { + width: 100%; + padding: 0; + } + } + } +} + +.tags { + display: flex; + flex-flow: row; + flex-wrap: wrap; + gap: 15px; + align-items: center; +} + +.tag { + padding: 2px 10px 2px 10px; + border-radius: 12px; + font-size: 12px; + display: grid; + place-items: center; + @include themed() { + background: t($modal-sidebar); + box-shadow: 0 0 0 3px t($modal-sidebarActive); + + span { + &:before { + content: '#'; + color: t($subColor); + margin-right: 5px; + } } &:hover { - background: var(--tab-active); + background: t($modal-sidebarActive); } } } -@media (max-width: 1920px) { - .items { - grid-template-columns: repeat(3, 1fr); +.moreTag { + padding: 2px 10px 2px 10px; + border-radius: 12px; + font-size: 12px; + display: grid; + place-items: center; + + @include themed() { + background: t($modal-sidebar); + box-shadow: 0 0 0 3px t($modal-sidebarActive); + + span { + &:before { + content: '+'; + color: t($subColor); + margin-right: 5px; + } + } + + &:hover { + background: t($modal-sidebarActive); + } } } -@media (max-width: 1680px) and (min-width: 1500px) { - .items { - grid-template-columns: repeat(2, 1fr); - } -} - -@media (max-width: 1440px) { - .items { - grid-template-columns: repeat(1, 1fr); - } -} - -.emptyitems { - width: 25vw; - display: flex; - justify-content: center; - margin-top: 90px; +.emptyItems { + width: 100%; + height: 100%; + display: grid; + place-items: center; } .emptyMessage { - text-align: center; - background: var(--sidebar); - padding: 25px; - border-radius: 30px; - box-shadow: 0 0 10px rgb(0 0 0 / 30%); - position: absolute; - width: 300px; + display: grid; + place-items: center; + grid-gap: 5px; + padding: 50px; - h1 { - font-size: 2rem; + @include themed() { + .sideloadIcon { + font-size: 50px; + color: t($subColor); + } } + button { + display: flex; + flex-flow: row; + } +} + +.emptyNewMessage { + display: flex; + gap: 20px; + flex-flow: column; + text-align: center; + align-items: center; + img { + width: 200px; + height: auto; + } svg { - font-size: 50px; - margin-bottom: -20px; + font-size: 70px; + /* background: -webkit-linear-gradient(90deg,rgba(255,92,39,.7) 37%,rgba(255,70,110,.67) 60%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent;*/ + } + button { + svg { + font-size: 1rem; + } + } + .buttonsRow { + display: flex; + flex-flow: row; + gap: 30px; + align-items: center; } } @@ -106,24 +299,275 @@ p.author { margin-top: -5px; } -#item>img, -.updateimage, -.updatechangelog>p>img { +#item > img, +.updateImage, +.updateChangelog > p > img { border-radius: 12px; height: 200px; width: auto; cursor: pointer; } -/* sideload failed modal */ -.sideloadModal { - min-width: 250px; - max-width: 250px; - overflow-x: hidden; -} - -@media (max-height: 1080px) { - .dropdownsortAddons { - margin-top: 40px !important; +.returnButton { + display: grid; + place-items: center; + width: 48px; + height: 48px; + border-radius: 12px; + cursor: pointer; + margin-right: 25px; + svg { + font-size: 2em; + } + &:hover { + background: rgba(121, 121, 121, 0.226); + } +} + +.flexTopMarketplace { + display: flex; +} + +.itemWarning { + display: flex; + flex-direction: column; + align-items: center; + + @include themed() { + background: t($modal-sidebar); + box-shadow: 0 0 0 4px t($modal-sidebarActive); + border-radius: t($borderRadius); + padding: 15px; + } + + .topRow { + display: flex; + flex-flow: column; + align-items: center; + } + + .subtitle { + text-align: justify; + } +} + +.truncate { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.filter { + display: flex; + flex-flow: row; + padding: 15px; + gap: 15px; + justify-content: space-between; + align-items: center; + margin-top: 15px; + + @include themed() { + background: t($modal-sidebar); + border-radius: t($borderRadius); + box-shadow: 0 0 0 4px t($modal-sidebarActive); + } + + .MuiFormControl-root { + margin-bottom: 10px; + } + + .buttonSection { + display: flex; + flex-flow: row; + gap: 20px; + } + + .tags { + max-width: 50%; + } +} + +.collectionPage { + height: 200px; + display: flex; + flex-flow: column; + align-items: center; + justify-content: center; + gap: 25px; + background-size: cover; + background-position: center; + background-repeat: no-repeat; + + @include themed() { + border-radius: t($borderRadius); + } + + .nice-tag { + border-radius: 150px; + padding: 1px 12px; + backdrop-filter: blur(16px) saturate(180%); + -webkit-backdrop-filter: blur(16px) saturate(180%); + background-color: rgba(255, 255, 255, 0.1); + border: 1px solid rgba(209, 213, 219, 0.3); + color: #fff; + } + .content { + display: flex; + flex-flow: column; + text-align: center; + .mainTitle { + justify-content: center; + color: #fff !important; + } + + .subtitle { + color: #ccc !important; + } + } +} + +.collection { + display: flex; + justify-content: space-between; + padding: 36px 48px; + margin: 15px 0; + background-size: cover; + background-position: center; + background-repeat: no-repeat; + align-items: center; + + @include themed() { + box-shadow: 0 0 0 1px t($modal-sidebarActive); + border-radius: t($borderRadius); + } + + .content { + display: flex; + flex-flow: column; + gap: 15px; + max-width: 250px; + + .title { + color: #fff !important; + } + + .subtitle { + color: #ccc !important; + } + } + + .items { + justify-content: center; + } + + button.collectionButton, + a.collectionButton { + display: flex; + align-items: center; + gap: 15px; + padding: 1px 12px; + backdrop-filter: blur(16px) saturate(180%); + -webkit-backdrop-filter: blur(16px) saturate(180%); + background-color: rgba(255, 255, 255, 0.1); + border: 1px solid rgba(209, 213, 219, 0.3); + color: #fff; + &:hover { + backdrop-filter: blur(16px) saturate(180%); + -webkit-backdrop-filter: blur(16px) saturate(180%); + background-color: rgba(17, 25, 40, 0.2); + border: 1px solid rgba(255, 255, 255, 0.125); + } + } +} + +a.collectionButton { + height: 40px; + text-decoration: none; + @include themed() { + border-radius: t($borderRadius); + } +} + +.smallBanner { + button { + padding: 0 15px 0 15px; + } + + display: flex; + justify-content: space-between; + padding: 15px; + margin-top: 15px; + align-items: center; + + @include themed() { + box-shadow: 0 0 0 4px t($modal-sidebarActive); + border-radius: t($borderRadius); + background: t($modal-sidebar); + } + + .content { + display: flex; + flex-flow: column; + gap: 15px; + max-width: 250px; + } +} + +.marketplaceRefresh { + display: flex; + flex-flow: row; + gap: 5px; + align-items: center; +} + +.marketplaceSearch { + display: flex; + align-items: center; + padding: 10px 30px; + border-radius: 10px; + font-size: 18px; + @include themed() { + background: t($modal-sidebarActive); + box-shadow: 0 0 0 3px t($modal-sidebarActive); + background: t($modal-sidebar); + } + input { + all: unset; + } + @include themed() { + &:focus-within { + background: t($modal-sidebarActive); + box-shadow: 0 0 0 1px t($color); + } + + &:disabled { + background: t($modal-sidebarActive); + cursor: not-allowed; + } + } +} + +.inCollection { + background-image: linear-gradient(to left, transparent, #000), + url('https://external-preview.redd.it/JyhsEoGMhKIMi3kvfBS24L0IllAO_KrIm4UI-dA1Ax4.jpg?auto=webp&s=b5adf9859b2c1855a5b3085f9453a6e878548505'); + display: flex; + flex-flow: column; + gap: 15px; + padding: 15px; + + @include themed() { + box-shadow: 0 0 0 4px t($modal-sidebarActive); + border-radius: t($borderRadius); + } +} + +.createYourOwn { + display: flex; + flex-flow: column; + gap: 20px; + align-items: center; + margin-top: 30px; + svg { + font-size: 30px; } } diff --git a/src/components/modals/main/scss/marketplace/modules/_buttons.scss b/src/components/modals/main/scss/marketplace/modules/_buttons.scss index a3144d44..a7908f83 100644 --- a/src/components/modals/main/scss/marketplace/modules/_buttons.scss +++ b/src/components/modals/main/scss/marketplace/modules/_buttons.scss @@ -1,4 +1,4 @@ -%storebutton { +%storeButton { cursor: pointer; font-size: 18px; display: block; @@ -14,7 +14,7 @@ } } -.dark %storebutton { +.dark %storeButton { border: 2px solid map-get($theme-colours, 'main'); color: map-get($theme-colours, 'main'); @@ -24,44 +24,13 @@ } } -.removeFromMue { - @extend %storebutton; - - border: 2px solid #ff4757; - color: #ff4757; - float: right; - margin-top: -10px; - - &:hover { - background: #ff4757; - color: map-get($theme-colours, 'main'); - } -} - -.addToMue { - @extend %storebutton; - - float: right; - margin-top: -10px; -} - .sideload { display: inline; - margin-top: 0px; + margin-top: 0; float: none !important; -} - -button.round { - margin-left: 5px; - width: 30px; - height: 30px; - border-radius: 50%; - text-align: center; - line-height: 3px; - vertical-align: middle; - padding: 10px; + width: 200px; } .updateCheck { - margin-top: 15px; + flex-flow: row !important; } diff --git a/src/components/modals/main/scss/marketplace/modules/_featured.scss b/src/components/modals/main/scss/marketplace/modules/_featured.scss index e2c62b56..ab77d966 100644 --- a/src/components/modals/main/scss/marketplace/modules/_featured.scss +++ b/src/components/modals/main/scss/marketplace/modules/_featured.scss @@ -1,10 +1,9 @@ .featured { - margin-top: 40px; border-radius: 15px; padding: 50px; color: #fff; - box-shadow: 0 0 10px rgb(0 0 0 / 30%); - width: 85%; + width: calc(100% - 6rem); + margin-top: 13px; button { float: left; diff --git a/src/components/modals/main/scss/marketplace/modules/_item.scss b/src/components/modals/main/scss/marketplace/modules/_item.scss index 2f6937a5..a34dd50e 100644 --- a/src/components/modals/main/scss/marketplace/modules/_item.scss +++ b/src/components/modals/main/scss/marketplace/modules/_item.scss @@ -1,90 +1,101 @@ -#item { - h1 { - font-size: 40px; - line-height: 20px; - } - - img { - float: left; - } - - a { - color: var(--modal-link); - cursor: pointer; - - &:hover { - opacity: 0.8; - } - } -} - .side { float: right; margin-left: 20px; } -#item>h1, -#item>svg { - display: inline; -} - p.description { - margin-top: 0px; + margin-top: 0; max-width: 800px; } -.backArrow { - cursor: pointer; - width: 2rem !important; - height: 2rem !important; - - &:hover { - color: grey; - } -} - .informationContainer { margin-top: 150px; position: absolute; } -.productInformation { - padding: 10px; - background: var(--sidebar); - width: 350px; - border-radius: 12px; - min-height: 180px; +.moreInfo { + display: flex; + justify-content: space-between; + flex-wrap: wrap; + width: calc(100% - 30px); + gap: 25px; - h4 { - cursor: initial !important; + .items { + margin-top: 0 !important; } - li { - margin-left: -4px; - list-style: none; - font-size: 16px; - cursor: initial !important; + .item { + flex: 1 0 40% !important; + } - &.header { + @include themed() { + background: t($modal-sidebar); + box-shadow: t(boxShadow); + border-radius: t($borderRadius); + padding: 15px; + + .infoItem { + display: flex; + flex-flow: row; + align-items: center; + gap: 15px; + flex: 1 0 44%; + + svg { + font-size: 25px; + color: t($subColor); + } + + .text { + display: flex; + flex-flow: column; + } + } + + .header { text-transform: uppercase; - color: #787878; - margin-left: -5px; + color: t($subColor); + } + + span { + color: t($color); } } } -@media only screen and (max-width: 1200px) { - .side { - margin-top: 222px; - float: none !important; - } +.itemTitle { + font-size: 38px; + font-weight: 600; - .overview { - margin-top: -160px !important; + @include themed() { + color: t($color); } } -.overview { - font-size: 30px !important; - margin-top: 33px; +.titleTop { + display: flex; + flex-flow: column; + gap: 3px; +} + +.showMore { + display: flex; + align-items: center; + gap: 5px; + transition: 0.5s; + cursor: pointer; + + @include themed() { + &:hover { + color: t($subColor); + } + } +} + +.showMoreItems { + display: flex; + flex-flow: column; + justify-content: center; + align-items: center; + gap: 10px; } diff --git a/src/components/modals/main/scss/marketplace/modules/_lightbox.scss b/src/components/modals/main/scss/marketplace/modules/_lightbox.scss index 92b059db..23fb967e 100644 --- a/src/components/modals/main/scss/marketplace/modules/_lightbox.scss +++ b/src/components/modals/main/scss/marketplace/modules/_lightbox.scss @@ -1,4 +1,4 @@ -.lightboxmodal { +.lightBoxModal { margin: auto; max-width: 60%; background: none !important; diff --git a/src/components/modals/main/scss/modules/_navbar.scss b/src/components/modals/main/scss/modules/_navbar.scss index 8a7cf0cf..efbbbde9 100644 --- a/src/components/modals/main/scss/modules/_navbar.scss +++ b/src/components/modals/main/scss/modules/_navbar.scss @@ -1,17 +1,21 @@ .navbar-item { - font-size: 22px; - font-weight: 500; - display: flex; - flex-direction: column; - align-items: center; - color: var(--photo-info); - + flex-flow: row !important; + padding: 0 15px 0 15px; + @include themed() { + background: t($modal-secondaryColour) !important; + border-radius: t($borderRadius) !important; + box-shadow: t($boxShadow) !important; + border: 0px !important; + &:hover { + background: t($modal-sidebarActive) !important; + } + } &:hover { svg { background: var(--tab-active); } - color: var(--modal-text) + color: var(--modal-text); } span, @@ -21,9 +25,6 @@ svg { font-size: 1.2em !important; - width: 60px; - padding: 5px; - border-radius: 20px; color: var(--photo-info); } } @@ -35,38 +36,21 @@ } } -.modalNavbar { - position: absolute; - left: 20rem; - top: 1rem; - justify-content: center; +#modal { display: flex; - - svg { - margin-right: 0.5rem; - padding: 3px; - vertical-align: middle; - } + align-items: flex-start; + justify-content: flex-start; } -@media only screen and (max-width: 1200px) { - .modalNavbar { - left: 6rem; - } -} - -@media only screen and (max-width: 800px) { - li.navbar-item { - span { - display: none; - } - } +.modalNavbar { + display: flex; + flex-flow: row; + gap: 25px; + margin-bottom: 1rem; } .navbar-item-active { - color: var(--modal-text); - - svg { - background: var(--sidebar); + @include themed() { + background: t($modal-sidebarActive) !important; } } diff --git a/src/components/modals/main/scss/modules/_scrollbars.scss b/src/components/modals/main/scss/modules/_scrollbars.scss index b324add5..4b76d6f6 100644 --- a/src/components/modals/main/scss/modules/_scrollbars.scss +++ b/src/components/modals/main/scss/modules/_scrollbars.scss @@ -1,12 +1,17 @@ +@import '../.../../../../../././../scss/variables'; + ::-webkit-scrollbar { width: 6px; height: 6px; - border-top-right-radius: map-get($modal, 'border-radius'); - border-bottom-right-radius: map-get($modal, 'border-radius'); + border-radius: 12px; + @include themed() { + background: t($modal-sidebar); + } } ::-webkit-scrollbar-thumb { - background: #636e72; - border-top-right-radius: map-get($modal, 'border-radius'); - border-bottom-right-radius: map-get($modal, 'border-radius'); + @include themed() { + background: t($modal-sidebarActive); + } + border-radius: 12px; } diff --git a/src/components/modals/main/scss/modules/_sidebar.scss b/src/components/modals/main/scss/modules/_sidebar.scss index 35670a29..8add630a 100644 --- a/src/components/modals/main/scss/modules/_sidebar.scss +++ b/src/components/modals/main/scss/modules/_sidebar.scss @@ -1,87 +1,75 @@ -ul.sidebar { - position: absolute; - top: 0; - left: 0; - margin: 0; - padding-left: 0; - background: var(--sidebar); - border-radius: 12px 0 0 12px; - text-align: left; - font-size: 24px; - min-height: 110vh; +@import '../.../../../../../././../scss/variables'; - h1 { - text-align: center; - font-size: 1.8em; - } +.sidebar { + @include themed() { + top: 0; + left: 0; + position: sticky; + margin: 0; + padding: 0; + background: t($modal-sidebar); + border-radius: 12px 0 0 12px; + overflow-y: auto; + height: 80vh; + min-width: 250px; + overflow-x: hidden; - svg { - vertical-align: middle; - padding: 5px; - } - - hr { - height: 3px; - background: rgba(196, 196, 196, 0.74); - width: 75%; - outline: none; - border: none; - } -} - -@media (max-height: 999px) and (min-height: 920px) { - ul.sidebar { - min-height: 160vh; - } -} - -@media (max-height: 919px) and (min-height: 700px) { - ul.sidebar { - min-height: 200vh; - } -} - -@media (max-height: 699px) and (min-height: 400px) { - ul.sidebar { - min-height: 260vh; - } -} - -@media only screen and (min-width: 1200px) { - ul.sidebar { - width: 310px; - align-items: center; - } -} - -li { - list-style: none; - font-size: 24px; - padding: 5px 30px 5px 30px; - cursor: pointer; - margin-top: 2px; -} - -.tab-list-active { - background: var(--tab-active); -} - -@media only screen and (max-width: 1200px) { - li.tab-list-item { - span { - display: none; + .mainTitle { + text-align: center; + font-size: 35px; + display: flex; + justify-content: center; + padding: 25px; } - } - ul.sidebar { - h1 { - display: none; + svg { + margin-left: 20px; + margin-right: 20px; + color: t($subColor); + font-size: 17px; + } + + hr { + height: 1px; + background: #ccc; + margin: 0 1.75rem 0 1.75rem; + border: none; + } + + button { + color: t($color); + font-size: 18px; + list-style: none; + cursor: pointer; + border-radius: 12px; + display: flex; + align-items: center; + margin: 0.2rem; + padding: 0.5rem; + transition: 0.5s; + outline: none; + border: none; + background: none; + min-width: calc(100% - 1.2em); + text-align: left; + + &:hover { + background: t($modal-sidebarActive); + } + + &:active { + background: t($modal-sidebarActive); + box-shadow: 0 0 0 0.5px t($color); + } + + &:focus { + background: t($modal-sidebarActive); + box-shadow: 0 0 0 0.5px t($color); + } + } + + .tab-list-active { + background: t($modal-sidebarActive); } } } - -.tab-list-item { - &:hover { - background: var(--tab-active); - } -} diff --git a/src/components/modals/main/scss/modules/_tab-content.scss b/src/components/modals/main/scss/modules/_tab-content.scss index b15659a5..2e220222 100644 --- a/src/components/modals/main/scss/modules/_tab-content.scss +++ b/src/components/modals/main/scss/modules/_tab-content.scss @@ -1,43 +1,171 @@ +@import '../../../../../scss/variables'; + .tab-content { - position: absolute; + button { + @include modal-button(standard); + } + @include themed() { + padding: 1rem 3rem 3rem 3rem; + display: flex; + flex-direction: column; + width: 100%; + background: t($modal-background); + @extend %tabText; + hr { + width: 100%; + background: rgba(196, 196, 196, 0.74); + outline: none; + } + .settingsRow { + display: flex; + align-items: center; + min-height: 100px; + justify-content: space-between; + /*border-top: 1px solid #ccc;*/ + border-bottom: 1px solid #ccc; + padding-top: 1rem; + padding-bottom: 1rem; - h3 { - font-size: 1.5rem; - margin-bottom: 0; + &.settingsNoBorder { + border-bottom: none; + } + .content { + display: flex; + flex-flow: column; + max-width: 50%; + } + .action { + display: flex; + flex-flow: column; + align-items: flex-end; + width: 300px; + button { + margin-top: 10px; + width: 283px; + } + } + } } } -@media only screen and (min-width: 2300px) { - .tab-content { - left: 350px; - top: 7%; +.activityButtons { + flex-wrap: wrap !important; + justify-content: space-between !important; + align-items: flex-end !important; + align-content: space-between !important; + flex-wrap: wrap !important; + flex-direction: row !important; + + button:not(:first-child) { + width: 40% !important; + height: 99px !important; + flex-flow: column-reverse !important; + } + + button { + @include modal-button(standard); } } -@media only screen and (max-width: 1920px) { - .tab-content { - left: 120px; - top: 60px; +table { + border-collapse: separate; + @include themed() { + border-radius: t($borderRadius); + margin-top: 20px; + tr:first-child { + background: t($modal-sidebarActive); + th { + padding: 1rem; + } + } + td { + padding: 15px; + } + tr { + th:last-child { + display: grid; + place-items: center; + } + } + + ::placeholder { + color: t($subColor); + } + + tr:not(:first-child) { + background: t($modal-sidebar); + textarea { + width: 90%; + margin: 10px; + color: t($color); + } + } } } -@media only screen and (min-width: 1920px) { - .tab-content { - left: 350px; - top: 9%; +.donateButton { + @include modal-button(standard); + flex-flow: row !important; + text-decoration: none; + height: auto !important; + svg { + font-size: 1.5rem !important; } } -@media only screen and (max-width: 1400px), -(min-width: 1400px) { - .tab-content { - left: 350px; +.flexGrow { + flex-grow: 1; +} +.messageMap { + display: flex; + flex-flow: row; + align-items: center; + gap: 25px; + padding: 25px; + justify-content: space-between; + div:nth-child(1) { + display: flex; + flex-flow: row; + gap: 25px; + align-items: center; + } + .icon { + border-radius: 100%; + display: grid; + place-items: center; + padding: 15px; + font-size: 25px; + @include themed() { + background: t($modal-sidebarActive); + } + } + .messageText { + display: flex; + flex-flow: column; + flex-grow: 3; + textarea { + @include themed() { + color: t($color); + } + } + .subtitle { + @include themed() { + color: t($subColor); + font-size: 13px; + } + } + } + .messageAction { + float: right; + } + @include themed() { + background: t($modal-sidebar); + border-radius: t($borderRadius); } } -@media only screen and (max-width: 1200px) { - .tab-content { - left: 125px; - top: 90px; - } +.messagesContainer { + display: flex; + flex-flow: column; + gap: 25px; } diff --git a/src/components/modals/main/scss/settings/_buttons.scss b/src/components/modals/main/scss/settings/_buttons.scss deleted file mode 100644 index ca4976e3..00000000 --- a/src/components/modals/main/scss/settings/_buttons.scss +++ /dev/null @@ -1,121 +0,0 @@ -@import '../../../../../scss/modules/buttons'; - -.refresh { - @extend %settingsButton; - - background-color: map-get($button-colours, 'confirm'); - border: 2px solid map-get($button-colours, 'confirm'); - - &:hover { - border: 2px solid map-get($button-colours, 'confirm'); - color: map-get($button-colours, 'confirm'); - } -} - -.reset { - @extend %settingsButton; - - background-color: map-get($button-colours, 'reset'); - border: 2px solid map-get($button-colours, 'reset'); - - &:hover { - border: 2px solid map-get($button-colours, 'reset'); - color: map-get($button-colours, 'reset'); - } -} - -.add, -.close { - @extend %settingsButton; - - background-color: map-get($button-colours, 'other'); - border: 2px solid map-get($button-colours, 'other'); - - &:hover { - color: map-get($button-colours, 'other'); - border: 2px solid map-get($button-colours, 'other'); - } -} - -.close { - padding: 10px 50px 10px 50px; -} - -.export, -.uploadbg, -.import { - width: 440px; - height: 60px; - background-color: var(--sidebar); - border: none; - outline: none; - color: var(--modal-text); - border-radius: 12px; - margin-right: 25px; - width: 220px; - cursor: pointer; - border-radius: 24px; - border: 3px solid var(--tab-active); - font-size: 1rem; - - &:hover { - background-color: var(--tab-active); - } - - &:disabled { - cursor: not-allowed; - background: none; - border: 1px solid var(--tab-active); - - &:hover { - background: none; - border: 1px solid var(--tab-active); - } - } -} - -.export, -.import { - margin-left: 20px; -} - -.round-small { - height: 10px !important; - width: 10px !important; -} - -.data-buttons-row { - width: 350px; - display: flex; - flex-direction: row; - - button { - background: var(--sidebar); - text-align: center; - border-radius: 20px; - padding: 20px; - border: 3px solid var(--tab-active); - height: 40px; - font-size: 1rem; - margin: 0 10px 10px 0; - display: flex; - flex-direction: column-reverse; - align-items: center; - color: var(--modal-text); - - svg { - font-size: 2em; - } - - &:hover { - background: var(--tab-active); - cursor: pointer; - } - } -} - -.customvideoicon { - position: absolute; - margin-bottom: 45px; - font-size: 3em !important; -} diff --git a/src/components/modals/main/scss/settings/_main.scss b/src/components/modals/main/scss/settings/_main.scss index ce879728..3910eb01 100644 --- a/src/components/modals/main/scss/settings/_main.scss +++ b/src/components/modals/main/scss/settings/_main.scss @@ -1,6 +1,6 @@ @import 'modules/resetmodal'; +@import 'scss/variables'; @import 'modules/material-ui'; -@import 'modules/reminder'; @import 'modules/tabs/about'; @import 'modules/tabs/changelog'; @@ -8,7 +8,7 @@ input { /* colour picker */ - &[type=color] { + &[type='color'] { border-radius: 100%; height: 30px; width: 30px; @@ -17,6 +17,9 @@ input { -webkit-appearance: none; vertical-align: middle; background: none; + @include themed() { + border: t($modal-sidebarActive) 1px solid; + } &::-webkit-color-swatch-wrapper { padding: 0; @@ -29,7 +32,7 @@ input { } /* firefox fixes for colour picker (using "," didn't work) */ - &[type=color]::-moz-color-swatch { + &[type='color']::-moz-color-swatch { border-radius: 100%; height: 30px; width: 30px; @@ -50,11 +53,13 @@ input { } /* date picker */ - &[type=date] { - width: 280px; - color: var(--modal-text); - background: var(--background); - border: solid var(--modal-text) 1px; + &[type='date'] { + width: 260px; + @include themed() { + background: t($modal-sidebar); + border: 3px solid t($modal-sidebarActive); + color: t($color); + } padding: 15px 20px; border-radius: 4px; display: flex !important; @@ -77,10 +82,151 @@ h4 { cursor: pointer; } -.keybind-table { - text-align: left; - - th { - padding-right: 10px; +.photosEmpty { + height: 400px; + display: grid; + place-items: center; + button { + padding: 0 20px 0 20px; + } +} + +.imagesTopBar { + padding-top: 25px; + display: flex; + flex-flow: row; + justify-content: space-between; + align-items: center; + div:nth-child(1) { + display: flex; + flex-flow: row; + align-items: center; + gap: 20px; + svg { + font-size: 30px; + @include themed() { + color: t($subColor); + } + } + div { + display: flex; + flex-flow: column; + } + } + .topbarbuttons { + display: flex; + flex-flow: row; + gap: 25px; + } + button { + padding: 0 20px 0 20px; + } +} + +.statsGrid { + display: grid; + grid-template-columns: repeat(3, 1fr); + grid-template-rows: repeat(2, 1fr); + column-gap: 45px; + row-gap: 100px; + padding-top: 45px; + .leftPanel { + grid-area: 1 / 1 / 3 / 3; + } + .rightPanel { + grid-area: 1 / 3 / 4 / 4; + display: flex; + flex-flow: column; + gap: 10px; + .subtitle { + text-transform: capitalize; + } + span { + font-size: 20px; + } + } +} + +.breadcrumb { + display: flex; + flex-flow: row; + padding-top: 20px; + gap: 10px; + align-items: center; + + .settingsReturn { + border-radius: 12px; + cursor: pointer; + padding: 4px; + + svg { + font-size: 2em; + } + &:hover { + background: rgba(121, 121, 121, 0.226); + } + } + .returnButton { + display: grid; + place-items: center; + width: 48px; + height: 48px; + border-radius: 12px; + cursor: pointer; + margin-right: 25px; + svg { + font-size: 2em; + } + &:hover { + background: rgba(121, 121, 121, 0.226); + } + } +} + +.achievements { + margin-top: 25px; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + grid-gap: 10px; +} + +.achievement { + padding: 20px 10px 20px 10px; + display: flex; + flex-flow: row !important; + align-items: center; + @include themed() { + background: t($modal-sidebarActive); + border-radius: t($borderRadius); + gap: 10px; + } + svg { + font-size: 20px !important; + padding: 15px; + border-radius: 100%; + @include themed() { + background: t($modal-sidebar); + } + } +} + +.statSection.rightPanel { + padding: 25px; + @include themed() { + border-radius: t($borderRadius); + background: t($modal-sidebar); + box-shadow: 0 0 0 4px t($modal-sidebarActive); + svg { + font-size: 50px; + color: t($subColor); + } + } +} + +.achievementContent { + display: flex; + flex-flow: column; + span { + font-size: 15px; } } diff --git a/src/components/modals/main/scss/settings/modules/_material-ui.scss b/src/components/modals/main/scss/settings/modules/_material-ui.scss index 7203d7de..558c5f95 100644 --- a/src/components/modals/main/scss/settings/modules/_material-ui.scss +++ b/src/components/modals/main/scss/settings/modules/_material-ui.scss @@ -1,4 +1,7 @@ /* these are overrides for the material ui default styles */ + +@import '../../../../../../scss/variables'; + .MuiCheckbox-colorPrimary.Mui-checked, .MuiSwitch-colorPrimary.Mui-checked, .MuIconButton-colorPrimary.Mui-checked, @@ -9,19 +12,23 @@ .aboutLink, .MuiSlider-colorPrimary, legend { - color: var(--modal-text) !important; + @include themed() { + color: t($color) !important; + } } .MuiFormControlLabel-labelPlacementStart { - margin-left: 0px !important; + margin-left: 0 !important; } -.MuiSwitch-colorPrimary.Mui-checked+.MuiSwitch-track { +.MuiSwitch-colorPrimary.Mui-checked + .MuiSwitch-track { background: darkgray !important; } -.MuiIconButton-label>svg.MuiSvgIcon-root { - color: var(--modal-text) !important; +.MuiIconButton-label > svg.MuiSvgIcon-root { + @include themed() { + color: t($color) !important; + } } .MuiTouchRipple-root { @@ -33,7 +40,9 @@ legend { } .checkbox svg { - fill: var(--modal-text) !important; + @include themed() { + fill: t($color) !important; + } } .radio-title { @@ -51,11 +60,15 @@ legend { } .MuiOutlinedInput-notchedOutline { - border-color: var(--modal-text) !important; + @include themed() { + border-color: t($color) !important; + } } .MuiFormLabel-root-MuiInputLabel-root { - color: var(--modal-text) !important; + @include themed() { + color: t($color) !important; + } } .MuiInputLabel-root, @@ -66,23 +79,28 @@ legend { .Mui-focused, legend, .MuiOutlinedInput-input { - color: var(--modal-text) !important; + @include themed() { + color: t($color) !important; + } } .MuiMenu-list { - background-color: var(--background) !important; - color: var(--modal-text) !important; + @include themed() { + background-color: t($modal-background); + color: t($color); + } } .Mui-selected { - background-color: var(--tab-active) !important; + @include themed() { + background-color: t($modal-sidebarActive) !important; + } } .MuiTextField-root, .MuiFormControl-root, .MuiSlider-root { width: 300px !important; - display: flex !important; } .Mui-disabled { @@ -95,9 +113,38 @@ legend, } .MuiPaper-root { - background-color: var(--background) !important; + @include themed() { + background-color: t($modal-background) !important; + } } .MuiSlider-valueLabel { - background-color: var(--tab-active) !important; + @include themed() { + background-color: t($modal-sidebarActive) !important; + } +} + +.MuiFormControlLabel-labelPlacementStart { + justify-content: flex-end; +} + +.settingsRow { + .MuiFormControlLabel-root { + flex-direction: row-reverse; + margin-right: 0; + display: flex; + justify-content: space-between; + width: 100%; + margin-left: 0; + } + .MuiFormControlLabel-root { + width: 100%; + } +} + +.css-6od3lo-MuiChip-label { + @include themed() { + color: t($color) !important; + } + text-transform: capitalize; } diff --git a/src/components/modals/main/scss/settings/modules/_reminder.scss b/src/components/modals/main/scss/settings/modules/_reminder.scss deleted file mode 100644 index 7be620a9..00000000 --- a/src/components/modals/main/scss/settings/modules/_reminder.scss +++ /dev/null @@ -1,14 +0,0 @@ -.reminder-info { - position: absolute; - bottom: 20px; - right: 20px; - padding: 15px; - color: var(--modal-text); - background: var(--sidebar); - max-width: 300px; - border-radius: 0.7em; - - h1 { - font-size: 1rem; - } -} diff --git a/src/components/modals/main/scss/settings/modules/_resetmodal.scss b/src/components/modals/main/scss/settings/modules/_resetmodal.scss index 1b489f78..e69de29b 100644 --- a/src/components/modals/main/scss/settings/modules/_resetmodal.scss +++ b/src/components/modals/main/scss/settings/modules/_resetmodal.scss @@ -1,27 +0,0 @@ -.resetmodal { - min-height: 300px !important; - max-width: 300px !important; - margin: auto; - font-size: 1rem; - - h4 { - cursor: initial; - font-size: 1.1rem; - } -} - -.resetfooter { - position: absolute; - bottom: 20px; - width: 300px; - justify-content: center; - display: flex; - - button.reset { - margin-right: 43px; - } -} - -.resetoverlay { - background-color: rgba(0, 0, 0, 0.5); -} diff --git a/src/components/modals/main/scss/settings/modules/tabs/_about.scss b/src/components/modals/main/scss/settings/modules/tabs/_about.scss index ba8c3892..6fa2fcb9 100644 --- a/src/components/modals/main/scss/settings/modules/tabs/_about.scss +++ b/src/components/modals/main/scss/settings/modules/tabs/_about.scss @@ -1,16 +1,3 @@ -.aboutIcon { - color: var(--modal-text) !important; - padding-right: 10px; - - &:hover { - opacity: 0.8; - } - - svg { - font-size: 1.5em; - } -} - .aboutLink { &:hover { opacity: 0.8; @@ -20,17 +7,28 @@ .aboutLogo { height: 100px; width: auto; - margin-left: -15px; + margin: calc(1rem - 15px) 0 1rem 0; + align-self: center; } -.abouticon { - width: 96px; - height: auto; - border-radius: 50%; - padding-right: 5px; +.aboutContact { + flex-flow: row; + display: flex; + gap: 15px; + a { + @include basicIconButton(11px, 1.2rem, modal); + } } -.contacth3 { - font-size: 1.5rem; - margin-bottom: 0.8em !important; +.contributorImages { + display: flex; + flex-wrap: wrap; + gap: 15px; + img { + width: 75px; + height: auto; + @include themed() { + border-radius: t($borderRadius); + } + } } diff --git a/src/components/modals/main/scss/settings/modules/tabs/_changelog.scss b/src/components/modals/main/scss/settings/modules/tabs/_changelog.scss index a04e0291..1366f541 100644 --- a/src/components/modals/main/scss/settings/modules/tabs/_changelog.scss +++ b/src/components/modals/main/scss/settings/modules/tabs/_changelog.scss @@ -1,5 +1,6 @@ -.updatechangelog { +.updateChangelog { max-width: 75%; + white-space: pre-wrap; li { cursor: initial; @@ -26,7 +27,7 @@ } h5 { - line-height: 0px !important; + line-height: 0 !important; } img { diff --git a/src/components/modals/main/scss/settings/modules/tabs/_order.scss b/src/components/modals/main/scss/settings/modules/tabs/_order.scss index 42af1508..3443b826 100644 --- a/src/components/modals/main/scss/settings/modules/tabs/_order.scss +++ b/src/components/modals/main/scss/settings/modules/tabs/_order.scss @@ -1,54 +1,152 @@ -.sortableitem { - background: var(--sidebar) !important; - padding: 10px 80px; - padding-left: 10px; - border-radius: 15px; - margin-bottom: 10px; - font-size: 1.325rem; - color: var(--modal-text) !important; - cursor: move; - width: 150px; - z-index: 999 !important; +@import '../../../../../../../scss/variables'; - svg { - font-size: 1.3rem; - } - - &:hover { - background: var(--tab-active) !important; - } -} - -ul { - padding-left: 0px; - margin: 0; - - >label { - vertical-align: middle; - } -} - -.images-row { - display: flex; - flex-wrap: wrap; - width: 500px; - - div { - width: 100px; - height: 100px; - background-repeat: no-repeat; - background-size: cover; - background-position: center; - background-color: var(--sidebar); - border: 20px solid var(--sidebar); - border-radius: 20px; - margin: 0 20px 20px 0; +.sortableItem { + @include themed() { + padding: 15px; + margin-bottom: 10px; + font-size: 1.325rem; + color: t($color) !important; + cursor: move; + width: 200px; + z-index: 999 !important; display: flex; - align-items: flex-end; - justify-content: center; + justify-content: space-between; + align-items: center; + + background: t($modal-secondaryColour); + border-radius: t($borderRadius); + box-shadow: t($boxShadow); svg { - font-size: 1.9em; + font-size: 1.3rem; + color: t($subColor); + } + + &:hover { + background: t($modal-sidebarActive) !important; + } + } + + ul { + -webkit-padding-start: 0; + padding: 0; + list-style-type: none; + + > label { + vertical-align: middle; } } } + +.sortablecontainer { + -webkit-padding-start: 0; + padding: 0; + list-style-type: none; +} + +.images-row { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + padding: 20px; + grid-gap: 20px; + @include themed() { + div { + border-radius: t($borderRadius); + // border: 5px t($modal-sidebar) solid; + display: flex; + align-items: center; + justify-content: center; + flex-flow: column; + gap: 5px; + position: relative; + img { + width: 100%; + height: 200px; + object-fit: cover; + border-radius: t($borderRadius); + } + button { + padding: 0 30px 0 30px; + background: t($modal-background); + border: none !important; + &:hover { + background: t($modal-sidebarActive); + } + } + .tooltip { + position: absolute !important; + top: 5px !important; + right: 5px !important; + } + } + .iconButton { + width: calc(100% - 22px); + margin-top: 10px; + @include basicIconButton(11px, 1.3rem, modal); + } + } +} + +.overviewGrid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + grid-gap: 30px; +} + +.tabPreview { + width: 100%; + aspect-ratio: 2 / 1; + display: flex; + align-items: center; + justify-content: center; + margin-top: 16px; + @include themed() { + background: t($modal-secondaryColour); + border-radius: t($borderRadius); + box-shadow: t($boxShadow); + } + + .previewContainer { + } + + .previewItem { + display: flex; + flex-flow: column; + align-items: center; + .quotediv .quote { + max-width: 100%; + } + + .quotediv .author-holder .author .author-content .title { + font-size: 1em !important; + @include themed() { + color: t($color) !important; + } + } + } +} + +.overviewNews { + display: flex; + flex-flow: column; + margin-top: 16px; + padding: 25px; + .title { + font-size: 36px !important; + text-align: center; + } + .subtitle { + font-size: 12px !important; + text-align: center; + text-transform: uppercase; + letter-spacing: 1px; + } + .content { + margin: 20px 20px 0; + } + @include themed() { + background: t($modal-secondaryColour); + border-radius: t($borderRadius); + box-shadow: t($boxShadow); + } +} diff --git a/src/components/modals/main/scss/settings/react-color-picker-gradient-picker-custom-styles.scss b/src/components/modals/main/scss/settings/react-color-picker-gradient-picker-custom-styles.scss index 5b68fe6c..51751f66 100644 --- a/src/components/modals/main/scss/settings/react-color-picker-gradient-picker-custom-styles.scss +++ b/src/components/modals/main/scss/settings/react-color-picker-gradient-picker-custom-styles.scss @@ -32,7 +32,16 @@ div.color-preview-area > div > div:nth-child(5) { border: 2px solid var(--modal-text) !important; } -.text-input, .number-input { +.text-input, +.number-input { background-color: var(--sidebar) !important; color: var(--modal-text) !important; } + +.colourInput { + display: flex; + width: 100%; + justify-content: space-between; + align-items: center; + flex-flow: row-reverse; +} diff --git a/src/components/modals/main/settings/Checkbox.jsx b/src/components/modals/main/settings/Checkbox.jsx index 991f1511..9dda856b 100644 --- a/src/components/modals/main/settings/Checkbox.jsx +++ b/src/components/modals/main/settings/Checkbox.jsx @@ -8,43 +8,52 @@ export default class Checkbox extends PureComponent { constructor(props) { super(props); this.state = { - checked: (localStorage.getItem(this.props.name) === 'true') + checked: localStorage.getItem(this.props.name) === 'true', }; } handleChange = () => { - const value = (this.state.checked === true) ? false : true; + const value = this.state.checked !== true; localStorage.setItem(this.props.name, value); this.setState({ - checked: value + checked: value, }); if (this.props.onChange) { this.props.onChange(value); } - variables.stats.postEvent('setting', `${this.props.name} ${(this.state.checked === true) ? 'enabled' : 'disabled'}`); + variables.stats.postEvent( + 'setting', + `${this.props.name} ${this.state.checked === true ? 'enabled' : 'disabled'}`, + ); if (this.props.element) { if (!document.querySelector(this.props.element)) { - document.querySelector('.reminder-info').style.display = 'block'; + document.querySelector('.reminder-info').style.display = 'flex'; return localStorage.setItem('showReminder', true); } } EventBus.dispatch('refresh', this.props.category); - } + }; render() { return ( - <> - } - label={this.props.text} - /> -
- + + } + label={this.props.text} + /> ); } } diff --git a/src/components/modals/main/settings/ChipSelect.jsx b/src/components/modals/main/settings/ChipSelect.jsx new file mode 100644 index 00000000..ab1a601c --- /dev/null +++ b/src/components/modals/main/settings/ChipSelect.jsx @@ -0,0 +1,55 @@ +import { useState, memo } from 'react'; +import { useTheme } from '@mui/material/styles'; +import Box from '@mui/material/Box'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import InputLabel from '@mui/material/InputLabel'; +import MenuItem from '@mui/material/MenuItem'; +import FormControl from '@mui/material/FormControl'; +import Select from '@mui/material/Select'; +import Chip from '@mui/material/Chip'; + +function ChipSelect({ label, options, name }) { + let start = (localStorage.getItem('apiCategories') || '').split(','); + if (start[0] === '') start = []; + + const [optionsSelected, setoptionsSelected] = useState(start); + + const handleChange = (event) => { + const { + target: { value }, + } = event; + setoptionsSelected(typeof value === 'string' ? value.split(',') : value); + localStorage.setItem('apiCategories', value); + }; + + return ( +
+ + {label} + + +
+ ); +} + +export default memo(ChipSelect); diff --git a/src/components/modals/main/settings/Dropdown.jsx b/src/components/modals/main/settings/Dropdown.jsx index c4b63666..a7eee012 100644 --- a/src/components/modals/main/settings/Dropdown.jsx +++ b/src/components/modals/main/settings/Dropdown.jsx @@ -9,7 +9,7 @@ export default class Dropdown extends PureComponent { super(props); this.state = { value: localStorage.getItem(this.props.name) || this.props.children[0].props.value, - title: '' + title: '', }; this.dropdown = createRef(); } @@ -17,33 +17,34 @@ export default class Dropdown extends PureComponent { onChange = (e) => { const { value } = e.target; - if (value === variables.language.getMessage(variables.languagecode, 'modals.main.loading')) { + if (value === variables.getMessage('modals.main.loading')) { return; } variables.stats.postEvent('setting', `${this.props.name} from ${this.state.value} to ${value}`); this.setState({ - value + value, }); - + if (!this.props.noSetting) { localStorage.setItem(this.props.name, value); + localStorage.setItem(this.props.name2, this.props.value2); } - + if (this.props.onChange) { this.props.onChange(value); } if (this.props.element) { if (!document.querySelector(this.props.element)) { - document.querySelector('.reminder-info').style.display = 'block'; + document.querySelector('.reminder-info').style.display = 'flex'; return localStorage.setItem('showReminder', true); } } EventBus.dispatch('refresh', this.props.category); - } + }; render() { const id = 'dropdown' + this.props.name; @@ -52,10 +53,24 @@ export default class Dropdown extends PureComponent { return ( {label} - + {this.props.manual + ? this.props.children + : this.props.children.map((e, index) => { + return e ? ( + + {e.props ? e.props.children : ''} + + ) : null; + })} ); diff --git a/src/components/modals/main/settings/FileUpload.jsx b/src/components/modals/main/settings/FileUpload.jsx index 9670d1fb..f74d2587 100644 --- a/src/components/modals/main/settings/FileUpload.jsx +++ b/src/components/modals/main/settings/FileUpload.jsx @@ -1,10 +1,10 @@ import variables from 'modules/variables'; import { PureComponent } from 'react'; import { toast } from 'react-toastify'; +import { compressAccurately, filetoDataURL } from 'image-conversion'; +import { videoCheck } from 'modules/helpers/background/widget'; export default class FileUpload extends PureComponent { - getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - componentDidMount() { document.getElementById(this.props.id).onchange = (e) => { const reader = new FileReader(); @@ -12,22 +12,52 @@ export default class FileUpload extends PureComponent { if (this.props.type === 'settings') { reader.readAsText(file, 'UTF-8'); + reader.onload = (e) => { + return this.props.loadFunction(e.target.result); + }; } else { // background upload - if (file.size > 2000000) { - return toast(this.getMessage('modals.main.file_upload_error')); + const settings = {}; + + Object.keys(localStorage).forEach((key) => { + settings[key] = localStorage.getItem(key); + }); + + const settingsSize = new TextEncoder().encode(JSON.stringify(settings)).length; + if (videoCheck(file.type) === true) { + if (settingsSize + file.size > 4850000) { + return toast(variables.getMessage('toasts.no_storage')); + } + + return this.props.loadFunction(file); } - reader.readAsDataURL(file); - } + compressAccurately(file, { + size: 450, + accuracy: 0.9, + }).then(async (res) => { + if (settingsSize + res.size > 4850000) { + return toast(variables.getMessage('toasts.no_storage')); + } - reader.addEventListener('load', (e) => { - this.props.loadFunction(e); - }); + this.props.loadFunction({ + target: { + result: await filetoDataURL(res), + }, + }); + }); + } }; } render() { - return ; + return ( + + ); } } diff --git a/src/components/modals/main/settings/Header.jsx b/src/components/modals/main/settings/Header.jsx index c5572b61..6ccfa4d6 100644 --- a/src/components/modals/main/settings/Header.jsx +++ b/src/components/modals/main/settings/Header.jsx @@ -1,23 +1,90 @@ import variables from 'modules/variables'; import { PureComponent } from 'react'; +import { /*MdHelpOutline,*/ MdFlag, MdArrowBack } from 'react-icons/md'; import Slider from './Slider'; import Switch from './Switch'; +import SettingsItem from './SettingsItem'; import { values } from 'modules/helpers/settings/modals'; +import Tooltip from '../../../helpers/tooltip/Tooltip'; export default class Header extends PureComponent { render() { - const getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - return ( <> -

{this.props.title}

- - {this.props.zoomSetting ? - <> - :
} +
+ {this.props.backButton ? ( +
+ + + +
+ ) : null} + {this.props.title} +
+
+ {/* + window.open( + variables.constants.KNOWLEDGEBASE + + '/settings/' + + this.props.setting.toLowerCase().replace('enabled', ''), + '_blank', + ) + } + > + {variables.getMessage('modals.main.settings.sections.header.more_info')} + */} + + window.open( + variables.constants.BUG_REPORT + this.props.title.split(' ').join('+'), + '_blank', + ) + } + > + {variables.getMessage('modals.main.settings.sections.header.report_issue')} + +
+ {this.props.switch ? ( + + + + ) : null} + {this.props.zoomSetting ? ( + + + + ) : null} ); } diff --git a/src/components/modals/main/settings/KeybindInput.jsx b/src/components/modals/main/settings/KeybindInput.jsx deleted file mode 100644 index f7068937..00000000 --- a/src/components/modals/main/settings/KeybindInput.jsx +++ /dev/null @@ -1,24 +0,0 @@ -import variables from 'modules/variables'; -import { MdCancel } from 'react-icons/md'; -import { TextField } from '@mui/material'; - -export default function KeybindInput(props) { - const value = props.state[props.setting]; - - const getButton = () => { - if (!value) { - return ;; - } else if (value === variables.language.getMessage(variables.languagecode, 'modals.main.settings.sections.keybinds.recording')) { - return ; - } else { - return ; - } - } - - return ( - <> - props.action('listen', props.setting)} value={value || variables.language.getMessage(variables.languagecode, 'modals.main.settings.sections.keybinds.click_to_record')} readOnly spellCheck={false} varient='outlined' InputLabelProps={{ shrink: true }} /> - {getButton()} - - ); -} diff --git a/src/components/modals/main/settings/Radio.jsx b/src/components/modals/main/settings/Radio.jsx index 1497bdd2..53423f80 100644 --- a/src/components/modals/main/settings/Radio.jsx +++ b/src/components/modals/main/settings/Radio.jsx @@ -1,18 +1,25 @@ import variables from 'modules/variables'; import { PureComponent } from 'react'; -import { Radio as RadioUI, RadioGroup, FormControlLabel, FormControl, FormLabel } from '@mui/material'; +import { + Radio as RadioUI, + RadioGroup, + FormControlLabel, + FormControl, + FormLabel, +} from '@mui/material'; import EventBus from 'modules/helpers/eventbus'; +import translations from 'modules/translations'; export default class Radio extends PureComponent { constructor(props) { super(props); this.state = { - value: localStorage.getItem(this.props.name) + value: localStorage.getItem(this.props.name), }; } - - handleChange = (e) => { + + handleChange = async (e) => { const { value } = e.target; if (value === 'loading') { @@ -21,15 +28,15 @@ export default class Radio extends PureComponent { if (this.props.name === 'language') { // old tab name - if (localStorage.getItem('tabName') === variables.language.getMessage(variables.languagecode, 'tabname')) { - localStorage.setItem('tabName', require(`translations/${value.replace('-', '_')}.json`).tabname); + if (localStorage.getItem('tabName') === variables.getMessage('tabname')) { + localStorage.setItem('tabName', translations[value.replace('-', '_')].tabname); } } localStorage.setItem(this.props.name, value); - + this.setState({ - value + value, }); if (this.props.onChange) { @@ -37,24 +44,39 @@ export default class Radio extends PureComponent { } variables.stats.postEvent('setting', `${this.props.name} from ${this.state.value} to ${value}`); - + if (this.props.element) { if (!document.querySelector(this.props.element)) { - document.querySelector('.reminder-info').style.display = 'block'; + document.querySelector('.reminder-info').style.display = 'flex'; return localStorage.setItem('showReminder', true); } } EventBus.dispatch('refresh', this.props.category); - } - + }; + render() { return ( - - {this.props.title} - + + + {this.props.title} + + {this.props.options.map((option) => ( - } label={option.name} key={option.name} /> + } + label={option.name} + key={option.name} + /> ))} diff --git a/src/components/modals/main/settings/ResetModal.jsx b/src/components/modals/main/settings/ResetModal.jsx index 54679f1c..04614dec 100644 --- a/src/components/modals/main/settings/ResetModal.jsx +++ b/src/components/modals/main/settings/ResetModal.jsx @@ -1,8 +1,10 @@ +import { memo } from 'react'; import variables from 'modules/variables'; import { MdClose, MdRestartAlt } from 'react-icons/md'; import { setDefaultSettings } from 'modules/helpers/settings'; +import Tooltip from '../../../helpers/tooltip/Tooltip'; -export default function ResetModal({ modalClose }) { +function ResetModal({ modalClose }) { const reset = () => { variables.stats.postEvent('setting', 'Reset'); setDefaultSettings('reset'); @@ -10,19 +12,37 @@ export default function ResetModal({ modalClose }) { }; return ( - <> -

{variables.language.getMessage(variables.languagecode, 'modals.main.settings.sections.advanced.reset_modal.title')}

- {variables.language.getMessage(variables.languagecode, 'modals.main.settings.sections.advanced.reset_modal.question')} -

- {variables.language.getMessage(variables.languagecode, 'modals.main.settings.sections.advanced.reset_modal.information')} -
- -
- +
); } + +export default memo(ResetModal); diff --git a/src/components/modals/main/settings/SettingsItem.jsx b/src/components/modals/main/settings/SettingsItem.jsx new file mode 100644 index 00000000..9b5b8a6a --- /dev/null +++ b/src/components/modals/main/settings/SettingsItem.jsx @@ -0,0 +1,15 @@ +import { memo } from 'react'; + +function SettingsItem(props) { + return ( +
+
+ {props.title} + {props.subtitle} +
+
{props.children}
+
+ ); +} + +export default memo(SettingsItem); diff --git a/src/components/modals/main/settings/Slider.jsx b/src/components/modals/main/settings/Slider.jsx index e61af3b6..ee7e728e 100644 --- a/src/components/modals/main/settings/Slider.jsx +++ b/src/components/modals/main/settings/Slider.jsx @@ -2,6 +2,7 @@ import variables from 'modules/variables'; import { PureComponent } from 'react'; import { toast } from 'react-toastify'; import { Slider } from '@mui/material'; +import { MdRefresh } from 'react-icons/md'; import EventBus from 'modules/helpers/eventbus'; @@ -9,7 +10,7 @@ export default class SliderComponent extends PureComponent { constructor(props) { super(props); this.state = { - value: localStorage.getItem(this.props.name) || this.props.default + value: localStorage.getItem(this.props.name) || this.props.default, }; } @@ -20,56 +21,63 @@ export default class SliderComponent extends PureComponent { if (text) { if (value === '') { return this.setState({ - value: 0 + value: 0, }); } if (value > this.props.max) { value = this.props.max; } - + if (value < this.props.min) { value = this.props.min; } } - + localStorage.setItem(this.props.name, value); this.setState({ - value + value, }); if (this.props.element) { if (!document.querySelector(this.props.element)) { - document.querySelector('.reminder-info').style.display = 'block'; + document.querySelector('.reminder-info').style.display = 'flex'; return localStorage.setItem('showReminder', true); } } EventBus.dispatch('refresh', this.props.category); - } + }; resetItem = () => { this.handleChange({ target: { - value: this.props.default || '' - } + value: this.props.default || '', + }, }); - toast(variables.language.getMessage(variables.languagecode, 'toasts.reset')); - } + toast(variables.getMessage('toasts.reset')); + }; render() { return ( <> -

{this.props.title}{variables.language.getMessage(variables.languagecode, 'modals.main.settings.buttons.reset')}

- `${value}`} + + {this.props.title} + {Number(this.state.value)} + + + {variables.getMessage('modals.main.settings.buttons.reset')} + + + `${value}`} marks={this.props.marks || []} /> diff --git a/src/components/modals/main/settings/Switch.jsx b/src/components/modals/main/settings/Switch.jsx index d2f5dd72..80b72457 100644 --- a/src/components/modals/main/settings/Switch.jsx +++ b/src/components/modals/main/settings/Switch.jsx @@ -8,39 +8,47 @@ export default class Switch extends PureComponent { constructor(props) { super(props); this.state = { - checked: (localStorage.getItem(this.props.name) === 'true') + checked: localStorage.getItem(this.props.name) === 'true', }; } handleChange = () => { - const value = (this.state.checked === true) ? false : true; + const value = this.state.checked !== true; localStorage.setItem(this.props.name, value); this.setState({ - checked: value + checked: value, }); - variables.stats.postEvent('setting', `${this.props.name} ${(this.state.checked === true) ? 'enabled' : 'disabled'}`); + variables.stats.postEvent( + 'setting', + `${this.props.name} ${this.state.checked === true ? 'enabled' : 'disabled'}`, + ); if (this.props.element) { if (!document.querySelector(this.props.element)) { - document.querySelector('.reminder-info').style.display = 'block'; + document.querySelector('.reminder-info').style.display = 'flex'; return localStorage.setItem('showReminder', true); } } EventBus.dispatch('refresh', this.props.category); - } + }; render() { return ( - <> - } - label={this.props.text} - labelPlacement='start' - /> - + + } + label={this.props.header ? '' : this.props.text} + labelPlacement="start" + /> ); } } diff --git a/src/components/modals/main/settings/Text.jsx b/src/components/modals/main/settings/Text.jsx index 50ed0f17..7b37c128 100644 --- a/src/components/modals/main/settings/Text.jsx +++ b/src/components/modals/main/settings/Text.jsx @@ -9,13 +9,13 @@ export default class Text extends PureComponent { constructor(props) { super(props); this.state = { - value: localStorage.getItem(this.props.name) || '' + value: localStorage.getItem(this.props.name) || '', }; } handleChange = (e) => { let { value } = e.target; - + // Alex wanted font to work with montserrat and Montserrat, so I made it work if (this.props.upperCaseFirst === true) { value = value.charAt(0).toUpperCase() + value.slice(1); @@ -23,36 +23,55 @@ export default class Text extends PureComponent { localStorage.setItem(this.props.name, value); this.setState({ - value + value, }); if (this.props.element) { if (!document.querySelector(this.props.element)) { - document.querySelector('.reminder-info').style.display = 'block'; + document.querySelector('.reminder-info').style.display = 'flex'; return localStorage.setItem('showReminder', true); } } EventBus.dispatch('refresh', this.props.category); - } + }; resetItem = () => { this.handleChange({ target: { - value: this.props.default || '' - } + value: this.props.default || '', + }, }); - toast(variables.language.getMessage(variables.languagecode, 'toasts.reset')); - } + toast(variables.getMessage('toasts.reset')); + }; render() { return ( <> - {(this.props.textarea === true) ? - - : - } - {variables.language.getMessage(variables.languagecode, 'modals.main.settings.buttons.reset')} + {this.props.textarea === true ? ( + + ) : ( + + )} + + {variables.getMessage('modals.main.settings.buttons.reset')} + ); } diff --git a/src/components/modals/main/settings/sections/About.jsx b/src/components/modals/main/settings/sections/About.jsx index 088097ba..e1b0c866 100644 --- a/src/components/modals/main/settings/sections/About.jsx +++ b/src/components/modals/main/settings/sections/About.jsx @@ -1,25 +1,27 @@ import variables from 'modules/variables'; import { PureComponent } from 'react'; -import { MdEmail } from 'react-icons/md'; +import { MdEmail, MdContactPage } from 'react-icons/md'; import { FaDiscord, FaTwitter } from 'react-icons/fa'; -import { SiGithubsponsors, SiLiberapay, SiKofi, SiPatreon } from 'react-icons/si'; +import { SiGithubsponsors, SiOpencollective } from 'react-icons/si'; +import { BiDonateHeart } from 'react-icons/bi'; import Tooltip from 'components/helpers/tooltip/Tooltip'; -const other_contributors = require('modules/other_contributors.json'); +import other_contributors from 'modules/other_contributors.json'; export default class About extends PureComponent { - getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - constructor() { super(); this.state = { contributors: [], sponsors: [], other_contributors: [], - photographers: this.getMessage('modals.main.loading'), - update: this.getMessage('modals.main.settings.sections.about.version.checking_update'), - loading: this.getMessage('modals.main.loading') + photographers: [], + update: variables.getMessage('modals.main.settings.sections.about.version.checking_update'), + loading: variables.getMessage('modals.main.loading'), + image: document.body.classList.contains('dark') + ? 'icons/mue_dark.png' + : 'icons/mue_light.png', }; this.controller = new AbortController(); } @@ -28,22 +30,54 @@ export default class About extends PureComponent { let contributors, sponsors, photographers, versionData; try { - versionData = await (await fetch(variables.constants.GITHUB_URL + '/repos/' + variables.constants.ORG_NAME + '/' + variables.constants.REPO_NAME + '/releases', { signal: this.controller.signal })).json(); - contributors = await (await fetch(variables.constants.GITHUB_URL + '/repos/'+ variables.constants.ORG_NAME + '/' + variables.constants.REPO_NAME + '/contributors', { signal: this.controller.signal })).json(); - sponsors = (await (await fetch(variables.constants.SPONSORS_URL + '/list', { signal: this.controller.signal })).json()).sponsors; - photographers = await (await fetch(variables.constants.API_URL + '/images/photographers', { signal: this.controller.signal })).json(); + versionData = await ( + await fetch( + variables.constants.GITHUB_URL + + '/repos/' + + variables.constants.ORG_NAME + + '/' + + variables.constants.REPO_NAME + + '/releases', + { signal: this.controller.signal }, + ) + ).json(); + contributors = await ( + await fetch( + variables.constants.GITHUB_URL + + '/repos/' + + variables.constants.ORG_NAME + + '/' + + variables.constants.REPO_NAME + + '/contributors', + { signal: this.controller.signal }, + ) + ).json(); + sponsors = ( + await ( + await fetch(variables.constants.SPONSORS_URL + '/list', { + signal: this.controller.signal, + }) + ).json() + ).sponsors; + photographers = await ( + await fetch(variables.constants.API_URL + '/images/photographers', { + signal: this.controller.signal, + }) + ).json(); } catch (e) { if (this.controller.signal.aborted === true) { return; } return this.setState({ - update: this.getMessage('modals.main.settings.sections.about.version.error.title'), - loading: this.getMessage('modals.main.settings.sections.about.version.error.description') + update: variables.getMessage('modals.main.settings.sections.about.version.error.title'), + loading: variables.getMessage( + 'modals.main.settings.sections.about.version.error.description', + ), }); } - if (sponsors.length === 0) { + if (sponsors.length === 0) { sponsors = [{ handle: 'empty' }]; } @@ -53,9 +87,14 @@ export default class About extends PureComponent { const newVersion = versionData[0].tag_name; - let update = this.getMessage('modals.main.settings.sections.about.version.no_update'); - if (Number(variables.constants.VERSION.replaceAll('.', '')) < Number(newVersion.replaceAll('.', ''))) { - update = `${this.getMessage('modals.main.settings.sections.about.version.update_available')}: ${newVersion}`; + let update = variables.getMessage('modals.main.settings.sections.about.version.no_update'); + if ( + Number(variables.constants.VERSION.replaceAll('.', '')) < + Number(newVersion.replaceAll('.', '')) + ) { + update = `${variables.getMessage( + 'modals.main.settings.sections.about.version.update_available', + )}: ${newVersion}`; } this.setState({ @@ -64,16 +103,16 @@ export default class About extends PureComponent { sponsors, update, other_contributors, - photographers: photographers.sort().join(', '), - loading: null + photographers, + loading: null, }); } componentDidMount() { if (navigator.onLine === false || localStorage.getItem('offlineMode') === 'true') { this.setState({ - update: this.getMessage('modals.main.settings.sections.about.version.checking_update'), - loading: this.getMessage('modals.main.marketplace.offline.description') + update: variables.getMessage('modals.main.settings.sections.about.version.checking_update'), + loading: variables.getMessage('modals.main.marketplace.offline.description'), }); return; } @@ -89,59 +128,235 @@ export default class About extends PureComponent { render() { return ( <> -

{this.getMessage('modals.main.settings.sections.about.title')}

- Logo -

{this.getMessage('modals.main.settings.sections.about.copyright')} {variables.constants.COPYRIGHT_YEAR}-{new Date().getFullYear()} {variables.constants.COPYRIGHT_NAME} ({variables.constants.COPYRIGHT_LICENSE})

-

{this.getMessage('modals.main.settings.sections.about.version.title')} {variables.constants.VERSION} ({this.state.update})

- {this.getMessage('modals.welcome.sections.privacy.links.privacy_policy')} + + {variables.getMessage('modals.main.settings.sections.about.title')} + +
+
+ Logo + + {variables.getMessage('modals.main.settings.sections.about.version.title')}{' '} + {variables.constants.VERSION} + + ({this.state.update}) + + {variables.getMessage('modals.main.settings.sections.about.copyright')}{' '} + {variables.constants.COPYRIGHT_YEAR}-{new Date().getFullYear()}{' '} + + {variables.constants.COPYRIGHT_NAME} + {' '} + ({variables.constants.COPYRIGHT_LICENSE}) + + + + {variables.getMessage('modals.welcome.sections.privacy.links.privacy_policy')} + + +
+
-

{this.getMessage('modals.main.settings.sections.about.contact_us')}

- - - - -

{this.getMessage('modals.main.settings.sections.about.support_mue')}

- - - - - -

{this.getMessage('modals.main.settings.sections.about.resources_used.title')}

-

- Pexels - , Unsplash ({this.getMessage('modals.main.settings.sections.about.resources_used.bg_images')}) -

- -

{this.getMessage('modals.main.settings.sections.about.contributors')}

-

{this.state.loading}

- {this.state.contributors.map(({ login, id }) => ( - - {login} - - ))} - { // for those who contributed without opening a pull request - this.state.other_contributors.map(({ login, avatar_url }) => ( - - {login} - - ))} - -

{this.getMessage('modals.main.settings.sections.about.supporters')}

-

{this.state.loading}

- {this.state.sponsors.map(({ handle, avatar }) => { - if (handle === 'empty') { - return

{this.getMessage('modals.main.settings.sections.about.no_supporters')}

; - } - - return ( - - {handle} +
+ + {variables.getMessage('modals.main.settings.sections.about.contact_us')} + +
+ + + Form + + + + + - ) - })} + + + + + + + + + + +
+
-

{this.getMessage('modals.main.settings.sections.about.photographers')}

-

{this.state.photographers}

+
+ + {variables.getMessage('modals.main.settings.sections.about.support_mue')} + +

{variables.getMessage('modals.main.settings.sections.about.support_subtitle')}

+ +
+ +
+ + {variables.getMessage('modals.main.settings.sections.about.resources_used.title')} + + + + Pexels + + ,{' '} + + Unsplash + {' '} + ({variables.getMessage('modals.main.settings.sections.about.resources_used.bg_images')}) + +
+ +
+ + {variables.getMessage('modals.main.settings.sections.about.contributors')} + +

{this.state.loading}

+
+ {this.state.contributors.map(({ login, id }) => ( + + + {login} + + + ))} + { + // for those who contributed without opening a pull request + this.state.other_contributors.map(({ login, avatar_url }) => ( + + + {login} + + + )) + } +
+
+ +
+ + {variables.getMessage('modals.main.settings.sections.about.supporters')} + +

{this.state.loading}

+
+ {this.state.sponsors.map(({ handle, avatar }) => { + if (handle === 'empty') { + return ( +

{variables.getMessage('modals.main.settings.sections.about.no_supporters')}

+ ); + } + + return ( + + + {handle} + + + ); + })} +
+
+
+ + {variables.getMessage('modals.main.settings.sections.about.photographers')} + + {!!this.state.loading ?

{this.state.loading}

: <> } +
    + {this.state.photographers.map(({ name, count }) => <> +
  • + {name} + ({count} images) +
  • + )} +
+
); } diff --git a/src/components/modals/main/settings/sections/Advanced.jsx b/src/components/modals/main/settings/sections/Advanced.jsx index dc993176..a32a3661 100644 --- a/src/components/modals/main/settings/sections/Advanced.jsx +++ b/src/components/modals/main/settings/sections/Advanced.jsx @@ -2,72 +2,129 @@ import variables from 'modules/variables'; import { PureComponent } from 'react'; import Modal from 'react-modal'; import { MenuItem } from '@mui/material'; -import { MdUpload as ImportIcon, MdDownload as ExportIcon, MdRestartAlt as ResetIcon } from 'react-icons/md'; +import { + MdUpload as ImportIcon, + MdDownload as ExportIcon, + MdRestartAlt as ResetIcon, +} from 'react-icons/md'; import { exportSettings, importSettings } from 'modules/helpers/settings/modals'; -import Checkbox from '../Checkbox'; import FileUpload from '../FileUpload'; import Text from '../Text'; import Switch from '../Switch'; import ResetModal from '../ResetModal'; import Dropdown from '../Dropdown'; +import SettingsItem from '../SettingsItem'; -const time_zones = require('components/widgets/time/timezones.json'); +import time_zones from 'components/widgets/time/timezones.json'; export default class AdvancedSettings extends PureComponent { constructor() { super(); this.state = { - resetModal: false + resetModal: false, }; } render() { - const getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - return ( <> -

{getMessage('modals.main.settings.sections.advanced.title')}

- - - {getMessage('modals.main.settings.sections.advanced.timezone.automatic')} - {time_zones.map((timezone) => ( - {timezone} - ))} - - - {localStorage.getItem('welcomePreview') !== 'true' ? - <> -

{getMessage('modals.main.settings.sections.advanced.data')}

-
-
- - - -
- - : null} - importSettings(e)}/> - -

{getMessage('modals.main.settings.sections.advanced.customisation')}

- - - -

{getMessage('modals.main.settings.sections.experimental.title')}

-

{getMessage('modals.main.settings.sections.advanced.experimental_warning')}

- - - this.setState({ resetModal: false })} isOpen={this.state.resetModal} className='Modal resetmodal mainModal' overlayClassName='Overlay resetoverlay' ariaHideApp={false}> + + {variables.getMessage('modals.main.settings.sections.advanced.title')} + + + + + {localStorage.getItem('welcomePreview') !== 'true' ? ( +
+
+ + {variables.getMessage('modals.main.settings.sections.advanced.data')} + + + {variables.getMessage('modals.main.settings.sections.advanced.data_subtitle')} + +
+
+ + + +
+
+ ) : null} + + + + {variables.getMessage('modals.main.settings.sections.advanced.timezone.automatic')} + + {time_zones.map((timezone) => ( + + {timezone} + + ))} + + + + + + importSettings(e)} + /> + + + + + + + this.setState({ resetModal: false })} + isOpen={this.state.resetModal} + className="Modal resetmodal mainModal" + overlayClassName="Overlay resetoverlay" + ariaHideApp={false} + > this.setState({ resetModal: false })} /> diff --git a/src/components/modals/main/settings/sections/Appearance.jsx b/src/components/modals/main/settings/sections/Appearance.jsx index 7805bf04..6c753d3e 100644 --- a/src/components/modals/main/settings/sections/Appearance.jsx +++ b/src/components/modals/main/settings/sections/Appearance.jsx @@ -1,3 +1,5 @@ +import { memo } from 'react'; + import variables from 'modules/variables'; import Checkbox from '../Checkbox'; @@ -5,58 +7,208 @@ import Dropdown from '../Dropdown'; import Radio from '../Radio'; import Slider from '../Slider'; import Text from '../Text'; +import SettingsItem from '../SettingsItem'; import { values } from 'modules/helpers/settings/modals'; -export default function AppearanceSettings() { - const getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - - const themeOptions = [ - { - name: getMessage('modals.main.settings.sections.appearance.theme.auto'), - value: 'auto' - }, - { - name: getMessage('modals.main.settings.sections.appearance.theme.light'), - value: 'light' - }, - { - name: getMessage('modals.main.settings.sections.appearance.theme.dark'), - value: 'dark' - } - ]; - +function AppearanceSettings() { return ( <> -

{getMessage('modals.main.settings.sections.appearance.title')}

- + + {variables.getMessage('modals.main.settings.sections.appearance.title')} + +
+
+ + {variables.getMessage('modals.main.settings.sections.appearance.theme.title')} + + + {' '} + {variables.getMessage('modals.main.settings.sections.appearance.theme.description')} + +
+
+ +
+
+
+
+ + {variables.getMessage('modals.main.settings.sections.appearance.font.title')} + + + {variables.getMessage('modals.main.settings.sections.appearance.font.description')} + +
+
+ + + + {/* names are taken from https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight */} + + + + + + + + + + + + + + +
+
+ + + -

{getMessage('modals.main.settings.sections.appearance.font.title')}

- -
- - - {/* names are taken from https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight */} - - - - - - - - - - - - - - - -

{getMessage('modals.main.settings.sections.appearance.accessibility.title')}

- - - + + + {' '} + {/* default */} + {' '} + {/* old checkbox setting */} + + + + + ); } + +export default memo(AppearanceSettings); diff --git a/src/components/modals/main/settings/sections/Changelog.jsx b/src/components/modals/main/settings/sections/Changelog.jsx index 44ff5033..d11ee714 100644 --- a/src/components/modals/main/settings/sections/Changelog.jsx +++ b/src/components/modals/main/settings/sections/Changelog.jsx @@ -11,35 +11,43 @@ export default class Changelog extends PureComponent { this.state = { title: null, showLightbox: false, - lightboxImg: null + lightboxImg: null, }; - this.offlineMode = (localStorage.getItem('offlineMode') === 'true'); + this.offlineMode = localStorage.getItem('offlineMode') === 'true'; this.controller = new AbortController(); this.changelog = createRef(); } async getUpdate() { - const data = await (await fetch(variables.constants.BLOG_POST + '/index.json', { signal: this.controller.signal })).json(); + const res = await fetch(variables.constants.BLOG_POST + '/index.json', { + signal: this.controller.signal, + }); + + if (res.status === 404) { + this.setState({ error: true }); + return; + } if (this.controller.signal.aborted === true) { return; } + const data = await res.json(); let date = new Date(data.date.split(' ')[0]); - date = date.toLocaleDateString(variables.languagecode.replace('_', '-'), { - year: 'numeric', - month: 'long', - day: 'numeric' + date = date.toLocaleDateString(variables.languagecode.replace('_', '-'), { + year: 'numeric', + month: 'long', + day: 'numeric', }); this.setState({ title: data.title, date, image: data.featured_image || null, - author: variables.language.getMessage(variables.languagecode, 'modals.main.settings.sections.changelog.by', { - author: data.authors.join(', ') + author: variables.getMessage('modals.main.settings.sections.changelog.by', { + author: data.authors.join(', '), }), - html: data.html + content: data.markdown, }); // lightbox etc @@ -51,7 +59,7 @@ export default class Changelog extends PureComponent { img.onclick = () => { this.setState({ showLightbox: true, - lightboxImg: img.src + lightboxImg: img.src, }); }; } @@ -62,12 +70,12 @@ export default class Changelog extends PureComponent { links[link].rel = 'noopener noreferrer'; } } - + componentDidMount() { if (navigator.onLine === false || this.offlineMode) { return; } - + this.getUpdate(); } @@ -77,38 +85,74 @@ export default class Changelog extends PureComponent { } render() { - const getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - const errorMessage = (msg) => { return ( -
-
- {msg} -
+
+
{msg}
); }; - if (navigator.onLine === false || this.offlineMode) { - return errorMessage(<> - -

{getMessage('modals.main.marketplace.offline.title')}

-

{getMessage('modals.main.marketplace.offline.description')}

- ); + if (navigator.onLine === false || this.offlineMode) { + return errorMessage( + <> + +

{variables.getMessage('modals.main.marketplace.offline.title')}

+

+ {variables.getMessage('modals.main.marketplace.offline.description')} +

+ , + ); } - + + if (this.state.error === true) { + return errorMessage( + <> + + {variables.getMessage('modals.main.error_boundary.title')} + + {variables.getMessage('modals.main.error_boundary.message')} + + , + ); + } + if (!this.state.title) { - return errorMessage(

{getMessage('modals.main.loading')}

); + return errorMessage( +
+
+ {variables.getMessage('modals.main.loading')} +
, + ); } return ( -
+

{this.state.title}

-
{this.state.author} • {this.state.date}
- {this.state.image ? {this.state.title} : null} -
- this.setState({ showLightbox: false })} isOpen={this.state.showLightbox} className='Modal lightboxmodal' overlayClassName='Overlay resetoverlay' ariaHideApp={false}> - this.setState({ showLightbox: false })} img={this.state.lightboxImg}/> +
+ {this.state.author} • {this.state.date} +
+ {this.state.image ? ( + {this.state.title} + ) : null} +
{this.state.content}
+ this.setState({ showLightbox: false })} + isOpen={this.state.showLightbox} + className="Modal lightBoxModal" + overlayClassName="Overlay resetoverlay" + ariaHideApp={false} + > + this.setState({ showLightbox: false })} + img={this.state.lightboxImg} + />
); diff --git a/src/components/modals/main/settings/sections/Date.jsx b/src/components/modals/main/settings/sections/Date.jsx index 44545aa3..975efcc1 100644 --- a/src/components/modals/main/settings/sections/Date.jsx +++ b/src/components/modals/main/settings/sections/Date.jsx @@ -4,62 +4,118 @@ import { PureComponent } from 'react'; import Header from '../Header'; import Checkbox from '../Checkbox'; import Dropdown from '../Dropdown'; +import SettingsItem from '../SettingsItem'; export default class DateSettings extends PureComponent { constructor() { super(); this.state = { - dateType: localStorage.getItem('dateType') || 'long' + dateType: localStorage.getItem('dateType') || 'long', }; } render() { - const getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - - let dateSettings; - const longSettings = ( <> - - + + + + + + + ); const shortSettings = ( <> - - - - - + + + + + + + + + + + - - - - - - - ); - if (this.state.dateType === 'long') { - dateSettings = longSettings; - } else { - dateSettings = shortSettings; - } - return ( <> -
- - this.setState({ dateType: value })} category='date'> - - - - - - {dateSettings} +
+ + this.setState({ dateType: value })} + category="date" + > + + + + + + {this.state.dateType === 'long' ? longSettings : shortSettings} + + + ); } diff --git a/src/components/modals/main/settings/sections/Experimental.jsx b/src/components/modals/main/settings/sections/Experimental.jsx index 00d15da0..d4706981 100644 --- a/src/components/modals/main/settings/sections/Experimental.jsx +++ b/src/components/modals/main/settings/sections/Experimental.jsx @@ -1,31 +1,74 @@ import variables from 'modules/variables'; -import { useState } from 'react'; +import { useState, memo } from 'react'; import Checkbox from '../Checkbox'; import Slider from '../Slider'; import { TextField } from '@mui/material'; import EventBus from 'modules/helpers/eventbus'; import { values } from 'modules/helpers/settings/modals'; +import SettingsItem from '../SettingsItem'; -export default function ExperimentalSettings() { - const getMessage = (text) => variables.language.getMessage(variables.languagecode, text); +function ExperimentalSettings() { const [eventType, setEventType] = useState(); const [eventName, setEventName] = useState(); return ( <> -

{getMessage('modals.main.settings.sections.experimental.title')}

-

{getMessage('modals.main.settings.sections.experimental.warning')}

-

{getMessage('modals.main.settings.sections.experimental.developer')}

- - -

Send Event

- setEventType(e.target.value)} spellCheck={false} varient='outlined' InputLabelProps={{ shrink: true }} /> - setEventName(e.target.value)} spellCheck={false} varient='outlined' InputLabelProps={{ shrink: true }} /> -
- -

- + + {variables.getMessage('modals.main.settings.sections.experimental.title')} + + + {variables.getMessage('modals.main.settings.sections.experimental.warning')} + + + + +

Send Event

+ setEventType(e.target.value)} + spellCheck={false} + varient="outlined" + InputLabelProps={{ shrink: true }} + /> + setEventName(e.target.value)} + spellCheck={false} + varient="outlined" + InputLabelProps={{ shrink: true }} + /> +
+ + + + ); } + +export default memo(ExperimentalSettings); diff --git a/src/components/modals/main/settings/sections/Greeting.jsx b/src/components/modals/main/settings/sections/Greeting.jsx index 6b78f377..afd99124 100644 --- a/src/components/modals/main/settings/sections/Greeting.jsx +++ b/src/components/modals/main/settings/sections/Greeting.jsx @@ -5,12 +5,13 @@ import Header from '../Header'; import Checkbox from '../Checkbox'; import Switch from '../Switch'; import Text from '../Text'; +import SettingsItem from '../SettingsItem'; export default class GreetingSettings extends PureComponent { constructor() { super(); this.state = { - birthday: new Date(localStorage.getItem('birthday')) || new Date() + birthday: new Date(localStorage.getItem('birthday')) || new Date(), }; } @@ -18,26 +19,68 @@ export default class GreetingSettings extends PureComponent { localStorage.setItem('birthday', e.target.value || new Date()); this.setState({ - birthday: e.target.value ? new Date(e.target.value) : new Date() + birthday: e.target.value ? new Date(e.target.value) : new Date(), }); - } + }; render() { - const getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - return ( <> -
- - - - -

{getMessage('modals.main.settings.sections.greeting.birthday')}

- -
- -

{getMessage('modals.main.settings.sections.greeting.birthday_date')}

- +
+ + + + + + + + +

+ {variables.getMessage('modals.main.settings.sections.greeting.birthday_date')} +

+ +
); } diff --git a/src/components/modals/main/settings/sections/Keybinds.jsx b/src/components/modals/main/settings/sections/Keybinds.jsx deleted file mode 100644 index 2ed3c936..00000000 --- a/src/components/modals/main/settings/sections/Keybinds.jsx +++ /dev/null @@ -1,148 +0,0 @@ -import variables from 'modules/variables'; -import { PureComponent } from 'react'; - -import Header from '../Header'; -import KeybindInput from '../KeybindInput'; - -export default class KeybindSettings extends PureComponent { - getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - - constructor() { - super(); - this.state = { - keybinds: JSON.parse(localStorage.getItem('keybinds')) || {}, - cancelled: false - }; - } - - showReminder() { - document.querySelector('.reminder-info').style.display = 'none'; - return localStorage.setItem('showReminder', false); - } - - listen(type) { - const currentKeybinds = this.state.keybinds; - currentKeybinds[type] = this.getMessage('modals.main.settings.sections.keybinds.recording'); - this.setState({ - keybinds: currentKeybinds, - cancelled: false - }); - this.forceUpdate(); - - let keys = ''; - let previouskey = ''; - this.keydown = document.addEventListener('keydown', (event) => { - if (event.key === previouskey && this.state.cancelled === true) { - return; - } - - if (keys === '') { - keys = event.key; - } else { - keys = `${keys}+${event.key}`; - } - - previouskey = event.key - }); - - this.keyup = document.addEventListener('keyup', () => { - if (this.state.cancelled === true) { - return; - } - - document.removeEventListener('keydown', this.keydown); - const keybinds = this.state.keybinds; - keybinds[type] = keys.split('+').slice(0, 4).join('+'); - localStorage.setItem('keybinds', JSON.stringify(keybinds)); - this.setState({ - keybinds: JSON.parse(localStorage.getItem('keybinds')) || {} - }); - }); - - document.removeEventListener('keyup', this.keyup); - - this.showReminder(); - } - - cancel(type) { - document.removeEventListener('keydown', this.keydown); - document.removeEventListener('keyup', this.keyup); - - const currentKeybinds = this.state.keybinds; - delete currentKeybinds[type]; - - this.setState({ - keybinds: currentKeybinds, - cancelled: true - }); - this.forceUpdate(); - } - - reset(type) { - const keybinds = this.state.keybinds; - keybinds[type] = ''; - localStorage.setItem('keybinds', JSON.stringify(keybinds)); - - this.setState({ - keybinds: JSON.parse(localStorage.getItem('keybinds')) || {}, - cancelled: true - }); - - this.showReminder(); - } - - action(action, e) { - switch (action) { - case 'listen': - this.listen(e); - break; - case 'cancel': - this.cancel(e); - break; - case 'reset': - this.reset(e); - break; - default: - break; - } - } - - render() { - return ( - <> -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
this.action(type, e)}/> this.action(type, e)}/>
this.action(type, e)}/> this.action(type, e)}/>
this.action(type, e)}/> this.action(type, e)}/>
this.action(type, e)}/> this.action(type, e)}/>
this.action(type, e)}/> this.action(type, e)}/>
this.action(type, e)}/> this.action(type, e)}/>
this.action(type, e)}/>
- - ); - } -} diff --git a/src/components/modals/main/settings/sections/Language.jsx b/src/components/modals/main/settings/sections/Language.jsx index 761dc4a7..3c560f3f 100644 --- a/src/components/modals/main/settings/sections/Language.jsx +++ b/src/components/modals/main/settings/sections/Language.jsx @@ -3,24 +3,28 @@ import { PureComponent } from 'react'; import Radio from '../Radio'; -const languages = require('modules/languages.json'); +import languages from 'modules/languages.json'; export default class LanguageSettings extends PureComponent { - getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - constructor() { super(); this.state = { - quoteLanguages: [{ - name: this.getMessage('modals.main.loading'), - value: 'loading' - }] + quoteLanguages: [ + { + name: variables.getMessage('modals.main.loading'), + value: 'loading', + }, + ], }; this.controller = new AbortController(); } - async getQuoteLanguages() { - const data = await (await fetch(variables.constants.API_URL + '/quotes/languages', { signal: this.controller.signal })).json(); + async getquoteLanguages() { + const data = await ( + await fetch(variables.constants.API_URL + '/quotes/languages', { + signal: this.controller.signal, + }) + ).json(); if (this.controller.signal.aborted === true) { return; @@ -30,26 +34,28 @@ export default class LanguageSettings extends PureComponent { data.forEach((item) => { quoteLanguages.push({ name: item, - value: item + value: item, }); }); this.setState({ - quoteLanguages + quoteLanguages, }); } componentDidMount() { if (navigator.onLine === false || localStorage.getItem('offlineMode') === 'true') { return this.setState({ - quoteLanguages: [{ - name: this.getMessage('modals.main.marketplace.offline.description'), - value: 'loading' - }] + quoteLanguages: [ + { + name: variables.getMessage('modals.main.marketplace.offline.description'), + value: 'loading', + }, + ], }); } - this.getQuoteLanguages(); + this.getquoteLanguages(); } componentWillUnmount() { @@ -60,10 +66,22 @@ export default class LanguageSettings extends PureComponent { render() { return ( <> -

{this.getMessage('modals.main.settings.sections.language.title')}

- -

{this.getMessage('modals.main.settings.sections.language.quote')}

- + + {variables.getMessage('modals.main.settings.sections.language.title')} + +
+ +
+ + {variables.getMessage('modals.main.settings.sections.language.quote')} + +
+ l.name)} + category="quote" + /> +
); } diff --git a/src/components/modals/main/settings/sections/Message.jsx b/src/components/modals/main/settings/sections/Message.jsx index 1e02078f..2e58da8e 100644 --- a/src/components/modals/main/settings/sections/Message.jsx +++ b/src/components/modals/main/settings/sections/Message.jsx @@ -1,31 +1,30 @@ import variables from 'modules/variables'; import { PureComponent } from 'react'; -import { MdCancel, MdAdd } from 'react-icons/md'; +import { MdCancel, MdAdd, MdOutlineTextsms } from 'react-icons/md'; import { toast } from 'react-toastify'; -import { TextField } from '@mui/material'; +import { TextareaAutosize } from '@mui/material'; +import SettingsItem from '../SettingsItem'; import Header from '../Header'; import EventBus from 'modules/helpers/eventbus'; export default class Message extends PureComponent { - getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - constructor() { super(); this.state = { - messages: JSON.parse(localStorage.getItem('messages')) || [''], + messages: JSON.parse(localStorage.getItem('messages')) || [], }; } reset = () => { - localStorage.setItem('messages', '[""]'); + localStorage.setItem('messages', '[]'); this.setState({ - messages: [''] + messages: [], }); - toast(this.getMessage(this.languagecode, 'toasts.reset')); + toast(variables.getMessage(this.languagecode, 'toasts.reset')); EventBus.dispatch('refresh', 'message'); - } + }; modifyMessage(type, index) { const messages = this.state.messages; @@ -36,7 +35,7 @@ export default class Message extends PureComponent { } this.setState({ - messages + messages, }); this.forceUpdate(); @@ -44,37 +43,92 @@ export default class Message extends PureComponent { } message(e, text, index) { - const result = (text === true) ? e.target.value : e.target.result; + const result = text === true ? e.target.value : e.target.result; const messages = this.state.messages; messages[index] = result; this.setState({ - messages + messages, }); this.forceUpdate(); localStorage.setItem('messages', JSON.stringify(messages)); - document.querySelector('.reminder-info').style.display = 'block'; + document.querySelector('.reminder-info').style.display = 'flex'; localStorage.setItem('showReminder', true); } - + render() { return ( <> -
-

{this.getMessage('modals.main.settings.sections.message.text')}

-
- +
+ + + +
+ {this.state.messages.map((_url, index) => ( +
+
+
+ +
+
+ + {variables.getMessage('modals.main.settings.sections.message.title')} + + this.message(e, true, index)} + varient="outlined" + style={{ padding: '0' }} + /> +
+
+
+
+ +
+
+
+ ))}
- {this.state.messages.map((_url, index) => ( -
- this.message(e, true, index)} varient='outlined' /> - {this.state.messages.length > 1 ? : null} + {this.state.messages.length === 0 ? ( +
+
+ + + {variables.getMessage('modals.main.settings.sections.message.no_messages')} + + + {variables.getMessage('modals.main.settings.sections.message.add_some')} + + +
- ))} -
+ ) : null} ); } diff --git a/src/components/modals/main/settings/sections/Navbar.jsx b/src/components/modals/main/settings/sections/Navbar.jsx index b03fe749..e7d61f38 100644 --- a/src/components/modals/main/settings/sections/Navbar.jsx +++ b/src/components/modals/main/settings/sections/Navbar.jsx @@ -1,34 +1,90 @@ import variables from 'modules/variables'; -import { PureComponent } from 'react'; +import { useState, memo } from 'react'; import Checkbox from '../Checkbox'; import Dropdown from '../Dropdown'; -import Slider from '../Slider'; -import { values } from 'modules/helpers/settings/modals'; +import SettingsItem from '../SettingsItem'; +import Header from '../Header'; -export default class Navbar extends PureComponent { - render() { - const getMessage = (text) => variables.language.getMessage(variables.languagecode, text); +function Navbar() { + const [showRefreshOptions, setShowRefreshOptions] = useState( + localStorage.getItem('refresh') === 'true', + ); - return ( - <> -

{getMessage('modals.main.settings.sections.appearance.navbar.title')}

- - - - - - - - - - - {/* before it was just a checkbox */} - - - - ); - } + return ( + <> +
+ + + + + + + + {showRefreshOptions ? ( + + + + + + + + + ) : null} + + ); } + +export default memo(Navbar); diff --git a/src/components/modals/main/settings/sections/Order.jsx b/src/components/modals/main/settings/sections/Order.jsx deleted file mode 100644 index 0daf9087..00000000 --- a/src/components/modals/main/settings/sections/Order.jsx +++ /dev/null @@ -1,96 +0,0 @@ -import variables from 'modules/variables'; -import { PureComponent } from 'react'; -import { MdOutlineDragIndicator } from 'react-icons/md'; -import { sortableContainer, sortableElement } from 'react-sortable-hoc'; -import { toast } from 'react-toastify'; - -import EventBus from 'modules/helpers/eventbus'; - -const getMessage = (text) => variables.language.getMessage(variables.languagecode, text); -const widget_name = { - greeting: getMessage('modals.main.settings.sections.greeting.title'), - time: getMessage('modals.main.settings.sections.time.title'), - quicklinks: getMessage('modals.main.settings.sections.quicklinks.title'), - quote: getMessage('modals.main.settings.sections.quote.title'), - date: getMessage('modals.main.settings.sections.date.title'), - message: getMessage('modals.main.settings.sections.message.title') -}; - -const SortableItem = sortableElement(({ value }) => ( -
  • - - {widget_name[value]} -
  • -)); - -const SortableContainer = sortableContainer(({ children }) => ( -
      {children}
    -)); - -export default class OrderSettings extends PureComponent { - constructor() { - super(); - this.state = { - items: JSON.parse(localStorage.getItem('order')) - }; - } - - arrayMove(array, oldIndex, newIndex) { - const result = Array.from(array); - const [removed] = result.splice(oldIndex, 1); - result.splice(newIndex, 0, removed); - - return result; - } - - onSortEnd = ({ oldIndex, newIndex }) => { - this.setState({ - items: this.arrayMove(this.state.items, oldIndex, newIndex) - }); - } - - reset = () => { - localStorage.setItem('order', JSON.stringify(['greeting', 'time', 'quicklinks', 'quote', 'date', 'message'])); - - this.setState({ - items: JSON.parse(localStorage.getItem('order')) - }); - - toast(getMessage('toasts.reset')); - } - - enabled = (setting) => { - switch (setting) { - case 'quicklinks': - return (localStorage.getItem('quicklinksenabled') === 'true'); - default: - return (localStorage.getItem(setting) === 'true'); - } - } - - componentDidUpdate() { - localStorage.setItem('order', JSON.stringify(this.state.items)); - variables.stats.postEvent('setting', 'Widget order'); - EventBus.dispatch('refresh', 'widgets'); - } - - render() { - return ( - <> -

    {getMessage('modals.main.settings.sections.order.title')}

    - {getMessage('modals.main.settings.buttons.reset')} - - {this.state.items.map((value, index) => { - if (!this.enabled(value)) { - return null; - } - - return ( - - ); - })} - - - ); - } -} diff --git a/src/components/modals/main/settings/sections/Overview.jsx b/src/components/modals/main/settings/sections/Overview.jsx new file mode 100644 index 00000000..4b0f3520 --- /dev/null +++ b/src/components/modals/main/settings/sections/Overview.jsx @@ -0,0 +1,195 @@ +import variables from 'modules/variables'; +import { PureComponent } from 'react'; +import { MdOutlineDragIndicator } from 'react-icons/md'; +import { sortableContainer, sortableElement } from 'react-sortable-hoc'; +import { toast } from 'react-toastify'; + +import Greeting from './overview_skeletons/Greeting'; +import Clock from './overview_skeletons/Clock'; +import Quote from './overview_skeletons/Quote'; +import QuickLinks from './overview_skeletons/QuickLinks'; +import Date from './overview_skeletons/Date'; +import Message from './overview_skeletons/Message'; + +import EventBus from 'modules/helpers/eventbus'; + +const widget_name = { + greeting: variables.getMessage('modals.main.settings.sections.greeting.title'), + time: variables.getMessage('modals.main.settings.sections.time.title'), + quicklinks: variables.getMessage('modals.main.settings.sections.quicklinks.title'), + quote: variables.getMessage('modals.main.settings.sections.quote.title'), + date: variables.getMessage('modals.main.settings.sections.date.title'), + message: variables.getMessage('modals.main.settings.sections.message.title'), +}; + +const SortableItem = sortableElement(({ value }) => ( +
  • + {widget_name[value]} + +
  • +)); + +const SortableContainer = sortableContainer(({ children }) => ( +
      {children}
    +)); + +export default class OrderSettings extends PureComponent { + constructor() { + super(); + this.state = { + items: JSON.parse(localStorage.getItem('order')), + news: { + title: '', + date: '', + description: '', + link: '', + linkText: '', + }, + newsDone: false, + }; + } + + arrayMove(array, oldIndex, newIndex) { + const result = Array.from(array); + const [removed] = result.splice(oldIndex, 1); + result.splice(newIndex, 0, removed); + + return result; + } + + onSortEnd = ({ oldIndex, newIndex }) => { + this.setState({ + items: this.arrayMove(this.state.items, oldIndex, newIndex), + }); + }; + + reset = () => { + localStorage.setItem( + 'order', + JSON.stringify(['greeting', 'time', 'quicklinks', 'quote', 'date', 'message']), + ); + + this.setState({ + items: JSON.parse(localStorage.getItem('order')), + }); + + toast(variables.getMessage('toasts.reset')); + }; + + enabled = (setting) => { + switch (setting) { + case 'quicklinks': + return localStorage.getItem('quicklinksenabled') === 'true'; + default: + return localStorage.getItem(setting) === 'true'; + } + }; + + getTab = (value) => { + switch (value) { + case 'greeting': + return ; + case 'time': + return ; + case 'quicklinks': + return ; + case 'quote': + return ; + case 'date': + return ; + case 'message': + return ; + default: + return null; + } + }; + + async getNews() { + const data = await (await fetch(variables.constants.API_URL + '/news')).json(); + data.date = new window.Date(data.date).toLocaleDateString( + variables.languagecode.replace('_', '-'), + { + year: 'numeric', + month: 'long', + day: 'numeric', + }, + ); + + this.setState({ + news: data, + newsDone: true, + }); + } + + componentDidUpdate() { + localStorage.setItem('order', JSON.stringify(this.state.items)); + variables.stats.postEvent('setting', 'Widget order'); + EventBus.dispatch('refresh', 'widgets'); + } + + componentDidMount() { + this.getNews(); + } + + render() { + return ( + <> + + {variables.getMessage('modals.main.marketplace.product.overview')} + + {/*{variables.getMessage('modals.main.marketplace.product.overview')} + + {variables.getMessage('modals.main.settings.buttons.reset')} + */} +
    +
    + {variables.getMessage('modals.welcome.buttons.preview')} +
    +
    + {this.state.items.map((value, index) => { + if (!this.enabled(value)) { + return null; + } + + return ( +
    + {' '} + {this.getTab(value)} +
    + ); + })} +
    +
    +
    + {this.state.news.title} + {this.state.news.date} + {this.state.news.description} + + {this.state.news.linkText} + +
    +
    +
    + + {variables.getMessage('modals.main.settings.sections.order.title')} + + + {this.state.items.map((value, index) => { + if (!this.enabled(value)) { + return null; + } + + return ; + })} + +
    +
    + + ); + } +} diff --git a/src/components/modals/main/settings/sections/QuickLinks.jsx b/src/components/modals/main/settings/sections/QuickLinks.jsx index 61ada28d..4eb276f5 100644 --- a/src/components/modals/main/settings/sections/QuickLinks.jsx +++ b/src/components/modals/main/settings/sections/QuickLinks.jsx @@ -1,20 +1,286 @@ import variables from 'modules/variables'; -import { useState } from 'react'; - +import { PureComponent, createRef } from 'react'; +import { MdAddLink, MdLinkOff, MdCancel, MdEdit } from 'react-icons/md'; import Header from '../Header'; import Checkbox from '../Checkbox'; +import Dropdown from '../Dropdown'; +import Modal from 'react-modal'; -export default function QuickLinks() { - const getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - const [textOnly, setTextOnly] = useState(localStorage.getItem('quicklinksText') === 'true'); +import SettingsItem from '../SettingsItem'; +import AddModal from './quicklinks/AddModal'; - return ( - <> -
    - setTextOnly(value)}/> - - - - - ); +import EventBus from 'modules/helpers/eventbus'; + +export default class QuickLinks extends PureComponent { + constructor() { + super(); + this.state = { + items: JSON.parse(localStorage.getItem('quicklinks')), + showAddModal: false, + urlError: '', + edit: false, + editData: '', + }; + this.quicklinksContainer = createRef(); + } + + deleteLink(key, event) { + event.preventDefault(); + + // remove link from array + const data = JSON.parse(localStorage.getItem('quicklinks')).filter((i) => i.key !== key); + + localStorage.setItem('quicklinks', JSON.stringify(data)); + this.setState({ + items: data, + }); + + variables.stats.postEvent('feature', 'Quicklink delete'); + } + + addLink(name, url, icon) { + const data = JSON.parse(localStorage.getItem('quicklinks')); + let urlError; + + // regex: https://ihateregex.io/expr/url/ + // eslint-disable-next-line no-useless-escape + if ( + url.length <= 0 || + /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()!@:%_.~#?&=]*)/.test( + url, + ) === false + ) { + urlError = variables.getMessage('widgets.quicklinks.url_error'); + } + + if (urlError) { + return this.setState({ + urlError, + }); + } + + if (!url.startsWith('http://') && !url.startsWith('https://')) { + url = 'http://' + url; + } + + data.push({ + name: name || url, + url, + icon: icon || '', + key: Math.random().toString(36).substring(7) + 1, + }); + + localStorage.setItem('quicklinks', JSON.stringify(data)); + + this.setState({ + items: data, + showAddModal: false, + urlError: '', + }); + + variables.stats.postEvent('feature', 'Quicklink add'); + } + + startEditLink(data) { + this.setState({ + edit: true, + editData: data, + showAddModal: true, + }); + } + + editLink(og, name, url, icon) { + const data = JSON.parse(localStorage.getItem('quicklinks')); + const dataobj = data.find((i) => i.key === og.key); + dataobj.name = name || url; + dataobj.url = url; + dataobj.icon = icon || ''; + + localStorage.setItem('quicklinks', JSON.stringify(data)); + + this.setState({ + items: data, + showAddModal: false, + edit: false, + }); + } + + componentDidMount() { + EventBus.on('refresh', (data) => { + if (data === 'quicklinks') { + if (localStorage.getItem('quicklinksenabled') === 'false') { + return (this.quicklinksContainer.current.style.display = 'none'); + } + + this.quicklinksContainer.current.style.display = 'block'; + + this.setState({ + items: JSON.parse(localStorage.getItem('quicklinks')), + }); + } + }); + } + + componentWillUnmount() { + EventBus.off('refresh'); + } + + render() { + let target, + rel = null; + if (localStorage.getItem('quicklinksnewtab') === 'true') { + target = '_blank'; + rel = 'noopener noreferrer'; + } + + const useText = localStorage.getItem('quicklinksText') === 'true'; + + const quickLink = (item) => { + if (useText) { + return ( + this.deleteLink(item.key, e)} + href={item.url} + target={target} + rel={rel} + draggable={false} + > + {item.name} + + ); + } + + const img = + item.icon || + 'https://icon.horse/icon/ ' + item.url.replace('https://', '').replace('http://', ''); + + const link = ( +
    +
    + {item.name} +
    +
    +
    {item.name}
    +
    {item.url}
    +
    +
    +
    + + +
    +
    +
    + ); + + return link; + }; + + return ( + <> +
    + + + + + + + + + + + + + + + + + {this.state.items.length === 0 ? ( +
    +
    + + + {variables.getMessage('modals.main.settings.sections.quicklinks.no_quicklinks')} + + + {variables.getMessage('modals.main.settings.sections.message.add_some')} + + +
    +
    + ) : null} + +
    + {this.state.items.map((item) => quickLink(item))} +
    + this.setState({ showAddModal: false, urlError: '' })} + isOpen={this.state.showAddModal} + className="Modal resetmodal mainModal" + overlayClassName="Overlay resetoverlay" + ariaHideApp={false} + > + this.addLink(name, url, icon)} + editLink={(og, name, url, icon) => this.editLink(og, name, url, icon)} + edit={this.state.edit} + editData={this.state.editData} + closeModal={() => this.setState({ showAddModal: false, urlError: '' })} + /> + + + ); + } } diff --git a/src/components/modals/main/settings/sections/Quote.jsx b/src/components/modals/main/settings/sections/Quote.jsx index 8907c90e..b2070b3f 100644 --- a/src/components/modals/main/settings/sections/Quote.jsx +++ b/src/components/modals/main/settings/sections/Quote.jsx @@ -1,56 +1,66 @@ import variables from 'modules/variables'; -import { PureComponent } from 'react'; -import { MdCancel, MdAdd } from 'react-icons/md'; -import { TextField } from '@mui/material'; +import React, { PureComponent } from 'react'; +import { + MdCancel, + MdAdd, + MdSource, + MdOutlineKeyboardArrowRight, + MdOutlineFormatQuote, +} from 'react-icons/md'; +import TextareaAutosize from '@mui/material/TextareaAutosize'; import Header from '../Header'; import Checkbox from '../Checkbox'; import Dropdown from '../Dropdown'; +import SettingsItem from '../SettingsItem'; import { toast } from 'react-toastify'; import EventBus from 'modules/helpers/eventbus'; export default class QuoteSettings extends PureComponent { - getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - constructor() { super(); this.state = { quoteType: localStorage.getItem('quoteType') || 'api', - customQuote: this.getCustom() + customQuote: this.getCustom(), + sourceSection: false, }; } marketplaceType = () => { if (localStorage.getItem('quote_packs')) { - return ; + return ( + + ); } - } + }; resetCustom = () => { localStorage.setItem('customQuote', '[{"quote": "", "author": ""}]'); this.setState({ - customQuote: [{ - quote: '', - author: '' - }] + customQuote: [ + { + quote: '', + author: '', + }, + ], }); - toast(this.getMessage('toasts.reset')); + toast(variables.getMessage('toasts.reset')); EventBus.dispatch('refresh', 'background'); - } + }; customQuote(e, text, index, type) { - const result = (text === true) ? e.target.value : e.target.result; + const result = text === true ? e.target.value : e.target.result; const customQuote = this.state.customQuote; customQuote[index][type] = result; this.setState({ - customQuote + customQuote, }); this.forceUpdate(); localStorage.setItem('customQuote', JSON.stringify(customQuote)); - document.querySelector('.reminder-info').style.display = 'block'; + document.querySelector('.reminder-info').style.display = 'flex'; localStorage.setItem('showReminder', true); } @@ -59,14 +69,14 @@ export default class QuoteSettings extends PureComponent { if (type === 'add') { customQuote.push({ quote: '', - author: '' + author: '', }); } else { customQuote.splice(index, 1); } this.setState({ - customQuote + customQuote, }); this.forceUpdate(); @@ -76,66 +86,213 @@ export default class QuoteSettings extends PureComponent { getCustom() { let data = JSON.parse(localStorage.getItem('customQuote')); if (data === null) { - data = [{ - quote: localStorage.getItem('customQuote') || '', - author: localStorage.getItem('customQuoteAuthor') || '' - }]; + data = []; } return data; } render() { let customSettings; - if (this.state.quoteType === 'custom') { + if (this.state.quoteType === 'custom' && this.state.sourceSection === true) { customSettings = ( <> -

    {this.getMessage('modals.main.settings.sections.quote.custom')} {this.getMessage('modals.main.settings.buttons.reset')}

    -
    - -
    - {this.state.customQuote.map((_url, index) => ( -
    - this.customQuote(e, true, index, 'quote')} varient='outlined' style={{ marginRight: '10px' }} /> - this.customQuote(e, true, index, 'author')} varient='outlined' /> - {this.state.customQuote.length > 1 ? : null} + + + + + {this.state.customQuote.length !== 0 ? ( +
    + {this.state.customQuote.map((_url, index) => ( +
    +
    + +
    +
    + this.customQuote(e, true, index, 'quote')} + varient="outlined" + style={{ fontSize: '22px', fontWeight: 'bold' }} + /> + this.customQuote(e, true, index, 'author')} + varient="outlined" + /> +
    +
    +
    + +
    +
    +
    + ))}
    - ))} + ) : ( +
    +
    + + + {variables.getMessage('modals.main.settings.sections.quote.no_quotes')} + + + {variables.getMessage('modals.main.settings.sections.message.add_some')} + + +
    +
    + )} ); } else { // api - customSettings = ( - <> - - - - - - - - - - - ); + customSettings = <>; } return ( <> -
    - - this.setState({ quoteType: value })} category='quote'> - {this.marketplaceType()} - - - + {this.state.sourceSection ? ( + this.setState({ sourceSection: false })}> + + {variables.getMessage('modals.main.settings.sections.quote.title')} + + {' '} + {variables.getMessage('modals.main.settings.sections.background.source.title')} + + ) : ( +
    + )} +
    this.setState({ sourceSection: true })}> +
    + +
    + + {variables.getMessage('modals.main.settings.sections.background.source.title')} + + + {variables.getMessage('modals.main.settings.sections.quote.source_subtitle')} + +
    +
    +
    + this.setState({ quoteType: value })} + category="quote" + > + {this.marketplaceType()} + + + +
    +
    + {!this.state.sourceSection ? ( + <> + + + + + + + + {/* + + + + + + + + + */} + + + + + ) : null} {customSettings} - -

    {this.getMessage('modals.main.settings.sections.quote.buttons.title')}

    - - - ); } diff --git a/src/components/modals/main/settings/sections/Search.jsx b/src/components/modals/main/settings/sections/Search.jsx index 17db1d2a..0a5ef96b 100644 --- a/src/components/modals/main/settings/sections/Search.jsx +++ b/src/components/modals/main/settings/sections/Search.jsx @@ -6,39 +6,36 @@ import { MenuItem, TextField } from '@mui/material'; import Header from '../Header'; import Dropdown from '../Dropdown'; import Checkbox from '../Checkbox'; -import Radio from '../Radio'; +import SettingsItem from '../SettingsItem'; import EventBus from 'modules/helpers/eventbus'; -const searchEngines = require('components/widgets/search/search_engines.json'); -const autocompleteProviders = require('components/widgets/search/autocomplete_providers.json'); +import searchEngines from 'components/widgets/search/search_engines.json'; export default class SearchSettings extends PureComponent { - getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - constructor() { super(); this.state = { customEnabled: false, customDisplay: 'none', - customValue: localStorage.getItem('customSearchEngine') || '' + customValue: localStorage.getItem('customSearchEngine') || '', }; } resetSearch() { localStorage.removeItem('customSearchEngine'); this.setState({ - customValue: '' + customValue: '', }); - toast(this.getMessage('toasts.reset')); + toast(variables.getMessage('toasts.reset')); } componentDidMount() { if (localStorage.getItem('searchEngine') === 'custom') { this.setState({ customDisplay: 'block', - customEnabled: true + customEnabled: true, }); } else { localStorage.removeItem('customSearchEngine'); @@ -57,12 +54,12 @@ export default class SearchSettings extends PureComponent { if (input === 'custom') { this.setState({ customDisplay: 'block', - customEnabled: true + customEnabled: true, }); } else { this.setState({ customDisplay: 'none', - customEnabled: false + customEnabled: false, }); localStorage.setItem('searchEngine', input); } @@ -73,24 +70,79 @@ export default class SearchSettings extends PureComponent { render() { return ( <> -
    - {/* not supported on firefox */} - {(navigator.userAgent.includes('Chrome') && typeof InstallTrigger === 'undefined') ? - - : null} - - this.setSearchEngine(value)} manual={true}> - {searchEngines.map((engine) => ( - {engine.name} - ))} - {this.getMessage('modals.main.settings.sections.search.custom').split(' ')[0]} - -
      -

      this.resetSearch()}>{this.getMessage('modals.main.settings.buttons.reset')}

      - this.setState({ customValue: e.target.value })} varient='outlined' InputLabelProps={{ shrink: true }} /> -
    - - +
    + + {/* not supported on firefox */} + {navigator.userAgent.includes('Chrome') && typeof InstallTrigger === 'undefined' ? ( + + ) : null} + + + + + + this.setSearchEngine(value)} + manual={true} + > + {searchEngines.map((engine) => ( + + {engine.name} + + ))} + + {variables.getMessage('modals.main.settings.sections.search.custom').split(' ')[0]} + + + +
    + + this.setState({ customValue: e.target.value })} + varient="outlined" + InputLabelProps={{ shrink: true }} + /> +

    + this.resetSearch()}> + {variables.getMessage('modals.main.settings.buttons.reset')} + +

    +
    +
    ); } diff --git a/src/components/modals/main/settings/sections/Stats.jsx b/src/components/modals/main/settings/sections/Stats.jsx index 11957f74..268555e1 100644 --- a/src/components/modals/main/settings/sections/Stats.jsx +++ b/src/components/modals/main/settings/sections/Stats.jsx @@ -1,30 +1,90 @@ +/* eslint-disable array-callback-return */ import variables from 'modules/variables'; import { PureComponent } from 'react'; +import { MdShowChart } from 'react-icons/md'; import Switch from '../Switch'; +import SettingsItem from '../SettingsItem'; +import { FaTrophy } from 'react-icons/fa'; import EventBus from 'modules/helpers/eventbus'; +import achievementsData from 'modules/helpers/settings/achievements.json'; +import translations from 'modules/helpers/settings/achievement_translations/index'; + +const achievementLanguage = { + de_DE: translations.de_DE, + en_GB: translations.en_GB, + en_US: translations.en_US, + es: translations.es, + fr: translations.fr, + nl: translations.nl, + no: translations.no, + ru: translations.ru, + zh_CN: translations.zh_CN, + id_ID: translations.id_ID, + tr_TR: translations.tr_TR, +}; export default class Stats extends PureComponent { constructor() { super(); this.state = { - stats: JSON.parse(localStorage.getItem('statsData')) || {} + stats: JSON.parse(localStorage.getItem('statsData')) || {}, + achievements: achievementsData.achievements, }; } - componentDidMount() { - EventBus.on('refresh', (data) => { + getAchievements() { + const achievements = this.state.achievements; + achievements.forEach((achievement) => { + switch (achievement.condition.type) { + case 'tabsOpened': + if (this.state.stats['tabs-opened'] >= achievement.condition.amount) { + achievement.achieved = true; + } + break; + case 'addonInstall': + if (this.state.stats.marketplace) { + if (this.state.stats.marketplace['install'] >= achievement.condition.amount) { + achievement.achieved = true; + } + } + break; + default: + break; + } + }); + + this.setState({ + achievements, + }); + } + + getUnlockedCount() { + let count = 0; + this.state.achievements.forEach((achievement) => { + if (achievement.achieved) { + count++; + } + }); + return count; + } + + componentDidMount() { + EventBus.on('refresh', (data) => { if (data === 'stats') { if (localStorage.getItem('stats') === 'false') { localStorage.setItem('statsData', JSON.stringify({})); return this.setState({ - stats: {} + stats: {}, }); } this.forceUpdate(); } }); + + this.getAchievements(); + this.forceUpdate(); } componentWillUnmount() { @@ -32,29 +92,129 @@ export default class Stats extends PureComponent { } render() { - const getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - if (localStorage.getItem('stats') === 'false') { return ( <> -

    {getMessage('modals.main.settings.reminder.title')}

    -

    {getMessage('modals.main.settings.sections.stats.warning')}

    - + + {variables.getMessage('modals.main.settings.sections.stats.title')} + + + + ); } + const achievementElement = (key, name) => ( +
    + +
    + {name} + + {achievementLanguage[localStorage.getItem('language')][key]} + +
    +
    + ); + return ( <> -

    {getMessage('modals.main.settings.sections.stats.title')}

    - -

    {getMessage('modals.main.settings.sections.stats.sections.tabs_opened')}: {this.state.stats['tabs-opened'] || 0}

    -

    {getMessage('modals.main.settings.sections.stats.sections.backgrounds_favourited')}: {this.state.stats.feature ? this.state.stats.feature['background-favourite'] || 0 : 0}

    -

    {getMessage('modals.main.settings.sections.stats.sections.backgrounds_downloaded')}: {this.state.stats.feature ? this.state.stats.feature['background-download'] || 0 : 0}

    -

    {getMessage('modals.main.settings.sections.stats.sections.quotes_favourited')}: {this.state.stats.feature ? this.state.stats.feature['quoted-favourite'] || 0 : 0}

    -

    {getMessage('modals.main.settings.sections.stats.sections.quicklinks_added')}: {this.state.stats.feature ? this.state.stats.feature['quicklink-add'] || 0 : 0}

    -

    {getMessage('modals.main.settings.sections.stats.sections.settings_changed')}: {this.state.stats.setting ? Object.keys(this.state.stats.setting).length : 0}

    -

    {getMessage('modals.main.settings.sections.stats.sections.addons_installed')}: {this.state.stats.marketplace ? this.state.stats.marketplace['install'] : 0}

    + + {variables.getMessage('modals.main.settings.sections.stats.title')} + + + + +
    +
    + + {variables.getMessage('modals.main.settings.sections.stats.achievements')} + +
    + + {variables.getMessage('modals.main.settings.sections.stats.unlocked', { + count: this.getUnlockedCount() + '/' + this.state.achievements.length, + })} + +
    + {this.state.achievements.map((achievement, index) => { + if (achievement.achieved) { + return achievementElement(index, achievement.name); + } + })} +
    +
    +
    + + + {variables.getMessage('modals.main.settings.sections.stats.sections.tabs_opened')}{' '} + + {this.state.stats['tabs-opened'] || 0} + + {variables.getMessage( + 'modals.main.settings.sections.stats.sections.backgrounds_favourited', + )}{' '} + + + {this.state.stats.feature ? this.state.stats.feature['background-favourite'] || 0 : 0} + + + {variables.getMessage( + 'modals.main.settings.sections.stats.sections.backgrounds_downloaded', + )}{' '} + + + {this.state.stats.feature ? this.state.stats.feature['background-download'] || 0 : 0} + + + {variables.getMessage( + 'modals.main.settings.sections.stats.sections.quotes_favourited', + )}{' '} + + + {this.state.stats.feature ? this.state.stats.feature['quoted-favourite'] || 0 : 0} + + + {variables.getMessage( + 'modals.main.settings.sections.stats.sections.quicklinks_added', + )}{' '} + + + {this.state.stats.feature ? this.state.stats.feature['quicklink-add'] || 0 : 0} + + + {variables.getMessage( + 'modals.main.settings.sections.stats.sections.settings_changed', + )}{' '} + + + {this.state.stats.setting ? Object.keys(this.state.stats.setting).length : 0} + + + {variables.getMessage( + 'modals.main.settings.sections.stats.sections.addons_installed', + )}{' '} + + + {this.state.stats.marketplace ? this.state.stats.marketplace['install'] : 0} + +
    +
    ); } diff --git a/src/components/modals/main/settings/sections/Time.jsx b/src/components/modals/main/settings/sections/Time.jsx index 139e8c93..cc212ccd 100644 --- a/src/components/modals/main/settings/sections/Time.jsx +++ b/src/components/modals/main/settings/sections/Time.jsx @@ -5,48 +5,142 @@ import Header from '../Header'; import Checkbox from '../Checkbox'; import Dropdown from '../Dropdown'; import Radio from '../Radio'; +import SettingsItem from '../SettingsItem'; export default class TimeSettings extends PureComponent { constructor() { super(); this.state = { - timeType: localStorage.getItem('timeType') || 'digital' + timeType: localStorage.getItem('timeType') || 'digital', + hourColour: localStorage.getItem('hourColour') || '#ffffff', + minuteColour: localStorage.getItem('minuteColour') || '#ffffff', }; } - render() { - const getMessage = (text) => variables.language.getMessage(variables.languagecode, text); + updateColour(type, event) { + const colour = event.target.value; + this.setState({ [type]: colour }); + localStorage.setItem(type, colour); + } + render() { let timeSettings = null; - const digitalOptions = [ - { - name: getMessage('modals.main.settings.sections.time.digital.twentyfourhour'), - value: 'twentyfourhour' - }, - { - name: getMessage('modals.main.settings.sections.time.digital.twelvehour'), - value: 'twelvehour' - } - ]; - const digitalSettings = ( - <> -

    {getMessage('modals.main.settings.sections.time.digital.title')}

    - - - - + + + + + ); const analogSettings = ( + + + + + + + + ); + + const verticalClock = ( <> -

    {getMessage('modals.main.settings.sections.time.analogue.title')}

    - - - - - + +
    + this.updateColour('hourColour', event)} + value={this.state.hourColour} + > + +
    + localStorage.setItem('hourColour', '#ffffff')}> + {variables.getMessage('modals.main.settings.buttons.reset')} + +
    + +
    + this.updateColour('minuteColour', event)} + value={this.state.minuteColour} + > + +
    + localStorage.setItem('minuteColour', '#ffffff')}> + {variables.getMessage('modals.main.settings.buttons.reset')} + +
    + {digitalSettings} ); @@ -54,16 +148,44 @@ export default class TimeSettings extends PureComponent { timeSettings = digitalSettings; } else if (this.state.timeType === 'analogue') { timeSettings = analogSettings; + } else if (this.state.timeType === 'verticalClock') { + timeSettings = verticalClock; } return ( <> -
    - this.setState({ timeType: value })} category='clock'> - - - - +
    + + this.setState({ timeType: value })} + category="clock" + > + + + + + + {timeSettings} ); diff --git a/src/components/modals/main/settings/sections/Weather.jsx b/src/components/modals/main/settings/sections/Weather.jsx index 1d87fc4d..6cc9480e 100644 --- a/src/components/modals/main/settings/sections/Weather.jsx +++ b/src/components/modals/main/settings/sections/Weather.jsx @@ -3,15 +3,17 @@ import { PureComponent } from 'react'; import Header from '../Header'; import Radio from '../Radio'; +import Dropdown from '../Dropdown'; import Checkbox from '../Checkbox'; import { TextField } from '@mui/material'; +import SettingsItem from '../SettingsItem'; export default class TimeSettings extends PureComponent { constructor() { super(); this.state = { location: localStorage.getItem('location') || '', - windSpeed: (localStorage.getItem('windspeed') !== 'true') + windSpeed: localStorage.getItem('windspeed') !== 'true', }; } @@ -20,70 +22,186 @@ export default class TimeSettings extends PureComponent { } showReminder() { - document.querySelector('.reminder-info').style.display = 'block'; + document.querySelector('.reminder-info').style.display = 'flex'; localStorage.setItem('showReminder', true); } changeLocation(e) { - this.setState({ - location: e.target.value + this.setState({ + location: e.target.value, }); this.showReminder(); } getAuto() { - navigator.geolocation.getCurrentPosition(async (position) => { - const data = await (await fetch(`${variables.constants.PROXY_URL}/weather/autolocation?lat=${position.coords.latitude}&lon=${position.coords.longitude}`)).json(); - this.setState({ - location: data[0].name - }); + navigator.geolocation.getCurrentPosition( + async (position) => { + const data = await ( + await fetch( + `${variables.constants.API_URL}/gps?latitude=${position.coords.latitude}&longitude=${position.coords.longitude}`, + ) + ).json(); + this.setState({ + location: data[0].name, + }); - this.showReminder(); - }, (error) => { - // firefox requires this 2nd function - console.log(error); - }, { - enableHighAccuracy: true - }); + this.showReminder(); + }, + (error) => { + // firefox requires this 2nd function + console.log(error); + }, + { + enableHighAccuracy: true, + }, + ); } render() { - const getMessage = (text) => variables.language.getMessage(variables.languagecode, text); + const weatherType = localStorage.getItem('weatherType'); - const tempFormat = [ - { - name: getMessage('modals.main.settings.sections.weather.temp_format.celsius') + ' (°C)', - value: 'celsius' - }, - { - name: getMessage('modals.main.settings.sections.weather.temp_format.fahrenheit') + ' (°F)', - value: 'fahrenheit' - }, - { - name: getMessage('modals.main.settings.sections.weather.temp_format.kelvin') + ' (K)', - value: 'kelvin' - } - ]; - return ( <> -
    - this.changeLocation(e)} placeholder='London' varient='outlined' InputLabelProps={{ shrink: true }} /> - this.getAuto()}>{getMessage('modals.main.settings.sections.weather.auto')} - - -

    {getMessage('modals.main.settings.sections.weather.extra_info.title')}

    - - - - - - this.setState({ windSpeed: (localStorage.getItem('windspeed') !== 'true') })}/> - - - - +
    + + this.forceUpdate()} + > + + + + + + + + this.changeLocation(e)} + placeholder="London" + varient="outlined" + InputLabelProps={{ shrink: true }} + /> + this.getAuto()}> + {variables.getMessage('modals.main.settings.sections.weather.auto')} + + + + + + {weatherType === '4' && ( + + + + + + + this.setState({ + windSpeed: localStorage.getItem('windspeed') !== 'true', + }) + } + /> + + + + )} ); } diff --git a/src/components/modals/main/settings/sections/advanced/Advanced.jsx b/src/components/modals/main/settings/sections/advanced/Advanced.jsx new file mode 100644 index 00000000..891c3cee --- /dev/null +++ b/src/components/modals/main/settings/sections/advanced/Advanced.jsx @@ -0,0 +1,161 @@ +import variables from 'modules/variables'; +import { PureComponent } from 'react'; +import Modal from 'react-modal'; +import { MenuItem } from '@mui/material'; +import { + MdUpload as ImportIcon, + MdDownload as ExportIcon, + MdRestartAlt as ResetIcon, + /* MdDataUsage, */ + /* MdOutlineKeyboardArrowRight, */ +} from 'react-icons/md'; + +import { exportSettings, importSettings } from 'modules/helpers/settings/modals'; + +import FileUpload from '../../FileUpload'; +import Text from '../../Text'; +import Switch from '../../Switch'; +import ResetModal from '../../ResetModal'; +import Dropdown from '../../Dropdown'; +import SettingsItem from '../../SettingsItem'; + +//import Data from './Data'; + +import time_zones from 'components/widgets/time/timezones.json'; + +export default class AdvancedSettings extends PureComponent { + constructor() { + super(); + this.state = { + resetModal: false, + showData: false, + }; + } + + render() { + /*if (this.state.showData) { + return this.setState({ showData: false })} />; + }*/ + + return ( + <> + + {variables.getMessage('modals.main.settings.sections.advanced.title')} + + {/* {localStorage.getItem('welcomePreview') !== 'true' ? ( +
    this.setState({ showData: true })}> +
    + +
    + + {variables.getMessage('modals.main.settings.sections.advanced.data')} + + + Sync, export, import etc your data. You have control, this is Mue. + +
    +
    +
    + {' '} + +
    +
    + ) : null} */} + + + + {localStorage.getItem('welcomePreview') !== 'true' ? ( +
    +
    + + {variables.getMessage('modals.main.settings.sections.advanced.data')} + + + {variables.getMessage('modals.main.settings.sections.advanced.data_subtitle')} + +
    +
    + + + +
    +
    + ) : null} + + + + {variables.getMessage('modals.main.settings.sections.advanced.timezone.automatic')} + + {time_zones.map((timezone) => ( + + {timezone} + + ))} + + + + + + importSettings(e)} + /> + + + + + + + this.setState({ resetModal: false })} + isOpen={this.state.resetModal} + className="Modal resetmodal mainModal" + overlayClassName="Overlay resetoverlay" + ariaHideApp={false} + > + this.setState({ resetModal: false })} /> + + + ); + } +} diff --git a/src/components/modals/main/settings/sections/advanced/Data.jsx b/src/components/modals/main/settings/sections/advanced/Data.jsx new file mode 100644 index 00000000..800c1220 --- /dev/null +++ b/src/components/modals/main/settings/sections/advanced/Data.jsx @@ -0,0 +1,64 @@ +import variables from 'modules/variables'; +import SettingsItem from '../../SettingsItem'; +import { PureComponent } from 'react'; +import { + MdOutlineKeyboardArrowRight, + MdUpload as ImportIcon, + MdDownload as ExportIcon, + MdRestartAlt as ResetIcon, + MdOutlineSync, +} from 'react-icons/md'; + +export default class Data extends PureComponent { + render() { + return ( + <> + this.props.goBack()}> + {variables.getMessage('modals.main.settings.sections.advanced.title')} + Data + +
    + + Sync + {/*Last synced at: Sun 10:12PM, 1st May 2022*/} + Sync is not setup yet. +
    +
    +
    + + {variables.getMessage('modals.main.settings.sections.advanced.data')} + + + Choose whether to export your Mue settings to your computer, import an existing + settings file, or reset your settings to their default values. + +
    +
    + + + +
    +
    + + + ); + } +} diff --git a/src/components/modals/main/settings/sections/background/Background.jsx b/src/components/modals/main/settings/sections/background/Background.jsx index c33f3dc8..a00b71e3 100644 --- a/src/components/modals/main/settings/sections/background/Background.jsx +++ b/src/components/modals/main/settings/sections/background/Background.jsx @@ -1,12 +1,15 @@ import variables from 'modules/variables'; import { PureComponent } from 'react'; import { MenuItem } from '@mui/material'; +import { MdSource, MdOutlineKeyboardArrowRight, MdOutlineAutoAwesome } from 'react-icons/md'; import Header from '../../Header'; import Checkbox from '../../Checkbox'; +import ChipSelect from '../../ChipSelect'; import Dropdown from '../../Dropdown'; import Slider from '../../Slider'; import Radio from '../../Radio'; +import SettingsItem from '../../SettingsItem'; import ColourSettings from './Colour'; import CustomSettings from './Custom'; @@ -14,36 +17,40 @@ import CustomSettings from './Custom'; import { values } from 'modules/helpers/settings/modals'; export default class BackgroundSettings extends PureComponent { - getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - constructor() { super(); this.state = { backgroundType: localStorage.getItem('backgroundType') || 'api', backgroundFilter: localStorage.getItem('backgroundFilter') || 'none', - backgroundCategories: [this.getMessage('modals.main.loading')], + backgroundCategories: [variables.getMessage('modals.main.loading')], backgroundAPI: localStorage.getItem('backgroundAPI') || 'mue', - marketplaceEnabled: localStorage.getItem('photo_packs') + marketplaceEnabled: localStorage.getItem('photo_packs'), + effects: false, + backgroundSettingsSection: false, }; this.controller = new AbortController(); } async getBackgroundCategories() { - const data = await (await fetch(variables.constants.API_URL + '/images/categories', { signal: this.controller.signal })).json(); + const data = await ( + await fetch(variables.constants.API_URL + '/images/categories', { + signal: this.controller.signal, + }) + ).json(); if (this.controller.signal.aborted === true) { return; } this.setState({ - backgroundCategories: data + backgroundCategories: data, }); } componentDidMount() { if (navigator.onLine === false || localStorage.getItem('offlineMode') === 'true') { return this.setState({ - backgroundCategories: [this.getMessage('modals.update.offline.title')] + backgroundCategories: [variables.getMessage('modals.update.offline.title')], }); } @@ -56,123 +63,484 @@ export default class BackgroundSettings extends PureComponent { } render() { - const { getMessage } = this; - - let backgroundSettings; - - const apiOptions = [ - { - name: 'Mue', - value: 'mue' - }, - { - name: 'Unsplash', - value: 'unsplash' - }, - { - name: 'Pexels', - value: 'pexels' - } - ]; - const interval = ( - - - - - - - - - + + + + + + + + + + + ); const APISettings = ( <> - this.setState({ backgroundAPI: e })}/> - {this.state.backgroundCategories[0] === getMessage('modals.main.loading') ? - <> - - {getMessage('modals.main.loading')} - {getMessage('modals.main.loading')} - - : - - {this.state.backgroundCategories.map((category) => ( - {category.charAt(0).toUpperCase() + category.slice(1)} - ))} + + {this.state.backgroundCategories[0] === variables.getMessage('modals.main.loading') ? ( + <> + + + {variables.getMessage('modals.main.loading')} + + + {variables.getMessage('modals.main.loading')} + + + + ) : ( + <> + {/* + {this.state.backgroundCategories.map((category) => ( + + {category.name.charAt(0).toUpperCase() + category.name.slice(1)} ( + {category.count}) + + ))} + */} + + + )} + + + + + - } - - - - - - - {interval} + this.setState({ backgroundAPI: e })} + /> + ); + let backgroundSettings = APISettings; switch (this.state.backgroundType) { - case 'custom': backgroundSettings = ; break; - case 'colour': backgroundSettings = ; break; - case 'random_colour': backgroundSettings = <>; break; - case 'random_gradient': backgroundSettings = <>; break; - default: backgroundSettings = APISettings; break; + case 'custom': + backgroundSettings = ; + break; + case 'colour': + backgroundSettings = ; + break; + case 'random_colour': + case 'random_gradient': + backgroundSettings = <>; + break; + default: + break; } - if (localStorage.getItem('photo_packs') && this.state.backgroundType !== 'custom' && this.state.backgroundType !== 'colour' && this.state.backgroundType !== 'api') { + if ( + localStorage.getItem('photo_packs') && + this.state.backgroundType !== 'custom' && + this.state.backgroundType !== 'colour' && + this.state.backgroundType !== 'api' + ) { backgroundSettings = null; } - const usingImage = this.state.backgroundType !== 'colour' && this.state.backgroundType !== 'random_colour' && this.state.backgroundType !== 'random_gradient'; - + const usingImage = + this.state.backgroundType !== 'colour' && + this.state.backgroundType !== 'random_colour' && + this.state.backgroundType !== 'random_gradient'; + + let header; + if (this.state.effects === true) { + header = ( + this.setState({ effects: false })}> + + {variables.getMessage('modals.main.settings.sections.background.title')} + + {' '} + {variables.getMessage('modals.main.settings.sections.background.effects.title')} + + ); + } else if (this.state.backgroundSettingsSection === true) { + header = ( + this.setState({ backgroundSettingsSection: false })} + > + + {variables.getMessage('modals.main.settings.sections.background.title')}{' '} + + {' '} + {variables.getMessage('modals.main.settings.sections.background.source.title')} + + ); + } else { + header = ( +
    + ); + } + return ( <> -
    - - - - - -

    {getMessage('modals.main.settings.sections.background.source.title')}

    - this.setState({ backgroundType: value })} category='background'> - {this.state.marketplaceEnabled ? : null} - - - - - - - - {backgroundSettings} - - {this.state.backgroundType === 'api' && APISettings && this.state.backgroundAPI === 'mue' ? + {header} + {this.state.backgroundSettingsSection !== true && this.state.effects !== true ? ( <> -

    {getMessage('modals.main.settings.sections.background.buttons.title')}

    - +
    this.setState({ backgroundSettingsSection: true })} + > +
    + +
    + + {variables.getMessage('modals.main.settings.sections.background.source.title')} + + + {variables.getMessage( + 'modals.main.settings.sections.background.source.subtitle', + )} + +
    +
    +
    + this.setState({ backgroundType: value })} + category="background" + > + {this.state.marketplaceEnabled ? ( + + ) : null} + + + + + + +
    +
    + {this.state.backgroundType === 'api' || + this.state.backgroundType === 'custom' || + this.state.marketplaceEnabled ? ( + <> +
    this.setState({ effects: true })}> +
    + +
    + + {variables.getMessage( + 'modals.main.settings.sections.background.effects.title', + )} + + + {variables.getMessage( + 'modals.main.settings.sections.background.effects.subtitle', + )} + +
    +
    +
    + {' '} + +
    +
    + + ) : null} - : null} - - {this.state.backgroundType === 'api' || this.state.backgroundType === 'custom' || this.state.marketplaceEnabled ? + ) : null} + {this.state.backgroundSettingsSection !== true && + this.state.effects !== true && + (this.state.backgroundType === 'api' || + this.state.backgroundType === 'custom' || + this.state.marketplaceEnabled) ? ( + + + + + + + ) : null} + {this.state.backgroundSettingsSection ? ( <> -

    {getMessage('modals.main.settings.sections.background.effects.title')}

    - - -
    - this.setState({ backgroundFilter: value })} category='background' element='#backgroundImage'> - - - - - - + + this.setState({ backgroundType: value })} + category="background" + > + {this.state.marketplaceEnabled ? ( + + ) : null} + + + + + + + + {/* // todo: ideally refactor all of this file, but we need interval to appear on marketplace too */} + {/*{this.state.backgroundType === 'api' || + this.state.backgroundType === 'custom' || + this.state.marketplaceEnabled + ? interval + : null}*/} + {backgroundSettings} + + ) : null} + {(this.state.backgroundType === 'api' || + this.state.backgroundType === 'custom' || + this.state.marketplaceEnabled) && + this.state.effects ? ( + + + + this.setState({ backgroundFilter: value })} + category="background" + element="#backgroundImage" + > + + + + + + - {this.state.backgroundFilter !== 'none' ? - - : null} - - : null} + {this.state.backgroundFilter !== 'none' ? ( + + ) : null} + + ) : null} ); } diff --git a/src/components/modals/main/settings/sections/background/Colour.jsx b/src/components/modals/main/settings/sections/background/Colour.jsx index d9337089..9c9accc9 100644 --- a/src/components/modals/main/settings/sections/background/Colour.jsx +++ b/src/components/modals/main/settings/sections/background/Colour.jsx @@ -2,6 +2,7 @@ import variables from 'modules/variables'; import { PureComponent, Fragment } from 'react'; import { ColorPicker } from 'react-color-gradient-picker'; import { toast } from 'react-toastify'; +import SettingsItem from '../../SettingsItem'; import hexToRgb from 'modules/helpers/background/hexToRgb'; import rgbToHex from 'modules/helpers/background/rgbToHex'; @@ -10,28 +11,30 @@ import 'react-color-gradient-picker/dist/index.css'; import '../../../scss/settings/react-color-picker-gradient-picker-custom-styles.scss'; export default class ColourSettings extends PureComponent { - DefaultGradientSettings = { angle: '180', gradient: [{ colour: '#ffb032', stop: 0 }], type: 'linear' }; - GradientPickerInitalState = undefined; + DefaultGradientSettings = { + angle: '180', + gradient: [{ colour: '#ffb032', stop: 0 }], + type: 'linear', + }; + GradientPickerInitialState = undefined; - getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - constructor() { super(); this.state = { - gradientSettings: this.DefaultGradientSettings + gradientSettings: this.DefaultGradientSettings, }; } resetColour() { localStorage.setItem('customBackgroundColour', ''); this.setState({ - gradientSettings: this.DefaultGradientSettings + gradientSettings: this.DefaultGradientSettings, }); - toast(this.getMessage('toasts.reset')); + toast(variables.getMessage('toasts.reset')); } initialiseColourPickerState(gradientSettings) { - this.GradientPickerInitalState = { + this.GradientPickerInitialState = { points: gradientSettings.gradient.map((g) => { const rgb = hexToRgb(g.colour); return { @@ -39,11 +42,11 @@ export default class ColourSettings extends PureComponent { red: rgb.red, green: rgb.green, blue: rgb.blue, - alpha: 1 + alpha: 1, }; }), - degree: + gradientSettings.angle, - type: gradientSettings.type + degree: +gradientSettings.angle, + type: gradientSettings.type, }; } @@ -64,7 +67,7 @@ export default class ColourSettings extends PureComponent { } this.setState({ - gradientSettings + gradientSettings, }); } @@ -76,43 +79,61 @@ export default class ColourSettings extends PureComponent { const newValue = event.target.value; const name = event.target.name; this.setState((s) => { - const newState = { + return { gradientSettings: { ...s.gradientSettings, - gradient: s.gradientSettings.gradient.map((g, i) => i === index ? { ...g, [name]: newValue } : g) - } + gradient: s.gradientSettings.gradient.map((g, i) => + i === index ? { ...g, [name]: newValue } : g, + ), + }, }; - return newState; }); this.showReminder(); - } + }; addColour = () => { this.setState((s) => { const [lastGradient, ...initGradients] = s.gradientSettings.gradient.reverse(); - const newState = { + return { gradientSettings: { ...s.gradientSettings, - gradient: [...initGradients, lastGradient, { colour: localStorage.getItem('theme') === 'dark' ? '#000000' : '#ffffff', stop: 100 }].sort((a, b) => (a.stop > b.stop) ? 1 : -1) - } + gradient: [ + ...initGradients, + lastGradient, + { + colour: localStorage.getItem('theme') === 'dark' ? '#000000' : '#ffffff', + stop: 100, + }, + ].sort((a, b) => (a.stop > b.stop ? 1 : -1)), + }, }; - return newState; }); - variables.stats.postEvent('setting', 'Changed backgroundtype from colour to gradient'); - } + variables.stats.postEvent('setting', 'Changed backgroundType from colour to gradient'); + }; currentGradientSettings = () => { - if (typeof this.state.gradientSettings === 'object' && this.state.gradientSettings.gradient.every(g => g.colour !== this.getMessage('modals.main.settings.sections.background.source.disabled'))) { + if ( + typeof this.state.gradientSettings === 'object' && + this.state.gradientSettings.gradient.every( + (g) => + g.colour !== + variables.getMessage('modals.main.settings.sections.background.source.disabled'), + ) + ) { const clampNumber = (num, a, b) => Math.max(Math.min(num, Math.max(a, b)), Math.min(a, b)); return JSON.stringify({ ...this.state.gradientSettings, - gradient: [...this.state.gradientSettings.gradient.map(g => { return { ...g, stop: clampNumber(+g.stop, 0, 100) } })].sort((a, b) => (a.stop > b.stop) ? 1 : -1) + gradient: [ + ...this.state.gradientSettings.gradient.map((g) => { + return { ...g, stop: clampNumber(+g.stop, 0, 100) }; + }), + ].sort((a, b) => (a.stop > b.stop ? 1 : -1)), }); } - return this.getMessage('modals.main.settings.sections.background.source.disabled'); - } + return variables.getMessage('modals.main.settings.sections.background.source.disabled'); + }; onColourPickerChange = (attrs, name) => { if (process.env.NODE_ENV === 'development') { @@ -125,10 +146,11 @@ export default class ColourSettings extends PureComponent { gradient: attrs.points.map((p) => { return { colour: '#' + rgbToHex(p.red, p.green, p.blue), - stop: p.left - }}), - type: attrs.type - } + stop: p.left, + }; + }), + type: attrs.type, + }, }); this.showReminder(); @@ -149,7 +171,7 @@ export default class ColourSettings extends PureComponent { let gradientInputs; if (gradientHasMoreThanOneColour) { - if (this.GradientPickerInitalState === undefined) { + if (this.GradientPickerInitialState === undefined) { this.initialiseColourPickerState(this.state.gradientSettings); } @@ -158,15 +180,25 @@ export default class ColourSettings extends PureComponent { onStartChange={(colour) => this.onColourPickerChange(colour, 'start')} onChange={(colour) => this.onColourPickerChange(colour, 'change')} onEndChange={(colour) => this.onColourPickerChange(colour, 'end')} - gradient={this.GradientPickerInitalState} - isGradient/> + gradient={this.GradientPickerInitialState} + isGradient + /> ); } else { gradientInputs = this.state.gradientSettings.gradient.map((g, i) => { return ( - this.onGradientChange(event, i)} value={g.colour}> - + this.onGradientChange(event, i)} + value={g.colour} + > + ); }); @@ -174,16 +206,31 @@ export default class ColourSettings extends PureComponent { colourSettings = ( <> - {gradientInputs} - {!gradientHasMoreThanOneColour ? (<>

    ) : null} +
    {gradientInputs}
    + {!gradientHasMoreThanOneColour ? ( + <> + + + ) : null} ); } return ( <> -

    {this.getMessage('modals.main.settings.sections.background.source.custom_colour')} this.resetColour()}>{this.getMessage('modals.main.settings.buttons.reset')}

    - {colourSettings} + + this.resetColour()}> + {variables.getMessage('modals.main.settings.buttons.reset')} + + {colourSettings} + ); } diff --git a/src/components/modals/main/settings/sections/background/Custom.jsx b/src/components/modals/main/settings/sections/background/Custom.jsx index 7e6bbb39..a6f66419 100644 --- a/src/components/modals/main/settings/sections/background/Custom.jsx +++ b/src/components/modals/main/settings/sections/background/Custom.jsx @@ -1,51 +1,62 @@ import variables from 'modules/variables'; -import { PureComponent } from 'react'; +import { PureComponent, createRef } from 'react'; import { toast } from 'react-toastify'; -import { MdCancel, MdAddLink, MdAddPhotoAlternate, MdPersonalVideo } from 'react-icons/md'; +import { + MdCancel, + MdAddLink, + MdAddPhotoAlternate, + MdPersonalVideo, + MdOutlineFileUpload, + MdFolder, +} from 'react-icons/md'; import EventBus from 'modules/helpers/eventbus'; +import { compressAccurately, filetoDataURL } from 'image-conversion'; +import { videoCheck } from 'modules/helpers/background/widget'; import Checkbox from '../../Checkbox'; import FileUpload from '../../FileUpload'; +import Tooltip from '../../../../../helpers/tooltip/Tooltip'; import Modal from 'react-modal'; import CustomURLModal from './CustomURLModal'; export default class CustomSettings extends PureComponent { - getMessage = (text) => variables.language.getMessage(variables.languagecode, text); + getMessage = (text, obj) => variables.getMessage(text, obj || {}); constructor() { super(); this.state = { customBackground: this.getCustom(), - customURLModal: false + customURLModal: false, }; + this.customDnd = createRef(null); } resetCustom = () => { localStorage.setItem('customBackground', '[]'); this.setState({ - customBackground: [] + customBackground: [], }); - toast(this.getMessage('toasts.reset')); + toast(variables.getMessage('toasts.reset')); EventBus.dispatch('refresh', 'background'); - } - + }; + customBackground(e, text, index) { - const result = (text === true) ? e.target.value : e.target.result; - + const result = text === true ? e.target.value : e.target.result; + const customBackground = this.state.customBackground; customBackground[index] = result; this.setState({ - customBackground + customBackground, }); this.forceUpdate(); - + localStorage.setItem('customBackground', JSON.stringify(customBackground)); - document.querySelector('.reminder-info').style.display = 'block'; + document.querySelector('.reminder-info').style.display = 'flex'; localStorage.setItem('showReminder', true); } - + modifyCustomBackground(type, index) { const customBackground = this.state.customBackground; if (type === 'add') { @@ -53,36 +64,51 @@ export default class CustomSettings extends PureComponent { } else { customBackground.splice(index, 1); } - + this.setState({ - customBackground + customBackground, }); this.forceUpdate(); - + localStorage.setItem('customBackground', JSON.stringify(customBackground)); - document.querySelector('.reminder-info').style.display = 'block'; + document.querySelector('.reminder-info').style.display = 'flex'; localStorage.setItem('showReminder', true); } videoCheck(url) { - return url.startsWith('data:video/') || url.endsWith('.mp4') || url.endsWith('.webm') || url.endsWith('.ogg'); + return ( + url.startsWith('data:video/') || + url.endsWith('.mp4') || + url.endsWith('.webm') || + url.endsWith('.ogg') + ); } - - videoCustomSettings = () => { - const hasVideo = this.state.customBackground.filter(bg => this.videoCheck(bg)); - if (hasVideo.length > 0) { + videoCustomSettings = () => { + const hasVideo = this.state.customBackground.filter((bg) => this.videoCheck(bg)); + + if (hasVideo.length > 0) { return ( <> - - + + ); } else { return null; } - } - + }; + getCustom() { let data; try { @@ -90,52 +116,167 @@ export default class CustomSettings extends PureComponent { } catch (e) { data = [localStorage.getItem('customBackground')]; } - + return data; } - + uploadCustomBackground() { document.getElementById('bg-input').setAttribute('index', this.state.customBackground.length); document.getElementById('bg-input').click(); // to fix loadFunction this.setState({ - currentBackgroundIndex: this.state.customBackground.length + currentBackgroundIndex: this.state.customBackground.length, }); } addCustomURL(e) { this.setState({ customURLModal: false, - currentBackgroundIndex: this.state.customBackground.length + currentBackgroundIndex: this.state.customBackground.length, }); - this.customBackground({ target: { value: e }}, true, this.state.customBackground.length); + this.customBackground({ target: { value: e } }, true, this.state.customBackground.length); + } + + componentDidMount() { + const dnd = this.customDnd.current; + dnd.ondragover = dnd.ondragenter = (e) => { + e.preventDefault(); + }; + + // todo: make this get from FileUpload.jsx to prevent duplication + dnd.ondrop = (e) => { + e.preventDefault(); + const file = e.dataTransfer.files[0]; + const settings = {}; + + Object.keys(localStorage).forEach((key) => { + settings[key] = localStorage.getItem(key); + }); + + const settingsSize = new TextEncoder().encode(JSON.stringify(settings)).length; + if (videoCheck(file.type) === true) { + if (settingsSize + file.size > 4850000) { + return toast(variables.getMessage('toasts.no_storage')); + } + + return this.customBackground(file, false, this.state.currentBackgroundIndex); + } + + compressAccurately(file, { + size: 450, + accuracy: 0.9, + }).then(async (res) => { + if (settingsSize + res.size > 4850000) { + return toast(variables.getMessage('toasts.no_storage')); + } + + this.customBackground(await filetoDataURL(res), false, this.state.currentBackgroundIndex); + }); + e.preventDefault(); + }; } render() { return ( -
      -

      {this.getMessage('modals.main.settings.sections.background.source.custom_background')} {this.getMessage('modals.main.settings.buttons.reset')}

      -
      - - -
      -
      - {this.state.customBackground.map((url, index) => ( -
      - {this.videoCheck(url) ? : null} - {this.state.customBackground.length > 0 ? : null} + <> +
      +
      +
      + +
      + + {variables.getMessage( + 'modals.main.settings.sections.background.source.custom_title', + )} + + + {variables.getMessage( + 'modals.main.settings.sections.background.source.custom_description', + )} + +
      - ))} +
      + + +
      +
      +
      + {this.state.customBackground.length > 0 ? ( +
      + {this.state.customBackground.map((url, index) => ( +
      + {'Custom + {this.videoCheck(url) ? : null} + {this.state.customBackground.length > 0 ? ( + + + + ) : null} +
      + ))} +
      + ) : ( +
      +
      + + + {variables.getMessage( + 'modals.main.settings.sections.background.source.drop_to_upload', + )} + + + {variables.getMessage( + 'modals.main.settings.sections.background.source.formats', + { + list: 'jpeg, png, webp, webm, gif, mp4, webm, ogg', + }, + )} + + +
      +
      + )} +
      - this.customBackground(e, false, this.state.currentBackgroundIndex)} /> - {this.props.interval} + this.customBackground(e, false, this.state.currentBackgroundIndex)} + /> {this.videoCustomSettings()} - this.setState({ customURLModal: false })} isOpen={this.state.customURLModal} className='Modal resetmodal mainModal' overlayClassName='Overlay resetoverlay' ariaHideApp={false}> - this.addCustomURL(e)} modalCloseOnly={() => this.setState({ customURLModal: false })} /> + this.setState({ customURLModal: false })} + isOpen={this.state.customURLModal} + className="Modal resetmodal mainModal" + overlayClassName="Overlay resetoverlay" + ariaHideApp={false} + > + this.addCustomURL(e)} + modalCloseOnly={() => this.setState({ customURLModal: false })} + /> -
    + ); } } diff --git a/src/components/modals/main/settings/sections/background/CustomURLModal.jsx b/src/components/modals/main/settings/sections/background/CustomURLModal.jsx index b2f809a4..2cda4bae 100644 --- a/src/components/modals/main/settings/sections/background/CustomURLModal.jsx +++ b/src/components/modals/main/settings/sections/background/CustomURLModal.jsx @@ -1,21 +1,43 @@ import variables from 'modules/variables'; -import { useState } from 'react'; -import { MdAdd } from 'react-icons/md'; -import { TextField } from '@mui/material'; +import { useState, memo } from 'react'; +import { MdAdd, MdClose } from 'react-icons/md'; +import Tooltip from '../../../../../helpers/tooltip/Tooltip'; -export default function CustomURLModal({ modalClose, modalCloseOnly }) { +function CustomURLModal({ modalClose, modalCloseOnly }) { const [url, setURL] = useState(); return ( - <> - × -

    {variables.language.getMessage(variables.languagecode, 'modals.main.settings.sections.background.source.add_url')}

    - setURL(e.target.value)} varient='outlined'/> -
    - +
    +
    + + {variables.getMessage('modals.main.settings.sections.background.source.add_url')} + + +
    + +
    +
    - +
    + setURL(e.target.value)} + varient="outlined" + /> + + + +
    +
    ); } + +export default memo(CustomURLModal); diff --git a/src/components/modals/main/settings/sections/overview_skeletons/Clock.jsx b/src/components/modals/main/settings/sections/overview_skeletons/Clock.jsx new file mode 100644 index 00000000..730a2ebb --- /dev/null +++ b/src/components/modals/main/settings/sections/overview_skeletons/Clock.jsx @@ -0,0 +1,31 @@ +import { Suspense, lazy, memo } from 'react'; +const Analog = lazy(() => import('react-clock')); + +function ClockSkeleton() { + if (localStorage.getItem('timeType') === 'analogue') { + return ( + }> +
    + +
    +
    + ); + } else if (localStorage.getItem('timeType') === 'percentageComplete') { + return 68%; + } else if (localStorage.getItem('timeType') === 'verticalClock') { + return ( + +
    10
    +
    23
    +
    + ); + } else { + return 10:24; + } +} + +export default memo(ClockSkeleton); diff --git a/src/components/modals/main/settings/sections/overview_skeletons/Date.jsx b/src/components/modals/main/settings/sections/overview_skeletons/Date.jsx new file mode 100644 index 00000000..e64ca4f3 --- /dev/null +++ b/src/components/modals/main/settings/sections/overview_skeletons/Date.jsx @@ -0,0 +1,7 @@ +import { memo } from 'react'; + +function DateSkeleton() { + return Thursday January 1st; +} + +export default memo(DateSkeleton); diff --git a/src/components/modals/main/settings/sections/overview_skeletons/Greeting.jsx b/src/components/modals/main/settings/sections/overview_skeletons/Greeting.jsx new file mode 100644 index 00000000..752613cc --- /dev/null +++ b/src/components/modals/main/settings/sections/overview_skeletons/Greeting.jsx @@ -0,0 +1,7 @@ +import { memo } from 'react'; + +function GreetingSkeleton() { + return Good Morning; +} + +export default memo(GreetingSkeleton); diff --git a/src/components/modals/main/settings/sections/overview_skeletons/Message.jsx b/src/components/modals/main/settings/sections/overview_skeletons/Message.jsx new file mode 100644 index 00000000..98274fe4 --- /dev/null +++ b/src/components/modals/main/settings/sections/overview_skeletons/Message.jsx @@ -0,0 +1,14 @@ +import { memo } from 'react'; + +function MessageSkeleton() { + return ( +

    + + Message +
    +
    +

    + ); +} + +export default memo(MessageSkeleton); diff --git a/src/components/modals/main/settings/sections/overview_skeletons/QuickLinks.jsx b/src/components/modals/main/settings/sections/overview_skeletons/QuickLinks.jsx new file mode 100644 index 00000000..b08bddd4 --- /dev/null +++ b/src/components/modals/main/settings/sections/overview_skeletons/QuickLinks.jsx @@ -0,0 +1,26 @@ +import { memo } from 'react'; +import { FaDiscord, FaTwitter } from 'react-icons/fa'; +import { SiKofi, SiPatreon } from 'react-icons/si'; + +function QuicklinksSkeleton() { + return ( +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + ); +} + +export default memo(QuicklinksSkeleton); diff --git a/src/components/modals/main/settings/sections/overview_skeletons/Quote.jsx b/src/components/modals/main/settings/sections/overview_skeletons/Quote.jsx new file mode 100644 index 00000000..2b3dcf2c --- /dev/null +++ b/src/components/modals/main/settings/sections/overview_skeletons/Quote.jsx @@ -0,0 +1,21 @@ +import { memo } from 'react'; +import { MdPerson } from 'react-icons/md'; + +function QuoteSkeleton() { + return ( +
    + "Never gonna give you up" +
    +
    + +
    +
    + Rick Astley + English singer-songwriter +
    +
    +
    + ); +} + +export default memo(QuoteSkeleton); diff --git a/src/components/modals/main/settings/sections/quicklinks/AddModal.jsx b/src/components/modals/main/settings/sections/quicklinks/AddModal.jsx new file mode 100644 index 00000000..8b5c93e1 --- /dev/null +++ b/src/components/modals/main/settings/sections/quicklinks/AddModal.jsx @@ -0,0 +1,59 @@ +import { useState, memo } from 'react'; +import { TextareaAutosize } from '@mui/material'; +import { MdAddLink, MdClose } from 'react-icons/md'; +import Tooltip from 'components/helpers/tooltip/Tooltip'; + +import variables from 'modules/variables'; + +function AddModal({ urlError, addLink, closeModal, edit, editData, editLink }) { + const [name, setName] = useState(edit ? editData.name : ''); + const [url, setUrl] = useState(edit ? editData.url : ''); + const [icon, setIcon] = useState(edit ? editData.url : ''); + + return ( +
    +
    + {variables.getMessage('widgets.quicklinks.new')} + +
    closeModal()}> + +
    +
    +
    +
    + setName(e.target.value)} + /> + + setUrl(e.target.value)} + /> + {urlError} + setIcon(e.target.value)} + /> + + {edit ? ( + + ) : ( + + )} +
    +
    + ); +} + +export default memo(AddModal); diff --git a/src/components/modals/main/tabs/Addons.jsx b/src/components/modals/main/tabs/Addons.jsx index 204f7f52..9f548fda 100644 --- a/src/components/modals/main/tabs/Addons.jsx +++ b/src/components/modals/main/tabs/Addons.jsx @@ -1,18 +1,21 @@ import variables from 'modules/variables'; +import { memo } from 'react'; import Tabs from './backend/Tabs'; import Added from '../marketplace/sections/Added'; -import Sideload from '../marketplace/sections/Sideload'; import Create from '../marketplace/sections/Create'; -export default function Addons() { - const getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - +function Addons(props) { return ( - -
    -
    -
    + props.changeTab(type)} current="addons"> +
    + +
    +
    + +
    ); } + +export default memo(Addons); diff --git a/src/components/modals/main/tabs/Marketplace.jsx b/src/components/modals/main/tabs/Marketplace.jsx index 705d4130..301b6239 100644 --- a/src/components/modals/main/tabs/Marketplace.jsx +++ b/src/components/modals/main/tabs/Marketplace.jsx @@ -1,16 +1,33 @@ import variables from 'modules/variables'; +import { memo } from 'react'; + import Tabs from './backend/Tabs'; import MarketplaceTab from '../marketplace/sections/Marketplace'; -export default function Marketplace() { - const getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - +function Marketplace(props) { return ( - -
    -
    -
    + props.changeTab(type)} current="marketplace"> +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    ); } + +export default memo(Marketplace); diff --git a/src/components/modals/main/tabs/Settings.jsx b/src/components/modals/main/tabs/Settings.jsx index d62e4302..28f3211b 100644 --- a/src/components/modals/main/tabs/Settings.jsx +++ b/src/components/modals/main/tabs/Settings.jsx @@ -1,6 +1,9 @@ import variables from 'modules/variables'; +import { memo } from 'react'; + import Tabs from './backend/Tabs'; +import Overview from '../settings/sections/Overview'; import Navbar from '../settings/sections/Navbar'; import Greeting from '../settings/sections/Greeting'; import Time from '../settings/sections/Time'; @@ -11,42 +14,106 @@ import Message from '../settings/sections/Message'; import Background from '../settings/sections/background/Background'; import Search from '../settings/sections/Search'; import Weather from '../settings/sections/Weather'; -import Order from '../settings/sections/Order'; import Appearance from '../settings/sections/Appearance'; import Language from '../settings/sections/Language'; -import Advanced from '../settings/sections/Advanced'; -//import Keybinds from '../settings/sections/Keybinds'; +import Advanced from '../settings/sections/advanced/Advanced'; import Stats from '../settings/sections/Stats'; import Experimental from '../settings/sections/Experimental'; import Changelog from '../settings/sections/Changelog'; import About from '../settings/sections/About'; -export default function Settings() { - const getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - +function Settings(props) { return ( - <> - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - {/*
    */} -
    -
    -
    -
    -
    - + props.changeTab(type)} current="settings"> +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    ); } + +export default memo(Settings); diff --git a/src/components/modals/main/tabs/backend/Tab.jsx b/src/components/modals/main/tabs/backend/Tab.jsx index c33f70fc..c9849538 100644 --- a/src/components/modals/main/tabs/backend/Tab.jsx +++ b/src/components/modals/main/tabs/backend/Tab.jsx @@ -14,25 +14,20 @@ import { MdOutlinePhoto as Background, MdSearch, MdCloudQueue as Weather, - MdList as Order, MdFormatPaint as Appearance, MdTranslate as Language, MdOutlineSettings as Advanced, MdBugReport as Experimental, - //KeyboardAltOutlined as Keybinds, MdOutlineAssessment as Stats, MdOutlineNewReleases as Changelog, MdInfoOutline as About, - MdEvent as Reminder, - MdCode as Sideload, MdAddCircleOutline as Added, - MdAddCircleOutline as Create + MdAddCircleOutline as Create, + MdViewAgenda as Overview, + MdCollectionsBookmark as Collections, } from 'react-icons/md'; - function Tab({ label, currentTab, onClick, navbarTab }) { - const getMessage = (text) => variables.language.getMessage(variables.languagecode, text); - let className = 'tab-list-item'; if (currentTab === label) { className += ' tab-list-active'; @@ -45,56 +40,120 @@ function Tab({ label, currentTab, onClick, navbarTab }) { } } - let icon, divider; + let icon, divider, mue; switch (label) { - case getMessage('modals.main.navbar.settings'): icon = ; break; - case getMessage('modals.main.navbar.addons'): icon = ; break; - case getMessage('modals.main.navbar.marketplace'): icon = ; break; + case variables.getMessage('modals.main.marketplace.product.overview'): + icon = ; + mue = true; + break; + case variables.getMessage('modals.main.navbar.settings'): + icon = ; + break; + case variables.getMessage('modals.main.navbar.addons'): + icon = ; + break; + case variables.getMessage('modals.main.navbar.marketplace'): + icon = ; + break; - case getMessage('modals.main.settings.sections.appearance.navbar.title'): icon = ; break; - case getMessage('modals.main.settings.sections.greeting.title'): icon = ; break; - case getMessage('modals.main.settings.sections.time.title'): icon =