ui(tour): permanenter Tour-Link in der Topbar + modernes Button-Styling

User-Feedback: Tour-Start muss auch nach dem ersten Mal möglich sein,
und die Buttons sahen "sehr 90er" aus.

Permanenter Tour-Zugang:
- Topbar-Link "🧭 Tour" neben Methodik/Quellen, sichtbar auf jeder
  Page mit ``window.GWOE_TOUR_STEPS`` (Antrag-Detail + Startseite).
- Per JS in base.html nach DOMContentLoaded sichtbar geschaltet.
- Style: dezente teal-Pille, kein dominanter Button.

Button-Modernisierung:
- ``.v2-chip`` und ``.v3-action-btn`` jetzt pill-shaped (border-radius
  999px statt 3px), mit transition + box-shadow on hover und subtle
  transform on active. Focus-visible mit klarem outline.
- Primary-Variante: teal-solid mit weichem Drop-Shadow, nicht das alte
  dark-Mode-Schwarz.
- Welcome-Banner (Startseite): scharfes ``v2-kasten outline-blue`` weg,
  stattdessen weicher gradient-Hintergrund teal→blue mit border 22%
  teal-Hauch und subtle box-shadow. Skip-Button als Text-Link
  ("Später") statt vollwertiger Chip — visuell klar nachgeordnet.
This commit is contained in:
Dotty Dotter 2026-05-09 03:31:09 +02:00
parent 6ec05d2b86
commit c3fd617585
4 changed files with 149 additions and 28 deletions

View File

@ -360,19 +360,31 @@ body.v2 strong, body.v2 b {
.v2-chip { .v2-chip {
border: 1px solid var(--hairline); border: 1px solid var(--hairline);
background: var(--paper); background: var(--paper);
padding: 5px 11px; padding: 6px 12px;
font-size: 12px; font-size: 12px;
color: var(--ecg-dark); color: var(--ecg-dark);
font-family: var(--font-sans); font-family: var(--font-sans);
font-weight: 400; font-weight: 500;
cursor: pointer; cursor: pointer;
white-space: nowrap; white-space: nowrap;
display: inline-block; display: inline-flex;
align-items: center;
gap: 6px;
border-radius: 999px; /* pill-style — runde Ecken statt eckig 90er */
line-height: 1.2;
transition: background 0.15s ease, border-color 0.15s ease,
box-shadow 0.15s ease, transform 0.05s ease;
} }
.v2-chip:hover { .v2-chip:hover {
border-color: var(--ecg-light); border-color: var(--ecg-teal);
background: var(--surface); background: var(--surface);
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.06);
}
.v2-chip:active { transform: translateY(1px); }
.v2-chip:focus-visible {
outline: 2px solid var(--ecg-teal);
outline-offset: 2px;
} }
.v2-chip.active, .v2-chip.active,
@ -380,9 +392,45 @@ body.v2 strong, body.v2 b {
background: var(--ecg-dark); background: var(--ecg-dark);
color: #fff; color: #fff;
border-color: var(--ecg-dark); border-color: var(--ecg-dark);
font-weight: 900; font-weight: 700;
} }
/* Primary-Variante: solid teal mit subtle shadow. Für Calls-to-Action
wie "Tour starten" hebt sich klar von neutralen Filter-Chips ab. */
.v2-chip.primary {
background: var(--ecg-teal);
color: #fff;
border-color: var(--ecg-teal);
font-weight: 600;
box-shadow: 0 2px 6px rgba(0, 130, 130, 0.18);
}
.v2-chip.primary:hover {
border-color: var(--ecg-teal);
background: color-mix(in srgb, var(--ecg-teal) 88%, #000);
box-shadow: 0 3px 10px rgba(0, 130, 130, 0.28);
}
/* Topbar-Link "🧭 Tour" — visueller Akzent ohne dominanten Button-Look. */
.v2-topbar-tour {
display: inline-flex;
align-items: center;
gap: 5px;
font-family: var(--font-mono);
font-size: 11px;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--ecg-teal);
background: color-mix(in srgb, var(--ecg-teal) 10%, transparent);
padding: 4px 10px;
border-radius: 999px;
text-decoration: none;
transition: background 0.15s ease;
}
.v2-topbar-tour:hover {
background: color-mix(in srgb, var(--ecg-teal) 18%, transparent);
}
.v2-topbar-tour[hidden] { display: none; }
.v2-chip.green.active, .v2-chip.green.active,
.v2-chip.green[data-active="true"] { .v2-chip.green[data-active="true"] {
background: var(--ecg-green); background: var(--ecg-green);

View File

@ -157,24 +157,47 @@
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
gap: 6px; gap: 6px;
padding: 5px 12px; padding: 6px 14px;
border: 1px solid var(--hairline); border: 1px solid var(--hairline);
border-radius: 3px; border-radius: 999px;
background: var(--paper); background: var(--paper);
color: var(--ecg-dark); color: var(--ecg-dark);
font-family: var(--font-mono); font-family: var(--font-mono);
font-size: 11px; font-size: 11px;
font-weight: 500;
cursor: pointer; cursor: pointer;
text-decoration: none; text-decoration: none;
transition: background 0.15s ease, border-color 0.15s ease,
box-shadow 0.15s ease, transform 0.05s ease;
}
.v3-action-btn:hover {
border-color: var(--ecg-teal);
color: var(--ecg-teal);
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.06);
}
.v3-action-btn:active { transform: translateY(1px); }
.v3-action-btn:focus-visible {
outline: 2px solid var(--ecg-teal);
outline-offset: 2px;
}
.v3-action-btn:disabled {
opacity: 0.4;
cursor: not-allowed;
box-shadow: none;
} }
.v3-action-btn:hover { border-color: var(--ecg-blue); color: var(--ecg-blue); }
.v3-action-btn.primary { .v3-action-btn.primary {
background: var(--ecg-blue); background: var(--ecg-teal);
color: #fff; color: #fff;
border-color: var(--ecg-blue); border-color: var(--ecg-teal);
font-weight: 700; font-weight: 600;
box-shadow: 0 2px 6px rgba(0, 130, 130, 0.18);
}
.v3-action-btn.primary:hover {
background: color-mix(in srgb, var(--ecg-teal) 88%, #000);
border-color: color-mix(in srgb, var(--ecg-teal) 88%, #000);
color: #fff;
box-shadow: 0 3px 10px rgba(0, 130, 130, 0.28);
} }
.v3-action-btn.primary:hover { background: var(--ecg-dark); border-color: var(--ecg-dark); color: #fff; }
.v3-action-btn.v3-action-muted { opacity: 0.8; } .v3-action-btn.v3-action-muted { opacity: 0.8; }
/* ── 6. Programm-Treue ─────────────────────────────────────────────── */ /* ── 6. Programm-Treue ─────────────────────────────────────────────── */

View File

@ -83,6 +83,12 @@
<span class="v2-topbar-spacer"></span> <span class="v2-topbar-spacer"></span>
<a href="/methodik">{{ icon("info", 13) }} Methodik</a> <a href="/methodik">{{ icon("info", 13) }} Methodik</a>
<a href="/quellen">{{ icon("book-open", 13) }} Quellen</a> <a href="/quellen">{{ icon("book-open", 13) }} Quellen</a>
{# Tour-Link: nur sichtbar wenn die aktuelle Page Tour-Stationen
definiert hat (window.GWOE_TOUR_STEPS). Wird per JS unten ge-toggled. #}
<a href="#" id="v2-topbar-tour" class="v2-topbar-tour" hidden
onclick="event.preventDefault(); if (window.gwoeTourStart) gwoeTourStart();">
🧭 <span>Tour</span>
</a>
{# ── Globaler Bundesland-Selector ─────────────────────────────────── #} {# ── Globaler Bundesland-Selector ─────────────────────────────────── #}
<select id="v2-global-bl" <select id="v2-global-bl"
@ -323,6 +329,18 @@
})(); })();
</script> </script>
<script>
/* Tour-Link in der Topbar nur einblenden, wenn die aktuelle Page eine
Tour definiert hat (window.GWOE_TOUR_STEPS). Wird auf jeder Page mit
{% include "v3/components/tour.html" %} sichtbar. */
document.addEventListener('DOMContentLoaded', function () {
var link = document.getElementById('v2-topbar-tour');
if (link && Array.isArray(window.GWOE_TOUR_STEPS) && window.GWOE_TOUR_STEPS.length > 0) {
link.hidden = false;
}
});
</script>
{# Feedback/Bug-Report-Widget — öffnet Gitea-Issues direkt aus dem Browser #} {# Feedback/Bug-Report-Widget — öffnet Gitea-Issues direkt aus dem Browser #}
{% include "v2/components/feedback_widget.html" %} {% include "v2/components/feedback_widget.html" %}

View File

@ -10,18 +10,20 @@
{% block main %} {% block main %}
{# ── Welcome-Banner: Tour-Einstieg für Erst-Besucher:innen (#185) ── #} {# ── Welcome-Banner: Tour-Einstieg für Erst-Besucher:innen (#185) ── #}
<div id="gwoe-welcome-banner" class="v2-kasten outline-blue gwoe-welcome-banner" hidden> <aside id="gwoe-welcome-banner" class="gwoe-welcome-banner" hidden role="region"
aria-label="Willkommen — Tour-Einstieg">
<span aria-hidden="true" class="gwoe-welcome-icon">🧭</span>
<div class="gwoe-welcome-text"> <div class="gwoe-welcome-text">
<strong>Du bist neu hier?</strong> <strong>Du bist neu hier?</strong>
Soll ich dir die Seite erklären? Eine geführte Tour mit Sprachausgabe — du kannst sie jederzeit abbrechen. Soll ich dir die Seite kurz erklären? Geführte Tour mit Sprachausgabe — jederzeit abbrechbar.
</div> </div>
<div class="gwoe-welcome-actions"> <div class="gwoe-welcome-actions">
<button type="button" onclick="gwoeTourStart()" class="v2-chip primary" <button type="button" onclick="gwoeTourStart()" class="v2-chip primary"
id="gwoe-welcome-start">🧭 Tour starten</button> id="gwoe-welcome-start">Tour starten</button>
<button type="button" onclick="gwoeWelcomeDismiss()" class="v2-chip" <button type="button" onclick="gwoeWelcomeDismiss()" class="gwoe-welcome-skip"
id="gwoe-welcome-dismiss">Nein, danke</button> id="gwoe-welcome-dismiss" aria-label="Banner schließen">Später</button>
</div>
</div> </div>
</aside>
{# ── Toolbar: Suche ──────────────────────────────────────────────── #} {# ── Toolbar: Suche ──────────────────────────────────────────────── #}
{# BL-Filter läuft jetzt über den globalen Selector in der Topbar. #} {# BL-Filter läuft jetzt über den globalen Selector in der Topbar. #}
@ -359,28 +361,58 @@ kbd {
.gwoe-welcome-banner { .gwoe-welcome-banner {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 16px; gap: 14px;
flex-wrap: wrap; flex-wrap: wrap;
margin-bottom: 12px; margin-bottom: 14px;
padding: 14px 18px;
border-radius: 12px;
/* dezent-warmer Hint statt scharfes Outline-Kasten */
background: linear-gradient(
135deg,
color-mix(in srgb, var(--ecg-teal) 6%, var(--surface)) 0%,
color-mix(in srgb, var(--ecg-blue) 4%, var(--surface)) 100%
);
border: 1px solid color-mix(in srgb, var(--ecg-teal) 22%, transparent);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);
} }
.gwoe-welcome-banner[hidden] { display: none !important; } .gwoe-welcome-banner[hidden] { display: none !important; }
.gwoe-welcome-icon {
font-size: 22px;
flex-shrink: 0;
filter: drop-shadow(0 1px 1px rgba(0, 0, 0, 0.08));
}
.gwoe-welcome-text { .gwoe-welcome-text {
flex: 1 1 320px; flex: 1 1 320px;
font-size: 13px; font-size: 14px;
line-height: 1.5; line-height: 1.55;
color: var(--ecg-dark); color: var(--ecg-dark);
} }
.gwoe-welcome-text strong {
font-weight: 700;
color: var(--ecg-teal);
}
.gwoe-welcome-actions { .gwoe-welcome-actions {
display: flex; display: flex;
gap: 8px; gap: 4px;
align-items: center; align-items: center;
} }
.v2-chip.primary { .gwoe-welcome-skip {
background: var(--ecg-teal); background: none;
color: #fff; border: none;
border-color: var(--ecg-teal); color: var(--ecg-dark);
font-size: 12px;
font-family: var(--font-mono);
letter-spacing: 0.04em;
opacity: 0.55;
padding: 6px 10px;
cursor: pointer;
border-radius: 999px;
transition: opacity 0.15s ease, background 0.15s ease;
}
.gwoe-welcome-skip:hover {
opacity: 0.9;
background: color-mix(in srgb, var(--ecg-dark) 6%, transparent);
} }
.v2-chip.primary:hover { opacity: 0.92; }
</style> </style>
<script> <script>