Public-Auth-Seiten in Landingpage-Stil integrieren
- gemeinsames Public-CSS fuer Landingpage und Auth-Seiten ergaenzen - Login, Registrierung und Passwort-/E-Mail-Seiten vom App-Layout trennen - App-Sidebar von Public-Login- und Registrierungslinks bereinigen - Webspace- und Subdomain-Strategie dokumentieren
This commit is contained in:
@@ -0,0 +1,175 @@
|
||||
body.public-page {
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
.public-shell {
|
||||
min-height: 100vh;
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
.public-hero {
|
||||
min-height: 82vh;
|
||||
background-image: url("../images/landing-hero.png");
|
||||
background-size: cover;
|
||||
background-position: center right;
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 4rem 6vw;
|
||||
}
|
||||
|
||||
.public-hero:before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
background: rgba(255, 255, 255, 0.68);
|
||||
}
|
||||
|
||||
.public-nav {
|
||||
position: absolute;
|
||||
top: 1.5rem;
|
||||
left: 6vw;
|
||||
right: 6vw;
|
||||
z-index: 2;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.public-nav strong {
|
||||
color: #3d4449;
|
||||
font-family: "Roboto Slab", serif;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
.public-nav strong a {
|
||||
border-bottom: 0;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.public-nav .actions {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.public-hero-content {
|
||||
position: relative;
|
||||
max-width: 42rem;
|
||||
}
|
||||
|
||||
.public-hero h1 {
|
||||
margin-bottom: 0.35em;
|
||||
}
|
||||
|
||||
.public-hero p {
|
||||
color: #3d4449;
|
||||
font-size: 1.15em;
|
||||
max-width: 34rem;
|
||||
}
|
||||
|
||||
.public-section {
|
||||
padding: 4rem 6vw;
|
||||
}
|
||||
|
||||
.public-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||
gap: 1.25rem;
|
||||
max-width: 72rem;
|
||||
}
|
||||
|
||||
.public-feature,
|
||||
.public-panel {
|
||||
border: solid 1px rgba(210, 215, 217, 0.75);
|
||||
border-radius: 8px;
|
||||
padding: 1.5rem;
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
.public-feature h3 {
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.public-feature p {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.public-auth {
|
||||
min-height: 100vh;
|
||||
background-image: url("../images/landing-hero.png");
|
||||
background-size: cover;
|
||||
background-position: center right;
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 6rem 6vw 4rem 6vw;
|
||||
}
|
||||
|
||||
.public-auth:before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
background: rgba(255, 255, 255, 0.72);
|
||||
}
|
||||
|
||||
.public-auth-grid {
|
||||
position: relative;
|
||||
display: grid;
|
||||
grid-template-columns: minmax(18rem, 0.85fr) minmax(22rem, 1.15fr);
|
||||
gap: 2rem;
|
||||
align-items: start;
|
||||
width: min(72rem, 100%);
|
||||
}
|
||||
|
||||
.public-auth-copy {
|
||||
padding-top: 1.25rem;
|
||||
}
|
||||
|
||||
.public-auth-copy p {
|
||||
color: #3d4449;
|
||||
font-size: 1.05em;
|
||||
max-width: 30rem;
|
||||
}
|
||||
|
||||
.public-panel {
|
||||
box-shadow: 0 0.75rem 2.25rem rgba(61, 68, 73, 0.08);
|
||||
}
|
||||
|
||||
.public-panel h2 {
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.public-panel form {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.public-panel .actions {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 980px) {
|
||||
.public-hero {
|
||||
min-height: 78vh;
|
||||
padding: 5.5rem 2rem 3rem 2rem;
|
||||
background-position: center right 30%;
|
||||
}
|
||||
|
||||
.public-auth {
|
||||
padding: 5.5rem 2rem 3rem 2rem;
|
||||
background-position: center right 30%;
|
||||
}
|
||||
|
||||
.public-nav {
|
||||
left: 2rem;
|
||||
right: 2rem;
|
||||
}
|
||||
|
||||
.public-grid,
|
||||
.public-auth-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.public-section {
|
||||
padding: 3rem 2rem;
|
||||
}
|
||||
}
|
||||
@@ -138,6 +138,7 @@ email-verifikation-senden.php
|
||||
email-verifizieren.php
|
||||
landing.php
|
||||
assets/images/landing-hero.png
|
||||
assets/css/public.css
|
||||
```
|
||||
|
||||
Umgesetzter Umfang:
|
||||
@@ -153,8 +154,10 @@ Umgesetzter Umfang:
|
||||
- `konto.php` zeigt den aktuellen SaaS-Kontext fuer den angemeldeten User.
|
||||
- `functions.php` akzeptiert eine SaaS-Login-Session als erste Identitaetsquelle,
|
||||
laesst `DEV_AUTH_EMAIL` und `AUTH_USER` aber als Legacy-Fallback bestehen.
|
||||
- `footer.php` ist fuer nicht angemeldete Public-Seiten sicher und zeigt Links
|
||||
zu Login und Registrierung.
|
||||
- `footer.php` bleibt App-Sidebar und zeigt keine Public-Login- oder
|
||||
Registrierungslinks mehr.
|
||||
- Login, Registrierung, Passwort-Reset und E-Mail-Verifikation nutzen das
|
||||
Public-Layout im Stil der Landingpage.
|
||||
- Passwort-Reset erzeugt Single-Use-Tokens und speichert nur Token-Hashes.
|
||||
- E-Mail-Verifikation erzeugt Single-Use-Tokens und setzt
|
||||
`users.email_verified_at`.
|
||||
@@ -176,6 +179,7 @@ Umgesetzte Dateien:
|
||||
```text
|
||||
landing.php
|
||||
assets/images/landing-hero.png
|
||||
assets/css/public.css
|
||||
```
|
||||
|
||||
Umgesetzter Umfang:
|
||||
@@ -183,6 +187,8 @@ Umgesetzter Umfang:
|
||||
- Oeffentliche Landingpage ohne Legacy-DB-Zugriff.
|
||||
- Hero mit generiertem Bild-Asset, bestehender Typografie und gruenem Akzent.
|
||||
- CTA zu Login und Registrierung.
|
||||
- Login, Registrierung und oeffentliche Auth-Hilfsseiten sind optisch in den
|
||||
Public-Bereich integriert.
|
||||
- Kurzabschnitt zu Stricherfassung, Mandantenfaehigkeit und Webspace-Betrieb.
|
||||
- Die geschuetzte App-Sidebar bleibt von der Public-Seite getrennt.
|
||||
|
||||
@@ -192,6 +198,8 @@ Entscheidung fuer den Webspace-Betrieb:
|
||||
|
||||
- Keine Wildcard-Subdomains im ersten Schritt.
|
||||
- Primaere App-Adresse ist eine zentrale App-Domain wie `app.kaffeeliste.de`.
|
||||
- Die Public-Seite kann ueber `kaffeeliste.de` beziehungsweise
|
||||
`www.kaffeeliste.de` laufen.
|
||||
- Der aktive Mandant wird nach Login ueber `tenant_memberships` und die PHP-
|
||||
Session gesetzt.
|
||||
- Bei genau einem Mandanten wird automatisch weitergeleitet.
|
||||
@@ -202,6 +210,8 @@ Entscheidung fuer den Webspace-Betrieb:
|
||||
Noch offen:
|
||||
|
||||
- `APP_PRIMARY_HOST` in der Zielumgebung setzen.
|
||||
- Optional `APP_PUBLIC_HOST` beziehungsweise Host-Rewrite fuer die Landingpage
|
||||
in der Zielumgebung definieren.
|
||||
- Produktive Domain-/Zertifikatspruefung fuer einzelne feste Domains
|
||||
definieren.
|
||||
|
||||
|
||||
@@ -83,9 +83,10 @@ Empfohlene Routen:
|
||||
- `/`: Landingpage.
|
||||
- `/preise` oder spaeter `/pricing`: optional, falls Tarife eingefuehrt werden.
|
||||
- `/faq`: oeffentliche FAQ oder FAQ-Auszug.
|
||||
- `/registrieren`: Kundenregistrierung.
|
||||
- `/login`: Login.
|
||||
- `/passwort-vergessen`: Passwort-Reset.
|
||||
- `/registrieren` beziehungsweise aktuell `register.php`: Kundenregistrierung.
|
||||
- `/login` beziehungsweise aktuell `login.php`: Login.
|
||||
- `/passwort-vergessen` beziehungsweise aktuell `passwort-vergessen.php`:
|
||||
Passwort-Reset.
|
||||
|
||||
Landingpage-Inhalte:
|
||||
|
||||
@@ -121,6 +122,25 @@ Die App sollte eine Sidebar behalten, aber besser gruppiert werden:
|
||||
- Erfassung: Striche, Einzahlungen.
|
||||
- Auswertung: Kaffeeliste, Buchungen, Export.
|
||||
- Administration: Mitglieder, Hinweise, Einstellungen, Importe.
|
||||
- Konto: Kundenkonto und Logout. Public-Links wie Login und Registrierung
|
||||
gehoeren nicht in die App-Sidebar.
|
||||
|
||||
### Webspace- und Host-Strategie
|
||||
|
||||
Empfohlen fuer den Start:
|
||||
|
||||
- `kaffeeliste.de` oder `www.kaffeeliste.de` fuer Landingpage, Registrierung
|
||||
und Login.
|
||||
- `app.kaffeeliste.de` fuer die geschuetzte App.
|
||||
- Keine Wildcard-Subdomains fuer Kunden.
|
||||
- Mandantenauswahl nach Login ueber Session und `tenant_memberships`.
|
||||
- Kundeneigene feste Domains oder Subdomains erst spaeter gezielt einrichten,
|
||||
wenn DNS und Zertifikat pro Domain sauber geprueft sind.
|
||||
|
||||
Damit bleibt der Betrieb webspace-tauglich: Fuer den Start reichen zwei feste
|
||||
Hosts mit normalen Let's-Encrypt-Zertifikaten. Die fachliche Tenant-Aufloesung
|
||||
ist in M3 vorbereitet; produktive Host-Rewrites, Cookie-Domain und Zertifikats-
|
||||
Details gehoeren zur M8-Betriebshaertung.
|
||||
|
||||
## Datenmodell
|
||||
|
||||
@@ -287,7 +307,7 @@ Uebersicht:
|
||||
| M4 | Datenmigration | Gestartet: Ledger-Tabelle, Legacy-Backfill, Paritaetscheck und Ledger-Service sind umgesetzt |
|
||||
| M5 | App-Kern | Dashboard, Striche, Einzahlungen, Mitglieder und Liste laufen |
|
||||
| M6 | Betriebsflows | Import, Export, Mail und Jahresprozesse sind auditierbar |
|
||||
| M7 | Landingpage | Erste werbliche Seite ist oeffentlich nutzbar; spaetere Ausbaustufen folgen |
|
||||
| M7 | Landingpage | Public-Seite und Auth-Seiten sind im gemeinsamen Stil nutzbar; spaetere Ausbaustufen folgen |
|
||||
| M8 | Haertung | Betrieb, Datenschutz, Monitoring und Isolation sind geprueft |
|
||||
| M9 | Cutover | Produktivumstellung ist vorbereitet und Legacy ist read-only |
|
||||
|
||||
@@ -427,6 +447,9 @@ Schritte:
|
||||
- Rollenpruefung zentralisieren: erster Owner/Admin-Check erledigt.
|
||||
- Erste Admin-/Owner-Seite fuer Grundeinstellungen: erledigt.
|
||||
- Erste Public-Landingpage mit CTA zu Login und Registrierung: erledigt.
|
||||
- Login, Registrierung, Passwort-Reset und E-Mail-Verifikation im Public-Stil:
|
||||
erledigt.
|
||||
- App-Sidebar ohne Public-Login-/Registrierungslinks: erledigt.
|
||||
|
||||
Ergebnis:
|
||||
|
||||
@@ -529,10 +552,13 @@ zu verwischen.
|
||||
Schritte:
|
||||
|
||||
- Public-Layout mit bestehender Typografie und gruenem Akzent bauen. Erster
|
||||
Stand als `landing.php` erledigt.
|
||||
Stand als `landing.php` und `assets/css/public.css` erledigt.
|
||||
- Landingpage-Inhalte erstellen. Erster Stand erledigt.
|
||||
- Demo-Screenshot oder Demo-Ansicht einbinden.
|
||||
- CTA zu Registrierung und Login. Erledigt.
|
||||
- Login, Registrierung und Passwort-Reset in den Public-Stil integrieren.
|
||||
Erledigt.
|
||||
- App-Sidebar von Public-Links trennen. Erledigt.
|
||||
- FAQ-Auszug strukturieren.
|
||||
- Keine App-Sidebar im Public-Bereich.
|
||||
|
||||
|
||||
+38
-9
@@ -8,19 +8,40 @@ $result = $token !== ''
|
||||
? saas_verify_email_token($pdo, $token)
|
||||
: ['ok' => false, 'errors' => ['Der Link ist ungueltig oder abgelaufen.']];
|
||||
|
||||
include 'header.php';
|
||||
include 'headerline.php';
|
||||
include 'nav.php';
|
||||
?>
|
||||
|
||||
<section id="banner">
|
||||
<div class="content">
|
||||
<h2>E-Mail verifizieren</h2>
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<title>Kaffeeliste E-Mail verifizieren</title>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
|
||||
<link rel="stylesheet" href="assets/css/main.css" />
|
||||
<link rel="stylesheet" href="assets/css/public.css" />
|
||||
</head>
|
||||
<body class="is-preload public-page">
|
||||
<div class="public-shell">
|
||||
<section class="public-auth">
|
||||
<nav class="public-nav" aria-label="Hauptnavigation">
|
||||
<strong><a href="landing.php">Kaffeeliste</a></strong>
|
||||
<ul class="actions">
|
||||
<li><a href="login.php" class="button">Login</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="public-auth-grid">
|
||||
<div class="public-auth-copy">
|
||||
<h1>E-Mail verifizieren</h1>
|
||||
<p>Bestaetige deine Adresse, damit dein Kundenkonto vollstaendig eingerichtet ist.</p>
|
||||
</div>
|
||||
|
||||
<div class="public-panel">
|
||||
<h2>Status</h2>
|
||||
|
||||
<?php if ($result['ok']): ?>
|
||||
<div class="hint-box success"><p>Die E-Mail-Adresse wurde bestaetigt.</p></div>
|
||||
<ul class="actions">
|
||||
<li><a href="konto.php" class="button">Zum Konto</a></li>
|
||||
<li><a href="konto.php" class="button primary">Zum Konto</a></li>
|
||||
</ul>
|
||||
<?php else: ?>
|
||||
<div class="hint-box error">
|
||||
@@ -29,10 +50,18 @@ include 'nav.php';
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<ul class="actions">
|
||||
<li><a href="login.php" class="button">Zum Login</a></li>
|
||||
<li><a href="login.php" class="button primary">Zum Login</a></li>
|
||||
</ul>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<?php include 'footer.php'; ?>
|
||||
<script src="assets/js/jquery.min.js"></script>
|
||||
<script src="assets/js/browser.min.js"></script>
|
||||
<script src="assets/js/breakpoints.min.js"></script>
|
||||
<script src="assets/js/util.js"></script>
|
||||
<script src="assets/js/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -54,11 +54,6 @@ if ($saasNavUser !== null) {
|
||||
?>
|
||||
<li><a href="logout.php">Logout</a></li>
|
||||
<?php
|
||||
} else {
|
||||
?>
|
||||
<li><a href="login.php">Login</a></li>
|
||||
<li><a href="register.php">Registrierung</a></li>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</ul>
|
||||
|
||||
+11
-117
@@ -5,125 +5,19 @@
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
|
||||
<link rel="stylesheet" href="assets/css/main.css" />
|
||||
<style>
|
||||
body {
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
.landing-shell {
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
.landing-hero {
|
||||
min-height: 82vh;
|
||||
background-image: url("assets/images/landing-hero.png");
|
||||
background-size: cover;
|
||||
background-position: center right;
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 4rem 6vw;
|
||||
}
|
||||
|
||||
.landing-hero:before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
background: rgba(255, 255, 255, 0.68);
|
||||
}
|
||||
|
||||
.landing-hero-content {
|
||||
position: relative;
|
||||
max-width: 42rem;
|
||||
}
|
||||
|
||||
.landing-hero h1 {
|
||||
margin-bottom: 0.35em;
|
||||
}
|
||||
|
||||
.landing-hero p {
|
||||
color: #3d4449;
|
||||
font-size: 1.15em;
|
||||
max-width: 34rem;
|
||||
}
|
||||
|
||||
.landing-nav {
|
||||
position: absolute;
|
||||
top: 1.5rem;
|
||||
left: 6vw;
|
||||
right: 6vw;
|
||||
z-index: 2;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.landing-nav strong {
|
||||
color: #3d4449;
|
||||
font-family: "Roboto Slab", serif;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
.landing-section {
|
||||
padding: 4rem 6vw;
|
||||
}
|
||||
|
||||
.landing-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||
gap: 1.25rem;
|
||||
max-width: 72rem;
|
||||
}
|
||||
|
||||
.landing-feature {
|
||||
border: solid 1px rgba(210, 215, 217, 0.75);
|
||||
border-radius: 8px;
|
||||
padding: 1.5rem;
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
.landing-feature h3 {
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.landing-feature p {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 980px) {
|
||||
.landing-hero {
|
||||
min-height: 78vh;
|
||||
padding: 5.5rem 2rem 3rem 2rem;
|
||||
background-position: center right 30%;
|
||||
}
|
||||
|
||||
.landing-nav {
|
||||
left: 2rem;
|
||||
right: 2rem;
|
||||
}
|
||||
|
||||
.landing-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.landing-section {
|
||||
padding: 3rem 2rem;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<link rel="stylesheet" href="assets/css/public.css" />
|
||||
</head>
|
||||
<body class="is-preload">
|
||||
<div class="landing-shell">
|
||||
<section class="landing-hero">
|
||||
<nav class="landing-nav" aria-label="Hauptnavigation">
|
||||
<body class="is-preload public-page">
|
||||
<div class="public-shell">
|
||||
<section class="public-hero">
|
||||
<nav class="public-nav" aria-label="Hauptnavigation">
|
||||
<strong>Kaffeeliste</strong>
|
||||
<ul class="actions">
|
||||
<li><a href="login.php" class="button">Login</a></li>
|
||||
<li><a href="register.php" class="button primary">Registrieren</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
<div class="landing-hero-content">
|
||||
<div class="public-hero-content">
|
||||
<h1>Kaffeeliste</h1>
|
||||
<p>Die digitale Kaffeekasse fuer Teams, Bueros und Vereine: Striche, Einzahlungen und offene Betraege bleiben nachvollziehbar an einem Ort.</p>
|
||||
<ul class="actions">
|
||||
@@ -133,20 +27,20 @@
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="landing-section">
|
||||
<section class="public-section">
|
||||
<header class="major">
|
||||
<h2>Alles rund um die Kaffeekasse</h2>
|
||||
</header>
|
||||
<div class="landing-grid">
|
||||
<article class="landing-feature">
|
||||
<div class="public-grid">
|
||||
<article class="public-feature">
|
||||
<h3>Striche erfassen</h3>
|
||||
<p>Teilnehmer und Admins behalten Verbrauch, Einzahlungen und Salden im Blick.</p>
|
||||
</article>
|
||||
<article class="landing-feature">
|
||||
<article class="public-feature">
|
||||
<h3>Mandantenfaehig</h3>
|
||||
<p>Jeder Kunde arbeitet in seinem eigenen Bereich mit eigenen Einstellungen.</p>
|
||||
</article>
|
||||
<article class="landing-feature">
|
||||
<article class="public-feature">
|
||||
<h3>Webspace-tauglich</h3>
|
||||
<p>Der Start erfolgt ueber eine zentrale App-Adresse mit Login und Mandantenauswahl.</p>
|
||||
</article>
|
||||
|
||||
@@ -32,14 +32,35 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
$errors = $result['errors'];
|
||||
}
|
||||
|
||||
include 'header.php';
|
||||
include 'headerline.php';
|
||||
include 'nav.php';
|
||||
?>
|
||||
|
||||
<section id="banner">
|
||||
<div class="content">
|
||||
<h2>Login</h2>
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<title>Kaffeeliste Login</title>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
|
||||
<link rel="stylesheet" href="assets/css/main.css" />
|
||||
<link rel="stylesheet" href="assets/css/public.css" />
|
||||
</head>
|
||||
<body class="is-preload public-page">
|
||||
<div class="public-shell">
|
||||
<section class="public-auth">
|
||||
<nav class="public-nav" aria-label="Hauptnavigation">
|
||||
<strong><a href="landing.php">Kaffeeliste</a></strong>
|
||||
<ul class="actions">
|
||||
<li><a href="register.php" class="button">Registrieren</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="public-auth-grid">
|
||||
<div class="public-auth-copy">
|
||||
<h1>Login</h1>
|
||||
<p>Melde dich mit deinem Kundenkonto an. Wenn du mehreren Mandanten zugeordnet bist, waehlst du danach den passenden Bereich aus.</p>
|
||||
</div>
|
||||
|
||||
<div class="public-panel">
|
||||
<h2>Zur App</h2>
|
||||
|
||||
<?php if (isset($_GET['logged_out'])): ?>
|
||||
<div class="hint-box success"><p>Du wurdest abgemeldet.</p></div>
|
||||
@@ -56,26 +77,33 @@ include 'nav.php';
|
||||
<form method="post" action="login.php">
|
||||
<?php echo app_csrf_field(); ?>
|
||||
<div class="row">
|
||||
<div class="col-6 col-12-small">
|
||||
<div class="col-12">
|
||||
<label for="email">E-Mail</label>
|
||||
<input type="email" name="email" id="email" value="<?php echo saas_html($email); ?>" required>
|
||||
</div>
|
||||
<div class="col-6 col-12-small">
|
||||
<div class="col-12">
|
||||
<label for="password">Passwort</label>
|
||||
<input type="password" name="password" id="password" required>
|
||||
</div>
|
||||
<div class="col-6 col-12-small">
|
||||
<div class="col-12">
|
||||
<label for="tenant_slug">Kundenkuerzel</label>
|
||||
<input type="text" name="tenant_slug" id="tenant_slug" value="<?php echo saas_html($tenantSlug); ?>" placeholder="optional">
|
||||
</div>
|
||||
</div>
|
||||
<ul class="actions">
|
||||
<li><button type="submit">Einloggen</button></li>
|
||||
<li><a href="register.php" class="button alt">Registrieren</a></li>
|
||||
<li><a href="passwort-vergessen.php" class="button alt">Passwort vergessen</a></li>
|
||||
<li><button type="submit" class="primary">Einloggen</button></li>
|
||||
<li><a href="passwort-vergessen.php" class="button">Passwort vergessen</a></li>
|
||||
</ul>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<?php include 'footer.php'; ?>
|
||||
<script src="assets/js/jquery.min.js"></script>
|
||||
<script src="assets/js/browser.min.js"></script>
|
||||
<script src="assets/js/breakpoints.min.js"></script>
|
||||
<script src="assets/js/util.js"></script>
|
||||
<script src="assets/js/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+41
-11
@@ -27,14 +27,36 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
}
|
||||
}
|
||||
|
||||
include 'header.php';
|
||||
include 'headerline.php';
|
||||
include 'nav.php';
|
||||
?>
|
||||
|
||||
<section id="banner">
|
||||
<div class="content">
|
||||
<h2>Passwort vergessen</h2>
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<title>Kaffeeliste Passwort vergessen</title>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
|
||||
<link rel="stylesheet" href="assets/css/main.css" />
|
||||
<link rel="stylesheet" href="assets/css/public.css" />
|
||||
</head>
|
||||
<body class="is-preload public-page">
|
||||
<div class="public-shell">
|
||||
<section class="public-auth">
|
||||
<nav class="public-nav" aria-label="Hauptnavigation">
|
||||
<strong><a href="landing.php">Kaffeeliste</a></strong>
|
||||
<ul class="actions">
|
||||
<li><a href="login.php" class="button">Login</a></li>
|
||||
<li><a href="register.php" class="button primary">Registrieren</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="public-auth-grid">
|
||||
<div class="public-auth-copy">
|
||||
<h1>Passwort vergessen</h1>
|
||||
<p>Fordere einen Link an, um dein Passwort neu zu setzen. Wenn du mehrere Kundenbereiche nutzt, kannst du das Kuerzel optional angeben.</p>
|
||||
</div>
|
||||
|
||||
<div class="public-panel">
|
||||
<h2>Reset-Link anfordern</h2>
|
||||
|
||||
<?php if ($message !== ''): ?>
|
||||
<div class="hint-box success">
|
||||
@@ -56,21 +78,29 @@ include 'nav.php';
|
||||
<form method="post" action="passwort-vergessen.php">
|
||||
<?php echo app_csrf_field(); ?>
|
||||
<div class="row">
|
||||
<div class="col-6 col-12-small">
|
||||
<div class="col-12">
|
||||
<label for="email">E-Mail</label>
|
||||
<input type="email" name="email" id="email" value="<?php echo saas_html($email); ?>" required>
|
||||
</div>
|
||||
<div class="col-6 col-12-small">
|
||||
<div class="col-12">
|
||||
<label for="tenant_slug">Kundenkuerzel</label>
|
||||
<input type="text" name="tenant_slug" id="tenant_slug" value="<?php echo saas_html($tenantSlug); ?>" placeholder="optional">
|
||||
</div>
|
||||
</div>
|
||||
<ul class="actions">
|
||||
<li><button type="submit">Link vorbereiten</button></li>
|
||||
<li><a href="login.php" class="button alt">Zum Login</a></li>
|
||||
<li><button type="submit" class="primary">Link vorbereiten</button></li>
|
||||
<li><a href="login.php" class="button">Zum Login</a></li>
|
||||
</ul>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<?php include 'footer.php'; ?>
|
||||
<script src="assets/js/jquery.min.js"></script>
|
||||
<script src="assets/js/browser.min.js"></script>
|
||||
<script src="assets/js/breakpoints.min.js"></script>
|
||||
<script src="assets/js/util.js"></script>
|
||||
<script src="assets/js/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+39
-10
@@ -26,19 +26,40 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
}
|
||||
}
|
||||
|
||||
include 'header.php';
|
||||
include 'headerline.php';
|
||||
include 'nav.php';
|
||||
?>
|
||||
|
||||
<section id="banner">
|
||||
<div class="content">
|
||||
<h2>Passwort zuruecksetzen</h2>
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<title>Kaffeeliste Passwort zuruecksetzen</title>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
|
||||
<link rel="stylesheet" href="assets/css/main.css" />
|
||||
<link rel="stylesheet" href="assets/css/public.css" />
|
||||
</head>
|
||||
<body class="is-preload public-page">
|
||||
<div class="public-shell">
|
||||
<section class="public-auth">
|
||||
<nav class="public-nav" aria-label="Hauptnavigation">
|
||||
<strong><a href="landing.php">Kaffeeliste</a></strong>
|
||||
<ul class="actions">
|
||||
<li><a href="login.php" class="button">Login</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="public-auth-grid">
|
||||
<div class="public-auth-copy">
|
||||
<h1>Passwort zuruecksetzen</h1>
|
||||
<p>Setze ein neues Passwort fuer dein Kaffeeliste-Konto.</p>
|
||||
</div>
|
||||
|
||||
<div class="public-panel">
|
||||
<h2>Neues Passwort</h2>
|
||||
|
||||
<?php if ($success): ?>
|
||||
<div class="hint-box success"><p>Das Passwort wurde geaendert.</p></div>
|
||||
<ul class="actions">
|
||||
<li><a href="login.php" class="button">Zum Login</a></li>
|
||||
<li><a href="login.php" class="button primary">Zum Login</a></li>
|
||||
</ul>
|
||||
<?php else: ?>
|
||||
<?php if ($errors !== []): ?>
|
||||
@@ -66,16 +87,24 @@ include 'nav.php';
|
||||
</div>
|
||||
</div>
|
||||
<ul class="actions">
|
||||
<li><button type="submit">Passwort speichern</button></li>
|
||||
<li><button type="submit" class="primary">Passwort speichern</button></li>
|
||||
</ul>
|
||||
</form>
|
||||
<?php else: ?>
|
||||
<ul class="actions">
|
||||
<li><a href="passwort-vergessen.php" class="button">Neuen Link anfordern</a></li>
|
||||
<li><a href="passwort-vergessen.php" class="button primary">Neuen Link anfordern</a></li>
|
||||
</ul>
|
||||
<?php endif; ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<?php include 'footer.php'; ?>
|
||||
<script src="assets/js/jquery.min.js"></script>
|
||||
<script src="assets/js/browser.min.js"></script>
|
||||
<script src="assets/js/breakpoints.min.js"></script>
|
||||
<script src="assets/js/util.js"></script>
|
||||
<script src="assets/js/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+38
-9
@@ -39,14 +39,35 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
$errors = $result['errors'];
|
||||
}
|
||||
|
||||
include 'header.php';
|
||||
include 'headerline.php';
|
||||
include 'nav.php';
|
||||
?>
|
||||
|
||||
<section id="banner">
|
||||
<div class="content">
|
||||
<h2>Registrierung</h2>
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<title>Kaffeeliste Registrierung</title>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
|
||||
<link rel="stylesheet" href="assets/css/main.css" />
|
||||
<link rel="stylesheet" href="assets/css/public.css" />
|
||||
</head>
|
||||
<body class="is-preload public-page">
|
||||
<div class="public-shell">
|
||||
<section class="public-auth">
|
||||
<nav class="public-nav" aria-label="Hauptnavigation">
|
||||
<strong><a href="landing.php">Kaffeeliste</a></strong>
|
||||
<ul class="actions">
|
||||
<li><a href="login.php" class="button">Login</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="public-auth-grid">
|
||||
<div class="public-auth-copy">
|
||||
<h1>Registrierung</h1>
|
||||
<p>Lege einen neuen Kundenbereich an. Danach bist du als Owner angemeldet und kannst die Kaffeeliste fuer dein Team einrichten.</p>
|
||||
</div>
|
||||
|
||||
<div class="public-panel">
|
||||
<h2>Kundenkonto anlegen</h2>
|
||||
|
||||
<?php if ($errors !== []): ?>
|
||||
<div class="hint-box error">
|
||||
@@ -85,11 +106,19 @@ include 'nav.php';
|
||||
</div>
|
||||
</div>
|
||||
<ul class="actions">
|
||||
<li><button type="submit">Kundenkonto anlegen</button></li>
|
||||
<li><a href="login.php" class="button alt">Zum Login</a></li>
|
||||
<li><button type="submit" class="primary">Kundenkonto anlegen</button></li>
|
||||
<li><a href="login.php" class="button">Zum Login</a></li>
|
||||
</ul>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<?php include 'footer.php'; ?>
|
||||
<script src="assets/js/jquery.min.js"></script>
|
||||
<script src="assets/js/browser.min.js"></script>
|
||||
<script src="assets/js/breakpoints.min.js"></script>
|
||||
<script src="assets/js/util.js"></script>
|
||||
<script src="assets/js/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user