perf+a11y: heading order, image dimensions, static cache headers

- Fix heading hierarchy: H4→H3 in "Dlaczego warto?" section (6 cards)
  to maintain sequential H1→H2→H3 order (accessibility)
- Add explicit width/height to logo images in header/footer (CLS)
- Add Cache-Control: 30 days for /static/ assets (performance)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maciej Pienczyn 2026-04-07 18:00:21 +02:00
parent d8d3c2edf4
commit f86e870ff0
3 changed files with 13 additions and 9 deletions

4
app.py
View File

@ -793,6 +793,10 @@ def set_security_headers(response):
response.headers['Referrer-Policy'] = 'strict-origin-when-cross-origin'
response.headers['Permissions-Policy'] = 'camera=(), microphone=(), geolocation=(self)'
# Cache static assets (CSS, JS, images, fonts)
if request.path.startswith('/static/'):
response.headers['Cache-Control'] = 'public, max-age=2592000' # 30 days
# Freshness signal for SEO crawlers
if response.content_type and 'text/html' in response.content_type and 'Last-Modified' not in response.headers:
from email.utils import formatdate

View File

@ -1544,7 +1544,7 @@
<div class="container">
<nav role="navigation" aria-label="Main navigation">
<a href="{{ url_for('index') }}" class="nav-brand" aria-label="Norda Biznes Home">
<img src="{{ url_for('static', filename='img/norda-logo.svg') }}" alt="Norda Biznes" height="36" style="object-fit: contain;">
<img src="{{ url_for('static', filename='img/norda-logo.svg') }}" alt="Norda Biznes" width="80" height="36" style="object-fit: contain;">
</a>
{% if not current_user.is_authenticated %}<span class="nav-title">Norda Biznes Partner</span>{% endif %}
@ -2050,7 +2050,7 @@
<div class="container">
<div class="footer-content">
<div class="footer-section">
<img src="{{ url_for('static', filename='img/norda-logo.svg') }}" alt="Norda Biznes" height="48" style="margin-bottom: 12px; display: block;">
<img src="{{ url_for('static', filename='img/norda-logo.svg') }}" alt="Norda Biznes" width="107" height="48" style="margin-bottom: 12px; display: block;">
<h3>Norda Biznes Partner</h3>
<p>Strefa partnera Stowarzyszenia Norda Biznes - networking i współpraca biznesowa.</p>
</div>
@ -2081,7 +2081,7 @@
<div class="footer-creator">
<span>Stworzone przez</span>
<a href="https://inpi.pl" target="_blank" rel="noopener" class="creator-link">
<img src="{{ url_for('static', filename='img/INPI_LOGO_white_background.png') }}" alt="INPI" class="creator-logo">
<img src="{{ url_for('static', filename='img/INPI_LOGO_white_background.png') }}" alt="INPI" class="creator-logo" width="49" height="28">
</a>
</div>
<p>&copy; {{ current_year }} INPI. Wszelkie prawa zastrzeżone.</p>

View File

@ -572,32 +572,32 @@
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: var(--spacing-lg);">
<div style="background: white; padding: var(--spacing-lg); border-radius: var(--radius-lg); border-left: 4px solid var(--primary); box-shadow: var(--shadow); transition: all 0.3s ease;" onmouseover="this.style.transform='translateY(-4px)'; this.style.boxShadow='0 10px 25px rgba(0,0,0,0.1)'" onmouseout="this.style.transform=''; this.style.boxShadow='0 1px 3px rgba(0,0,0,0.1)'">
<h4 style="font-size: var(--font-size-lg); margin-bottom: var(--spacing-sm); color: var(--text-primary);">🤝 Szukasz podwykonawcy?</h4>
<h3 style="font-size: var(--font-size-lg); margin-bottom: var(--spacing-sm); color: var(--text-primary);">🤝 Szukasz podwykonawcy?</h3>
<p style="color: var(--text-secondary); font-size: var(--font-size-sm);">Znajdź firmę z konkretnymi kompetencjami i certyfikatami. Masz od razu telefon i email.</p>
</div>
<div style="background: white; padding: var(--spacing-lg); border-radius: var(--radius-lg); border-left: 4px solid var(--success);">
<h4 style="font-size: var(--font-size-lg); margin-bottom: var(--spacing-sm); color: var(--text-primary);">💼 Potrzebujesz usługi?</h4>
<h3 style="font-size: var(--font-size-lg); margin-bottom: var(--spacing-sm); color: var(--text-primary);">💼 Potrzebujesz usługi?</h3>
<p style="color: var(--text-secondary); font-size: var(--font-size-sm);">Zapytaj AI "kto robi X?" i dostaniesz listę firm z pełnymi danymi kontaktowymi.</p>
</div>
<div style="background: white; padding: var(--spacing-lg); border-radius: var(--radius-lg); border-left: 4px solid var(--warning);">
<h4 style="font-size: var(--font-size-lg); margin-bottom: var(--spacing-sm); color: var(--text-primary);">📊 Sprawdzasz NIP/REGON?</h4>
<h3 style="font-size: var(--font-size-lg); margin-bottom: var(--spacing-sm); color: var(--text-primary);">📊 Sprawdzasz NIP/REGON?</h3>
<p style="color: var(--text-secondary); font-size: var(--font-size-sm);">Wszystkie dane rejestrowe firm członkowskich w jednym miejscu.</p>
</div>
<div style="background: white; padding: var(--spacing-lg); border-radius: var(--radius-lg); border-left: 4px solid var(--error);">
<h4 style="font-size: var(--font-size-lg); margin-bottom: var(--spacing-sm); color: var(--text-primary);">🎯 Szukasz partnera lokalnie?</h4>
<h3 style="font-size: var(--font-size-lg); margin-bottom: var(--spacing-sm); color: var(--text-primary);">🎯 Szukasz partnera lokalnie?</h3>
<p style="color: var(--text-secondary); font-size: var(--font-size-sm);">Filtruj po lokalizacji - Wejherowo, Reda, Rumia, powiat wejherowski i województwo pomorskie.</p>
</div>
<div style="background: white; padding: var(--spacing-lg); border-radius: var(--radius-lg); border-left: 4px solid var(--primary);">
<h4 style="font-size: var(--font-size-lg); margin-bottom: var(--spacing-sm); color: var(--text-primary);">🔍 Sprawdzasz certyfikaty?</h4>
<h3 style="font-size: var(--font-size-lg); margin-bottom: var(--spacing-sm); color: var(--text-primary);">🔍 Sprawdzasz certyfikaty?</h3>
<p style="color: var(--text-secondary); font-size: var(--font-size-sm);">Zobacz które firmy mają ISO 9001, ISO 14001 i inne certyfikaty.</p>
</div>
<div style="background: white; padding: var(--spacing-lg); border-radius: var(--radius-lg); border-left: 4px solid var(--success);">
<h4 style="font-size: var(--font-size-lg); margin-bottom: var(--spacing-sm); color: var(--text-primary);">📱 Networking?</h4>
<h3 style="font-size: var(--font-size-lg); margin-bottom: var(--spacing-sm); color: var(--text-primary);">📱 Networking?</h3>
<p style="color: var(--text-secondary); font-size: var(--font-size-sm);">Poznaj wszystkich członków stowarzyszenia, ich profile i zakres działalności.</p>
</div>
</div>