From 282ef949112d5d9b373086688fe7eed64dc24f2b Mon Sep 17 00:00:00 2001 From: LIghtJUNction Date: Sun, 29 Mar 2026 16:48:52 +0800 Subject: [PATCH] feat(dashboard): introduce reactor core glassmorphism theme Global reactor background (ReactorBg): - Full-screen canvas with 24px crosshair grid and socket dots - Mouse energy field (120px radius) with lerp=0.08 smooth tracking - Crosses shrink and glow cyan when energy field passes - Canvas sits behind all UI (z-index 0, pointer-events none) Theme updates: - Dark surface now #0F0F12 for reactor aesthetic - Background deepens to #0A0A0C - Cards: translucent glassmorphism (40% opacity, blur 12px) with inset shadow, 1px cyan border on hover - Sidebar: glassmorphism (75% opacity, blur 16px, cyan border) - Header: glassmorphism (80% opacity, blur 20px, cyan border) - V-main: transparent so reactor bg shows through --- dashboard/src/components/shared/ReactorBg.vue | 159 ++++++++++++++++++ dashboard/src/composables/useReactorBg.ts | 36 ++++ dashboard/src/layouts/full/FullLayout.vue | 2 + dashboard/src/scss/_override.scss | 13 ++ dashboard/src/scss/components/_VCard.scss | 18 +- dashboard/src/scss/layout/_sidebar.scss | 4 +- dashboard/src/theme/BlueBusinessDarkTheme.ts | 10 +- 7 files changed, 233 insertions(+), 9 deletions(-) create mode 100644 dashboard/src/components/shared/ReactorBg.vue create mode 100644 dashboard/src/composables/useReactorBg.ts diff --git a/dashboard/src/components/shared/ReactorBg.vue b/dashboard/src/components/shared/ReactorBg.vue new file mode 100644 index 000000000..54927ecc9 --- /dev/null +++ b/dashboard/src/components/shared/ReactorBg.vue @@ -0,0 +1,159 @@ + + + + + diff --git a/dashboard/src/composables/useReactorBg.ts b/dashboard/src/composables/useReactorBg.ts new file mode 100644 index 000000000..4bb560e7f --- /dev/null +++ b/dashboard/src/composables/useReactorBg.ts @@ -0,0 +1,36 @@ +/** + * Global reactor background mouse tracking + * Shares mouse position across all components so the canvas + * background can react to UI element proximity. + */ +import { ref, readonly } from "vue"; + +const mouseX = ref(-9999); +const mouseY = ref(-9999); +const isOverUI = ref(false); + +function onMouseMove(e: MouseEvent) { + mouseX.value = e.clientX; + mouseY.value = e.clientY; +} + +function onMouseLeave() { + mouseX.value = -9999; + mouseY.value = -9999; + isOverUI.value = false; +} + +function setIsOverUI(val: boolean) { + isOverUI.value = val; +} + +export function useReactorBg() { + return { + mouseX: readonly(mouseX), + mouseY: readonly(mouseY), + isOverUI: readonly(isOverUI), + onMouseMove, + onMouseLeave, + setIsOverUI, + }; +} diff --git a/dashboard/src/layouts/full/FullLayout.vue b/dashboard/src/layouts/full/FullLayout.vue index 74ed9a83e..abb4afe4b 100644 --- a/dashboard/src/layouts/full/FullLayout.vue +++ b/dashboard/src/layouts/full/FullLayout.vue @@ -7,6 +7,7 @@ import VerticalHeaderVue from "./vertical-header/VerticalHeader.vue"; import MigrationDialog from "@/components/shared/MigrationDialog.vue"; import ReadmeDialog from "@/components/shared/ReadmeDialog.vue"; import Chat from "@/components/chat/Chat.vue"; +import ReactorBg from "@/components/shared/ReactorBg.vue"; import { useCustomizerStore } from "@/stores/customizer"; import { useRouterLoadingStore } from "@/stores/routerLoading"; import { useI18n } from "@/i18n/composables"; @@ -108,6 +109,7 @@ onMounted(() => { customizer.inputBg ? 'inputWithbg' : '', ]" > +