From 34b87991bc16743a0335b4b5a4b6ddcd455f5f19 Mon Sep 17 00:00:00 2001 From: Prospector <6166773+Prospector@users.noreply.github.com> Date: Sun, 31 May 2026 08:25:31 -0700 Subject: [PATCH] feat: new user badges, ui consistency pass (#6262) * feat: new user badges, ui consistency pass * prepr * fix: align with backend * fix: lint --------- Co-authored-by: Calum H. (IMB11) --- apps/app-frontend/src/providers/setup/auth.ts | 4 +- apps/app-frontend/vite.config.ts | 3 + apps/frontend/nuxt.config.ts | 3 + .../src/assets/styles/components.scss | 25 +- .../src/components/ui/AdPlaceholder.vue | 4 +- apps/frontend/src/components/ui/NavStack.vue | 3 +- apps/frontend/src/composables/auth.js | 2 + apps/frontend/src/layouts/default.vue | 3 +- apps/frontend/src/middleware/user.global.ts | 8 +- apps/frontend/src/pages/plus.vue | 8 +- apps/frontend/src/pages/user/[user].vue | 103 +--- apps/frontend/src/providers/setup/auth.ts | 6 +- apps/frontend/src/utils/user-membership.ts | 40 ++ .../api-client/src/modules/labrinth/types.ts | 11 + .../src/modules/labrinth/users/v3.ts | 19 + packages/assets/build/generate-exports.ts | 61 ++- packages/assets/generated-icons.ts | 40 ++ packages/assets/icons/badges/alpha.svg | 1 + packages/assets/icons/badges/beta.svg | 1 + .../assets/icons/badges/downloads-100m.svg | 1 + .../assets/icons/badges/downloads-10m.svg | 1 + packages/assets/icons/badges/downloads-1m.svg | 1 + .../assets/icons/badges/downloads-250m.svg | 1 + .../assets/icons/badges/downloads-25m.svg | 1 + .../assets/icons/badges/downloads-500m.svg | 1 + .../assets/icons/badges/downloads-50m.svg | 1 + .../assets/icons/badges/early-datapack.svg | 1 + .../assets/icons/badges/early-hosting.svg | 1 + .../assets/icons/badges/early-modpack.svg | 1 + packages/assets/icons/badges/early-plugin.svg | 1 + .../icons/badges/early-resourcepack.svg | 1 + .../assets/icons/badges/early-servers.svg | 1 + .../assets/icons/badges/early-shaders.svg | 1 + packages/assets/icons/badges/moderator.svg | 1 + packages/assets/icons/badges/plus.svg | 1 + packages/assets/icons/badges/pride.svg | 1 + packages/assets/icons/badges/staff.svg | 1 + packages/assets/styles/classes.scss | 53 +- packages/ui/src/components/base/NavTabs.vue | 2 +- packages/ui/src/components/index.ts | 1 + packages/ui/src/components/user/UserBadge.vue | 50 ++ .../ui/src/components/user/UserBadges.vue | 507 ++++++++++++++++++ packages/ui/src/components/user/index.ts | 1 + .../src/layouts/shared/browse-tab/sidebar.vue | 6 +- packages/ui/src/locales/en-US/index.json | 99 ++++ packages/ui/src/providers/auth.ts | 4 +- packages/ui/vite.config.ts | 3 + 47 files changed, 947 insertions(+), 142 deletions(-) create mode 100644 apps/frontend/src/utils/user-membership.ts create mode 100644 packages/assets/icons/badges/alpha.svg create mode 100644 packages/assets/icons/badges/beta.svg create mode 100644 packages/assets/icons/badges/downloads-100m.svg create mode 100644 packages/assets/icons/badges/downloads-10m.svg create mode 100644 packages/assets/icons/badges/downloads-1m.svg create mode 100644 packages/assets/icons/badges/downloads-250m.svg create mode 100644 packages/assets/icons/badges/downloads-25m.svg create mode 100644 packages/assets/icons/badges/downloads-500m.svg create mode 100644 packages/assets/icons/badges/downloads-50m.svg create mode 100644 packages/assets/icons/badges/early-datapack.svg create mode 100644 packages/assets/icons/badges/early-hosting.svg create mode 100644 packages/assets/icons/badges/early-modpack.svg create mode 100644 packages/assets/icons/badges/early-plugin.svg create mode 100644 packages/assets/icons/badges/early-resourcepack.svg create mode 100644 packages/assets/icons/badges/early-servers.svg create mode 100644 packages/assets/icons/badges/early-shaders.svg create mode 100644 packages/assets/icons/badges/moderator.svg create mode 100644 packages/assets/icons/badges/plus.svg create mode 100644 packages/assets/icons/badges/pride.svg create mode 100644 packages/assets/icons/badges/staff.svg create mode 100644 packages/ui/src/components/user/UserBadge.vue create mode 100644 packages/ui/src/components/user/UserBadges.vue create mode 100644 packages/ui/src/components/user/index.ts diff --git a/apps/app-frontend/src/providers/setup/auth.ts b/apps/app-frontend/src/providers/setup/auth.ts index 2de8c0acf..8832c09c6 100644 --- a/apps/app-frontend/src/providers/setup/auth.ts +++ b/apps/app-frontend/src/providers/setup/auth.ts @@ -1,5 +1,5 @@ import type { Labrinth } from '@modrinth/api-client' -import { type AuthProvider, provideAuth } from '@modrinth/ui' +import { type AuthProvider, type AuthUser, provideAuth } from '@modrinth/ui' import { computed, type Ref, ref, watchEffect } from 'vue' type AppCredentials = { @@ -12,7 +12,7 @@ export function setupAuthProvider( requestSignIn: (redirectPath: string) => void | Promise, ) { const sessionToken = ref(null) - const user = ref(null) + const user = ref(null) const isReady = computed(() => credentials.value !== undefined) const authProvider: AuthProvider = { diff --git a/apps/app-frontend/vite.config.ts b/apps/app-frontend/vite.config.ts index 5db05f562..d97b76d8f 100644 --- a/apps/app-frontend/vite.config.ts +++ b/apps/app-frontend/vite.config.ts @@ -58,6 +58,9 @@ export default defineConfig({ params: { overrides: { removeViewBox: false, + cleanupIds: { + minify: false, + }, }, }, }, diff --git a/apps/frontend/nuxt.config.ts b/apps/frontend/nuxt.config.ts index 6a05ce659..83f428f01 100644 --- a/apps/frontend/nuxt.config.ts +++ b/apps/frontend/nuxt.config.ts @@ -104,6 +104,9 @@ export default defineNuxtConfig({ params: { overrides: { removeViewBox: false, + cleanupIds: { + minify: false, + }, }, }, }, diff --git a/apps/frontend/src/assets/styles/components.scss b/apps/frontend/src/assets/styles/components.scss index cb9f0e2f8..6b91a25ff 100644 --- a/apps/frontend/src/assets/styles/components.scss +++ b/apps/frontend/src/assets/styles/components.scss @@ -1,18 +1,18 @@ /* Cards and body styling */ +// CARDS .base-card { - padding: var(--spacing-card-lg); + padding: 1rem; position: relative; + min-height: var(--font-size-2xl); - background-color: var(--color-raised-bg); - border-radius: var(--size-rounded-card); + background-color: var(--surface-3); + border-radius: var(--radius-lg); + border: 1px solid var(--surface-4); - margin-bottom: var(--spacing-card-md); + margin-bottom: var(--gap-md); outline: 2px solid transparent; - outline-offset: -2px; - - box-shadow: var(--shadow-card); .card__overlay { position: absolute; @@ -25,6 +25,17 @@ z-index: 2; } + &:where(&.warning, &.information) { + padding: 1.5rem; + line-height: 1.5; + min-height: 0; + + a { + color: var(--color-blue); + text-decoration: underline; + } + } + &.moderation-card { background-color: var(--color-warning-banner-bg); } diff --git a/apps/frontend/src/components/ui/AdPlaceholder.vue b/apps/frontend/src/components/ui/AdPlaceholder.vue index 01f25ead1..7c7737520 100644 --- a/apps/frontend/src/components/ui/AdPlaceholder.vue +++ b/apps/frontend/src/components/ui/AdPlaceholder.vue @@ -3,7 +3,7 @@
diff --git a/apps/frontend/src/components/ui/NavStack.vue b/apps/frontend/src/components/ui/NavStack.vue index 4e2735d19..16bef5bbb 100644 --- a/apps/frontend/src/components/ui/NavStack.vue +++ b/apps/frontend/src/components/ui/NavStack.vue @@ -1,7 +1,8 @@