Files
SkillMate/frontend/src/views/Settings.tsx
2025-09-29 00:35:31 +02:00

137 Zeilen
6.4 KiB
TypeScript

import { useState } from 'react'
import { useThemeStore } from '../stores/themeStore'
export default function Settings() {
const { isDarkMode, toggleTheme } = useThemeStore()
// Barrierefreiheit-Einstellungen (Platzhalter mit sinnvollen Optionen)
const [a11y, setA11y] = useState({
highContrast: false,
largeText: false,
reduceMotion: false,
underlineLinks: true,
alwaysShowFocusOutline: true,
dyslexiaFriendlyFont: false
})
const handleSave = () => {
// TODO: Save settings to backend/electron store
console.log('Settings saved:', { syncConfig, isDarkMode })
}
return (
<div>
<h1 className="text-title-lg font-poppins font-bold text-primary mb-8">
Einstellungen
</h1>
<div className="max-w-4xl space-y-6">
<div className="card">
<h2 className="text-title-card font-poppins font-semibold text-primary mb-6">
Darstellung
</h2>
<div className="space-y-4">
<div className="flex items-center justify-between">
<div>
<h3 className="text-body font-medium text-secondary">Dark Mode</h3>
<p className="text-small text-tertiary">
Aktiviert das dunkle Farbschema der Anwendung
</p>
</div>
<button
onClick={toggleTheme}
className={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors ${
isDarkMode ? 'bg-primary-blue' : 'bg-border-input'
}`}
>
<span
className={`inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${
isDarkMode ? 'translate-x-6' : 'translate-x-1'
}`}
/>
</button>
</div>
</div>
</div>
<div className="card">
<h2 className="text-title-card font-poppins font-semibold text-primary mb-6">
Barrierefreiheit
</h2>
<div className="space-y-4">
<label className="flex items-center space-x-3">
<input type="checkbox" className="w-5 h-5 rounded border-border-input text-primary-blue" checked={a11y.highContrast} onChange={(e) => setA11y(prev => ({ ...prev, highContrast: e.target.checked }))} />
<div>
<span className="text-body font-medium text-secondary">Hoher Kontrast</span>
<p className="text-small text-tertiary">Erhöht den Kontrast für bessere Lesbarkeit (BITV-konform)</p>
</div>
</label>
<label className="flex items-center space-x-3">
<input type="checkbox" className="w-5 h-5 rounded border-border-input text-primary-blue" checked={a11y.largeText} onChange={(e) => setA11y(prev => ({ ...prev, largeText: e.target.checked }))} />
<div>
<span className="text-body font-medium text-secondary">Große Schrift</span>
<p className="text-small text-tertiary">Vergrößert die Schriftgröße für bessere Lesbarkeit</p>
</div>
</label>
<label className="flex items-center space-x-3">
<input type="checkbox" className="w-5 h-5 rounded border-border-input text-primary-blue" checked={a11y.reduceMotion} onChange={(e) => setA11y(prev => ({ ...prev, reduceMotion: e.target.checked }))} />
<div>
<span className="text-body font-medium text-secondary">Reduzierte Bewegungen</span>
<p className="text-small text-tertiary">Deaktiviert Animationen für weniger Ablenkung</p>
</div>
</label>
<label className="flex items-center space-x-3">
<input type="checkbox" className="w-5 h-5 rounded border-border-input text-primary-blue" checked={a11y.underlineLinks} onChange={(e) => setA11y(prev => ({ ...prev, underlineLinks: e.target.checked }))} />
<div>
<span className="text-body font-medium text-secondary">Links unterstreichen</span>
<p className="text-small text-tertiary">Links werden grundsätzlich unterstrichen dargestellt</p>
</div>
</label>
<label className="flex items-center space-x-3">
<input type="checkbox" className="w-5 h-5 rounded border-border-input text-primary-blue" checked={a11y.alwaysShowFocusOutline} onChange={(e) => setA11y(prev => ({ ...prev, alwaysShowFocusOutline: e.target.checked }))} />
<div>
<span className="text-body font-medium text-secondary">Fokusrahmen immer anzeigen</span>
<p className="text-small text-tertiary">Hebt fokussierte Elemente dauerhaft für Tastaturbedienung hervor</p>
</div>
</label>
<label className="flex items-center space-x-3">
<input type="checkbox" className="w-5 h-5 rounded border-border-input text-primary-blue" checked={a11y.dyslexiaFriendlyFont} onChange={(e) => setA11y(prev => ({ ...prev, dyslexiaFriendlyFont: e.target.checked }))} />
<div>
<span className="text-body font-medium text-secondary">Dyslexie-freundliche Schrift</span>
<p className="text-small text-tertiary">Verwendet eine besser unterscheidbare Schriftart</p>
</div>
</label>
</div>
</div>
<div className="card">
<h2 className="text-title-card font-poppins font-semibold text-primary mb-6">
Über SkillMate
</h2>
<div className="space-y-2 text-body">
<p className="text-secondary">
<span className="font-medium">Version:</span> 1.0.0
</p>
<p className="text-secondary">
<span className="font-medium">Entwickelt für:</span> Sicherheitsbehörden
</p>
<p className="text-small text-tertiary mt-4">
SkillMate ist eine spezialisierte Anwendung zur Verwaltung von Fähigkeiten und Kompetenzen der Mitarbeitenden in Sicherheitsbehörden.
</p>
</div>
</div>
<div className="flex justify-end space-x-3">
<button className="btn-secondary">
Abbrechen
</button>
<button onClick={handleSave} className="btn-primary">
Einstellungen speichern
</button>
</div>
</div>
</div>
)
}