feat(frontend): pagini Termeni, Confidențialitate/GDPR și Contact
Activează linkurile din footer-ul landing-ului către pagini reale, în stilul paginilor statice din autopass. - Componentă comună LegalPage.vue: același antet (brand + selector de temă), footer și paletă (8 teme) ca landing-ul, cu slot "prose" - Logica temei extrasă în composable useLandingTheme (partajat de landing și paginile legale, persistat în localStorage) - Rute publice /termeni, /confidentialitate, /contact (fullBleed) - Footer-ul (landing + pagini) trimite acum la aceste rute Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
43
frontend/src/composables/useLandingTheme.ts
Normal file
43
frontend/src/composables/useLandingTheme.ts
Normal file
@@ -0,0 +1,43 @@
|
||||
import { ref, computed } from 'vue'
|
||||
|
||||
/**
|
||||
* Theme selector for the public pages (landing + legal/contact).
|
||||
* Same 8 themes and cycle order as the ROA app / autopass landing.
|
||||
* Persisted under its own key so it doesn't clash with the in-app theme.
|
||||
*/
|
||||
const THEMES: [string, string][] = [
|
||||
['light', 'Light'],
|
||||
['dark', 'Dark'],
|
||||
['petrol', 'Petrol'],
|
||||
['grafit', 'Grafit'],
|
||||
['cobalt', 'Cobalt'],
|
||||
['cupru', 'Cupru'],
|
||||
['hartie', 'Hârtie'],
|
||||
['auto', 'Auto']
|
||||
]
|
||||
const THEME_KEY = 'roa-landing-theme'
|
||||
const VALID = new Set(THEMES.map((t) => t[0]))
|
||||
|
||||
function resolve(id: string): string {
|
||||
if (id === 'auto') {
|
||||
return window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark'
|
||||
}
|
||||
return id
|
||||
}
|
||||
|
||||
// Module-level singleton so every public page shares the same selection.
|
||||
const stored = localStorage.getItem(THEME_KEY)
|
||||
const themeId = ref(stored && VALID.has(stored) ? stored : 'grafit')
|
||||
|
||||
export function useLandingTheme() {
|
||||
const theme = computed(() => resolve(themeId.value))
|
||||
const themeLabel = computed(() => THEMES.find((t) => t[0] === themeId.value)?.[1] ?? 'Grafit')
|
||||
|
||||
function cycleTheme() {
|
||||
const idx = THEMES.findIndex((t) => t[0] === themeId.value)
|
||||
themeId.value = THEMES[(idx + 1) % THEMES.length][0]
|
||||
localStorage.setItem(THEME_KEY, themeId.value)
|
||||
}
|
||||
|
||||
return { themeId, theme, themeLabel, cycleTheme }
|
||||
}
|
||||
Reference in New Issue
Block a user