Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,22 @@

## [Unreleased]

### Added
- Added square modern PWA and apple-touch-icon (`img/psugh-icon.webp`) in WebP format to resolve PWA verification warnings and fix icon squashing on iOS.
- Added preloading for hero background image `img/hintergrund.webp` and minified styles on `index.html`, `events.html`, and `impressum.html` to improve Largest Contentful Paint (LCP) performance.
- Added preloading for JSON data files on `events.html` to load event data as early as possible.

### Changed
- Refactored `events.html` JavaScript to consolidate network fetches, loading all three JSON data files in parallel only once at the page level.
- Combined next meeting details with upcoming events on `events.html` to display the next meeting within the "Kommende Treffen" list.
- Improved color contrast of the terminal window (body background, header background, title text, command text, and prompt prefix) to fully comply with WCAG 2.1 AAA accessibility contrast requirements.
- Added default underlines to all links nested inside paragraph text (`p a`) to satisfy WCAG 2.1 link recognition accessibility guidelines.
- Separated the access code and copy button from the 'Online teilnehmen' anchor link in the hero section to fix illegal nesting of interactive content and resolve overlapping touch target issues.
- Increased the size of all copy buttons (`.copy-btn`) to `44x44px` to fulfill WCAG mobile touch target size requirements.
- Fixed structured data warning false-positives for `noindex` pages (such as `impressum.html`) in the SEO validator.
- Refactored `validate-seo.js` to dynamically scan the `ressourcen/` directory for article pages, ensuring `erroractionpreference.html` and any future resources are automatically validated without manual list updates.
- Updated article generator `New-ResourceArticel.ps1` to remove instructions for manual updates to the SEO validator.

## [3.1.0] - 2026-06-16
### Added
- Added June 19th social event ("Bier, Kicker & PowerShell-Talks") with a custom WebP Lego foosball graphic (`img/psugh_social.webp`).
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ Wir bieten Tutorials und Skripte in der Ressourcen-Sektion an. Der Workflow für
1. Führe `./scripts/New-ResourceArticel.ps1` aus. Das Skript fragt Titel, Slug und Meta-Description ab und erstellt eine fertige Vorlage in `/ressourcen`.
2. Trage den neuen Artikel auf der Übersichtsseite in `ressourcen/index.html` ein. Diese Datei dient als die zentrale *Single Source of Truth* für die Artikelreihenfolge.
3. Führe `./scripts/Update-ArticleNavigation.ps1` aus. Dies durchsucht die `index.html` und generiert völlig automatisiert dynamische **"Zurück/Weiter"** Hyperlinks in jedem Artikel.
4. Trage den Artikel im SEO-Prüfer (`scripts/validate-seo.js`) und in der Sitemap (`sitemap.xml`) ein.
4. Trage den Artikel in der Sitemap (`sitemap.xml`) ein (der SEO-Prüfer `scripts/validate-seo.js` scannt neue Artikel automatisch).

## 🎨 Design System

Expand Down
107 changes: 89 additions & 18 deletions css/styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,20 @@ button:focus-visible {
outline: 3px solid var(--primary-color);
outline-offset: 3px;
}
/* High contrast focus outline for elements on dark backgrounds */
.hero-header :focus-visible,
.mobile-menu :focus-visible,
.terminal-window :focus-visible,
.site-footer :focus-visible,
.hero-room-code-container .copy-btn:focus-visible {
outline: 3px solid rgb(255 255 255);
outline-offset: 3px;
}
/* Focus visible outline for calendar cells with events */
.calendar-day.has-event:focus-visible {
outline: 3px solid var(--accent-color);
outline-offset: -3px;
}
:root {
--primary-color: #0073ae;
--primary-light: #4a9bc9;
Expand Down Expand Up @@ -155,6 +169,10 @@ a:focus {
outline: 2px solid var(--primary-color);
outline-offset: 2px;
}
p a {
text-decoration: underline;
text-underline-offset: 2px;
}
.skip-link {
position: absolute;
top: -40px;
Expand Down Expand Up @@ -493,7 +511,7 @@ a:focus {
font-size: var(--font-size-lg);
}
.terminal-window {
background: var(--bg-dark);
background: #0f172a;
border-radius: var(--border-radius-lg);
overflow: hidden;
box-shadow: var(--shadow-xl);
Expand All @@ -503,7 +521,7 @@ a:focus {
margin-right: auto;
}
.terminal-header {
background: #1a1f2e;
background: #1e293b;
padding: var(--spacing-md);
display: flex;
align-items: center;
Expand All @@ -529,15 +547,15 @@ a:focus {
background: var(--success-color);
}
.terminal-title {
color: var(--text-secondary);
color: #cbd5e1;
font-size: var(--font-size-sm);
font-weight: var(--font-weight-medium);
}
.terminal-content {
padding: var(--spacing-xl);
}
.terminal-command {
color: var(--success-color);
color: #4ade80;
font-family: var(--font-family-mono);
font-size: var(--font-size-base);
line-height: var(--line-height-relaxed);
Expand All @@ -548,7 +566,7 @@ a:focus {
}
.command-line::before {
content: 'PS C: \\> ';
color: #09f;
color: #38bdf8;
}
.command-line:not(:first-child)::before {
content: '>> ';
Expand Down Expand Up @@ -798,7 +816,7 @@ a:focus {
color: var(--social-linkedin);
background: rgb(0 119 181 / 1%);
}
.location-map iframe {
.meeting-location iframe {
display: block;
width: 100%;
max-width: 100%;
Expand Down Expand Up @@ -873,6 +891,14 @@ a:focus {
max-width: 300px;
text-align: center;
}
.online-join-group {
width: 100%;
max-width: 300px;
}
.online-join-group .btn {
width: 100%;
max-width: 100%;
}
.meeting-links {
flex-direction: column;
align-items: center;
Expand Down Expand Up @@ -1037,6 +1063,11 @@ button:focus {
padding: 0.5rem;
border-radius: 50%;
transition: background-color 0.3s;
min-width: 44px;
min-height: 44px;
display: inline-flex;
align-items: center;
justify-content: center;
}
.calendar-nav:hover {
background-color: var(--bg-secondary);
Expand Down Expand Up @@ -1115,6 +1146,23 @@ button:focus {
transform: translateY(-4px);
box-shadow: 0 8px 15px rgb(0 0 0 / 15%);
}
.event-card.highlight-flash {
animation: flash-animation 2s ease;
}
@keyframes flash-animation {
0% {
background-color: var(--bg-primary);
box-shadow: 0 4px 6px rgb(0 0 0 / 1%);
}
15% {
background-color: rgb(0 115 174 / 15%);
box-shadow: 0 0 15px rgb(0 115 174 / 40%);
}
100% {
background-color: var(--bg-primary);
box-shadow: 0 4px 6px rgb(0 0 0 / 1%);
}
}
.resource-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
Expand Down Expand Up @@ -1252,15 +1300,17 @@ button:focus {
background: 0 0;
border: none;
cursor: pointer;
padding: 4px;
padding: 8px;
margin-left: 4px;
border-radius: 4px;
border-radius: 6px;
display: inline-flex;
align-items: center;
justify-content: center;
vertical-align: middle;
transition: background-color var(--transition-fast);
color: var(--text-secondary);
min-width: 44px;
min-height: 44px;
}
.copy-btn:hover {
background-color: var(--bg-tertiary);
Expand All @@ -1276,22 +1326,43 @@ button:focus {
.copy-btn.success {
color: var(--success-color);
}
.btn-secondary small {
.online-join-group {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 4px;
margin-top: 4px;
gap: var(--spacing-sm);
}
.hero-room-code-container {
display: inline-flex;
align-items: center;
gap: var(--spacing-sm);
font-size: var(--font-size-sm);
color: rgb(255 255 255 / 90%);
background: rgb(255 255 255 / 10%);
backdrop-filter: blur(5px);
-webkit-backdrop-filter: blur(5px);
padding: 2px 2px 2px 12px;
border-radius: 22px;
border: 1px solid rgb(255 255 255 / 15%);
height: 44px;
}
.hero-room-code-container code {
font-family: var(--font-family-mono);
color: #fff;
font-weight: var(--font-weight-semibold);
background: var(--primary-color);
padding: 2px 6px;
border-radius: 4px;
}
.btn-secondary .copy-btn {
color: rgb(255 255 255 / 8%);
padding: 2px;
.hero-room-code-container .copy-btn {
color: rgb(255 255 255 / 70%);
margin-left: 0;
}
.btn-secondary .copy-btn:hover {
background-color: rgb(255 255 255 / 1%);
.hero-room-code-container .copy-btn:hover {
color: #fff;
background-color: rgb(255 255 255 / 10%);
}
.btn-secondary .copy-btn.success {
.hero-room-code-container .copy-btn.success {
color: var(--success-color);
}
.article-card {
Expand Down
4 changes: 2 additions & 2 deletions css/styles.min.css

Large diffs are not rendered by default.

Loading
Loading