Files
fotospiel-app/resources/views/layouts/join-token/pdf.blade.php
Codex Agent 64a5411fb9 - Reworked the tenant admin login page
- Updated the User model to implement Filament’s tenancy contracts
- Seeded a ready-to-use demo tenant (user, tenant, active package, purchase)
- Introduced a branded, translated 403 error page to replace the generic forbidden message for unauthorised admin hits
- Removed the public “Register” links from the marketing header
- hardened join event logic and improved error handling in the guest pwa.
2025-10-13 12:50:46 +02:00

206 lines
5.3 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>{{ $eventName }} Einladungs-QR</title>
<style>
:root {
--accent: {{ $layout['accent'] }};
--secondary: {{ $layout['secondary'] }};
--text: {{ $layout['text'] }};
--badge: {{ $layout['badge'] }};
--container-padding: 48px;
--qr-size: 340px;
--background: {{ $backgroundStyle }};
}
* {
box-sizing: border-box;
}
html, body {
margin: 0;
padding: 0;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
color: var(--text);
}
body {
min-height: 100%;
position: relative;
}
.layout-wrapper {
width: 100%;
height: 100%;
padding: var(--container-padding);
display: flex;
flex-direction: column;
justify-content: space-between;
background: var(--background);
}
.header {
display: flex;
flex-direction: column;
gap: 12px;
}
.badge {
display: inline-flex;
align-items: center;
gap: 10px;
background: var(--badge);
color: #fff;
padding: 10px 18px;
border-radius: 999px;
font-size: 15px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
width: fit-content;
}
.event-title {
font-size: 72px;
font-weight: 700;
line-height: 1.05;
margin: 0;
}
.subtitle {
font-size: 24px;
font-weight: 500;
color: rgba(17, 24, 39, 0.7);
margin: 0;
}
.content {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
gap: 40px;
margin-top: 48px;
align-items: center;
}
.info-card {
background: rgba(255, 255, 255, 0.65);
border-radius: 32px;
padding: 32px;
display: flex;
flex-direction: column;
gap: 18px;
box-shadow: 0 18px 50px rgba(15, 23, 42, 0.08);
}
.info-card h2 {
margin: 0;
font-size: 32px;
font-weight: 700;
}
.info-card p {
margin: 0;
font-size: 18px;
line-height: 1.6;
}
.instructions {
margin: 0;
padding-left: 22px;
display: flex;
flex-direction: column;
gap: 12px;
}
.instructions li {
font-size: 18px;
line-height: 1.5;
}
.link-box {
background: var(--secondary);
color: var(--text);
font-family: "Courier New", Courier, monospace;
border-radius: 16px;
padding: 18px 20px;
font-size: 18px;
word-break: break-all;
}
.qr-wrapper {
display: flex;
flex-direction: column;
align-items: center;
gap: 18px;
}
.qr-wrapper img {
width: var(--qr-size);
height: var(--qr-size);
}
.cta {
font-size: 20px;
font-weight: 600;
color: var(--accent);
text-transform: uppercase;
letter-spacing: 0.08em;
}
.footer {
margin-top: 48px;
display: flex;
justify-content: space-between;
align-items: flex-end;
font-size: 16px;
color: rgba(17, 24, 39, 0.6);
}
.footer strong {
color: var(--accent);
}
</style>
</head>
<body>
<div class="layout-wrapper">
<div class="header">
<span class="badge">Digitale Gästebox</span>
<h1 class="event-title">{{ $eventName }}</h1>
@if(!empty($layout['subtitle']))
<p class="subtitle">{{ $layout['subtitle'] }}</p>
@endif
</div>
<div class="content">
<div class="info-card">
<h2>So funktioniert&rsquo;s</h2>
<p>{{ $layout['description'] }}</p>
@if(!empty($layout['instructions']))
<ul class="instructions">
@foreach($layout['instructions'] as $step)
<li>{{ $step }}</li>
@endforeach
</ul>
@endif
<div>
<div class="cta">Alternative zum Einscannen</div>
<div class="link-box">{{ $tokenUrl }}</div>
</div>
</div>
<div class="qr-wrapper">
<img src="{{ $qrPngDataUri }}" alt="QR-Code zum Event {{ $eventName }}">
<div class="cta">Scan mich & starte direkt</div>
</div>
</div>
<div class="footer">
<div>
<strong>{{ config('app.name', 'Fotospiel') }}</strong> Gästebox & Fotochallenges
</div>
<div>Einladungsgültigkeit: {{ $joinToken->expires_at ? $joinToken->expires_at->isoFormat('LLL') : 'bis Widerruf' }}</div>
</div>
</div>
</body>
</html>