Files
schakal00783andClaude Opus 5 ef676a95f4 feat: perinco Pulse - Zeiterfassung fuer perinco
Erste Fassung, live unter https://pulse.perinco.de.

Frontend React 19 + TypeScript + Tailwind 4 (Vite), Backend Express mit
mysql2 auf MariaDB, Exporte als PDF (pdfkit), Excel (exceljs) und CSV.
Aufbau, Designsystem und die sieben Themes kommen aus dem perinco CRM.

Fachlich:
- Buchung mit Wochen-, Monats- und Jahresansicht, Zeiten als 1:23 oder 1,5
- Projekte mit n Budgettoepfen: Laufzeit, Volumen, Sperre bei Ablauf oder
  aufgebrauchtem Budget, Buchung nur auf den passenden Topf
- Kunden, Team mit Hierarchie, Reports im Harvest-Stil, Monatsexporte
- Rollen user/lead/management/admin, doppelt geprueft (Menue und Backend)
- SSO gegen Microsoft Entra ID, Uebernahme der AD-Benutzer per Drag & Drop

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 22:52:20 +02:00

58 lines
2.3 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1600 80" width="1600" height="80" preserveAspectRatio="xMidYMid slice">
<!--
Outdoor, obere Leiste: blauer Himmel mit Schleierwolken.
Die Leiste ist nur 80 px hoch und traegt Text - deshalb keine kraeftigen
Kontraste, sondern ein weicher Verlauf und Wolken aus unscharfen Ellipsen.
Der Schleier darueber kommt aus dem Theme (index.css), nicht aus dieser
Datei: so tont derselbe Himmel im Dunkelmodus zur Nacht ab.
-->
<defs>
<linearGradient id="himmel" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#5eb3e4" />
<stop offset="0.55" stop-color="#8fcdec" />
<stop offset="1" stop-color="#cfe8f5" />
</linearGradient>
<filter id="weich" x="-30%" y="-120%" width="160%" height="340%">
<feGaussianBlur stdDeviation="9" />
</filter>
<filter id="sehrWeich" x="-40%" y="-200%" width="180%" height="500%">
<feGaussianBlur stdDeviation="20" />
</filter>
</defs>
<rect width="1600" height="80" fill="url(#himmel)" />
<!-- Sonnenschein oben links, gerade so sichtbar -->
<ellipse cx="240" cy="4" rx="260" ry="60" fill="#fff6d8" opacity="0.5" filter="url(#sehrWeich)" />
<!-- Wolkenbaenke: je drei bis vier Ellipsen, damit die Kanten unregelmaessig sind -->
<g fill="#ffffff" filter="url(#weich)">
<g opacity="0.85">
<ellipse cx="150" cy="52" rx="120" ry="20" />
<ellipse cx="230" cy="44" rx="80" ry="16" />
<ellipse cx="86" cy="58" rx="70" ry="14" />
</g>
<g opacity="0.6">
<ellipse cx="520" cy="30" rx="150" ry="17" />
<ellipse cx="610" cy="24" rx="90" ry="13" />
</g>
<g opacity="0.8">
<ellipse cx="880" cy="58" rx="170" ry="22" />
<ellipse cx="960" cy="50" rx="110" ry="16" />
<ellipse cx="800" cy="62" rx="90" ry="15" />
</g>
<g opacity="0.55">
<ellipse cx="1240" cy="26" rx="140" ry="16" />
<ellipse cx="1330" cy="34" rx="100" ry="14" />
</g>
<g opacity="0.78">
<ellipse cx="1520" cy="56" rx="150" ry="20" />
<ellipse cx="1440" cy="62" rx="90" ry="14" />
</g>
</g>
<!-- Dunstband am unteren Rand: laesst die Leiste sauber in den Inhalt uebergehen -->
<rect y="60" width="1600" height="20" fill="#ffffff" opacity="0.28" filter="url(#weich)" />
</svg>