348 lines
11 KiB
HTML
348 lines
11 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="de">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>Aufbau einer Persona</title>
|
||
<style>
|
||
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;700&display=swap');
|
||
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
|
||
:root{
|
||
--bg:#0D1117;--surface:#161B22;--surface-2:#1C2128;--border:#21262D;
|
||
--text:#C9D1D9;--text-muted:#6E7681;--text-bright:#F0F6FC;
|
||
|
||
/* per-persona accent colors */
|
||
--amber:#F59E0B;
|
||
--blue:#60A5FA;
|
||
--green:#34D399;
|
||
--purple:#A78BFA;
|
||
--orange:#FB923C;
|
||
--red:#F87171;
|
||
--cyan:#22D3EE;
|
||
}
|
||
|
||
body{
|
||
background:var(--bg);
|
||
color:var(--text);
|
||
font-family:'Inter',system-ui,sans-serif;
|
||
height:100vh;
|
||
display:flex;
|
||
align-items:stretch;
|
||
padding:14px;
|
||
}
|
||
|
||
/* ── Outer shell ── */
|
||
.card{
|
||
width:100%;
|
||
display:flex;
|
||
flex-direction:column;
|
||
background:var(--surface);
|
||
border:1px solid var(--border);
|
||
border-radius:12px;
|
||
overflow:hidden;
|
||
position:relative;
|
||
}
|
||
.card::before{
|
||
content:'';
|
||
position:absolute;
|
||
inset:0;
|
||
background-image:radial-gradient(circle,rgba(255,255,255,0.05) 1px,transparent 1px);
|
||
background-size:26px 26px;
|
||
pointer-events:none;
|
||
}
|
||
|
||
/* ── Top bar ── */
|
||
.topbar{
|
||
display:flex;
|
||
align-items:center;
|
||
justify-content:space-between;
|
||
padding:15px 32px;
|
||
border-bottom:1px solid var(--border);
|
||
border-left:4px solid #4B5563;
|
||
font-family:'JetBrains Mono',monospace;
|
||
font-size:13px;
|
||
color:var(--text-muted);
|
||
}
|
||
.topbar .file{color:var(--text);font-weight:500}
|
||
.topbar .right{display:flex;gap:20px;align-items:center}
|
||
.topbar .project{color:#6B7280;font-weight:700;letter-spacing:1px;font-size:12px}
|
||
|
||
/* ── Layout: two columns ── */
|
||
.body{
|
||
flex:1;
|
||
display:grid;
|
||
grid-template-columns:270px 1fr;
|
||
min-height:0;
|
||
overflow:hidden;
|
||
position:relative;
|
||
}
|
||
|
||
/* ── Left: file outline ── */
|
||
.outline{
|
||
border-right:1px solid var(--border);
|
||
padding:22px 18px;
|
||
display:flex;
|
||
flex-direction:column;
|
||
gap:5px;
|
||
overflow:hidden;
|
||
}
|
||
.outline-title{
|
||
font-family:'JetBrains Mono',monospace;
|
||
font-size:11px;
|
||
font-weight:700;
|
||
text-transform:uppercase;
|
||
letter-spacing:1.5px;
|
||
color:var(--text-muted);
|
||
margin-bottom:12px;
|
||
padding-left:4px;
|
||
}
|
||
.outline-item{
|
||
font-family:'JetBrains Mono',monospace;
|
||
font-size:13px;
|
||
padding:6px 10px;
|
||
border-radius:4px;
|
||
color:var(--text-muted);
|
||
display:flex;
|
||
align-items:center;
|
||
gap:9px;
|
||
cursor:default;
|
||
transition:background .15s;
|
||
}
|
||
.outline-item .num{
|
||
font-size:11px;
|
||
color:#4B5563;
|
||
flex-shrink:0;
|
||
width:16px;
|
||
text-align:right;
|
||
}
|
||
.outline-item.header-item{ color:var(--text); font-weight:500; }
|
||
.outline-item.active{
|
||
background:var(--surface-2);
|
||
color:var(--text-bright);
|
||
font-weight:500;
|
||
}
|
||
/* accent dot per section */
|
||
.outline-item .dot{
|
||
width:7px; height:7px; border-radius:50%;
|
||
flex-shrink:0;
|
||
}
|
||
|
||
/* ── Right: content ── */
|
||
.content{
|
||
padding:14px 26px;
|
||
display:flex;
|
||
flex-direction:column;
|
||
gap:8px;
|
||
overflow:hidden;
|
||
}
|
||
|
||
/* ── Section row ── */
|
||
.section{
|
||
flex:1;
|
||
background:var(--surface-2);
|
||
border:1px solid var(--border);
|
||
border-radius:8px;
|
||
padding:12px 18px;
|
||
display:grid;
|
||
grid-template-columns:auto 1fr;
|
||
gap:0 20px;
|
||
align-items:center;
|
||
border-left:3px solid transparent;
|
||
transition:border-color .15s;
|
||
}
|
||
.section:hover{ border-left-color:var(--section-accent, #4B5563); }
|
||
|
||
.section-label-col{
|
||
display:flex;
|
||
flex-direction:column;
|
||
gap:5px;
|
||
align-items:flex-start;
|
||
padding-top:2px;
|
||
}
|
||
.section-heading{
|
||
font-family:'JetBrains Mono',monospace;
|
||
font-size:13px;
|
||
font-weight:700;
|
||
color:var(--text-muted);
|
||
white-space:nowrap;
|
||
}
|
||
.from-badge{
|
||
font-family:'JetBrains Mono',monospace;
|
||
font-size:11px;
|
||
font-weight:700;
|
||
padding:3px 9px;
|
||
border-radius:3px;
|
||
white-space:nowrap;
|
||
letter-spacing:.3px;
|
||
}
|
||
|
||
.section-text{
|
||
font-size:14px;
|
||
line-height:1.65;
|
||
color:var(--text-muted);
|
||
}
|
||
.section-text strong{
|
||
color:var(--text-bright);
|
||
font-weight:600;
|
||
}
|
||
|
||
/* ── identity section (wider badge, top of file) ── */
|
||
.section.identity{
|
||
background:transparent;
|
||
border-color:transparent;
|
||
border-left:3px solid #4B5563;
|
||
padding-left:14px;
|
||
}
|
||
|
||
/* Accent per persona */
|
||
.acc-red { --section-accent:var(--red); background:color-mix(in srgb,var(--red) 10%,transparent); color:var(--red); border-color:color-mix(in srgb,var(--red) 35%,transparent); }
|
||
.acc-cyan { --section-accent:var(--cyan); background:color-mix(in srgb,var(--cyan) 10%,transparent); color:var(--cyan); border-color:color-mix(in srgb,var(--cyan) 35%,transparent); }
|
||
.acc-purple{ --section-accent:var(--purple); background:color-mix(in srgb,var(--purple)10%,transparent); color:var(--purple); border-color:color-mix(in srgb,var(--purple)35%,transparent); }
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<div class="card">
|
||
|
||
<!-- top bar -->
|
||
<div class="topbar">
|
||
<div>
|
||
<span class="dir" style="color:var(--text-muted)">.claude/personas/</span>
|
||
<span class="file">*.md</span>
|
||
<span style="margin-left:12px;color:#4B5563">— alle Personas, gleicher Aufbau</span>
|
||
</div>
|
||
<div class="right">
|
||
<span>7 Dateien · gleiche Struktur</span>
|
||
<span class="project">FAMILIENARCHIV</span>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="body">
|
||
|
||
<!-- left: outline panel -->
|
||
<div class="outline">
|
||
<div class="outline-title">Outline</div>
|
||
|
||
<div class="outline-item header-item">
|
||
<span class="num">#</span>
|
||
<span>identity</span>
|
||
</div>
|
||
<div class="outline-item">
|
||
<span class="num">##</span>
|
||
<span>hard_limits</span>
|
||
</div>
|
||
<div class="outline-item" style="height:10px"></div>
|
||
|
||
<div class="outline-item active">
|
||
<span class="num">##</span>
|
||
<div class="dot" style="background:var(--red)"></div>
|
||
<span>readable_code</span>
|
||
</div>
|
||
<div class="outline-item active">
|
||
<span class="num">##</span>
|
||
<div class="dot" style="background:var(--cyan)"></div>
|
||
<span>reliable_code</span>
|
||
</div>
|
||
<div class="outline-item active">
|
||
<span class="num">##</span>
|
||
<div class="dot" style="background:var(--red)"></div>
|
||
<span>modern_code</span>
|
||
</div>
|
||
<div class="outline-item active">
|
||
<span class="num">##</span>
|
||
<div class="dot" style="background:var(--purple)"></div>
|
||
<span>secure_code</span>
|
||
</div>
|
||
<div class="outline-item active">
|
||
<span class="num">##</span>
|
||
<div class="dot" style="background:var(--purple)"></div>
|
||
<span>testable_code</span>
|
||
</div>
|
||
|
||
<div class="outline-item" style="height:10px"></div>
|
||
<div class="outline-item header-item">
|
||
<span class="num">##</span>
|
||
<span>domain_expertise</span>
|
||
</div>
|
||
<div class="outline-item" style="color:#4B5563;font-size:10px;padding-left:22px">
|
||
(persona-spezifisch)
|
||
</div>
|
||
</div>
|
||
|
||
<!-- right: content -->
|
||
<div class="content">
|
||
|
||
<!-- identity – neutral -->
|
||
<div class="section identity">
|
||
<div class="section-label-col">
|
||
<span class="section-heading" style="color:#6B7280"># identity</span>
|
||
<span class="from-badge" style="background:#21262D;color:#6B7280;border:1px solid #30363D">
|
||
alle
|
||
</span>
|
||
</div>
|
||
<div class="section-text">
|
||
Name · Rolle · Philosophie · Hard Limits — was diese Persona <strong>niemals</strong> tut.
|
||
Der Hard-Limits-Abschnitt ist die entscheidende Disziplinkontrolle.
|
||
</div>
|
||
</div>
|
||
|
||
<!-- readable_code → Security -->
|
||
<div class="section" style="--section-accent:var(--red)">
|
||
<div class="section-label-col">
|
||
<span class="section-heading" style="color:var(--red)">## readable_code</span>
|
||
<span class="from-badge acc-red">Nora "NullX"</span>
|
||
</div>
|
||
<div class="section-text">
|
||
<strong>Security-Code muss der lesbarste Code im gesamten Codebase sein</strong> — weil er am wahrscheinlichsten während eines Incident Response auditiert, hinterfragt und unter Zeitdruck gelesen wird. Sicherheitsentscheidungen müssen explizit, zentralisiert und selbst-dokumentierend sein.
|
||
</div>
|
||
</div>
|
||
|
||
<!-- reliable_code → DevOps -->
|
||
<div class="section" style="--section-accent:var(--cyan)">
|
||
<div class="section-label-col">
|
||
<span class="section-heading" style="color:var(--cyan)">## reliable_code</span>
|
||
<span class="from-badge acc-cyan">Tobias "tobi"</span>
|
||
</div>
|
||
<div class="section-text">
|
||
Zuverlässige Infrastruktur bedeutet, dass das System ohne menschlichen Eingriff aus Fehlern zurückfindet. <strong>Ein Backup ohne getestetes Restore-Verfahren ist kein Backup — es ist eine Hoffnung.</strong>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- modern_code → Security -->
|
||
<div class="section" style="--section-accent:var(--red)">
|
||
<div class="section-label-col">
|
||
<span class="section-heading" style="color:var(--red)">## modern_code</span>
|
||
<span class="from-badge acc-red">Nora "NullX"</span>
|
||
</div>
|
||
<div class="section-text">
|
||
<strong>Moderne Security nutzt Framework-eigene Controls, anstatt Schutzmechanismen selbst zu bauen.</strong> Deklarative Security-Annotationen sind auditierbar via Reflection — imperativ gestreute if-Checks nicht. Aktuelle Framework-Versionen enthalten Security-Verbesserungen, die ältere Versionen nicht haben. Aktuell bleiben ist eine Sicherheitsstrategie.
|
||
</div>
|
||
</div>
|
||
|
||
<!-- secure_code → UX -->
|
||
<div class="section" style="--section-accent:var(--purple)">
|
||
<div class="section-label-col">
|
||
<span class="section-heading" style="color:var(--purple)">## secure_code</span>
|
||
<span class="from-badge acc-purple">Leonie Voss</span>
|
||
</div>
|
||
<div class="section-text">
|
||
UI-Security schützt Nutzer vor schädlichen Interaktionen — irreführende Interfaces, exponierte Daten, unsichtbare Fallen. <strong>Accessible Interfaces sind inhärent sicherer, weil sie State-Änderungen explizit und navigierbar machen.</strong> Sicherheit und Usability sind Verbündete, keine Trade-offs.
|
||
</div>
|
||
</div>
|
||
|
||
<!-- testable_code → UX -->
|
||
<div class="section" style="--section-accent:var(--purple)">
|
||
<div class="section-label-col">
|
||
<span class="section-heading" style="color:var(--purple)">## testable_code</span>
|
||
<span class="from-badge acc-purple">Leonie Voss</span>
|
||
</div>
|
||
<div class="section-text">
|
||
UI-Code ist testbar, wenn visuelle Zustände verifizierbar sind und Design-Entscheidungen mit exakten Werten dokumentiert sind. <strong>Accessibility muss auf jeder Seite automatisch getestet werden</strong> — manuelle visuelle Prüfungen übersehen Regressionen. Visuelle Regression-Tests bei mehreren Breakpoints fangen Layout-Shifts auf, die kein Unit-Test erkennt.
|
||
</div>
|
||
</div>
|
||
|
||
</div><!-- /content -->
|
||
</div><!-- /body -->
|
||
</div>
|
||
</body>
|
||
</html>
|