From 2d52d169332ed26d68d96fcf0ba4f0ef63078c8e Mon Sep 17 00:00:00 2001 From: Ap_Tx <3045929398@qq.com> Date: Sun, 27 Sep 2026 08:15:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E4=BA=86=E9=A6=96?= =?UTF-8?q?=E6=AC=A1=E5=90=AF=E5=8A=A8=E5=99=A8=E6=97=B6=E5=BC=B9=E5=87=BA?= =?UTF-8?q?=E7=9A=84=E5=85=AC=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/app-frontend/src/App.vue | 16 +++ .../ui/StartupAnnouncementModal.vue | 132 ++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 apps/app-frontend/src/components/ui/StartupAnnouncementModal.vue diff --git a/apps/app-frontend/src/App.vue b/apps/app-frontend/src/App.vue index a687a76..811870e 100644 --- a/apps/app-frontend/src/App.vue +++ b/apps/app-frontend/src/App.vue @@ -92,6 +92,7 @@ import NavRail from '@/components/ui/NavRail.vue' import OnboardingOverlay from '@/components/ui/onboarding/OnboardingOverlay.vue' import QuickInstanceSwitcher from '@/components/ui/QuickInstanceSwitcher.vue' import SkinSiteSessionFrame from '@/components/ui/SkinSiteSessionFrame.vue' +import StartupAnnouncementModal from '@/components/ui/StartupAnnouncementModal.vue' import SplashScreen from '@/components/ui/SplashScreen.vue' import WindowControls from '@/components/ui/WindowControls.vue' import { useCheckDisableMouseover } from '@/composables/macCssFix.js' @@ -498,6 +499,7 @@ onMounted(async () => { checkUpdates() void warnIfRunningElevated() startDirectLinkSync() + maybeShowStartupAnnouncement() }) let directLinkSync: (() => Promise) | undefined @@ -1538,6 +1540,19 @@ const updateToPlayModal = ref() const modrinthLoginFlowWaitModal = ref() +const startupAnnouncementModal = ref | null>(null) +const STARTUP_ANNOUNCEMENT_KEY = 'starlight-startup-announcement-seen-v1' + +function maybeShowStartupAnnouncement() { + try { + if (localStorage.getItem(STARTUP_ANNOUNCEMENT_KEY)) return + localStorage.setItem(STARTUP_ANNOUNCEMENT_KEY, '1') + } catch (error) { + console.warn('Failed to read/write startup announcement flag', error) + } + startupAnnouncementModal.value?.show() +} + // ── Drop import system ────────────────────────────────────────────────── const dropImport = useDropImport({ notificationManager, @@ -2167,6 +2182,7 @@ provideAppUpdateDownloadProgress(appUpdateDownload) +
+import { ExternalIcon, UsersIcon, XIcon } from '@modrinth/assets' +import { Avatar, ButtonStyled, NewModal } from '@modrinth/ui' +import { openUrl } from '@tauri-apps/plugin-opener' +import { ref } from 'vue' + +import { teamMembers } from '@/data/about' + +const modal = ref>() + +const SERVER_IPS: { label: string; host: string }[] = [ + { label: '直连 IPv4', host: 'slv4.starlight.cool' }, + { label: '直连 IPv6', host: 'slv6.starlight.cool' }, + { label: '北方代理 IPv4', host: 'north.starlight.cool' }, + { label: '南方代理 IPv4', host: 'south.starlight.cool' }, + { label: '美国代理 IPv4', host: 'usa.starlight.cool' }, +] + +const RULES_URL = 'https://kdocs.cn/l/cmT6lVdryHJu' +const QQ_GROUP = '535392227' + +function show() { + modal.value?.show() +} + +function hide() { + modal.value?.hide() +} + +function openLink(url: string) { + void openUrl(url) +} + + +