From d3459e4b125826efca4734f5b7af7cef953ff695 Mon Sep 17 00:00:00 2001 From: Prospector <6166773+Prospector@users.noreply.github.com> Date: Tue, 19 Aug 2025 10:39:09 -0700 Subject: [PATCH] Medal promo v2 (#4220) * Revert "Revert "feat: medal promotion on servers page (#4117)"" This reverts commit 2e6cff7efc56c4fe167a6043f85b625a16aae3a1. * Revert "Revert "update changelog"" This reverts commit b2ff2d87370277b72aaa0f0c653406248e845cd4. * Revert "Revert "turn off medal promo"" This reverts commit eaa4b44a16b50024e9a2eb9a8fad85785b2e9006. * Revert "Revert "Revert "turn off medal promo""" This reverts commit 76d0ef03e79090a2423712df938d4b2bdbd84038. * Revert "Revert "fix medal thing showing up for everyone"" This reverts commit ee8c47adcb7ba64ee22749743a52776790108b94. * New medal colors * Update medal server listings * Upgrade modal enhancements & more medal consistency * undo app promo changes * Only apply medal promo with flag on * remove unneessary files * lint * disable medal flag --- apps/docs/src/styles/modrinth.css | 5 +- .../images/illustrations/medal_icon.svg | 11 + apps/frontend/src/assets/styles/global.scss | 18 ++ .../src/components/ui/AdPlaceholder.vue | 8 +- .../src/components/ui/servers/ServerIcon.vue | 2 +- .../components/ui/servers/ServerListing.vue | 157 +++++++---- .../ui/servers/ServersUpgradeModalWrapper.vue | 261 +++++++++++++++++ .../marketing/MedalBackgroundImage.vue | 59 ++++ .../servers/marketing/MedalPlanPromotion.vue | 52 ++++ .../marketing/MedalServerCountdown.vue | 160 +++++++++++ .../servers/marketing/MedalServerListing.vue | 227 +++++++++++++++ apps/frontend/src/composables/featureFlags.ts | 1 + .../composables/servers/modules/general.ts | 2 + .../src/pages/search/[searchProjectType].vue | 9 +- apps/frontend/src/pages/servers/index.vue | 45 +-- .../src/pages/servers/manage/[id].vue | 112 ++++---- .../servers/manage/[id]/options/index.vue | 2 +- .../src/pages/servers/manage/index.vue | 63 ++++- .../src/pages/settings/billing/index.vue | 266 ++++++++++-------- packages/assets/generated-icons.ts | 4 + packages/assets/icons/clock.svg | 1 + packages/assets/icons/rocket.svg | 1 + .../ui/src/components/base/ButtonStyled.vue | 5 +- .../ui/src/components/base/OptionGroup.vue | 128 +++++++++ .../billing/ModalBasedServerPlan.vue | 136 +++++++++ .../billing/ModrinthServersPurchaseModal.vue | 140 +++++++-- .../billing/ServersPurchase0Plan.vue | 226 +++++++++++++++ .../billing/ServersPurchase1Region.vue | 2 +- .../billing/ServersPurchase3Review.vue | 169 ++++++++--- .../src/components/billing/ServersSpecs.vue | 20 +- packages/ui/src/components/index.ts | 1 + packages/ui/src/composables/stripe.ts | 56 ++-- packages/ui/src/locales/en-US/index.json | 33 +++ packages/utils/changelog.ts | 6 + packages/utils/servers/types/common.ts | 3 + packages/utils/servers/types/server.ts | 1 + packages/utils/types.ts | 32 +++ 37 files changed, 2077 insertions(+), 347 deletions(-) create mode 100644 apps/frontend/src/assets/images/illustrations/medal_icon.svg create mode 100644 apps/frontend/src/components/ui/servers/ServersUpgradeModalWrapper.vue create mode 100644 apps/frontend/src/components/ui/servers/marketing/MedalBackgroundImage.vue create mode 100644 apps/frontend/src/components/ui/servers/marketing/MedalPlanPromotion.vue create mode 100644 apps/frontend/src/components/ui/servers/marketing/MedalServerCountdown.vue create mode 100644 apps/frontend/src/components/ui/servers/marketing/MedalServerListing.vue create mode 100644 packages/assets/icons/clock.svg create mode 100644 packages/assets/icons/rocket.svg create mode 100644 packages/ui/src/components/base/OptionGroup.vue create mode 100644 packages/ui/src/components/billing/ModalBasedServerPlan.vue create mode 100644 packages/ui/src/components/billing/ServersPurchase0Plan.vue diff --git a/apps/docs/src/styles/modrinth.css b/apps/docs/src/styles/modrinth.css index b61c7fbe..4f149c26 100644 --- a/apps/docs/src/styles/modrinth.css +++ b/apps/docs/src/styles/modrinth.css @@ -2,9 +2,8 @@ ::backdrop, :root[data-theme='light'], [data-theme='light'] ::backdrop { - --sl-font-system: - Inter, -apple-system, BlinkMacSystemFont, Segoe UI, Oxygen, Ubuntu, Roboto, Cantarell, - Fira Sans, Droid Sans, Helvetica Neue, sans-serif; + --sl-font-system: Inter, -apple-system, BlinkMacSystemFont, Segoe UI, Oxygen, Ubuntu, Roboto, + Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; --sl-color-white: var(--color-contrast); /* “white” */ --sl-color-gray-1: var(--color-base); diff --git a/apps/frontend/src/assets/images/illustrations/medal_icon.svg b/apps/frontend/src/assets/images/illustrations/medal_icon.svg new file mode 100644 index 00000000..bcc68420 --- /dev/null +++ b/apps/frontend/src/assets/images/illustrations/medal_icon.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/apps/frontend/src/assets/styles/global.scss b/apps/frontend/src/assets/styles/global.scss index e5c5b551..e8262adf 100644 --- a/apps/frontend/src/assets/styles/global.scss +++ b/apps/frontend/src/assets/styles/global.scss @@ -131,6 +131,15 @@ html { --landing-raw-bg: #fff; + --medal-promotion-bg: #fff; + --medal-promotion-bg-orange: #48aaff; + --medal-promotion-text-orange: #156db8; + --medal-promotion-bg-gradient: linear-gradient( + 90deg, + rgba(152, 207, 255, 0.2) 20%, + rgba(152, 207, 255, 0.1) 100% + ); + --banner-error-bg: #fee2e2; --banner-error-text: #991b1b; --banner-error-border: #ef4444; @@ -237,6 +246,15 @@ html { --landing-raw-bg: #000; + --medal-promotion-bg: #000; + --medal-promotion-bg-orange: rgba(208, 246, 255, 0.25); + --medal-promotion-text-orange: #42abff; + --medal-promotion-bg-gradient: linear-gradient( + 90deg, + rgba(66, 170, 255, 0.15), + rgba(0, 0, 0, 0) 100% + ); + --hover-filter: brightness(120%); --active-filter: brightness(140%); diff --git a/apps/frontend/src/components/ui/AdPlaceholder.vue b/apps/frontend/src/components/ui/AdPlaceholder.vue index 70c713a7..937aeefd 100644 --- a/apps/frontend/src/components/ui/AdPlaceholder.vue +++ b/apps/frontend/src/components/ui/AdPlaceholder.vue @@ -1,16 +1,16 @@ diff --git a/apps/frontend/src/components/ui/servers/ServersUpgradeModalWrapper.vue b/apps/frontend/src/components/ui/servers/ServersUpgradeModalWrapper.vue new file mode 100644 index 00000000..4874339a --- /dev/null +++ b/apps/frontend/src/components/ui/servers/ServersUpgradeModalWrapper.vue @@ -0,0 +1,261 @@ + + + diff --git a/apps/frontend/src/components/ui/servers/marketing/MedalBackgroundImage.vue b/apps/frontend/src/components/ui/servers/marketing/MedalBackgroundImage.vue new file mode 100644 index 00000000..866449a9 --- /dev/null +++ b/apps/frontend/src/components/ui/servers/marketing/MedalBackgroundImage.vue @@ -0,0 +1,59 @@ + + + + diff --git a/apps/frontend/src/components/ui/servers/marketing/MedalPlanPromotion.vue b/apps/frontend/src/components/ui/servers/marketing/MedalPlanPromotion.vue new file mode 100644 index 00000000..80578193 --- /dev/null +++ b/apps/frontend/src/components/ui/servers/marketing/MedalPlanPromotion.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/apps/frontend/src/components/ui/servers/marketing/MedalServerCountdown.vue b/apps/frontend/src/components/ui/servers/marketing/MedalServerCountdown.vue new file mode 100644 index 00000000..33f63eb3 --- /dev/null +++ b/apps/frontend/src/components/ui/servers/marketing/MedalServerCountdown.vue @@ -0,0 +1,160 @@ + + + + + diff --git a/apps/frontend/src/components/ui/servers/marketing/MedalServerListing.vue b/apps/frontend/src/components/ui/servers/marketing/MedalServerListing.vue new file mode 100644 index 00000000..4c18659e --- /dev/null +++ b/apps/frontend/src/components/ui/servers/marketing/MedalServerListing.vue @@ -0,0 +1,227 @@ + + + + + diff --git a/apps/frontend/src/composables/featureFlags.ts b/apps/frontend/src/composables/featureFlags.ts index 79054649..28a74946 100644 --- a/apps/frontend/src/composables/featureFlags.ts +++ b/apps/frontend/src/composables/featureFlags.ts @@ -25,6 +25,7 @@ export const DEFAULT_FEATURE_FLAGS = validateValues({ // Feature toggles projectTypesPrimaryNav: false, + enableMedalPromotion: false, hidePlusPromoInUserMenu: false, oldProjectCards: true, newProjectCards: false, diff --git a/apps/frontend/src/composables/servers/modules/general.ts b/apps/frontend/src/composables/servers/modules/general.ts index 8ab0bd6a..0562e38c 100644 --- a/apps/frontend/src/composables/servers/modules/general.ts +++ b/apps/frontend/src/composables/servers/modules/general.ts @@ -34,6 +34,8 @@ export class GeneralModule extends ServerModule implements ServerGeneral { node!: { token: string; instance: string } flows?: { intro?: boolean } + is_medal?: boolean + async fetch(): Promise { const data = await useServersFetch(`servers/${this.serverId}`, {}, 'general') diff --git a/apps/frontend/src/pages/search/[searchProjectType].vue b/apps/frontend/src/pages/search/[searchProjectType].vue index e2657a21..bd908801 100644 --- a/apps/frontend/src/pages/search/[searchProjectType].vue +++ b/apps/frontend/src/pages/search/[searchProjectType].vue @@ -20,7 +20,14 @@ class="flex flex-col gap-4 text-primary" > - + {{ server.general.name }} diff --git a/apps/frontend/src/pages/servers/index.vue b/apps/frontend/src/pages/servers/index.vue index 50758489..58017c21 100644 --- a/apps/frontend/src/pages/servers/index.vue +++ b/apps/frontend/src/pages/servers/index.vue @@ -392,7 +392,7 @@

Frequently Asked Questions

-
+
@@ -404,7 +404,7 @@ GHz, paired with DDR5 memory.

-
+
@@ -420,7 +420,7 @@

-
+
@@ -433,7 +433,7 @@

-
+
@@ -447,7 +447,7 @@

-
+
@@ -460,7 +460,7 @@

-
+
@@ -481,7 +481,7 @@

-
+
@@ -493,7 +493,7 @@

-
+
@@ -516,12 +516,13 @@
-
+

There's a server for everyone

@@ -551,6 +552,8 @@
+ +
    { if (route.hash) { - // where pyro-hash === route.hash - const faq = document.querySelector(`[pyro-hash="${route.hash.slice(1)}"]`) + // where nav-hash === route.hash + const faq = document.querySelector(`[nav-hash="${route.hash.slice(1)}"]`) if (faq) { faq.open = true const top = faq.getBoundingClientRect().top @@ -923,16 +928,20 @@ const selectProduct = async (product) => { await nextTick() if (product === 'custom') { - purchaseModal.value?.show(billingPeriod.value, undefined, selectedProjectId.value) + purchaseModal.value?.show(billingPeriod.value, null, selectedProjectId.value) } else { purchaseModal.value?.show(billingPeriod.value, selectedProduct.value, selectedProjectId.value) } } -const planQuery = () => { - if (route.query.plan) { - document.getElementById('plan').scrollIntoView() - selectProduct(route.query.plan) +const planQuery = async () => { + if ('plan' in route.query) { + await nextTick() + const planElement = document.querySelector(`[nav-hash="plan"]`) + if (planElement) { + planElement.scrollIntoView({ behavior: 'smooth' }) + await selectProduct(route.query.plan) + } } } diff --git a/apps/frontend/src/pages/servers/manage/[id].vue b/apps/frontend/src/pages/servers/manage/[id].vue index 0955e91a..4e2c046f 100644 --- a/apps/frontend/src/pages/servers/manage/[id].vue +++ b/apps/frontend/src/pages/servers/manage/[id].vue @@ -115,58 +115,63 @@ : `linear-gradient(180deg, rgba(153,153,153,1) 0%, rgba(87,87,87,1) 100%)`, }" > -
    - -
    - -
    -

    - {{ serverData.name }} -

    -
    - -
    -
    - -
    - Configuring server... -
    - + + + All servers + +
    + +
    +
    +

    + {{ serverData.name }} +

    +
    + +
    +
    + +
    + Configuring server... +
    + +
    @@ -290,6 +295,10 @@
+
+ +
+
-
+