Vier Ansichten in einer Seite: Anmeldung, Passwort festlegen ueber den
Einladungslink, Uebersicht, Projektdetail. 71 Textbausteine in fuenf
Sprachen.
Korrektur an einer frueheren Entscheidung: Ich hatte das Portal als "nur
Deutsch" eingestuft wie die Verwaltung. Denkfehler -- die Verwaltung
nutzen Dogfather und VanVan, das PORTAL nutzen Kunden, und die koennen
Franzosen oder Portugiesen sein. Jetzt fuenfsprachig, und die Sprache des
Kunden wird bei der Anmeldung automatisch uebernommen.
Gestaltungsentscheidungen:
* Eine Phasenleiste zeigt auf einen Blick, wo das Projekt steht. Das ist
die haeufigste Frage ueberhaupt und der Grund, warum Kunden anrufen.
Bei pausierten oder abgebrochenen Projekten wird KEINE Leiste gezeigt --
ein Fortschrittsbalken waere dort irrefuehrend.
* Eine Marke sagt, wer gerade am Zug ist ("Wir warten auf dich" /
"Dogfather ist dran"). Das beendet die haeufigste Unklarheit im
Projektverlauf.
* Offene Zahlungen stehen ganz oben und in Gold -- das Einzige, was den
Kunden wirklich zum Handeln auffordert.
* Rueckfrage nur beim ANNEHMEN eines Zusatzangebots, nicht beim Ablehnen.
Annehmen erzeugt eine Zahlungspflicht, Ablehnen ist folgenlos.
* Abgelaufene Sitzung fuehrt zur Anmeldung mit klarer Ansage statt zu
einer leeren Seite, die wie "du hast keine Projekte" aussaehe.
* Der Einladungslink wird nach Gebrauch aus der Adresszeile entfernt --
er ist verbraucht und hat in der Chronik nichts verloren.
* Die Zahlungsknoepfe sagen ehrlich, dass PayPal noch eingerichtet wird,
statt so zu tun als wuerde etwas passieren.
Pruefskript zweimal geschaerft, beide Male waren es Fehlalarme:
* Die Heuristik fuer Nachschlagetabellen hielt gewoehnliche Woerter wie
"abnahme" und "uebergeben" fuer Woerterbuch-Schluessel. Jetzt muss ein
Unterstrich im Namen sein, so wie bei allen echten Schluesseln.
* Eine Ueberschrift gilt jetzt auch als uebersetzt, wenn die Uebersetzung
INNEN sitzt (fester Teil + dynamischer Teil).
i18n vollstaendig, 45/45 Handy-Abnahme.
Co-Authored-By: Claude Opus 5 <[email protected]>
142 lines
7.3 KiB
HTML
142 lines
7.3 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="de" data-i18n-titel="seiten_titel">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>Kundenportal — Dogfather Webdesign</title>
|
|
<meta name="robots" content="noindex, nofollow, noarchive" />
|
|
<link rel="icon" type="image/png" href="/assets/img/favicon.png" />
|
|
<meta name="theme-color" content="#05070b" />
|
|
<link rel="manifest" href="/webdesign/app.webmanifest" />
|
|
<link rel="apple-touch-icon" href="/assets/img/wd-app-180.png" />
|
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
|
<meta name="apple-mobile-web-app-title" content="Dogfather Webdesign" />
|
|
<link rel="stylesheet" href="/assets/css/main.css?v=20260822wd2" />
|
|
<link rel="stylesheet" href="/assets/css/webdesign.css?v=20260822wd2" />
|
|
<style>
|
|
.po-login { max-width: 440px; margin: clamp(1.5rem,6vh,4rem) auto; }
|
|
|
|
.po-kopf { display: flex; flex-wrap: wrap; align-items: center; gap: .8rem; margin-bottom: 1.4rem; }
|
|
.po-kopf h1 { margin: 0; font-size: clamp(1.4rem,3.4vw,2rem); }
|
|
.po-kopf .wd-btn { margin-left: auto; }
|
|
|
|
/* Projektkarte in der Übersicht */
|
|
.po-projekt { display: block; width: 100%; text-align: left; cursor: pointer; margin-bottom: .8rem; }
|
|
.po-projekt-kopf { display: flex; flex-wrap: wrap; align-items: center; gap: .6rem; margin-bottom: .5rem; }
|
|
.po-projekt-nr { font-family: var(--font-head); font-weight: 800; font-size: .8rem; color: var(--wd-blau); }
|
|
.po-projekt h3 { margin: 0; flex: 1; min-width: 0; }
|
|
|
|
/* Fortschrittsleiste über die Projektphasen.
|
|
Zeigt auf einen Blick, wo das Projekt steht — die häufigste Frage
|
|
überhaupt, und der Grund, warum Kunden anrufen. */
|
|
.po-phasen { display: flex; gap: 3px; margin: .8rem 0 .6rem; }
|
|
.po-phase { flex: 1; height: 6px; border-radius: 999px; background: rgba(127,208,232,.13); }
|
|
.po-phase.po-erledigt { background: var(--wd-blau-tief); }
|
|
.po-phase.po-jetzt { background: var(--wd-blau); box-shadow: 0 0 10px rgba(127,208,232,.6); }
|
|
.po-phasen-text { font-size: .82rem; color: var(--wd-text-soft); }
|
|
|
|
.po-wartet {
|
|
display: inline-flex; align-items: center; gap: .35rem;
|
|
padding: .25rem .65rem; border-radius: 999px; font-size: .78rem; font-weight: 700;
|
|
}
|
|
.po-wartet--kunde { background: rgba(232,200,119,.16); color: var(--wd-gold); }
|
|
.po-wartet--dogfather { background: rgba(127,208,232,.14); color: var(--wd-blau); }
|
|
|
|
.po-liste { list-style: none; margin: 0; padding: 0; }
|
|
.po-eintrag {
|
|
display: flex; flex-wrap: wrap; align-items: center; gap: .5rem .9rem;
|
|
padding: .8rem 0; border-bottom: 1px solid var(--wd-rand);
|
|
}
|
|
.po-eintrag:last-child { border-bottom: none; }
|
|
.po-eintrag-haupt { flex: 1; min-width: 0; }
|
|
.po-eintrag-name { color: var(--wd-text); font-weight: 600; overflow-wrap: break-word; }
|
|
.po-eintrag-neben { font-size: .84rem; color: var(--wd-text-soft); }
|
|
|
|
.po-nachricht { padding: .8rem 1rem; border-radius: 14px; margin-bottom: .6rem; max-width: 88%; }
|
|
.po-nachricht--ich { background: rgba(127,208,232,.1); border: 1px solid var(--wd-rand-stark); margin-left: auto; }
|
|
.po-nachricht--du { background: rgba(16,26,41,.7); border: 1px solid var(--wd-rand); }
|
|
.po-nachricht-kopf { font-size: .74rem; color: var(--wd-text-soft); margin-bottom: .25rem; }
|
|
.po-nachricht p { margin: 0; font-size: .95rem; white-space: pre-wrap; color: var(--wd-text); }
|
|
|
|
.po-idee { padding: 1rem; border-radius: 14px; border: 1px solid var(--wd-rand); background: rgba(16,26,41,.5); margin-bottom: .7rem; }
|
|
.po-idee-kopf { display: flex; flex-wrap: wrap; align-items: baseline; gap: .5rem; margin-bottom: .4rem; }
|
|
.po-idee-kopf h4 { margin: 0; flex: 1; min-width: 0; }
|
|
.po-idee--offen { border-color: rgba(232,200,119,.4); background: rgba(232,200,119,.05); }
|
|
|
|
.po-laedt { text-align: center; padding: 2.5rem 1rem; color: var(--wd-text-soft); }
|
|
</style>
|
|
</head>
|
|
<body class="wd">
|
|
|
|
<div id="wd-kopf" data-wd-kopf="minimal"></div>
|
|
|
|
<main id="wd-inhalt">
|
|
<section class="wd-abschnitt" style="padding-top:1.6rem">
|
|
<div class="wd-container wd-container--schmal">
|
|
|
|
<div class="wd-meldung" id="po-meldung" hidden></div>
|
|
|
|
<!-- ============ ANMELDUNG ============ -->
|
|
<div id="po-anmeldung" class="wd-karte po-login" hidden>
|
|
<h1 style="font-size:1.5rem" data-i18n="po_login_h1">Dein Projektraum</h1>
|
|
<p class="wd-klein wd-leise" data-i18n="po_login_text">Hier siehst du deinen Projektstand, alle Dateien und offene Punkte.</p>
|
|
<form id="po-login-form" novalidate>
|
|
<div class="wd-feld" id="po-feld-email">
|
|
<label for="po-email" data-i18n="po_email">E-Mail</label>
|
|
<input type="email" id="po-email" autocomplete="username" inputmode="email" />
|
|
</div>
|
|
<div class="wd-feld" id="po-feld-passwort">
|
|
<label for="po-passwort" data-i18n="po_passwort">Passwort</label>
|
|
<input type="password" id="po-passwort" autocomplete="current-password" />
|
|
<p class="wd-feld-fehler"></p>
|
|
</div>
|
|
<button type="submit" class="wd-btn wd-btn--haupt wd-btn--breit" data-i18n="po_anmelden">Anmelden</button>
|
|
</form>
|
|
<p class="wd-klein wd-leise" style="margin:1rem 0 0" data-i18n="po_kein_zugang">Noch keinen Zugang? Der Projektraum wird freigeschaltet, sobald dein Projekt beginnt.</p>
|
|
</div>
|
|
|
|
<!-- ============ PASSWORT SETZEN ============ -->
|
|
<div id="po-setzen" class="wd-karte po-login" hidden>
|
|
<h1 style="font-size:1.5rem" data-i18n="po_setz_h1">Passwort festlegen</h1>
|
|
<p class="wd-klein wd-leise" data-i18n="po_setz_text">Wähl ein Passwort für deinen Projektraum. Ein kurzer Satz ist sicherer und leichter zu merken als ein kryptisches Wort.</p>
|
|
<p id="po-setz-fuer" class="wd-klein" style="color:var(--wd-blau)"></p>
|
|
<form id="po-setz-form" novalidate>
|
|
<div class="wd-feld" id="po-feld-neu">
|
|
<label for="po-neu" data-i18n="po_passwort">Passwort</label>
|
|
<input type="password" id="po-neu" autocomplete="new-password" />
|
|
<p class="wd-feld-fehler"></p>
|
|
</div>
|
|
<button type="submit" class="wd-btn wd-btn--haupt wd-btn--breit" data-i18n="po_setz_knopf">Passwort speichern</button>
|
|
</form>
|
|
</div>
|
|
|
|
<!-- ============ ÜBERSICHT ============ -->
|
|
<div id="po-uebersicht" hidden>
|
|
<div class="po-kopf">
|
|
<h1><span data-i18n="po_hallo">Hallo</span> <span id="po-name">—</span></h1>
|
|
<button type="button" class="wd-btn wd-btn--still wd-btn--klein" id="po-abmelden" data-i18n="po_abmelden">Abmelden</button>
|
|
</div>
|
|
<div id="po-inhalt"><div class="po-laedt" data-i18n="laedt">Wird geladen…</div></div>
|
|
</div>
|
|
|
|
<!-- ============ PROJEKTDETAIL ============ -->
|
|
<div id="po-detail" hidden>
|
|
<div class="po-kopf">
|
|
<button type="button" class="wd-btn wd-btn--still wd-btn--klein" id="po-zurueck" data-i18n="po_zurueck">Zurück zur Übersicht</button>
|
|
</div>
|
|
<div id="po-detail-inhalt"><div class="po-laedt" data-i18n="laedt">Wird geladen…</div></div>
|
|
</div>
|
|
|
|
</div>
|
|
</section>
|
|
</main>
|
|
|
|
<div id="wd-fuss"></div>
|
|
|
|
<script src="/assets/js/i18n-wd-portal.js?v=20260822wd2"></script>
|
|
<script src="/assets/js/wd-core.js?v=20260822wd2"></script>
|
|
<script src="/assets/js/wd-portal.js?v=20260822wd2"></script>
|
|
</body>
|
|
</html>
|