diff --git a/.editorconfig b/.editorconfig index 94b3660e5..9fdd83cbb 100644 --- a/.editorconfig +++ b/.editorconfig @@ -3,8 +3,7 @@ root = true [*] charset = utf-8 -indent_style = space -indent_size = 4 +indent_style = "tab" end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true @@ -15,5 +14,5 @@ indent_size = 2 max_line_length = off trim_trailing_whitespace = false -[*.{json,yml,yaml,ts,vue,scss,css,html,js,cjs,mjs,gltf,prettierrc}] +[*.{json,yml,yaml}] indent_size = 2 diff --git a/.vscode/settings.json b/.vscode/settings.json index 4d178702a..81e9bb921 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,10 +1,15 @@ { - "prettier.endOfLine": "lf", - "editor.formatOnSave": true, - "eslint.validate": ["javascript", "javascriptreact", "typescript", "typescriptreact"], - "editor.detectIndentation": true, - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit", - "source.organizeImports": "always", - } + "prettier.endOfLine": "lf", + "editor.formatOnSave": true, + "eslint.validate": ["javascript", "javascriptreact", "typescript", "typescriptreact"], + "editor.detectIndentation": false, + "editor.insertSpaces": false, + "files.eol": "\n", + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + "source.organizeImports": "always" + }, + "editor.defaultFormatter": "esbenp.prettier-vscode" } diff --git a/apps/app-frontend/.prettierignore b/apps/app-frontend/.prettierignore index 0cb3e84e5..f631b52a7 100644 --- a/apps/app-frontend/.prettierignore +++ b/apps/app-frontend/.prettierignore @@ -1,2 +1,3 @@ **/dist *.gltf +src/locales/ diff --git a/apps/app-frontend/eslint.config.mjs b/apps/app-frontend/eslint.config.mjs index 05f559424..3d6da7fb5 100644 --- a/apps/app-frontend/eslint.config.mjs +++ b/apps/app-frontend/eslint.config.mjs @@ -1,22 +1,2 @@ -import { createConfigForNuxt } from '@nuxt/eslint-config/flat' -import { fixupPluginRules } from '@eslint/compat' -import turboPlugin from 'eslint-plugin-turbo' - -export default createConfigForNuxt().append([ - { - name: 'turbo', - plugins: { - turbo: fixupPluginRules(turboPlugin), - }, - rules: { - 'turbo/no-undeclared-env-vars': 'error', - }, - }, - { - name: 'modrinth', - rules: { - 'vue/html-self-closing': 'off', - 'vue/multi-word-component-names': 'off', - }, - }, -]) +import config from '@modrinth/tooling-config/eslint/nuxt.mjs' +export default config diff --git a/apps/app-frontend/index.html b/apps/app-frontend/index.html index e5549f28a..50867a419 100644 --- a/apps/app-frontend/index.html +++ b/apps/app-frontend/index.html @@ -1,17 +1,17 @@ - - - - - Modrinth App + + + + + Modrinth App - - + + - -
- - - + +
+ + + diff --git a/apps/app-frontend/package.json b/apps/app-frontend/package.json index d760df6d3..4cc577cdb 100644 --- a/apps/app-frontend/package.json +++ b/apps/app-frontend/package.json @@ -1,64 +1,63 @@ { - "name": "@modrinth/app-frontend", - "private": true, - "version": "1.0.0-local", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vue-tsc --noEmit && vite build", - "tsc:check": "vue-tsc --noEmit", - "lint": "eslint . && prettier --check .", - "fix": "eslint . --fix && prettier --write .", - "intl:extract": "formatjs extract \"src/**/*.{vue,ts,tsx,js,jsx,mts,cts,mjs,cjs}\" --ignore \"**/*.d.ts\" --ignore node_modules --out-file src/locales/en-US/index.json --format crowdin --preserve-whitespace", - "test": "vue-tsc --noEmit" - }, - "dependencies": { - "@geometrically/minecraft-motd-parser": "^1.1.4", - "@modrinth/assets": "workspace:*", - "@modrinth/ui": "workspace:*", - "@modrinth/utils": "workspace:*", - "@sentry/vue": "^8.27.0", - "@tauri-apps/api": "^2.5.0", - "@tauri-apps/plugin-dialog": "^2.2.1", - "@tauri-apps/plugin-http": "^2.5.0", - "@tauri-apps/plugin-opener": "^2.2.6", - "@tauri-apps/plugin-os": "^2.2.1", - "@tauri-apps/plugin-updater": "^2.7.1", - "@tauri-apps/plugin-window-state": "^2.2.2", - "@types/three": "^0.172.0", - "@vintl/vintl": "^4.4.1", - "@vueuse/core": "^11.1.0", - "dayjs": "^1.11.10", - "floating-vue": "^5.2.2", - "ofetch": "^1.3.4", - "pinia": "^2.1.7", - "posthog-js": "^1.158.2", - "three": "^0.172.0", - "vite-svg-loader": "^5.1.0", - "vue": "^3.5.13", - "vue-multiselect": "3.0.0", - "vue-router": "4.3.0", - "vue-virtual-scroller": "v2.0.0-beta.8" - }, - "devDependencies": { - "@eslint/compat": "^1.1.1", - "@formatjs/cli": "^6.2.12", - "@nuxt/eslint-config": "^0.5.6", - "@taijased/vue-render-tracker": "^1.0.7", - "@vitejs/plugin-vue": "^5.0.4", - "autoprefixer": "^10.4.19", - "eslint": "^9.9.1", - "eslint-config-custom": "workspace:*", - "eslint-plugin-turbo": "^2.5.4", - "postcss": "^8.4.39", - "prettier": "^3.2.5", - "sass": "^1.74.1", - "tailwindcss": "^3.4.4", - "tsconfig": "workspace:*", - "typescript": "^5.5.4", - "vite": "^5.4.6", - "vue-tsc": "^2.1.6" - }, - "packageManager": "pnpm@9.4.0", - "web-types": "../../web-types.json" + "name": "@modrinth/app-frontend", + "private": true, + "version": "1.0.0-local", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc --noEmit && vite build", + "tsc:check": "vue-tsc --noEmit", + "lint": "eslint . && prettier --check .", + "fix": "eslint . --fix && prettier --write .", + "intl:extract": "formatjs extract \"src/**/*.{vue,ts,tsx,js,jsx,mts,cts,mjs,cjs}\" --ignore \"**/*.d.ts\" --ignore node_modules --out-file src/locales/en-US/index.json --format crowdin --preserve-whitespace", + "test": "vue-tsc --noEmit" + }, + "dependencies": { + "@geometrically/minecraft-motd-parser": "^1.1.4", + "@modrinth/assets": "workspace:*", + "@modrinth/ui": "workspace:*", + "@modrinth/utils": "workspace:*", + "@sentry/vue": "^8.27.0", + "@tauri-apps/api": "^2.5.0", + "@tauri-apps/plugin-dialog": "^2.2.1", + "@tauri-apps/plugin-http": "^2.5.0", + "@tauri-apps/plugin-opener": "^2.2.6", + "@tauri-apps/plugin-os": "^2.2.1", + "@tauri-apps/plugin-updater": "^2.7.1", + "@tauri-apps/plugin-window-state": "^2.2.2", + "@types/three": "^0.172.0", + "@vintl/vintl": "^4.4.1", + "@vueuse/core": "^11.1.0", + "dayjs": "^1.11.10", + "floating-vue": "^5.2.2", + "ofetch": "^1.3.4", + "pinia": "^2.1.7", + "posthog-js": "^1.158.2", + "three": "^0.172.0", + "vite-svg-loader": "^5.1.0", + "vue": "^3.5.13", + "vue-multiselect": "3.0.0", + "vue-router": "4.3.0", + "vue-virtual-scroller": "v2.0.0-beta.8" + }, + "devDependencies": { + "@modrinth/tooling-config": "workspace:*", + "@eslint/compat": "^1.1.1", + "@formatjs/cli": "^6.2.12", + "@nuxt/eslint-config": "^0.5.6", + "@taijased/vue-render-tracker": "^1.0.7", + "@vitejs/plugin-vue": "^5.0.4", + "autoprefixer": "^10.4.19", + "eslint": "^9.9.1", + "eslint-plugin-turbo": "^2.5.4", + "postcss": "^8.4.39", + "prettier": "^3.2.5", + "sass": "^1.74.1", + "tailwindcss": "^3.4.4", + "typescript": "^5.5.4", + "vite": "^5.4.6", + "vue-tsc": "^2.1.6" + }, + "packageManager": "pnpm@9.4.0", + "web-types": "../../web-types.json" } diff --git a/apps/app-frontend/postcss.config.js b/apps/app-frontend/postcss.config.js index 2e7af2b7f..1a5262473 100644 --- a/apps/app-frontend/postcss.config.js +++ b/apps/app-frontend/postcss.config.js @@ -1,6 +1,6 @@ export default { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, } diff --git a/apps/app-frontend/src/App.vue b/apps/app-frontend/src/App.vue index cb1ea25e4..11cc6600e 100644 --- a/apps/app-frontend/src/App.vue +++ b/apps/app-frontend/src/App.vue @@ -1,4 +1,46 @@ diff --git a/apps/app-frontend/src/assets/external/index.js b/apps/app-frontend/src/assets/external/index.js index c20eb57c9..479cf4fd8 100644 --- a/apps/app-frontend/src/assets/external/index.js +++ b/apps/app-frontend/src/assets/external/index.js @@ -1,18 +1,18 @@ +export { default as ATLauncherIcon } from './atlauncher.svg' export { default as BuyMeACoffeeIcon } from './bmac.svg' export { default as DiscordIcon } from './discord.svg' +export { default as GDLauncherIcon } from './gdlauncher.png' +export { default as GithubIcon } from './github.svg' +export { default as GitLabIcon } from './gitlab.svg' +export { default as GoogleIcon } from './google.svg' export { default as KoFiIcon } from './kofi.svg' +export { default as MastodonIcon } from './mastodon.svg' +export { default as MicrosoftIcon } from './microsoft.svg' +export { default as MultiMCIcon } from './multimc.webp' +export { default as OpenCollectiveIcon } from './opencollective.svg' export { default as PatreonIcon } from './patreon.svg' export { default as PaypalIcon } from './paypal.svg' -export { default as OpenCollectiveIcon } from './opencollective.svg' -export { default as TwitterIcon } from './twitter.svg' -export { default as GithubIcon } from './github.svg' -export { default as MastodonIcon } from './mastodon.svg' -export { default as RedditIcon } from './reddit.svg' -export { default as GoogleIcon } from './google.svg' -export { default as MicrosoftIcon } from './microsoft.svg' -export { default as SteamIcon } from './steam.svg' -export { default as GitLabIcon } from './gitlab.svg' -export { default as ATLauncherIcon } from './atlauncher.svg' -export { default as GDLauncherIcon } from './gdlauncher.png' -export { default as MultiMCIcon } from './multimc.webp' export { default as PrismIcon } from './prism.svg' +export { default as RedditIcon } from './reddit.svg' +export { default as SteamIcon } from './steam.svg' +export { default as TwitterIcon } from './twitter.svg' diff --git a/apps/app-frontend/src/assets/icons/index.js b/apps/app-frontend/src/assets/icons/index.js index 4a5266b25..256b61af2 100644 --- a/apps/app-frontend/src/assets/icons/index.js +++ b/apps/app-frontend/src/assets/icons/index.js @@ -1,9 +1,9 @@ -export { default as SwapIcon } from './arrow-left-right.svg' -export { default as ToggleIcon } from './toggle.svg' -export { default as PackageIcon } from './package.svg' -export { default as VersionIcon } from './milestone.svg' -export { default as TextInputIcon } from './text-cursor-input.svg' export { default as AddProjectImage } from './add-project.svg' -export { default as NewInstanceImage } from './new-instance.svg' +export { default as SwapIcon } from './arrow-left-right.svg' export { default as MenuIcon } from './menu.svg' export { default as ChatIcon } from './messages-square.svg' +export { default as VersionIcon } from './milestone.svg' +export { default as NewInstanceImage } from './new-instance.svg' +export { default as PackageIcon } from './package.svg' +export { default as TextInputIcon } from './text-cursor-input.svg' +export { default as ToggleIcon } from './toggle.svg' diff --git a/apps/app-frontend/src/assets/stylesheets/global.scss b/apps/app-frontend/src/assets/stylesheets/global.scss index 7ab08fd57..2969d3cb4 100644 --- a/apps/app-frontend/src/assets/stylesheets/global.scss +++ b/apps/app-frontend/src/assets/stylesheets/global.scss @@ -3,158 +3,158 @@ @tailwind utilities; @font-face { - font-family: 'bundled-minecraft-font-mrapp'; - font-style: normal; - font-display: swap; - font-weight: 400; - src: url('https://cdn-raw.modrinth.com/fonts/minecraft/regular.otf') format('opentype'); + font-family: 'bundled-minecraft-font-mrapp'; + font-style: normal; + font-display: swap; + font-weight: 400; + src: url('https://cdn-raw.modrinth.com/fonts/minecraft/regular.otf') format('opentype'); } @font-face { - font-family: 'bundled-minecraft-font-mrapp'; - font-style: italic; - font-display: swap; - font-weight: 400; - src: url('https://cdn-raw.modrinth.com/fonts/minecraft/italic.otf') format('opentype'); + font-family: 'bundled-minecraft-font-mrapp'; + font-style: italic; + font-display: swap; + font-weight: 400; + src: url('https://cdn-raw.modrinth.com/fonts/minecraft/italic.otf') format('opentype'); } @font-face { - font-family: 'bundled-minecraft-font-mrapp'; - font-style: normal; - font-display: swap; - font-weight: 600; - src: url('https://cdn-raw.modrinth.com/fonts/minecraft/bold.otf') format('opentype'); + font-family: 'bundled-minecraft-font-mrapp'; + font-style: normal; + font-display: swap; + font-weight: 600; + src: url('https://cdn-raw.modrinth.com/fonts/minecraft/bold.otf') format('opentype'); } @font-face { - font-family: 'bundled-minecraft-font-mrapp'; - font-style: italic; - font-display: swap; - font-weight: 600; - src: url('https://cdn-raw.modrinth.com/fonts/minecraft/bold-italic.otf') format('opentype'); + font-family: 'bundled-minecraft-font-mrapp'; + font-style: italic; + font-display: swap; + font-weight: 600; + src: url('https://cdn-raw.modrinth.com/fonts/minecraft/bold-italic.otf') format('opentype'); } .font-minecraft { - font-family: 'bundled-minecraft-font-mrapp', monospace; + font-family: 'bundled-minecraft-font-mrapp', monospace; } :root { - font-family: var(--font-standard, sans-serif), sans-serif; - color-scheme: dark; - --view-width: calc(100% - 5rem); - --expanded-view-width: calc(100% - 13rem); + font-family: var(--font-standard, sans-serif), sans-serif; + color-scheme: dark; + --view-width: calc(100% - 5rem); + --expanded-view-width: calc(100% - 13rem); } body { - position: fixed; - width: 100%; - height: 100%; - overflow: hidden; + position: fixed; + width: 100%; + height: 100%; + overflow: hidden; } * { - box-sizing: border-box; + box-sizing: border-box; } .card-divider { - background-color: var(--color-button-bg); - border: none; - color: var(--color-button-bg); - height: 1px; - margin: var(--gap-sm) 0; + background-color: var(--color-button-bg); + border: none; + color: var(--color-button-bg); + height: 1px; + margin: var(--gap-sm) 0; } .no-wrap { - white-space: nowrap; + white-space: nowrap; } .no-select { - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; } a { - color: var(--color-link); - text-decoration: none; + color: var(--color-link); + text-decoration: none; - &:hover { - text-decoration: none; - } + &:hover { + text-decoration: none; + } } input { - border: none !important; + border: none !important; } .badge { - display: flex; - border-radius: var(--radius-md); - white-space: nowrap; - align-items: center; - background-color: var(--color-bg); - padding-block: var(--gap-sm); - padding-inline: var(--gap-lg); - width: min-content; + display: flex; + border-radius: var(--radius-md); + white-space: nowrap; + align-items: center; + background-color: var(--color-bg); + padding-block: var(--gap-sm); + padding-inline: var(--gap-lg); + width: min-content; - svg { - width: 1.1rem; - height: 1.1rem; - margin-right: 0.5rem; - } + svg { + width: 1.1rem; + height: 1.1rem; + margin-right: 0.5rem; + } - &.featured { - background-color: var(--color-brand-highlight); - color: var(--color-contrast); - } + &.featured { + background-color: var(--color-brand-highlight); + color: var(--color-contrast); + } } * { - scrollbar-width: auto; - scrollbar-color: var(--color-scrollbar) var(--color-bg); + scrollbar-width: auto; + scrollbar-color: var(--color-scrollbar) var(--color-bg); } /* Chrome, Edge, and Safari */ *::-webkit-scrollbar { - width: 16px; - border: 3px solid transparent; - opacity: 0.5; - transition: opacity 0.2s ease-in-out; + width: 16px; + border: 3px solid transparent; + opacity: 0.5; + transition: opacity 0.2s ease-in-out; } *::-webkit-scrollbar:hover { - opacity: 1; + opacity: 1; } *::-webkit-scrollbar-track { - background: transparent; + background: transparent; } *::-webkit-scrollbar-thumb { - background-color: var(--color-scrollbar); - border-radius: var(--radius-lg); - border: 5px solid transparent; - background-clip: content-box; + background-color: var(--color-scrollbar); + border-radius: var(--radius-lg); + border: 5px solid transparent; + background-clip: content-box; } .highlighted { - box-shadow: 0 0 1rem var(--color-brand) !important; + box-shadow: 0 0 1rem var(--color-brand) !important; } .gecko { - background-color: var(--color-raised-bg); - box-shadow: none !important; + background-color: var(--color-raised-bg); + box-shadow: none !important; } img { - user-select: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; } .card-shadow { - box-shadow: var(--shadow-card); + box-shadow: var(--shadow-card); } @import '@modrinth/assets/omorphia.scss'; diff --git a/apps/app-frontend/src/assets/stylesheets/macFix.css b/apps/app-frontend/src/assets/stylesheets/macFix.css index b56737a9c..901ce8642 100644 --- a/apps/app-frontend/src/assets/stylesheets/macFix.css +++ b/apps/app-frontend/src/assets/stylesheets/macFix.css @@ -1,3 +1,3 @@ img { - pointer-events: none !important; + pointer-events: none !important; } diff --git a/apps/app-frontend/src/components/GridDisplay.vue b/apps/app-frontend/src/components/GridDisplay.vue index 896c55b98..046244f66 100644 --- a/apps/app-frontend/src/components/GridDisplay.vue +++ b/apps/app-frontend/src/components/GridDisplay.vue @@ -1,37 +1,38 @@ diff --git a/apps/app-frontend/src/components/LoadingIndicatorBar.vue b/apps/app-frontend/src/components/LoadingIndicatorBar.vue index 3c1dd0883..7cbee4965 100644 --- a/apps/app-frontend/src/components/LoadingIndicatorBar.vue +++ b/apps/app-frontend/src/components/LoadingIndicatorBar.vue @@ -1,29 +1,30 @@ diff --git a/apps/app-frontend/src/components/RowDisplay.vue b/apps/app-frontend/src/components/RowDisplay.vue index f0a3edbdd..b01146535 100644 --- a/apps/app-frontend/src/components/RowDisplay.vue +++ b/apps/app-frontend/src/components/RowDisplay.vue @@ -1,4 +1,21 @@ diff --git a/apps/app-frontend/src/components/ui/AccountsCard.vue b/apps/app-frontend/src/components/ui/AccountsCard.vue index f26d8c6f6..73d10598b 100644 --- a/apps/app-frontend/src/components/ui/AccountsCard.vue +++ b/apps/app-frontend/src/components/ui/AccountsCard.vue @@ -1,102 +1,103 @@ diff --git a/apps/app-frontend/src/components/ui/AddContentButton.vue b/apps/app-frontend/src/components/ui/AddContentButton.vue index d3447bf0a..193b6e80f 100644 --- a/apps/app-frontend/src/components/ui/AddContentButton.vue +++ b/apps/app-frontend/src/components/ui/AddContentButton.vue @@ -1,61 +1,62 @@ diff --git a/apps/app-frontend/src/components/ui/Breadcrumbs.vue b/apps/app-frontend/src/components/ui/Breadcrumbs.vue index d87c502f5..ee12e17ea 100644 --- a/apps/app-frontend/src/components/ui/Breadcrumbs.vue +++ b/apps/app-frontend/src/components/ui/Breadcrumbs.vue @@ -1,63 +1,64 @@ diff --git a/apps/app-frontend/src/components/ui/ContextMenu.vue b/apps/app-frontend/src/components/ui/ContextMenu.vue index a0ca9417e..bddcbfb8b 100644 --- a/apps/app-frontend/src/components/ui/ContextMenu.vue +++ b/apps/app-frontend/src/components/ui/ContextMenu.vue @@ -1,26 +1,26 @@ diff --git a/apps/app-frontend/src/components/ui/ErrorModal.vue b/apps/app-frontend/src/components/ui/ErrorModal.vue index bdd1acf79..17a9dffc7 100644 --- a/apps/app-frontend/src/components/ui/ErrorModal.vue +++ b/apps/app-frontend/src/components/ui/ErrorModal.vue @@ -1,4 +1,16 @@ diff --git a/apps/app-frontend/src/components/ui/ExportModal.vue b/apps/app-frontend/src/components/ui/ExportModal.vue index 3957a5add..d29633af5 100644 --- a/apps/app-frontend/src/components/ui/ExportModal.vue +++ b/apps/app-frontend/src/components/ui/ExportModal.vue @@ -1,26 +1,27 @@ diff --git a/apps/frontend/src/pages/servers/manage/[id]/options/startup.vue b/apps/frontend/src/pages/servers/manage/[id]/options/startup.vue index dcbaf4172..34ee921e7 100644 --- a/apps/frontend/src/pages/servers/manage/[id]/options/startup.vue +++ b/apps/frontend/src/pages/servers/manage/[id]/options/startup.vue @@ -1,234 +1,235 @@