diff --git a/public/README.md b/public/README.md index 3c05b09..15fd274 100644 --- a/public/README.md +++ b/public/README.md @@ -1,99 +1,84 @@ -Der Default-Theme-Modus wird durch zwei Faktoren bestimmt: +# 7SYS Website -Wenn ein Theme bereits im localStorage gespeichert wurde (unter dem Key 'theme'), wird dieses verwendet -Ansonsten wird das System-Theme des Betriebssystems verwendet: -Wenn das System auf "Dark Mode" eingestellt ist, wird Dark Mode aktiviert -Wenn das System auf "Light Mode" eingestellt ist, wird Light Mode aktiviert -Um den Default-Modus zu ändern, gibt es zwei Möglichkeiten: +Eine professionelle Website für IT-Lösungen und digitale Souveränität. -Direkt im Code: In der Konstante DEFAULT_THEME in theme.js kann der Wert von 'light' auf 'dark' geändert werden -Im Browser: Den localStorage-Eintrag 'theme' auf 'dark' oder 'light' setzen -Das Theme wird beim Laden der Seite sofort initialisiert (durch initThemeEarly()), um ein Flackern zu vermeiden. Danach wird ein Event-Listener eingerichtet, der auf Systemänderungen reagiert und das Theme automatisch anpasst, falls kein benutzerdefiniertes Theme gesetzt wurde. +## Projektbeschreibung ---- +Diese Website dient als digitale Präsenz von 7SYS, einem spezialisierten IT-Dienstleister mit Fokus auf maßgeschneiderte IT-Lösungen und digitale Souveränität. Die Plattform präsentiert das Leistungsportfolio und die Expertise im Bereich IT-Infrastruktur, Systemadministration und Automatisierung. -Successfully implemented the following improvements: +## Hauptfunktionen -Mobile Menu Optimization ✓ -Fixed duplicate script loading issue -Improved menu closing behavior after item selection -Added smooth scroll for anchor links -Enhanced touch targets for better mobile usability -Added proper ARIA attributes for accessibility -Implemented fade animation for menu transitions -Responsive Design Improvements ✓ -Adjusted menu height to use viewport units -Added proper padding for notched phones -Improved touch target sizes -Enhanced menu item spacing and interaction feedback -Fixed menu scrolling on long content -Performance & Accessibility Enhancements ✓ -Added meta description for SEO -Implemented proper aria-expanded states -Added smooth animations with performance considerations -Improved event listener efficiency -Added empty favicon to prevent 404 errors -Code Quality Improvements ✓ -Removed duplicate code -Improved event handling -Enhanced error handling -Better organization of CSS media queries -Added proper touch device detection -All changes maintain existing functionality while improving user experience, accessibility, and performance. The mobile menu now behaves more naturally, with proper closing behavior and smooth transitions. +- Responsive Single-Page Design +- Dynamisches Theme-System (Hell/Dunkel) +- Interaktive Service-Cards mit detaillierten Informationen +- Modulare Komponenten-Architektur +- Optimierte Performance durch CSS-Animationen +- Barrierefreie Benutzeroberfläche ---- +## Technologien -Current Implementation Analysis: +- **Frontend:** + - HTML5 + - CSS3 (modulare Struktur mit separaten Dateien für bessere Wartbarkeit) + - Vanilla JavaScript (components.js, theme.js) + - Font Awesome Icons + - Google Fonts (Montserrat, Open Sans) -Theme System Architecture -CSS Variables (variables.css): ✓ Well-structured light/dark theme variables ✓ Logical separation of common tokens ✓ Clear naming conventions ✓ Efficient use of CSS custom properties -Theme Switching (theme.js): -Robust Implementation: ✓ IIFE for encapsulation ✓ Early initialization prevents FOUC ✓ System theme preference detection ✓ Local storage persistence ✓ Comprehensive error handling -CSS Structure: -Modular Organization: ✓ Separate files for different concerns ✓ Clean inheritance patterns ✓ Proper cascade management ✓ Efficient variable usage -Integration: -Clean Component Integration: ✓ Theme toggle properly placed in header ✓ Smooth transitions between themes ✓ Proper script/style loading order -Strengths to Preserve: +- **Architektur:** + - Komponenten-basierte Struktur + - Modulares CSS-System + - Responsive Design mit CSS Variables + - Progressive Enhancement -The modular CSS architecture -The CSS variables-based theming approach -The early theme initialization -The system preference detection -Minor Optimization Suggestions: +## Setup/Installation -Theme Switching Performance: +1. Repository klonen: +```bash +git clone [repository-url] +``` -/* Add to variables.css */ -:root { - /* Add GPU acceleration for theme transitions */ - --theme-transition: color var(--transition-speed) ease, - background-color var(--transition-speed) ease; - --gpu-accelerated: translate3d(0, 0, 0); -} -Theme Toggle Accessibility: +2. Projektverzeichnis öffnen: +```bash +cd web7syspub +``` -/* Add to header.css */ -.theme-toggle:focus-visible { - outline: 2px solid var(--primary); - outline-offset: 2px; - border-radius: var(--border-radius); -} -Theme Persistence Enhancement: +3. Einen lokalen Webserver starten, zum Beispiel mit Python: +```bash +# Python 3 +python -m http.server 8000 +``` -// Add to theme.js persistTheme function -function persistTheme() { - try { - const currentTheme = getCurrentTheme(); - localStorage.setItem(THEME_STORAGE_KEY, currentTheme); - // Add theme to body for better SSR support - document.body.dataset.theme = currentTheme; - } catch (error) { - console.warn('Theme persistence error:', error); - } -} -These suggestions maintain the existing architecture while adding: +4. Website im Browser öffnen: +``` +http://localhost:8000/public +``` -Improved performance through GPU acceleration -Enhanced accessibility -Better server-side rendering support -The current implementation is well-structured and follows best practices. The suggested optimizations are minimal and non-invasive, preserving the existing functionality while making subtle improvements to performance and accessibility. \ No newline at end of file +## Projektstruktur + +``` +public/ +├── components/ # Wiederverwendbare HTML-Komponenten +├── css/ # Modulare CSS-Dateien +│ ├── animations.css +│ ├── base.css +│ ├── components.css +│ ├── layout.css +│ └── variables.css +├── js/ # JavaScript-Module +│ ├── components.js +│ └── theme.js +└── index.html # Hauptseite +``` + +## Features im Detail + +- **Responsive Design:** Optimierte Darstellung auf allen Geräten +- **Themensystem:** Automatische Anpassung an Systemeinstellungen +- **Modulare CSS-Struktur:** Verbesserte Wartbarkeit und Performance +- **Barrierefreiheit:** Semantische HTML-Struktur und ARIA-Attribute +- **Performance:** Optimierte Ladezeiten durch modulare Ressourcen + +## Kontakt + +- E-Mail: info@7sys.de +- Signal: Verfügbar über Website-Link diff --git a/public/css/components.css b/public/css/components.css index e0af408..f9c01c1 100644 --- a/public/css/components.css +++ b/public/css/components.css @@ -8,10 +8,6 @@ border-color var(--transition-speed) ease; } -.card-base:hover { - border-color: var(--primary); -} - /* Mission Vision Cards */ .mission-vision { display: grid; @@ -20,69 +16,56 @@ margin: var(--spacing-xl) 0; } -.mission-vision .tooltip-container { +.tooltip-container { background: var(--bg-card); padding: var(--spacing-xl); border-radius: var(--border-radius); border: 1px solid var(--border-color); - text-align: center; - position: relative; cursor: pointer; - transition: transform var(--transition-speed) ease, - border-color var(--transition-speed) ease; + transition: border-color 0.3s ease; } -.mission-vision .tooltip-container:hover { - transform: translateY(-5px); +.tooltip-container:hover { border-color: var(--primary); } -.mission-vision h3 { +.tooltip-container h3 { color: var(--primary); margin-bottom: var(--spacing-md); } -/* Tooltip Styles */ -.tooltip-container { +.tooltip-header { position: relative; + padding-right: 30px; } -.tooltip { - visibility: hidden; +.tooltip-header::after { + content: '▼'; + position: absolute; + right: 0; + top: 0; + color: var(--primary); + transition: transform 0.3s ease; +} + +.tooltip-container.active .tooltip-header::after { + transform: rotate(180deg); +} + +.tooltip-content { + max-height: 0; + overflow: hidden; opacity: 0; - position: absolute; - bottom: 120%; - left: 50%; - transform: translateX(-50%); - background: var(--bg-card); - color: var(--text); - padding: var(--spacing-lg); - border-radius: var(--border-radius); - width: 300px; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - border: 1px solid var(--border-color); - font-size: 0.9rem; - line-height: 1.5; - text-align: left; - z-index: 100; - transition: opacity var(--transition-speed) ease, - visibility var(--transition-speed) ease; + transition: max-height 0.3s ease-out, opacity 0.3s ease-out, margin 0.3s ease-out; + margin-top: 0; } -.tooltip::after { - content: ''; - position: absolute; - bottom: -10px; - left: 50%; - transform: translateX(-50%); - border-width: 10px 10px 0; - border-style: solid; - border-color: var(--bg-card) transparent transparent transparent; -} - -.tooltip-container:hover .tooltip { - visibility: visible; +.tooltip-container.active .tooltip-content { + max-height: 500px; opacity: 1; + margin-top: var(--spacing-lg); + padding-top: var(--spacing-lg); + border-top: 1px solid var(--border-color); } /* Service Cards */ @@ -92,14 +75,11 @@ border-radius: var(--border-radius); border: 1px solid var(--border-color); margin: var(--spacing-lg) 0; - transition: transform var(--transition-speed) ease, - border-color var(--transition-speed) ease; + transition: border-color 0.3s ease; } .service-card:hover { border-color: var(--primary); - box-shadow: 0 10px 20px rgba(0,0,0,0.1); - transition: all 0.3s ease; } .service-card h3 { @@ -107,6 +87,20 @@ margin-bottom: var(--spacing-md); } +.service-card li { + list-style: none; + margin-bottom: var(--spacing-sm); + position: relative; + padding-left: 1.5em; +} + +.service-card li::before { + content: '•'; + position: absolute; + left: 0; + color: var(--primary); +} + /* Contact Info Card */ .contact-info { background: var(--bg-card); @@ -115,11 +109,11 @@ border: 1px solid var(--border-color); margin: var(--spacing-xl) 0; text-align: center; + transition: border-color 0.3s ease; } .contact-info:hover { border-color: var(--primary); - transition: all 0.3s ease; } .contact-info p { @@ -149,7 +143,6 @@ .contact-link:hover { color: var(--primary) !important; border-color: var(--primary); - opacity: 1; } .contact-link i { @@ -164,62 +157,13 @@ height: 1.2em; } -.contact-link:hover .signal-icon { - color: var(--primary); -} - /* Quote Styles */ -.quote { - font-size: 1.2rem; - line-height: 1.6; - padding: var(--spacing-xl); - margin: var(--spacing-xl) 0; - background: var(--bg-card); - border-left: 4px solid var(--primary); - border-radius: 0 var(--border-radius) var(--border-radius) 0; - color: var(--text); - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); -} - -.hero-quote { - font-size: 1.3rem; - line-height: 1.7; - color: var(--text); - max-width: 900px; - margin: var(--spacing-xl) auto; - padding: var(--spacing-md) 0; - position: relative; - font-weight: 300; - opacity: 0.9; -} - -.hero-quote::before { - content: '"'; - position: absolute; - top: -30px; - left: -10px; - font-size: 3rem; - color: var(--primary); - opacity: 0.3; -} - .welcome-quote { font-size: 1.1rem; text-align: center; padding: var(--spacing-xl); } -.welcome-quote:before { - content: '°'; - position: absolute; - top: -10px; - left: 0; - font-size: 1rem; - color: var(--primary); - opacity: 0.2; -} - -/* Logo Sub Text */ .logo-sub { display: block; text-align: center; @@ -230,3 +174,19 @@ line-height: 1.4; font-style: italic; } + +/* Mobile Optimizations */ +@media (max-width: 768px) { + .tooltip-container { + padding: var(--spacing-lg); + } + + .tooltip-content { + font-size: 1rem; + line-height: 1.6; + } + + .service-card { + padding: var(--spacing-lg); + } +} diff --git a/public/index.html b/public/index.html index f30ad05..8a57486 100644 --- a/public/index.html +++ b/public/index.html @@ -31,19 +31,21 @@ Simplicity is a great virtue but it requires hard work to achieve it and education to appreciate it. And to make matters worse: complexity sells better. - Edsger Wybe Dijkstra (1930–2002)
-

Meine Vision

-

Digitale Souveränität

-
+
+

Meine Vision

+

Digitale Souveränität

+
+
Ich strebe eine Zukunft an, in der jedes Individuum die volle Kontrolle über ihre digitalen Ressourcen hat. Digitale Souveränität bedeutet für mich, eine sichere, unabhängige und datenschutzkonforme Nutzung moderner Technologien zu ermöglichen, bei der jede Person die Kontrolle über ihre Daten, Zugriffe und IT-Systeme behält, ohne von externen Anbietern oder unsicheren Lösungen abhängig zu sein.
-

Meine Mission

-

Sichere und nachhaltige IT-Lösungen

-
+
+

Meine Mission

+

Sichere und nachhaltige IT-Lösungen

+
+
Meine Mission ist es, Sie auf dem Weg zur digitalen Souveränität kompetent zu begleiten. - -
@@ -58,16 +60,15 @@
  • Analyse Ihrer bestehenden Systeme und Situation mit Blick auf die Zukunft
  • Individuelle Lösungen für Ihre Bedürfnisse
  • Zukunftsorientierte Technologieberatung
  • -

    Systemadministration

    Professionelle Verwaltung und Wartung Ihrer IT-Systeme

  • Server-Management
  • -
  • Netzwerkadministration
  • -
  • Backup-Konzepte
  • -
  • Security-Lösungen
  • +
  • Netzwerkadministration
  • +
  • Backup-Konzepte
  • +
  • Security-Lösungen
  • @@ -79,21 +80,21 @@

    Self-Hosted & Cloud Solutions

    -

  • Wartung von Cloud- oder Self-Hosted-Infrastrukturen
  • -
  • Planung, Migration und Administration
  • +

    +

  • Wartung von Cloud- oder Self-Hosted-Infrastrukturen
  • +
  • Planung, Migration und Administration
  • +

    Kernkompetenzen

  • Microsoft Infrastrukturen (M365, Azure, AD, Windows Server, DNS, DHCP)
  • -
  • Linux-Server (RedHat or Debian based distributions)
  • -
  • Virtualisierung (Proxmox, vSphere, Xen Server)
  • -
  • Netzwerktechnik (Secure Point, Cisco, Mikrotik)
  • -
  • Sicherheit (Firewalls, VPN, Antivirus, Backup)
  • -
  • Automatisierung (Ansible, PowerShell, Bash).
  • +
  • Linux-Server (RedHat or Debian based distributions)
  • +
  • Virtualisierung (Proxmox, vSphere, Xen Server)
  • +
  • Netzwerktechnik (Secure Point, Cisco, Mikrotik)
  • +
  • Sicherheit (Firewalls, VPN, Antivirus, Backup)
  • +
  • Automatisierung (Ansible, PowerShell, Bash).
  • - -
    diff --git a/public/js/components.js b/public/js/components.js index 6d975be..05014f6 100644 --- a/public/js/components.js +++ b/public/js/components.js @@ -24,14 +24,58 @@ document.addEventListener('DOMContentLoaded', function() { loadComponent('components/footer.html', 'beforeend') ]).then(results => { if (results.every(Boolean)) { - // Dispatch custom event when all components are loaded document.dispatchEvent(new Event('componentsLoaded')); + initializeTooltips(); } }).catch(error => { console.warn('Error loading components:', error); }); - // Initialize header functionality after it's loaded + // Initialize tooltip functionality + function initializeTooltips() { + const tooltipContainers = document.querySelectorAll('.tooltip-container'); + + tooltipContainers.forEach(container => { + container.addEventListener('click', function(e) { + // Prevent click from propagating if clicking inside the content when expanded + if (this.classList.contains('active') && + e.target.closest('.tooltip-content') && + !e.target.closest('.tooltip-header')) { + return; + } + + // Toggle current container + this.classList.toggle('active'); + + // Close other containers + tooltipContainers.forEach(otherContainer => { + if (otherContainer !== this && otherContainer.classList.contains('active')) { + otherContainer.classList.remove('active'); + } + }); + }); + }); + + // Close tooltips when clicking outside + document.addEventListener('click', function(e) { + if (!e.target.closest('.tooltip-container')) { + tooltipContainers.forEach(container => { + container.classList.remove('active'); + }); + } + }); + + // Handle escape key + document.addEventListener('keydown', function(e) { + if (e.key === 'Escape') { + tooltipContainers.forEach(container => { + container.classList.remove('active'); + }); + } + }); + } + + // Initialize header functionality function initializeHeader() { const header = document.querySelector('header'); if (!header) return;