From 576106039362a4c412522da705927b93a89ff882 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9line=20Eap?= Date: Thu, 23 Jul 2026 15:33:46 +0200 Subject: [PATCH 1/2] add: 3 new ads --- webapp/src/components/ad/ArturiaCard.vue | 206 +++++++++++ webapp/src/components/ad/AudiofanzineCard.vue | 235 ++++++++++++ webapp/src/components/ad/VpnBanner.vue | 336 ++++++++++++++++++ webapp/src/components/app/ProjectSelector.vue | 62 +--- .../components/app/timeline/TimelineView.vue | 3 + webapp/src/components/blog/BlogContain.vue | 4 + webapp/src/components/blog/BlogTrends.vue | 1 - webapp/src/styles/base.css | 5 + webapp/src/styles/blog.css | 2 +- 9 files changed, 802 insertions(+), 52 deletions(-) create mode 100644 webapp/src/components/ad/ArturiaCard.vue create mode 100644 webapp/src/components/ad/AudiofanzineCard.vue create mode 100644 webapp/src/components/ad/VpnBanner.vue diff --git a/webapp/src/components/ad/ArturiaCard.vue b/webapp/src/components/ad/ArturiaCard.vue new file mode 100644 index 0000000..6ac993c --- /dev/null +++ b/webapp/src/components/ad/ArturiaCard.vue @@ -0,0 +1,206 @@ + + + + + diff --git a/webapp/src/components/ad/AudiofanzineCard.vue b/webapp/src/components/ad/AudiofanzineCard.vue new file mode 100644 index 0000000..386a4e3 --- /dev/null +++ b/webapp/src/components/ad/AudiofanzineCard.vue @@ -0,0 +1,235 @@ + + + + + diff --git a/webapp/src/components/ad/VpnBanner.vue b/webapp/src/components/ad/VpnBanner.vue new file mode 100644 index 0000000..756c47e --- /dev/null +++ b/webapp/src/components/ad/VpnBanner.vue @@ -0,0 +1,336 @@ + + + + + diff --git a/webapp/src/components/app/ProjectSelector.vue b/webapp/src/components/app/ProjectSelector.vue index 835b478..0cfa28a 100644 --- a/webapp/src/components/app/ProjectSelector.vue +++ b/webapp/src/components/app/ProjectSelector.vue @@ -12,6 +12,7 @@ import type { TrashedProjectListItem, } from "../../lib/utils/types"; import TabBar, { type TabItem } from "../shared/TabBar.vue"; +import VpnBanner from "../ad/VpnBanner.vue"; type Tab = "mine" | "favorites" | "discover" | "trash"; @@ -577,6 +578,10 @@ onMounted(() => loadProjects()); + +
+ +
loadProjects()); transform: translateX(0); } -.icon-toggle { - display: flex; - align-items: center; - justify-content: center; - width: 30px; - height: 30px; - background: transparent; - border: 1px solid var(--color-border-secondary); - border-radius: 6px; - color: var(--color-white-light); - font-size: 0.75rem; - cursor: pointer; - transition: all 0.2s ease; - opacity: 0.5; - - &:hover { - opacity: 1; - border-color: var(--color-accent3-hover); - color: var(--color-white); - } - - &.active { - opacity: 1; - border-color: var(--color-accent3-hover); - color: var(--color-accent3-hover); - background: rgba(var(--color-accent3-rgb), 0.2); - } - - &:disabled { - cursor: wait; - opacity: 0.3; - } -} - -.favorite-btn.active { - border-color: var(--color-danger-hover); - color: var(--color-danger-hover); - background: rgba(var(--color-danger-hover-rgb), 0.15); -} - -.favorite-btn:hover { - border-color: var(--color-danger-hover); - color: var(--color-danger-hover); -} - .state-container { text-align: center; padding: 60px 20px; @@ -878,11 +838,6 @@ onMounted(() => loadProjects()); } } -.delete-btn:hover { - border-color: var(--color-danger-hover); - color: var(--color-danger-hover); -} - .trash-card { cursor: default; opacity: 0.75; @@ -929,4 +884,11 @@ onMounted(() => loadProjects()); grid-template-columns: 1fr; } } + +.vpn-banner-full { + width: 100vw; + margin-top: 80px; + margin-left: calc(50% - 50vw); + margin-right: calc(50% - 50vw); +} diff --git a/webapp/src/components/app/timeline/TimelineView.vue b/webapp/src/components/app/timeline/TimelineView.vue index 6d4122e..a57719f 100644 --- a/webapp/src/components/app/timeline/TimelineView.vue +++ b/webapp/src/components/app/timeline/TimelineView.vue @@ -48,6 +48,7 @@ import EmptyState from "../../ui/EmptyState.vue"; import FormField from "../../ui/FormField.vue"; import BaseInput from "../../ui/BaseInput.vue"; import { useToast } from "../../../composables/useToast"; +import VpnBanner from "../../ad/VpnBanner.vue"; const emit = defineEmits<{ ( @@ -1183,6 +1184,8 @@ defineExpose({ + + diff --git a/webapp/src/stores/adsStore.ts b/webapp/src/stores/adsStore.ts new file mode 100644 index 0000000..f79d90d --- /dev/null +++ b/webapp/src/stores/adsStore.ts @@ -0,0 +1,33 @@ +import { defineStore } from "pinia"; +import { ref } from "vue"; + +const STORAGE_KEY = "display-ads"; + +export const useAdsStore = defineStore("ads", () => { + const isEnabled = ref(localStorage.getItem(STORAGE_KEY) !== "false"); + + const enable = () => { + isEnabled.value = true; + localStorage.setItem(STORAGE_KEY, "true"); + }; + + const disable = () => { + isEnabled.value = false; + localStorage.setItem(STORAGE_KEY, "false"); + }; + + const toggle = () => { + if (isEnabled.value) { + disable(); + } else { + enable(); + } + }; + + return { + isEnabled, + enable, + disable, + toggle, + }; +}); diff --git a/webapp/src/styles/base.css b/webapp/src/styles/base.css index 4a02f38..b91f76e 100644 --- a/webapp/src/styles/base.css +++ b/webapp/src/styles/base.css @@ -302,9 +302,4 @@ input[type="submit"]:disabled { padding: 40px 24px; max-width: 1200px; width: 100%; - min-height: calc(100vh - (88px + 90px)); } - -.page-container.no-ad-gap { - padding-bottom: 80px; -} \ No newline at end of file