Files
ifb-schulapp/public/index.html
T
Simon 5ff616e0d9 chore: remove school-brand impersonation from public pages
- Replace "IFB-Berufsfachschule Rosenheim" brand text with neutral "Klassenportal" labels in titles, brand headers, and footers.
- Rewrite privacy-policy responsible-party section to clarify this is a private, non-official project (no school/organization affiliation).
- Include prior uncommitted work on index.html and app.html.

Retain factual audience descriptors ("Nur für IFB-Schüler") and external links to the school website; these reference but do not impersonate.
2026-04-18 01:33:53 +02:00

948 lines
31 KiB
HTML
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">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>INFO1 · Das Klassen-Cockpit</title>
<meta name="description" content="INFO1 ist ein privates Klassenportal für die INFO1-Klasse. Stundenplan, Noten, Hausaufgaben, Klassen-Chat und mehr.">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap" rel="stylesheet">
<script src="https://unpkg.com/lucide@latest/dist/umd/lucide.min.js"></script>
<style>
:root {
--blue: #2563eb; --blue-d: #1d4ed8; --blue-l: #3b82f6;
--blue-50: #eff6ff; --blue-100: #dbeafe; --blue-700: #1d4ed8;
--bg: #f6f8fc;
--surface: #ffffff;
--surface-2: #f9fafb;
--border: #e5e7eb;
--border-s: #f0f2f5;
--text: #0f172a;
--text-2: #334155;
--muted: #64748b;
--subtle: #94a3b8;
--green: #16a34a; --amber: #d97706; --red: #dc2626;
--shadow-sm: 0 1px 2px rgba(15,23,42,.04), 0 1px 3px rgba(15,23,42,.06);
--shadow: 0 4px 12px rgba(15,23,42,.06), 0 2px 4px rgba(15,23,42,.04);
--shadow-lg: 0 20px 40px rgba(15,23,42,.08), 0 4px 10px rgba(15,23,42,.04);
--shadow-xl: 0 32px 64px rgba(15,23,42,.12), 0 8px 16px rgba(15,23,42,.06);
}
body.dark {
--bg: #0b1220;
--surface: #121a2b;
--surface-2: #0f1627;
--border: #1f2a44;
--border-s: #1a2338;
--text: #e6edf7;
--text-2: #c3cfe0;
--muted: #8fa0b8;
--subtle: #6c7d96;
--blue-50: #0f1e3d;
--blue-100: #16264e;
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
font-size: 16px;
line-height: 1.6;
background: var(--bg);
color: var(--text);
min-height: 100vh;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
a { color: inherit; text-decoration: none; }
/* ── NAV ──────────────────────── */
nav.top {
position: sticky; top: 0; z-index: 50;
background: rgba(255,255,255,.85);
backdrop-filter: saturate(180%) blur(14px);
-webkit-backdrop-filter: saturate(180%) blur(14px);
border-bottom: 1px solid var(--border);
}
body.dark nav.top { background: rgba(18,26,43,.85); }
.nav-inner {
max-width: 1200px; margin: 0 auto; padding: 0 24px;
height: 64px;
display: flex; align-items: center; gap: 28px;
}
.brand {
display: flex; align-items: center; gap: 10px;
user-select: none;
}
.brand-mark {
width: 34px; height: 34px;
background: linear-gradient(135deg, var(--blue) 0%, var(--blue-d) 100%);
border-radius: 8px;
display: flex; align-items: center; justify-content: center;
font-size: 14px; font-weight: 800; color: #fff;
letter-spacing: -.5px;
box-shadow: 0 4px 12px rgba(37,99,235,.3);
}
.brand-text { display: flex; flex-direction: column; line-height: 1.15; }
.brand-sub { font-size: 10px; color: var(--subtle); font-weight: 500; letter-spacing: .3px; }
.brand-name { font-size: 15px; font-weight: 800; color: var(--text); letter-spacing: -.4px; }
.nav-links {
display: flex; gap: 4px;
margin-left: 8px;
}
.nav-links a {
padding: 8px 14px;
font-size: 14px; font-weight: 500;
color: var(--text-2);
border-radius: 7px;
transition: background .15s, color .15s;
}
.nav-links a:hover { background: var(--surface-2); color: var(--text); }
.nav-right { margin-left: auto; display: flex; align-items: center; gap: 8px; }
.btn {
display: inline-flex; align-items: center; gap: 6px;
padding: 8px 16px;
font-size: 14px; font-weight: 600;
border-radius: 8px;
border: 1px solid transparent;
cursor: pointer;
transition: all .15s;
text-decoration: none;
white-space: nowrap;
}
.btn-ghost { background: transparent; color: var(--text-2); }
.btn-ghost:hover { background: var(--surface-2); color: var(--text); }
.btn-primary {
background: var(--blue); color: #fff;
box-shadow: 0 1px 2px rgba(37,99,235,.25), 0 4px 12px rgba(37,99,235,.22);
}
.btn-primary:hover { background: var(--blue-d); transform: translateY(-1px); }
.btn-outline {
background: var(--surface); color: var(--text);
border-color: var(--border);
}
.btn-outline:hover { border-color: var(--blue); color: var(--blue); }
.btn-lg { padding: 12px 22px; font-size: 15px; }
.icon-btn {
width: 36px; height: 36px;
display: inline-flex; align-items: center; justify-content: center;
background: transparent; border: 1px solid var(--border);
border-radius: 8px; color: var(--text-2);
cursor: pointer; transition: all .15s;
}
.icon-btn:hover { background: var(--surface-2); color: var(--text); }
.icon-btn .lucide { width: 16px; height: 16px; }
.mob-toggle { display: none; }
/* ── HERO ──────────────────────── */
.hero {
position: relative;
padding: 80px 24px 100px;
overflow: hidden;
}
.hero::before {
content: '';
position: absolute; inset: 0;
background:
radial-gradient(ellipse 800px 600px at 20% -10%, rgba(37,99,235,.18), transparent 60%),
radial-gradient(ellipse 700px 500px at 100% 10%, rgba(59,130,246,.14), transparent 60%);
pointer-events: none;
z-index: 0;
}
body.dark .hero::before {
background:
radial-gradient(ellipse 800px 600px at 20% -10%, rgba(37,99,235,.22), transparent 60%),
radial-gradient(ellipse 700px 500px at 100% 10%, rgba(59,130,246,.15), transparent 60%);
}
.hero-inner {
max-width: 1200px; margin: 0 auto;
position: relative; z-index: 1;
display: grid;
grid-template-columns: 1.05fr .95fr;
gap: 64px;
align-items: center;
}
.eyebrow {
display: inline-flex; align-items: center; gap: 8px;
padding: 6px 14px;
background: var(--blue-50);
color: var(--blue-d);
border: 1px solid var(--blue-100);
border-radius: 999px;
font-size: 12px; font-weight: 600;
letter-spacing: .2px;
margin-bottom: 20px;
}
.eyebrow .lucide { width: 13px; height: 13px; }
h1.hero-title {
font-size: clamp(36px, 5.2vw, 58px);
font-weight: 800;
line-height: 1.05;
letter-spacing: -1.4px;
color: var(--text);
margin-bottom: 20px;
}
h1.hero-title .accent {
background: linear-gradient(90deg, var(--blue) 0%, #60a5fa 100%);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}
.hero-lead {
font-size: 18px;
color: var(--muted);
max-width: 540px;
margin-bottom: 32px;
}
.hero-cta {
display: flex; gap: 12px; flex-wrap: wrap;
margin-bottom: 28px;
}
.hero-trust {
display: flex; gap: 20px; flex-wrap: wrap;
font-size: 13px; color: var(--muted);
}
.hero-trust span { display: inline-flex; align-items: center; gap: 6px; }
.hero-trust .lucide { width: 14px; height: 14px; color: var(--green); }
/* Hero visual mock */
.hero-visual {
position: relative;
aspect-ratio: 4/3.2;
perspective: 1200px;
}
.mock {
position: absolute; inset: 0;
background: var(--surface);
border: 1px solid var(--border);
border-radius: 14px;
box-shadow: var(--shadow-xl);
overflow: hidden;
transform: rotateY(-6deg) rotateX(4deg);
transform-origin: center center;
}
.mock-topbar {
height: 36px;
background: var(--surface-2);
border-bottom: 1px solid var(--border);
display: flex; align-items: center; gap: 6px;
padding: 0 14px;
}
.mock-dot { width: 10px; height: 10px; border-radius: 50%; }
.mock-dot.r { background: #ff5f57; }
.mock-dot.y { background: #febc2e; }
.mock-dot.g { background: #28c840; }
.mock-body { padding: 18px; display: grid; grid-template-columns: 1.1fr .9fr; gap: 14px; height: calc(100% - 36px); }
.mock-col { display: flex; flex-direction: column; gap: 10px; }
.mock-card {
background: var(--surface);
border: 1px solid var(--border);
border-radius: 10px;
padding: 12px;
flex: 1;
min-height: 0;
}
.mock-card-t {
font-size: 11px; font-weight: 700; color: var(--text);
margin-bottom: 8px;
display: flex; align-items: center; gap: 6px;
}
.mock-card-t .lucide { width: 12px; height: 12px; color: var(--blue); }
.mock-row {
height: 8px; border-radius: 3px;
background: linear-gradient(90deg, var(--surface-2), var(--border) 60%, var(--surface-2));
margin-bottom: 6px;
}
.mock-row.w70 { width: 70%; }
.mock-row.w50 { width: 50%; }
.mock-row.w85 { width: 85%; }
.mock-row.accent { background: linear-gradient(90deg, var(--blue-100), var(--blue-50)); }
.mock-grade {
display: flex; align-items: center; justify-content: space-between;
font-size: 11px; color: var(--text-2);
padding: 5px 0; border-bottom: 1px dashed var(--border-s);
}
.mock-grade:last-child { border-bottom: none; }
.mock-grade b { color: var(--blue-d); font-weight: 700; }
.mock-badge {
display: inline-block;
padding: 2px 7px;
background: var(--blue-50); color: var(--blue-d);
border-radius: 999px;
font-size: 9px; font-weight: 700;
}
/* ── SECTION ──────────────────── */
section { padding: 80px 24px; }
.section-inner { max-width: 1200px; margin: 0 auto; }
.sec-head { text-align: center; margin-bottom: 56px; }
.sec-eyebrow {
font-size: 13px; font-weight: 700;
color: var(--blue);
letter-spacing: 1.5px; text-transform: uppercase;
margin-bottom: 12px;
}
.sec-title {
font-size: clamp(28px, 3.5vw, 40px);
font-weight: 800;
letter-spacing: -1px;
line-height: 1.1;
margin-bottom: 16px;
}
.sec-lead {
font-size: 17px; color: var(--muted);
max-width: 620px; margin: 0 auto;
}
/* ── FEATURES ──────────────────────── */
#features { background: var(--surface); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }
.feat-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
}
.feat {
background: var(--surface);
border: 1px solid var(--border);
border-radius: 14px;
padding: 24px;
transition: all .2s;
}
.feat:hover {
transform: translateY(-2px);
border-color: var(--blue-100);
box-shadow: var(--shadow-lg);
}
.feat-icon {
width: 44px; height: 44px;
border-radius: 10px;
background: var(--blue-50);
color: var(--blue-d);
display: inline-flex; align-items: center; justify-content: center;
margin-bottom: 16px;
}
.feat-icon .lucide { width: 22px; height: 22px; }
.feat h3 {
font-size: 17px; font-weight: 700;
color: var(--text);
margin-bottom: 8px;
letter-spacing: -.2px;
}
.feat p {
font-size: 14px; color: var(--muted);
line-height: 1.55;
}
/* ── SPLIT (Schüler / Lehrer) ─── */
.split {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 24px;
}
.split-card {
background: var(--surface);
border: 1px solid var(--border);
border-radius: 16px;
padding: 36px 32px;
position: relative;
overflow: hidden;
}
.split-card.primary {
background: linear-gradient(135deg, var(--blue) 0%, var(--blue-d) 100%);
color: #fff;
border-color: transparent;
}
.split-tag {
display: inline-block;
padding: 4px 12px;
background: var(--blue-50);
color: var(--blue-d);
border-radius: 999px;
font-size: 12px; font-weight: 700;
letter-spacing: .3px;
margin-bottom: 16px;
}
.split-card.primary .split-tag { background: rgba(255,255,255,.18); color: #fff; }
.split-card h3 {
font-size: 24px; font-weight: 800;
letter-spacing: -.5px;
margin-bottom: 12px;
}
.split-card p.lead {
font-size: 15px;
color: var(--muted);
margin-bottom: 20px;
}
.split-card.primary p.lead { color: rgba(255,255,255,.88); }
.split-list { list-style: none; display: flex; flex-direction: column; gap: 10px; }
.split-list li {
display: flex; align-items: flex-start; gap: 10px;
font-size: 14px;
color: var(--text-2);
}
.split-card.primary .split-list li { color: rgba(255,255,255,.95); }
.split-list .lucide {
width: 18px; height: 18px; flex-shrink: 0;
color: var(--blue);
margin-top: 1px;
}
.split-card.primary .split-list .lucide { color: #fff; }
/* ── SECURITY ─────────────────── */
#sicherheit { background: var(--surface); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }
.sec-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 20px;
}
.sec-card {
padding: 24px;
background: var(--surface-2);
border: 1px solid var(--border);
border-radius: 12px;
}
.sec-card .lucide {
width: 26px; height: 26px;
color: var(--blue);
margin-bottom: 12px;
}
.sec-card h4 {
font-size: 15px; font-weight: 700;
margin-bottom: 6px;
}
.sec-card p {
font-size: 13px; color: var(--muted);
line-height: 1.5;
}
/* ── FAQ ──────────────────────── */
.faq-list { max-width: 760px; margin: 0 auto; display: flex; flex-direction: column; gap: 12px; }
.faq-item {
background: var(--surface);
border: 1px solid var(--border);
border-radius: 12px;
overflow: hidden;
transition: border-color .15s;
}
.faq-item[open] { border-color: var(--blue-100); }
.faq-item summary {
padding: 18px 22px;
cursor: pointer;
font-size: 15px; font-weight: 600;
display: flex; align-items: center; justify-content: space-between;
list-style: none;
color: var(--text);
}
.faq-item summary::-webkit-details-marker { display: none; }
.faq-item summary::after {
content: '+';
font-size: 22px; font-weight: 300;
color: var(--muted);
transition: transform .2s;
}
.faq-item[open] summary::after { content: ''; color: var(--blue); }
.faq-body {
padding: 0 22px 18px;
font-size: 14px; color: var(--muted);
line-height: 1.6;
}
/* ── CTA ──────────────────────── */
.cta-band {
max-width: 1100px; margin: 0 auto;
padding: 56px 48px;
background: linear-gradient(135deg, var(--blue) 0%, var(--blue-d) 100%);
border-radius: 22px;
text-align: center;
color: #fff;
position: relative;
overflow: hidden;
}
.cta-band::before {
content: '';
position: absolute; inset: 0;
background:
radial-gradient(circle at 20% 20%, rgba(255,255,255,.14), transparent 40%),
radial-gradient(circle at 80% 80%, rgba(255,255,255,.1), transparent 40%);
}
.cta-band > * { position: relative; }
.cta-band h2 {
font-size: clamp(26px, 3vw, 36px);
font-weight: 800;
letter-spacing: -.5px;
margin-bottom: 10px;
}
.cta-band p {
font-size: 16px; color: rgba(255,255,255,.88);
max-width: 520px; margin: 0 auto 28px;
}
.cta-band .btn { background: #fff; color: var(--blue-d); font-weight: 700; }
.cta-band .btn:hover { background: var(--blue-50); }
.cta-band .btn-ghost { background: transparent; color: #fff; border: 1px solid rgba(255,255,255,.35); }
.cta-band .btn-ghost:hover { background: rgba(255,255,255,.12); }
/* ── FOOTER ───────────────────── */
footer {
padding: 48px 24px 24px;
border-top: 1px solid var(--border);
background: var(--surface);
}
.foot-inner {
max-width: 1200px; margin: 0 auto;
display: grid;
grid-template-columns: 1.3fr 1fr 1fr 1fr;
gap: 40px;
padding-bottom: 28px;
border-bottom: 1px solid var(--border-s);
}
.foot-about p { font-size: 13px; color: var(--muted); margin-top: 12px; line-height: 1.55; max-width: 320px; }
.foot-col h5 {
font-size: 12px; font-weight: 700;
text-transform: uppercase; letter-spacing: 1px;
color: var(--subtle);
margin-bottom: 14px;
}
.foot-col ul { list-style: none; display: flex; flex-direction: column; gap: 8px; }
.foot-col a {
font-size: 14px; color: var(--text-2);
transition: color .15s;
}
.foot-col a:hover { color: var(--blue); }
.foot-bottom {
max-width: 1200px; margin: 0 auto;
padding-top: 20px;
display: flex; justify-content: space-between; align-items: center;
font-size: 12px; color: var(--muted);
flex-wrap: wrap; gap: 12px;
}
/* ── REDACT ──────────────────── */
.redact {
display: inline-block;
filter: blur(5px);
user-select: none;
-webkit-user-select: none;
background: var(--surface-2);
padding: 1px 8px;
border-radius: 4px;
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
font-size: .92em;
color: var(--text-2);
pointer-events: none;
}
/* ── RESPONSIVE ───────────────── */
@media (max-width: 980px) {
.nav-links { display: none; }
.mob-toggle { display: inline-flex; }
.hero-inner { grid-template-columns: 1fr; gap: 48px; }
.hero-visual { max-width: 540px; margin: 0 auto; width: 100%; }
.feat-grid { grid-template-columns: repeat(2, 1fr); }
.split { grid-template-columns: 1fr; }
.sec-grid { grid-template-columns: repeat(2, 1fr); }
.foot-inner { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 600px) {
.hero { padding: 56px 20px 72px; }
section { padding: 64px 20px; }
.feat-grid { grid-template-columns: 1fr; }
.sec-grid { grid-template-columns: 1fr; }
.foot-inner { grid-template-columns: 1fr; gap: 28px; }
.cta-band { padding: 40px 24px; }
.hero-trust { gap: 12px; }
.brand-sub { display: none; }
}
</style>
</head>
<body>
<nav class="top">
<div class="nav-inner">
<a class="brand" href="/">
<div class="brand-mark">i1</div>
<div class="brand-text">
<span class="brand-sub">Klassenportal</span>
<span class="brand-name">INFO1</span>
</div>
</a>
<div class="nav-links">
<a href="#features">Funktionen</a>
<a href="#ueber">Für wen</a>
<a href="#sicherheit">Sicherheit</a>
<a href="#faq">FAQ</a>
</div>
<div class="nav-right">
<button class="icon-btn" onclick="toggleDark()" title="Dark Mode" aria-label="Dark Mode"><i data-lucide="moon"></i></button>
<a class="btn btn-ghost" href="/login">Anmelden</a>
<a class="btn btn-primary" href="/login?tab=register">Registrieren</a>
</div>
</div>
</nav>
<!-- HERO -->
<section class="hero">
<div class="hero-inner">
<div>
<div class="eyebrow"><i data-lucide="sparkles"></i> Gemacht für die INFO1-Klasse</div>
<h1 class="hero-title">
Dein Schulalltag, <span class="accent">an einem Ort.</span>
</h1>
<p class="hero-lead">
Stundenplan, Hausaufgaben, Noten, Fehlzeiten und Klassen-Chat alles übersichtlich,
verschlüsselt und DSGVO-konform auf einem Server in Deutschland.
</p>
<div class="hero-cta">
<a class="btn btn-primary btn-lg" href="/login?tab=register">
Kostenlos registrieren <i data-lucide="arrow-right"></i>
</a>
<a class="btn btn-outline btn-lg" href="#features">
Funktionen ansehen
</a>
</div>
<div class="hero-trust">
<span><i data-lucide="check"></i> Nur für IFB-Schüler</span>
<span><i data-lucide="check"></i> 2-Faktor-Schutz</span>
<span><i data-lucide="check"></i> Hetzner · Nürnberg</span>
</div>
</div>
<div class="hero-visual">
<div class="mock" aria-hidden="true">
<div class="mock-topbar">
<span class="mock-dot r"></span><span class="mock-dot y"></span><span class="mock-dot g"></span>
</div>
<div class="mock-body">
<div class="mock-col">
<div class="mock-card">
<div class="mock-card-t"><i data-lucide="calendar"></i> Stundenplan</div>
<div class="mock-row accent w85"></div>
<div class="mock-row w70"></div>
<div class="mock-row accent"></div>
<div class="mock-row w50"></div>
<div class="mock-row w70"></div>
</div>
<div class="mock-card">
<div class="mock-card-t"><i data-lucide="pencil"></i> Hausaufgaben <span class="mock-badge">3 offen</span></div>
<div class="mock-row w85"></div>
<div class="mock-row w70"></div>
<div class="mock-row w50"></div>
</div>
</div>
<div class="mock-col">
<div class="mock-card">
<div class="mock-card-t"><i data-lucide="graduation-cap"></i> Noten Ø 2,1</div>
<div class="mock-grade">Mathe <b>1,7</b></div>
<div class="mock-grade">Deutsch <b>2,3</b></div>
<div class="mock-grade">Info <b>1,3</b></div>
<div class="mock-grade">BWL <b>2,7</b></div>
</div>
<div class="mock-card">
<div class="mock-card-t"><i data-lucide="timer"></i> Nächste Prüfung</div>
<div class="mock-row accent w85"></div>
<div class="mock-row w50"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- FEATURES -->
<section id="features">
<div class="section-inner">
<div class="sec-head">
<div class="sec-eyebrow">Funktionen</div>
<h2 class="sec-title">Alles, was du im Schulalltag brauchst</h2>
<p class="sec-lead">
Kein Wechsel zwischen zehn Apps, keine verlorenen Zettel. Ein Dashboard für deine Klasse.
</p>
</div>
<div class="feat-grid">
<div class="feat">
<div class="feat-icon"><i data-lucide="calendar"></i></div>
<h3>Stundenplan</h3>
<p>Deine Woche im Griff Fächer, Räume und Zeiten auf einen Blick, jederzeit anpassbar.</p>
</div>
<div class="feat">
<div class="feat-icon"><i data-lucide="pencil"></i></div>
<h3>Hausaufgaben</h3>
<p>Alle Aufgaben mit Fälligkeit und Fach, abhaken statt abhaken lassen.</p>
</div>
<div class="feat">
<div class="feat-icon"><i data-lucide="graduation-cap"></i></div>
<h3>Noten &amp; Durchschnitt</h3>
<p>Noten pro Fach mit automatischer Gewichtung und live berechnetem Schnitt.</p>
</div>
<div class="feat">
<div class="feat-icon"><i data-lucide="user-x"></i></div>
<h3>Fehlzeiten</h3>
<p>Entschuldigt oder nicht Fehltage und Stunden sauber dokumentiert.</p>
</div>
<div class="feat">
<div class="feat-icon"><i data-lucide="check-square"></i></div>
<h3>To-Dos</h3>
<p>Persönliche Aufgabenliste neben dem Unterricht fokussiert und ohne Ablenkung.</p>
</div>
<div class="feat">
<div class="feat-icon"><i data-lucide="timer"></i></div>
<h3>Countdowns</h3>
<p>Prüfungen, Ferien, Abschluss jedes Ziel mit Tage-Counter im Blick.</p>
</div>
<div class="feat">
<div class="feat-icon"><i data-lucide="message-square"></i></div>
<h3>Klassen-Chat</h3>
<p>Ende-zu-Ende verschlüsselter Austausch mit der Klasse direkt im Dashboard.</p>
</div>
<div class="feat">
<div class="feat-icon"><i data-lucide="folder"></i></div>
<h3>Dateispeicher</h3>
<p>Persönliche Dateien und Skripte sicher ablegen nur du hast Zugriff.</p>
</div>
<div class="feat">
<div class="feat-icon"><i data-lucide="calendar-days"></i></div>
<h3>Klassen-Events</h3>
<p>Gemeinsamer Kalender für Klausuren, Ausflüge und Termine von allen einsehbar.</p>
</div>
<div class="feat">
<div class="feat-icon"><i data-lucide="ticket"></i></div>
<h3>Support-Tickets</h3>
<p>Fragen oder Probleme? Direkter Draht zu Admins und Lehrern via Ticket-System.</p>
</div>
<div class="feat">
<div class="feat-icon"><i data-lucide="link"></i></div>
<h3>Schnelllinks</h3>
<p>Deine wichtigsten Schulportale einen Klick entfernt, individuell anpassbar.</p>
</div>
<div class="feat">
<div class="feat-icon"><i data-lucide="moon"></i></div>
<h3>Dark Mode</h3>
<p>Augenschonender Dunkelmodus für spätes Lernen ohne blendenden Bildschirm.</p>
</div>
</div>
</div>
</section>
<!-- SCHÜLER / LEHRER -->
<section id="ueber">
<div class="section-inner">
<div class="sec-head">
<div class="sec-eyebrow">Für wen</div>
<h2 class="sec-title">Zwei Perspektiven, ein System</h2>
<p class="sec-lead">
Ob du im Klassenzimmer sitzt oder davor stehst INFO1 passt sich an deine Rolle an.
</p>
</div>
<div class="split">
<div class="split-card primary">
<span class="split-tag">Schüler</span>
<h3>Durch die Schulzeit stressfrei</h3>
<p class="lead">Plane, organisiere und vernetze dich mit deiner Klasse ohne WhatsApp-Chaos.</p>
<ul class="split-list">
<li><i data-lucide="check"></i> Persönliches Dashboard mit deinem Stundenplan</li>
<li><i data-lucide="check"></i> Noten-Übersicht mit automatischem Schnitt</li>
<li><i data-lucide="check"></i> Hausaufgaben, To-Dos und Countdowns an einem Ort</li>
<li><i data-lucide="check"></i> Verschlüsselter Klassen-Chat + Dateispeicher</li>
<li><i data-lucide="check"></i> Shared Kalender für Klausuren &amp; Events</li>
</ul>
</div>
<div class="split-card">
<span class="split-tag">Lehrer</span>
<h3>Klassen-Überblick mit Fach-Fokus</h3>
<p class="lead">Teile Materialien, setze Einträge und bleibe mit deiner Klasse in Kontakt.</p>
<ul class="split-list">
<li><i data-lucide="check"></i> Registrierung mit Fach-Zuordnung und Admin-Freigabe</li>
<li><i data-lucide="check"></i> Materialien hochladen und mit der Klasse teilen</li>
<li><i data-lucide="check"></i> Hausaufgaben &amp; Klausurtermine eintragen</li>
<li><i data-lucide="check"></i> Support via Ticket-System direkt im Dashboard</li>
<li><i data-lucide="check"></i> Nur freigegebene IFB-E-Mails kontrollierter Zugang</li>
</ul>
</div>
</div>
</div>
</section>
<!-- SICHERHEIT -->
<section id="sicherheit">
<div class="section-inner">
<div class="sec-head">
<div class="sec-eyebrow">Sicherheit &amp; Datenschutz</div>
<h2 class="sec-title">Deine Daten gehören dir</h2>
<p class="sec-lead">
Entwickelt nach deutschen Datenschutz-Standards. Keine Tracker, keine Werbung, keine Weitergabe.
</p>
</div>
<div class="sec-grid">
<div class="sec-card">
<i data-lucide="shield-check"></i>
<h4>DSGVO &amp; Hetzner DE</h4>
<p>Server ausschließlich in Nürnberg. Keine Datenübertragung in Drittländer.</p>
</div>
<div class="sec-card">
<i data-lucide="key-round"></i>
<h4>2-Faktor-Authentifizierung</h4>
<p>Optionaler TOTP-Schutz per Authenticator-App für deinen Account.</p>
</div>
<div class="sec-card">
<i data-lucide="lock"></i>
<h4>Ende-zu-Ende-Chat</h4>
<p>Chat-Nachrichten werden im Browser verschlüsselt der Server liest nicht mit.</p>
</div>
<div class="sec-card">
<i data-lucide="mail-check"></i>
<h4>Geschlossener Zugang</h4>
<p>Nur offizielle <span class="redact">@ifb-schulen.com</span>-Adressen dürfen sich registrieren.</p>
</div>
</div>
</div>
</section>
<!-- FAQ -->
<section id="faq">
<div class="section-inner">
<div class="sec-head">
<div class="sec-eyebrow">FAQ</div>
<h2 class="sec-title">Häufige Fragen</h2>
</div>
<div class="faq-list">
<details class="faq-item">
<summary>Was kostet die Nutzung?</summary>
<div class="faq-body">
Nichts. INFO1 ist ein privates Projekt für die Klasse und kostet die Nutzer keinen Cent.
</div>
</details>
<details class="faq-item">
<summary>Wer darf sich registrieren?</summary>
<div class="faq-body">
Nur Personen mit einer offiziellen <span class="redact">@ifb-schulen.com</span>-E-Mail-Adresse. Lehrer-Accounts werden zusätzlich
manuell vom Admin freigegeben, um Missbrauch auszuschließen.
</div>
</details>
<details class="faq-item">
<summary>Wo liegen meine Daten?</summary>
<div class="faq-body">
Auf einem Hetzner-Server in Nürnberg, Deutschland. Es findet keine Übertragung in Drittländer statt.
Details in der <a href="/datenschutz" style="color:var(--blue);">Datenschutzerklärung</a>.
</div>
</details>
<details class="faq-item">
<summary>Kann der Admin meinen Chat lesen?</summary>
<div class="faq-body">
Nein. Chat-Nachrichten werden im Browser mit einem Klassen-Schlüssel verschlüsselt, bevor sie den Server erreichen.
Auf dem Server liegen nur Chiffre-Texte.
</div>
</details>
<details class="faq-item">
<summary>Was passiert, wenn ich mein Passwort vergesse?</summary>
<div class="faq-body">
Passwörter werden mit bcrypt gehasht und sind niemandem auch nicht dem Admin im Klartext bekannt.
Bei Verlust meldest du dich beim Admin für einen Reset.
</div>
</details>
<details class="faq-item">
<summary>Läuft INFO1 auch auf dem Handy?</summary>
<div class="faq-body">
Ja. Das Dashboard ist voll responsive und funktioniert auf Smartphone, Tablet und Desktop gleich gut.
</div>
</details>
</div>
</div>
</section>
<!-- CTA -->
<section>
<div class="cta-band">
<h2>Bereit für ein aufgeräumtes Schuljahr?</h2>
<p>Registriere dich in 30 Sekunden mit deiner IFB-E-Mail und leg los.</p>
<div style="display:flex; gap:12px; justify-content:center; flex-wrap:wrap;">
<a class="btn btn-lg" href="/login?tab=register">Jetzt kostenlos starten <i data-lucide="arrow-right"></i></a>
<a class="btn btn-ghost btn-lg" href="/login">Ich habe schon einen Account</a>
</div>
</div>
</section>
<!-- FOOTER -->
<footer>
<div class="foot-inner">
<div class="foot-about">
<a class="brand" href="/">
<div class="brand-mark">i1</div>
<div class="brand-text">
<span class="brand-sub">Klassenportal</span>
<span class="brand-name">INFO1</span>
</div>
</a>
<p>Privates Klassenportal für die INFO1-Klasse. Kein offizielles Angebot einer Schule oder eines Trägers. Daten gehostet in Deutschland.</p>
</div>
<div class="foot-col">
<h5>Produkt</h5>
<ul>
<li><a href="#features">Funktionen</a></li>
<li><a href="#ueber">Für wen</a></li>
<li><a href="#sicherheit">Sicherheit</a></li>
<li><a href="#faq">FAQ</a></li>
</ul>
</div>
<div class="foot-col">
<h5>Account</h5>
<ul>
<li><a href="/login">Anmelden</a></li>
<li><a href="/login?tab=register">Registrieren</a></li>
<li><a href="/app">Zum Dashboard</a></li>
</ul>
</div>
<div class="foot-col">
<h5>Rechtliches</h5>
<ul>
<li><a href="/datenschutz">Datenschutz</a></li>
<li><a href="https://www.ifb-schulen.de" target="_blank" rel="noopener">IFB Website</a></li>
</ul>
</div>
</div>
<div class="foot-bottom">
<span>© <span id="y"></span> INFO1 · Privates Klassenportal (inoffiziell)</span>
<span>Daten auf Hetzner, Nürnberg · EU-DSGVO konform</span>
</div>
</footer>
<script>
document.getElementById('y').textContent = new Date().getFullYear();
function toggleDark() {
document.body.classList.toggle('dark');
try { localStorage.setItem('dark', document.body.classList.contains('dark') ? '1' : '0'); } catch {}
}
try { if (localStorage.getItem('dark') === '1') document.body.classList.add('dark'); } catch {}
lucide.createIcons();
</script>
</body>
</html>