Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
60c2fb2d7e | ||
| e372505120 | |||
| 4e393dd5e9 | |||
| 8fd4aba63e |
@@ -1,3 +1,10 @@
|
|||||||
|
## [1.2.1](https://gitea.malio.fr/MALIO-DEV/Supervisor/compare/v1.2.0...v1.2.1) (2026-03-10)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* reduce style loading flash ([4e393dd](https://gitea.malio.fr/MALIO-DEV/Supervisor/commit/4e393dd5e92a28d91e49affb9437687ac8de3817))
|
||||||
|
|
||||||
# [1.2.0](https://gitea.malio.fr/MALIO-DEV/Supervisor/compare/v1.1.0...v1.2.0) (2026-03-10)
|
# [1.2.0](https://gitea.malio.fr/MALIO-DEV/Supervisor/compare/v1.1.0...v1.2.0) (2026-03-10)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -20,14 +20,18 @@
|
|||||||
--font-mono: "JetBrains Mono", "Fira Code", monospace;
|
--font-mono: "JetBrains Mono", "Fira Code", monospace;
|
||||||
}
|
}
|
||||||
|
|
||||||
@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&family=Outfit:wght@300;400;500;600;700;800;900&display=swap');
|
|
||||||
|
|
||||||
@layer base {
|
@layer base {
|
||||||
|
html {
|
||||||
|
background: rgb(var(--m-bg));
|
||||||
|
color-scheme: dark;
|
||||||
|
}
|
||||||
|
|
||||||
* {
|
* {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
|
min-height: 100vh;
|
||||||
font-family: var(--font-display);
|
font-family: var(--font-display);
|
||||||
background: rgb(var(--m-bg));
|
background: rgb(var(--m-bg));
|
||||||
color: rgb(var(--m-text));
|
color: rgb(var(--m-text));
|
||||||
@@ -35,6 +39,10 @@
|
|||||||
-moz-osx-font-smoothing: grayscale;
|
-moz-osx-font-smoothing: grayscale;
|
||||||
transition: background-color 0.4s ease, color 0.4s ease;
|
transition: background-color 0.4s ease, color 0.4s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@layer utilities {
|
@layer utilities {
|
||||||
|
|||||||
@@ -1,7 +1,3 @@
|
|||||||
@tailwind base;
|
|
||||||
@tailwind components;
|
|
||||||
@tailwind utilities;
|
|
||||||
|
|
||||||
@layer base {
|
@layer base {
|
||||||
:root {
|
:root {
|
||||||
--m-primary: 15 20 40;
|
--m-primary: 15 20 40;
|
||||||
|
|||||||
@@ -4,50 +4,48 @@
|
|||||||
<div class="sidebar-header">
|
<div class="sidebar-header">
|
||||||
<div class="logo-container">
|
<div class="logo-container">
|
||||||
<img
|
<img
|
||||||
:src="logoSrc"
|
:src="logoSrc"
|
||||||
alt="Logo Malio"
|
alt="Logo Malio"
|
||||||
class="logo"
|
class="logo"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="brand-copy">
|
<div class="brand-copy">
|
||||||
<p class="brand-title">Supervisor</p>
|
<p class="brand-title">Supervisor</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="sidebar-divider" />
|
<div class="sidebar-divider"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="sidebar-content">
|
<div class="sidebar-content">
|
||||||
<slot name="sidebar" />
|
<slot name="sidebar"/>
|
||||||
<nav class="sidebar-nav" aria-label="Sections">
|
<nav class="sidebar-nav" aria-label="Sections">
|
||||||
<p class="nav-label">Navigation</p>
|
<p class="nav-label">Navigation</p>
|
||||||
<NuxtLink
|
<div class="flex flex-col gap-2">
|
||||||
v-for="item in navItems"
|
<div class="bg-m-tertiary rounded-lg border border-m-accent/6">
|
||||||
:key="item.to"
|
<NuxtLink
|
||||||
v-slot="{ href, navigate, isExactActive }"
|
to="/"
|
||||||
:to="item.to"
|
class="flex items-center gap-3 px-4 py-2 rounded-lg text-white hover:bg-m-tertiary/80 transition-colors"
|
||||||
custom
|
>
|
||||||
>
|
<IconifyIcon
|
||||||
<a
|
icon="mdi:home"
|
||||||
:href="href"
|
class="text-lg"/>
|
||||||
class="nav-link"
|
<p>Home</p>
|
||||||
:class="{ 'nav-link-active': isExactActive }"
|
</NuxtLink>
|
||||||
:aria-current="isExactActive ? 'page' : undefined"
|
</div>
|
||||||
@click="navigate(); isMenuOpen = false"
|
<div class="bg-m-tertiary rounded-lg border border-m-accent/6">
|
||||||
>
|
<NuxtLink
|
||||||
<span class="nav-link-main">
|
to="/backup"
|
||||||
<span class="nav-icon">
|
class="flex items-center gap-3 px-4 py-2 rounded-lg text-white hover:bg-m-tertiary/80 transition-colors"
|
||||||
<IconifyIcon :icon="item.icon" class="text-lg" />
|
>
|
||||||
</span>
|
<IconifyIcon
|
||||||
<span>
|
icon="mdi:data"
|
||||||
<span class="nav-title">{{ item.label }}</span>
|
class="text-lg"/>
|
||||||
<span class="nav-caption">{{ item.caption }}</span>
|
<p>Backup</p>
|
||||||
</span>
|
</NuxtLink>
|
||||||
</span>
|
</div>
|
||||||
<span class="nav-pill">{{ item.short }}</span>
|
</div>
|
||||||
</a>
|
|
||||||
</NuxtLink>
|
|
||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
<div class="sidebar-footer">
|
<div class="sidebar-footer">
|
||||||
<div class="sidebar-divider" />
|
<div class="sidebar-divider"/>
|
||||||
<div class="footer-row">
|
<div class="footer-row">
|
||||||
<p class="font-mono text-[10px] tracking-widest uppercase text-white/40">
|
<p class="font-mono text-[10px] tracking-widest uppercase text-white/40">
|
||||||
Supervisor {{ appVersion }}
|
Supervisor {{ appVersion }}
|
||||||
@@ -57,18 +55,18 @@
|
|||||||
</aside>
|
</aside>
|
||||||
|
|
||||||
<button class="mobile-menu-button" type="button" @click="isMenuOpen = true">
|
<button class="mobile-menu-button" type="button" @click="isMenuOpen = true">
|
||||||
<IconifyIcon icon="mdi:menu" class="text-2xl" />
|
<IconifyIcon icon="mdi:menu" class="text-2xl"/>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<div v-if="isMenuOpen" class="mobile-menu-backdrop" @click="isMenuOpen = false" />
|
<div v-if="isMenuOpen" class="mobile-menu-backdrop" @click="isMenuOpen = false"/>
|
||||||
|
|
||||||
<aside v-if="isMenuOpen" class="mobile-sidebar" aria-label="Navigation mobile">
|
<aside v-if="isMenuOpen" class="mobile-sidebar" aria-label="Navigation mobile">
|
||||||
<div class="sidebar-header">
|
<div class="sidebar-header">
|
||||||
<div class="logo-container">
|
<div class="logo-container">
|
||||||
<img
|
<img
|
||||||
:src="logoSrc"
|
:src="logoSrc"
|
||||||
alt="Logo Malio"
|
alt="Logo Malio"
|
||||||
class="logo"
|
class="logo"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="brand-copy">
|
<div class="brand-copy">
|
||||||
@@ -78,29 +76,29 @@
|
|||||||
Tableau de bord interne pour le monitoring et les sauvegardes.
|
Tableau de bord interne pour le monitoring et les sauvegardes.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="sidebar-divider" />
|
<div class="sidebar-divider"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="sidebar-content">
|
<div class="sidebar-content">
|
||||||
<slot name="sidebar" />
|
<slot name="sidebar"/>
|
||||||
<nav class="sidebar-nav" aria-label="Sections mobiles">
|
<nav class="sidebar-nav" aria-label="Sections mobiles">
|
||||||
<p class="nav-label">Navigation</p>
|
<p class="nav-label">Navigation</p>
|
||||||
<NuxtLink
|
<NuxtLink
|
||||||
v-for="item in navItems"
|
v-for="item in navItems"
|
||||||
:key="`mobile-${item.to}`"
|
:key="`mobile-${item.to}`"
|
||||||
v-slot="{ href, navigate, isExactActive }"
|
v-slot="{ href, navigate, isExactActive }"
|
||||||
:to="item.to"
|
:to="item.to"
|
||||||
custom
|
custom
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
:href="href"
|
:href="href"
|
||||||
class="nav-link"
|
class="nav-link"
|
||||||
:class="{ 'nav-link-active': isExactActive }"
|
:class="{ 'nav-link-active': isExactActive }"
|
||||||
:aria-current="isExactActive ? 'page' : undefined"
|
:aria-current="isExactActive ? 'page' : undefined"
|
||||||
@click="navigate(); isMenuOpen = false"
|
@click="navigate(); isMenuOpen = false"
|
||||||
>
|
>
|
||||||
<span class="nav-link-main">
|
<span class="nav-link-main">
|
||||||
<span class="nav-icon">
|
<span class="nav-icon">
|
||||||
<IconifyIcon :icon="item.icon" class="text-lg" />
|
<IconifyIcon :icon="item.icon" class="text-lg"/>
|
||||||
</span>
|
</span>
|
||||||
<span>
|
<span>
|
||||||
<span class="nav-title">{{ item.label }}</span>
|
<span class="nav-title">{{ item.label }}</span>
|
||||||
@@ -113,7 +111,7 @@
|
|||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
<div class="sidebar-footer">
|
<div class="sidebar-footer">
|
||||||
<div class="sidebar-divider" />
|
<div class="sidebar-divider"/>
|
||||||
<div class="status-card">
|
<div class="status-card">
|
||||||
<p class="status-label">Environnement</p>
|
<p class="status-label">Environnement</p>
|
||||||
<p class="status-value">Production</p>
|
<p class="status-value">Production</p>
|
||||||
@@ -126,25 +124,25 @@
|
|||||||
Supervisor {{ appVersion }}
|
Supervisor {{ appVersion }}
|
||||||
</p>
|
</p>
|
||||||
<button class="close-button" type="button" @click="isMenuOpen = false">
|
<button class="close-button" type="button" @click="isMenuOpen = false">
|
||||||
<IconifyIcon icon="mdi:close" class="text-xl" />
|
<IconifyIcon icon="mdi:close" class="text-xl"/>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</aside>
|
</aside>
|
||||||
|
|
||||||
<main class="content bg-noise">
|
<main class="content bg-noise">
|
||||||
<slot />
|
<slot/>
|
||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref } from "vue"
|
import {ref} from "vue"
|
||||||
import { Icon as IconifyIcon } from "@iconify/vue"
|
import {Icon as IconifyIcon} from "@iconify/vue"
|
||||||
import logoSrc from '~/assets/LOGO_CARRE_BLANC.png'
|
import logoSrc from '~/assets/LOGO_CARRE_BLANC.png'
|
||||||
|
|
||||||
const {
|
const {
|
||||||
public: { appVersion }
|
public: {appVersion}
|
||||||
} = useRuntimeConfig()
|
} = useRuntimeConfig()
|
||||||
const isMenuOpen = ref(false)
|
const isMenuOpen = ref(false)
|
||||||
const navItems = [
|
const navItems = [
|
||||||
@@ -175,9 +173,9 @@ const navItems = [
|
|||||||
.sidebar,
|
.sidebar,
|
||||||
.mobile-sidebar {
|
.mobile-sidebar {
|
||||||
background: linear-gradient(
|
background: linear-gradient(
|
||||||
180deg,
|
180deg,
|
||||||
rgb(var(--m-sidebar-from)) 0%,
|
rgb(var(--m-sidebar-from)) 0%,
|
||||||
rgb(var(--m-sidebar-to)) 100%
|
rgb(var(--m-sidebar-to)) 100%
|
||||||
);
|
);
|
||||||
color: white;
|
color: white;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -259,10 +257,10 @@ const navItems = [
|
|||||||
height: 1px;
|
height: 1px;
|
||||||
margin: 0.75rem 1.5rem;
|
margin: 0.75rem 1.5rem;
|
||||||
background: linear-gradient(
|
background: linear-gradient(
|
||||||
90deg,
|
90deg,
|
||||||
transparent,
|
transparent,
|
||||||
var(--m-sidebar-divider),
|
var(--m-sidebar-divider),
|
||||||
transparent
|
transparent
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -299,11 +297,10 @@ const navItems = [
|
|||||||
border: 1px solid transparent;
|
border: 1px solid transparent;
|
||||||
color: white;
|
color: white;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
transition:
|
transition: background-color 0.2s ease,
|
||||||
background-color 0.2s ease,
|
border-color 0.2s ease,
|
||||||
border-color 0.2s ease,
|
transform 0.2s ease,
|
||||||
transform 0.2s ease,
|
box-shadow 0.2s ease;
|
||||||
box-shadow 0.2s ease;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-link:hover {
|
.nav-link:hover {
|
||||||
@@ -319,8 +316,7 @@ const navItems = [
|
|||||||
}
|
}
|
||||||
|
|
||||||
.nav-link-active {
|
.nav-link-active {
|
||||||
background:
|
background: linear-gradient(135deg, rgb(var(--m-accent) / 0.16), rgb(255 255 255 / 0.04));
|
||||||
linear-gradient(135deg, rgb(var(--m-accent) / 0.16), rgb(255 255 255 / 0.04));
|
|
||||||
border-color: rgb(var(--m-accent) / 0.24);
|
border-color: rgb(var(--m-accent) / 0.24);
|
||||||
box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.04);
|
box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.04);
|
||||||
}
|
}
|
||||||
@@ -378,9 +374,8 @@ const navItems = [
|
|||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
border-radius: 16px;
|
border-radius: 16px;
|
||||||
border: 1px solid rgb(var(--m-accent) / 0.14);
|
border: 1px solid rgb(var(--m-accent) / 0.14);
|
||||||
background:
|
background: radial-gradient(circle at top right, rgb(var(--m-accent) / 0.14), transparent 30%),
|
||||||
radial-gradient(circle at top right, rgb(var(--m-accent) / 0.14), transparent 30%),
|
rgb(255 255 255 / 0.04);
|
||||||
rgb(255 255 255 / 0.04);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.status-label {
|
.status-label {
|
||||||
|
|||||||
@@ -22,6 +22,18 @@ export default defineNuxtConfig({
|
|||||||
compatibilityDate: "2025-07-15",
|
compatibilityDate: "2025-07-15",
|
||||||
devtools: { enabled: true },
|
devtools: { enabled: true },
|
||||||
css: ["~/assets/css/main.css"],
|
css: ["~/assets/css/main.css"],
|
||||||
|
app: {
|
||||||
|
head: {
|
||||||
|
link: [
|
||||||
|
{ rel: "preconnect", href: "https://fonts.googleapis.com" },
|
||||||
|
{ rel: "preconnect", href: "https://fonts.gstatic.com", crossorigin: "" },
|
||||||
|
{
|
||||||
|
rel: "stylesheet",
|
||||||
|
href: "https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&family=Outfit:wght@300;400;500;600;700;800;900&display=swap"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
runtimeConfig: {
|
runtimeConfig: {
|
||||||
public: {
|
public: {
|
||||||
appVersion: getRepoVersion()
|
appVersion: getRepoVersion()
|
||||||
|
|||||||
786
package-lock.json
generated
786
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -11,6 +11,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@iconify/vue": "^5.0.0",
|
"@iconify/vue": "^5.0.0",
|
||||||
|
"iconify": "^1.4.0",
|
||||||
"nuxt": "^4.3.1",
|
"nuxt": "^4.3.1",
|
||||||
"vue": "^3.5.29",
|
"vue": "^3.5.29",
|
||||||
"vue-router": "^4.6.4"
|
"vue-router": "^4.6.4"
|
||||||
|
|||||||
Reference in New Issue
Block a user