Revamp app layout, theming and navigation

Refactor Layout.vue to implement a redesigned, responsive shell: new branding (SVG icon, title & subtitle), computed sidebar/footer routes, route-aware page title & description, improved footer visibility, and a mobile-friendly navigation drawer. Theme handling now uses a data-theme attribute, persistent storage, accessible labels and toggle controls. Added new image assets (icon.svg, icon.png, 404NotFound.png), global.css and documentation files (style.md, codexInfo.md), updated related plugins/routes/components, and removed the old logo.png. Also updated the favicon.
This commit is contained in:
Jonas
2026-04-17 22:55:58 +02:00
parent b9101a4582
commit 3b910850cb
15 changed files with 2113 additions and 102 deletions
+167 -19
View File
@@ -1,24 +1,172 @@
<script setup lang="ts"></script>
<script setup lang="ts">
import { ref } from 'vue'
const showPassword = ref(false)
</script>
<template>
<v-container class="py-10">
<v-row justify="center">
<v-col cols="12" sm="10" md="6" lg="4">
<v-card rounded="lg" elevation="2">
<v-card-title class="text-h5">Login</v-card-title>
<v-card-text>
<v-text-field label="E-Mail" prepend-inner-icon="mdi-email-outline" />
<v-text-field
label="Passwort"
type="password"
prepend-inner-icon="mdi-lock-outline"
/>
<v-btn color="primary" block prepend-icon="mdi-login">Anmelden</v-btn>
</v-card-text>
</v-card>
</v-col>
</v-row>
<v-container fluid class="login-page">
<section class="login-shell hoard-panel">
<aside class="login-brand">
<p class="login-kicker">Willkommen bei Hoard</p>
<h1>Anmelden und weiterarbeiten</h1>
<p class="login-intro">
Deine Dateiablage bleibt aufgeräumt, schnell und direkt im Browser bedienbar.
</p>
<ul class="login-points">
<li>
<v-icon icon="mdi-folder-outline" size="18" />
Ordner und Dateien zentral verwalten
</li>
<li>
<v-icon icon="mdi-file-document-edit-outline" size="18" />
Markdown-Dateien sofort bearbeiten
</li>
<li>
<v-icon icon="mdi-image-outline" size="18" />
Bilder und PDFs direkt als Vorschau ansehen
</li>
</ul>
</aside>
<v-form class="login-form hoard-panel" @submit.prevent>
<div class="form-head">
<h2>Login</h2>
<p>Melde dich mit deinem bestehenden Konto an.</p>
</div>
<v-text-field
label="E-Mail"
type="email"
variant="outlined"
prepend-inner-icon="mdi-email-outline"
autocomplete="email"
required
/>
<v-text-field
label="Passwort"
:type="showPassword ? 'text' : 'password'"
variant="outlined"
prepend-inner-icon="mdi-lock-outline"
:append-inner-icon="showPassword ? 'mdi-eye-off-outline' : 'mdi-eye-outline'"
autocomplete="current-password"
required
@click:append-inner="showPassword = !showPassword"
/>
<div class="form-meta">
<v-checkbox hide-details color="primary" density="compact" label="Angemeldet bleiben" />
<v-btn variant="text" size="small">Passwort vergessen?</v-btn>
</div>
<v-btn type="submit" color="primary" block size="large" prepend-icon="mdi-login">Anmelden</v-btn>
<v-btn variant="outlined" block to="/" prepend-icon="mdi-home">Zur Startseite</v-btn>
</v-form>
</section>
</v-container>
</template>
<style scoped></style>
<style scoped>
.login-page {
display: flex;
align-items: center;
justify-content: center;
min-height: calc(100vh - 210px);
padding: var(--space-8) var(--space-4);
}
.login-shell {
display: grid;
grid-template-columns: minmax(280px, 1fr) minmax(320px, 430px);
gap: var(--space-8);
width: min(100%, 1040px);
padding: var(--space-8);
background:
linear-gradient(
115deg,
color-mix(in srgb, var(--color-primary-100) 45%, var(--color-surface) 55%) 0%,
var(--color-surface) 52%
);
}
.login-kicker {
margin: 0 0 var(--space-2);
color: var(--color-primary-700);
font-size: var(--font-size-sm);
font-weight: 600;
letter-spacing: 0.06em;
text-transform: uppercase;
}
h1 {
margin-bottom: var(--space-3);
max-width: 18ch;
font-size: clamp(1.9rem, 2vw + 1rem, 2.6rem);
font-weight: 700;
}
.login-intro {
margin-bottom: var(--space-5);
max-width: 44ch;
color: var(--color-text-secondary);
}
.login-points {
display: flex;
flex-direction: column;
gap: var(--space-3);
padding: 0;
margin: 0;
list-style: none;
}
.login-points li {
display: flex;
align-items: center;
gap: var(--space-3);
color: var(--color-text-secondary);
font-weight: 500;
}
.login-form {
display: flex;
flex-direction: column;
gap: var(--space-4);
padding: var(--space-6);
border-radius: var(--radius-lg);
}
.form-head h2 {
margin-bottom: var(--space-1);
font-size: 1.45rem;
}
.form-head p {
margin: 0;
color: var(--color-text-secondary);
font-size: var(--font-size-md);
}
.form-meta {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-3);
}
@media (width <= 960px) {
.login-page {
min-height: calc(100vh - 180px);
padding: var(--space-5) var(--space-2);
}
.login-shell {
grid-template-columns: 1fr;
gap: var(--space-5);
padding: var(--space-5);
}
}
</style>