Zweites Lebenslauf-Design "Social Media" + Anschreiben folgt dem Layout

Der Lebenslauf kann jetzt zwischen zwei Layouts waehlen, und das Anschreiben
uebernimmt immer das Layout des Lebenslaufs - beide Dokumente kommen als ein Set
beim Unternehmen an.

"Social Media" ist die verspielte Variante nach der Media-Kit-Vorlage: getoente
Seite, rundes Portrait mit Blob, Schreibschrift-Zeile ueber einem grossen Namen,
Herzchen als Abschnittsmarker und Bullets, abgerundete Karten je Station,
Pill-Chips fuer Kompetenzen und Sprachen, Glitzer-Sterne als Deko. Bewusst laut -
gedacht fuer kreative und Social-Media-Stellen.

Die gesamte Farbwelt (Seite, Karten, Pills, Deko) wird aus der Akzentfarbe
abgeleitet, das Layout funktioniert also auch in Violett oder Tiefblau. Neue
Akzente Pink und Violett; das Layout bringt eigene Defaults mit (pink, rundes
Foto), sodass ein Wechsel sofort stimmig aussieht.

Neue Schriften (SIL OFL): Poppins fuer die geometrische Sans, Pacifico fuer die
Schreibschrift. Es werden nur die Fonts eingebettet, die das gewaehlte Layout
nutzt - ein klassischer Lebenslauf traegt Poppins/Pacifico nicht mit.

Herz und Sparkle sind als Bezier-Pfade gezeichnet, weil sich auf ein Herz-Glyph
in der Schrift nicht verlassen werden kann. Das neue Layout nutzt dieselbe
Mess- und Skalier-Mechanik wie das klassische, erbt also die Ein-Seiten-Garantie.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-13 01:15:02 +02:00
co-authored by Claude Opus 4.8
parent 9f7349af4e
commit 0e1d9b3322
9 changed files with 917 additions and 75 deletions
+11 -1
View File
@@ -2001,8 +2001,18 @@ initializeDatabase().then(() => {
app.post('/vorlagen/design', async (req, res) => {
try {
const gewaehlt = designStore.settings(req.body);
// Compare against what the *chosen layout* ships with, not the global
// defaults — otherwise picking "social" would persist its own pink/round
// defaults as if the user had overridden them. `layout` itself keeps the
// global default as its yardstick, so choosing a non-default layout is
// stored (comparing it against itself would never save anything).
const basis = {
...designStore.DEFAULTS,
...(designStore.LAYOUT_DEFAULTS[gewaehlt.layout] || {}),
layout: designStore.DEFAULTS.layout,
};
for (const [key, value] of Object.entries(gewaehlt)) {
if (value === designStore.DEFAULTS[key]) {
if (value === basis[key]) {
await dbRun('DELETE FROM design WHERE key = ?', [key]);
} else {
await dbRun(