2026-03-03 20:47:56 +01:00
<!DOCTYPE html>
< html lang = "de" >
< head >
< meta charset = "UTF-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< title > DocuMentor - XSL-Transformations-Toolkit</ title >
2026-03-03 21:19:54 +01:00
< link rel = "stylesheet" href = "fonts/fonts_v3.css" >
2026-03-03 20:47:56 +01:00
< style >
*, * :: before , * :: after {
margin : 0 ;
padding : 0 ;
box-sizing : border-box ;
}
: root {
--green : #00ff41 ;
--green-dim : #00cc33 ;
--green-dark : #009922 ;
--green-glow : #00ff41 80 ;
--green-faint : #00ff41 15 ;
--green-subtle : #00ff41 0 a ;
--bg : #0a0a0a ;
--bg-light : #0f0f0f ;
--bg-card : #111111 ;
--border : #00ff41 30 ;
}
html {
scroll-behavior : smooth ;
}
body {
font-family : 'VT323' , monospace ;
background : var ( -- bg );
color : var ( -- green );
font-size : 18 px ;
line-height : 1.6 ;
overflow-x : hidden ;
position : relative ;
}
/* CRT Scan Lines Overlay */
body :: before {
content : '' ;
position : fixed ;
top : 0 ;
left : 0 ;
width : 100 % ;
height : 100 % ;
pointer-events : none ;
z-index : 9999 ;
background : repeating-linear-gradient (
0 deg ,
transparent ,
transparent 2 px ,
rgba ( 0 , 0 , 0 , 0.15 ) 2 px ,
rgba ( 0 , 0 , 0 , 0.15 ) 4 px
);
}
/* CRT Flicker */
body :: after {
content : '' ;
position : fixed ;
top : 0 ;
left : 0 ;
width : 100 % ;
height : 100 % ;
pointer-events : none ;
z-index : 9998 ;
background : radial-gradient ( ellipse at center , transparent 60 % , rgba ( 0 , 0 , 0 , 0.4 ) 100 % );
animation : flicker 0.08 s infinite alternate ;
}
@ keyframes flicker {
0 % { opacity : 0.97 ; }
100 % { opacity : 1 ; }
}
/* Matrix Rain Canvas */
# matrix-canvas {
position : fixed ;
top : 0 ;
left : 0 ;
width : 100 % ;
height : 100 % ;
z-index : -1 ;
opacity : 0.06 ;
}
/* Typing cursor blink */
@ keyframes blink-caret {
0 %, 50 % { border-color : var ( -- green ); }
51 %, 100 % { border-color : transparent ; }
}
@ keyframes blink {
0 %, 50 % { opacity : 1 ; }
51 %, 100 % { opacity : 0 ; }
}
@ keyframes glow-pulse {
0 %, 100 % { text-shadow : 0 0 10 px var ( -- green - glow ), 0 0 20 px var ( -- green - glow ); }
50 % { text-shadow : 0 0 20 px var ( -- green - glow ), 0 0 40 px var ( -- green - glow ), 0 0 60 px var ( -- green - glow ); }
}
@ keyframes scanline-move {
0 % { top : -10 % ; }
100 % { top : 110 % ; }
}
@ keyframes type-in {
from { width : 0 ; }
to { width : 100 % ; }
}
@ keyframes fade-in-up {
from { opacity : 0 ; transform : translateY ( 30 px ); }
to { opacity : 1 ; transform : translateY ( 0 ); }
}
. cursor-blink {
display : inline-block ;
width : 12 px ;
height : 1.1 em ;
background : var ( -- green );
animation : blink 1 s step-end infinite ;
vertical-align : text - bottom ;
margin-left : 2 px ;
}
/* Moving scanline */
. scanline-bar {
position : fixed ;
width : 100 % ;
height : 6 px ;
background : linear-gradient ( 180 deg , transparent , var ( -- green - faint ), transparent );
z-index : 9997 ;
pointer-events : none ;
animation : scanline-move 8 s linear infinite ;
}
/* Navigation */
nav {
position : fixed ;
top : 0 ;
left : 0 ;
right : 0 ;
z-index : 1000 ;
background : rgba ( 10 , 10 , 10 , 0.95 );
border-bottom : 1 px solid var ( -- border );
padding : 12 px 0 ;
backdrop-filter : blur ( 5 px );
}
nav . nav-inner {
max-width : 1100 px ;
margin : 0 auto ;
padding : 0 24 px ;
display : flex ;
justify-content : space-between ;
align-items : center ;
}
nav . logo {
font-size : 22 px ;
color : var ( -- green );
text-shadow : 0 0 10 px var ( -- green - glow );
letter-spacing : 2 px ;
}
nav . logo span {
color : var ( -- green - dark );
}
nav ul {
list-style : none ;
display : flex ;
gap : 24 px ;
}
nav ul li a {
color : var ( -- green - dim );
text-decoration : none ;
font-family : 'Share Tech Mono' , monospace ;
font-size : 14 px ;
letter-spacing : 1 px ;
transition : color 0.3 s , text - shadow 0.3 s ;
text-transform : uppercase ;
}
nav ul li a : hover {
color : var ( -- green );
text-shadow : 0 0 10 px var ( -- green - glow );
}
. hamburger {
display : none ;
flex-direction : column ;
gap : 5 px ;
cursor : pointer ;
background : none ;
border : none ;
padding : 4 px ;
}
. hamburger span {
display : block ;
width : 24 px ;
height : 2 px ;
background : var ( -- green );
}
/* Sections */
section {
max-width : 1100 px ;
margin : 0 auto ;
padding : 100 px 24 px ;
}
. section-label {
font-family : 'Share Tech Mono' , monospace ;
font-size : 13 px ;
color : var ( -- green - dark );
letter-spacing : 3 px ;
text-transform : uppercase ;
margin-bottom : 8 px ;
}
. section-title {
font-size : 36 px ;
color : var ( -- green );
text-shadow : 0 0 15 px var ( -- green - glow );
margin-bottom : 40 px ;
line-height : 1.3 ;
}
. section-title :: before {
content : '> ' ;
color : var ( -- green - dark );
}
/* ======================== */
/* HERO */
/* ======================== */
# hero {
min-height : 100 vh ;
display : flex ;
flex-direction : column ;
justify-content : center ;
padding-top : 80 px ;
position : relative ;
}
. boot-sequence {
margin-bottom : 40 px ;
}
. boot-line {
font-family : 'Share Tech Mono' , monospace ;
font-size : 14 px ;
color : var ( -- green - dark );
opacity : 0 ;
transform : translateY ( 10 px );
margin-bottom : 4 px ;
letter-spacing : 1 px ;
}
. boot-line . visible {
opacity : 1 ;
transform : translateY ( 0 );
transition : opacity 0.3 s , transform 0.3 s ;
}
. boot-line . ok :: after {
content : ' [OK]' ;
color : var ( -- green );
}
. boot-line . loading :: after {
content : ' ...' ;
animation : blink 1 s step-end infinite ;
}
. hero-title {
font-size : clamp ( 48 px , 8 vw , 90 px );
line-height : 1.1 ;
color : var ( -- green );
text-shadow : 0 0 30 px var ( -- green - glow ), 0 0 60 px rgba ( 0 , 255 , 65 , 0.3 );
margin-bottom : 16 px ;
animation : glow-pulse 4 s ease-in-out infinite ;
letter-spacing : 4 px ;
}
. hero-tagline {
font-size : 24 px ;
color : var ( -- green - dim );
margin-bottom : 32 px ;
max-width : 700 px ;
}
. hero-tagline . typed-text {
border-right : 2 px solid var ( -- green );
animation : blink - caret 1 s step-end infinite ;
padding-right : 4 px ;
}
. hero-prompt {
font-family : 'Share Tech Mono' , monospace ;
font-size : 15 px ;
color : var ( -- green - dark );
margin-top : 48 px ;
}
. hero-prompt a {
color : var ( -- green );
text-decoration : none ;
border-bottom : 1 px dashed var ( -- green - dark );
transition : text - shadow 0.3 s ;
}
. hero-prompt a : hover {
text-shadow : 0 0 10 px var ( -- green - glow );
}
/* ======================== */
/* FEATURES */
/* ======================== */
. features-grid {
display : grid ;
grid-template-columns : repeat ( auto - fit , minmax ( 320 px , 1 fr ));
gap : 24 px ;
}
. feature-card {
background : var ( -- bg - card );
border : 1 px solid var ( -- border );
padding : 28 px 24 px ;
position : relative ;
overflow : hidden ;
transition : border-color 0.3 s , box-shadow 0.3 s ;
}
. feature-card : hover {
border-color : var ( -- green - dim );
box-shadow : 0 0 30 px var ( -- green - subtle ), inset 0 0 30 px var ( -- green - subtle );
}
. feature-card :: before {
content : '' ;
position : absolute ;
top : 0 ;
left : 0 ;
width : 100 % ;
height : 2 px ;
background : linear-gradient ( 90 deg , transparent , var ( -- green - dark ), transparent );
opacity : 0 ;
transition : opacity 0.3 s ;
}
. feature-card : hover :: before {
opacity : 1 ;
}
. feature-icon {
font-size : 28 px ;
margin-bottom : 12 px ;
display : block ;
color : var ( -- green );
text-shadow : 0 0 10 px var ( -- green - glow );
font-family : 'Share Tech Mono' , monospace ;
}
. feature-card h3 {
font-size : 22 px ;
margin-bottom : 10 px ;
color : var ( -- green );
}
. feature-card h3 :: before {
content : '$ ' ;
color : var ( -- green - dark );
font-size : 18 px ;
}
. feature-card p {
color : var ( -- green - dim );
font-size : 16 px ;
line-height : 1.5 ;
}
/* ======================== */
/* WORKFLOW */
/* ======================== */
. workflow-steps {
display : grid ;
gap : 0 ;
position : relative ;
}
. workflow-step {
display : grid ;
grid-template-columns : 60 px 1 fr ;
gap : 20 px ;
padding : 28 px 0 ;
border-bottom : 1 px solid var ( -- border );
position : relative ;
opacity : 0 ;
transform : translateX ( -20 px );
transition : opacity 0.5 s , transform 0.5 s ;
}
. workflow-step . visible {
opacity : 1 ;
transform : translateX ( 0 );
}
. workflow-step : last-child {
border-bottom : none ;
}
. step-number {
width : 50 px ;
height : 50 px ;
border : 2 px solid var ( -- green - dark );
display : flex ;
align-items : center ;
justify-content : center ;
font-size : 24 px ;
color : var ( -- green );
text-shadow : 0 0 10 px var ( -- green - glow );
position : relative ;
flex-shrink : 0 ;
}
. step-number :: before {
content : '' ;
position : absolute ;
top : -2 px ;
left : -2 px ;
right : -2 px ;
bottom : -2 px ;
border : 1 px solid var ( -- green - faint );
}
. step-content h3 {
font-size : 22 px ;
color : var ( -- green );
margin-bottom : 6 px ;
}
. step-content p {
color : var ( -- green - dim );
font-size : 16 px ;
}
. step-content . cmd {
font-family : 'Share Tech Mono' , monospace ;
font-size : 13 px ;
color : var ( -- green - dark );
margin-top : 8 px ;
background : var ( -- bg );
display : inline-block ;
padding : 4 px 10 px ;
border : 1 px solid var ( -- border );
}
/* ======================== */
/* DEMO / TERMINAL OUTPUT */
/* ======================== */
. terminal-window {
background : var ( -- bg );
border : 1 px solid var ( -- border );
overflow : hidden ;
max-width : 900 px ;
margin : 0 auto ;
}
. terminal-header {
background : var ( -- bg - light );
padding : 10 px 16 px ;
display : flex ;
align-items : center ;
gap : 8 px ;
border-bottom : 1 px solid var ( -- border );
}
. terminal-dot {
width : 10 px ;
height : 10 px ;
border-radius : 50 % ;
border : 1 px solid var ( -- green - dark );
}
. terminal-dot . r { background : #ff5f56 80 ; border-color : #ff5f56 ; }
. terminal-dot . y { background : #ffbd2e 80 ; border-color : #ffbd2e ; }
. terminal-dot . g { background : #27c93f 80 ; border-color : #27c93f ; }
. terminal-title {
font-family : 'Share Tech Mono' , monospace ;
font-size : 12 px ;
color : var ( -- green - dark );
margin-left : 12 px ;
letter-spacing : 1 px ;
}
. terminal-body {
padding : 20 px 24 px ;
font-family : 'Share Tech Mono' , monospace ;
font-size : 14 px ;
line-height : 1.8 ;
min-height : 300 px ;
overflow-x : auto ;
}
. terminal-body . prompt {
color : var ( -- green );
}
. terminal-body . cmd-text {
color : var ( -- green );
}
. terminal-body . output {
color : var ( -- green - dim );
}
. terminal-body . success {
color : var ( -- green );
}
. terminal-body . warning {
color : #ffbd2e ;
}
. terminal-body . info {
color : var ( -- green - dark );
}
. terminal-body . highlight {
color : var ( -- green );
text-shadow : 0 0 8 px var ( -- green - glow );
}
. terminal-line {
margin-bottom : 2 px ;
white-space : pre ;
}
/* ======================== */
/* TECH STACK */
/* ======================== */
. tech-grid {
display : grid ;
grid-template-columns : repeat ( auto - fit , minmax ( 200 px , 1 fr ));
gap : 16 px ;
}
. tech-item {
background : var ( -- bg - card );
border : 1 px solid var ( -- border );
padding : 20 px ;
text-align : center ;
transition : border-color 0.3 s , transform 0.2 s ;
}
. tech-item : hover {
border-color : var ( -- green - dim );
transform : translateY ( -2 px );
}
. tech-item . tech-name {
font-size : 20 px ;
color : var ( -- green );
margin-bottom : 6 px ;
text-shadow : 0 0 8 px var ( -- green - glow );
}
. tech-item . tech-desc {
font-family : 'Share Tech Mono' , monospace ;
font-size : 12 px ;
color : var ( -- green - dark );
letter-spacing : 1 px ;
text-transform : uppercase ;
}
. tech-item . tech-icon {
font-size : 32 px ;
margin-bottom : 10 px ;
display : block ;
}
/* ======================== */
/* DOWNLOAD / INSTALL */
/* ======================== */
# download {
text-align : center ;
}
. install-block {
background : var ( -- bg - card );
border : 1 px solid var ( -- border );
padding : 32 px ;
max-width : 700 px ;
margin : 0 auto 32 px ;
text-align : left ;
position : relative ;
}
. install-block . install-label {
font-family : 'Share Tech Mono' , monospace ;
font-size : 12 px ;
color : var ( -- green - dark );
letter-spacing : 2 px ;
text-transform : uppercase ;
margin-bottom : 16 px ;
}
. install-cmd {
font-family : 'Share Tech Mono' , monospace ;
font-size : 16 px ;
color : var ( -- green );
background : var ( -- bg );
padding : 16 px 20 px ;
border : 1 px solid var ( -- border );
display : flex ;
align-items : center ;
justify-content : space-between ;
gap : 12 px ;
cursor : pointer ;
transition : border-color 0.3 s ;
margin-bottom : 12 px ;
flex-wrap : wrap ;
}
. install-cmd : hover {
border-color : var ( -- green - dim );
}
. install-cmd . cmd-prefix {
color : var ( -- green - dark );
user-select : none ;
}
. install-cmd . copy-hint {
font-size : 11 px ;
color : var ( -- green - dark );
letter-spacing : 1 px ;
user-select : none ;
}
. install-note {
font-family : 'Share Tech Mono' , monospace ;
font-size : 13 px ;
color : var ( -- green - dark );
margin-top : 12 px ;
}
. requirements-list {
text-align : left ;
max-width : 700 px ;
margin : 32 px auto 0 ;
font-family : 'Share Tech Mono' , monospace ;
font-size : 14 px ;
color : var ( -- green - dim );
}
. requirements-list li {
list-style : none ;
padding : 6 px 0 ;
border-bottom : 1 px solid var ( -- border );
}
. requirements-list li :: before {
content : '[+] ' ;
color : var ( -- green - dark );
}
/* ======================== */
/* FOOTER */
/* ======================== */
footer {
border-top : 1 px solid var ( -- border );
padding : 40 px 24 px ;
text-align : center ;
}
footer . footer-inner {
max-width : 1100 px ;
margin : 0 auto ;
}
. footer-ascii {
font-family : 'Share Tech Mono' , monospace ;
font-size : 11 px ;
color : var ( -- green - dark );
margin-bottom : 20 px ;
line-height : 1.3 ;
white-space : pre ;
overflow-x : auto ;
}
. footer-links {
display : flex ;
justify-content : center ;
gap : 24 px ;
margin-bottom : 16 px ;
flex-wrap : wrap ;
}
. footer-links a {
font-family : 'Share Tech Mono' , monospace ;
font-size : 13 px ;
color : var ( -- green - dark );
text-decoration : none ;
letter-spacing : 1 px ;
transition : color 0.3 s ;
}
. footer-links a : hover {
color : var ( -- green );
}
. footer-copy {
font-family : 'Share Tech Mono' , monospace ;
font-size : 12 px ;
color : #333 ;
letter-spacing : 1 px ;
}
/* Scroll animations */
. reveal {
opacity : 0 ;
transform : translateY ( 30 px );
transition : opacity 0.6 s ease , transform 0.6 s ease ;
}
. reveal . visible {
opacity : 1 ;
transform : translateY ( 0 );
}
/* Responsive */
@ media ( max-width : 768px ) {
nav ul {
display : none ;
position : absolute ;
top : 100 % ;
left : 0 ;
right : 0 ;
background : rgba ( 10 , 10 , 10 , 0.98 );
flex-direction : column ;
padding : 16 px 24 px ;
border-bottom : 1 px solid var ( -- border );
gap : 16 px ;
}
nav ul . open {
display : flex ;
}
. hamburger {
display : flex ;
}
. hero-title {
letter-spacing : 2 px ;
}
. features-grid {
grid-template-columns : 1 fr ;
}
. workflow-step {
grid-template-columns : 50 px 1 fr ;
gap : 14 px ;
}
. tech-grid {
grid-template-columns : repeat ( 2 , 1 fr );
}
section {
padding : 60 px 16 px ;
}
. terminal-body {
font-size : 12 px ;
padding : 14 px 16 px ;
}
. footer-ascii {
font-size : 8 px ;
}
}
@ media ( max-width : 480px ) {
. tech-grid {
grid-template-columns : 1 fr ;
}
}
</ style >
</ head >
< body >
< canvas id = "matrix-canvas" ></ canvas >
< div class = "scanline-bar" ></ div >
<!-- Navigation -->
< nav >
< div class = "nav-inner" >
< div class = "logo" >< span > [</ span > DocuMentor< span > ]</ span ></ div >
< button class = "hamburger" id = "hamburger" aria-label = "Menu" >
< span ></ span >< span ></ span >< span ></ span >
</ button >
< ul id = "nav-links" >
< li >< a href = "#features" > Features</ a ></ li >
< li >< a href = "#workflow" > Workflow</ a ></ li >
< li >< a href = "#demo" > Demo</ a ></ li >
< li >< a href = "#techstack" > Tech-Stack</ a ></ li >
< li >< a href = "#download" > Download</ a ></ li >
</ ul >
</ div >
</ nav >
<!-- HERO -->
< section id = "hero" >
< div class = "boot-sequence" id = "boot-sequence" >
< div class = "boot-line ok" > BIOS POST abgeschlossen</ div >
< div class = "boot-line ok" > PySide6 Runtime v6.8 geladen</ div >
< div class = "boot-line ok" > Saxon HE 12.5 initialisiert</ div >
< div class = "boot-line ok" > Apache FOP 2.10 bereit</ div >
< div class = "boot-line ok" > PostgreSQL-Verbindung hergestellt</ div >
< div class = "boot-line ok" > XSL-Abhängigkeitsgraph aufgebaut</ div >
< div class = "boot-line ok" > blake2b Hash-Engine aktiv</ div >
< div class = "boot-line" > System bereit. Starte DocuMentor...</ div >
</ div >
< h1 class = "hero-title" > DocuMentor</ h1 >
< p class = "hero-tagline" >
< span class = "typed-text" id = "tagline" ></ span >
</ p >
< p class = "hero-prompt" >
< span style = "color:var(--green-dark)" > user@documentor:~$</ span >
< a href = "#features" > ./erkunde_features.sh</ a >
< span class = "cursor-blink" ></ span >
</ p >
</ section >
<!-- FEATURES -->
< section id = "features" >
< div class = "section-label" > // KERNFUNKTIONEN</ div >
< h2 class = "section-title" > Feature-Matrix</ h2 >
< div class = "features-grid" >
< div class = "feature-card reveal" >
< span class = "feature-icon" > [/\]</ span >
< h3 > Baumstruktur</ h3 >
< p > Hierarchische Organisation von XSL-Transformationen mit TreeNode-Architektur. Verwalte komplexe Abhängigkeitsketten über eine intuitive Baumansicht mit Drag-and-Drop.</ p >
</ div >
< div class = "feature-card reveal" >
< span class = "feature-icon" > [<> ]</ span >
< h3 > PDF-Diff</ h3 >
< p > Visueller Drei-Panel-Vergleich: Referenz, Differenz und Neu. Alpha-Blending Overlay mit Zoom- und Pan-Funktionalitaet zum pixelgenauen Abgleich von PDF-Änderungen.</ p >
</ div >
< div class = "feature-card reveal" >
< span class = "feature-icon" > [##]</ span >
< h3 > Hash-Tracking</ h3 >
< p > Automatische blake2b-Hashsummen für alle XML-Dateien. Änderungen werden zuverlässig erkannt und im project.yaml persistent gespeichert.</ p >
</ div >
< div class = "feature-card reveal" >
< span class = "feature-icon" > [~~]</ span >
< h3 > Async-Verarbeitung</ h3 >
< p > Nicht-blockierende Hintergrund-Threads für Hash-Berechnung und Datenbankabfragen. Die GUI bleibt stets responsiv - mit Abbrechen-Dialog und Timeout-Steuerung.</ p >
</ div >
< div class = "feature-card reveal" >
< span class = "feature-icon" > [db]</ span >
< h3 > PostgreSQL</ h3 >
< p > Native Datenbankintegration mit ConnectorX und Polars DataFrames. SSL-Modus-Unterstützung und asynchrone Verbindungstests inklusive.</ p >
</ div >
< div class = "feature-card reveal" >
< span class = "feature-icon" > [=>]</ span >
< h3 > Toolchain-Konfiguration</ h3 >
< p > Flexible Verwaltung von Java VM, Saxon, Apache FOP und diff-pdf. ID-basierte Referenzierung ermöglicht projektübergreifende Konfigurationsprofile.</ p >
</ div >
</ div >
</ section >
<!-- WORKFLOW -->
< section id = "workflow" >
< div class = "section-label" > // ARBEITSABLAUF</ div >
< h2 class = "section-title" > Workflow-Pipeline</ h2 >
< div class = "workflow-steps" >
< div class = "workflow-step reveal" >
< div class = "step-number" > 01</ div >
< div class = "step-content" >
< h3 > XSL-Dateien bearbeiten</ h3 >
< p > Führe die benötigten Änderungen an den XSL-Stylesheets durch. DocuMentor Überwacht den Abhängigkeitsgraphen von über 100 verknüpften Dateien via xsl:import und xsl:include.</ p >
< span class = "cmd" > vim vorlage_urkunde.xsl</ span >
</ div >
</ div >
< div class = "workflow-step reveal" >
< div class = "step-number" > 02</ div >
< div class = "step-content" >
< h3 > Transformation starten</ h3 >
< p > Starte die Saxon-Transformation direkt aus dem DocuMentor. Die gesamte Toolchain - von XSLT über FOP bis zur PDF-Generierung - wird automatisch orchestriert.</ p >
< span class = "cmd" > saxon -> fop -> pdf-output/</ span >
</ div >
</ div >
< div class = "workflow-step reveal" >
< div class = "step-number" > 03</ div >
< div class = "step-content" >
< h3 > PDF-Diff begutachten</ h3 >
< p > Vergleiche die neu generierte PDF mit der Referenzversion im Drei-Panel-Viewer. Visuelles Alpha-Blending hebt jede Änderung hervor - Schrift, Layout, Positionen.</ p >
< span class = "cmd" > diff-pdf --view referenz.pdf neu.pdf</ span >
</ div >
</ div >
< div class = "workflow-step reveal" >
< div class = "step-number" > 04</ div >
< div class = "step-content" >
< h3 > Ergebnis verifizieren</ h3 >
< p > Prüfe: Wurden nur die beabsichtigten PDF-Dateien geändert? Stimmt die Änderung mit der Erwartung überein? Bei Bedarf: zurück zu Schritt 1.</ p >
< span class = "cmd" > status: VERIFIED | RETRY</ span >
</ div >
</ div >
</ div >
</ section >
<!-- DEMO -->
< section id = "demo" >
< div class = "section-label" > // LIVE-AUSGABE</ div >
< h2 class = "section-title" > Terminal-Vorschau</ h2 >
< div class = "terminal-window reveal" >
< div class = "terminal-header" >
< div class = "terminal-dot r" ></ div >
< div class = "terminal-dot y" ></ div >
< div class = "terminal-dot g" ></ div >
< span class = "terminal-title" > documentor@workstation:~/projekte/flexnow</ span >
</ div >
< div class = "terminal-body" id = "terminal-output" >
< div class = "terminal-line" >< span class = "prompt" > user@documentor:~$</ span > < span class = "cmd-text" > documentor --projekt flexnow_urkunden</ span ></ div >
< div class = "terminal-line" >< span class = "info" > [INFO]</ span > < span class = "output" > Lade project.yaml ...</ span ></ div >
< div class = "terminal-line" >< span class = "info" > [INFO]</ span > < span class = "output" > Projektverzeichnis: /srv/flexnow/xsl-vorlagen</ span ></ div >
< div class = "terminal-line" >< span class = "info" > [INFO]</ span > < span class = "output" > Gefundene XSL-Dateien: 147</ span ></ div >
< div class = "terminal-line" >< span class = "info" > [INFO]</ span > < span class = "output" > Abhängigkeitsgraph: 23 Import-Ketten aufgeloest</ span ></ div >
< div class = "terminal-line" >< span class = "info" > [INFO]</ span > < span class = "output" > Hash-Berechnung gestartet (blake2b, async) ...</ span ></ div >
< div class = "terminal-line" > </ div >
< div class = "terminal-line" >< span class = "success" > [HASH]</ span > < span class = "output" > urkunde_basis.xml blake2b:a4f8e2..OK</ span ></ div >
< div class = "terminal-line" >< span class = "success" > [HASH]</ span > < span class = "output" > zeugnis_master.xml blake2b:7c3d91..OK</ span ></ div >
< div class = "terminal-line" >< span class = "warning" > [HASH]</ span > < span class = "output" > bescheid_v3.xml blake2b:GEÄNDERT</ span ></ div >
< div class = "terminal-line" >< span class = "success" > [HASH]</ span > < span class = "output" > notenblatt.xml blake2b:f1b8a0..OK</ span ></ div >
< div class = "terminal-line" > </ div >
< div class = "terminal-line" >< span class = "info" > [XSLT]</ span > < span class = "output" > Saxon HE 12.5 - Transformation läuft ...</ span ></ div >
< div class = "terminal-line" >< span class = "info" > [FOP ]</ span > < span class = "output" > Apache FOP 2.10 - PDF-Generierung ...</ span ></ div >
< div class = "terminal-line" >< span class = "success" > [DONE]</ span > < span class = "highlight" > 4 PDFs generiert in 3.2s</ span ></ div >
< div class = "terminal-line" > </ div >
< div class = "terminal-line" >< span class = "info" > [DIFF]</ span > < span class = "output" > Vergleiche Referenz < - > Neu ...</ span ></ div >
< div class = "terminal-line" >< span class = "success" > [DIFF]</ span > < span class = "output" > urkunde_basis.pdf IDENTISCH</ span ></ div >
< div class = "terminal-line" >< span class = "success" > [DIFF]</ span > < span class = "output" > zeugnis_master.pdf IDENTISCH</ span ></ div >
< div class = "terminal-line" >< span class = "warning" > [DIFF]</ span > < span class = "highlight" > bescheid_v3.pdf 2 Seiten geändert</ span ></ div >
< div class = "terminal-line" >< span class = "success" > [DIFF]</ span > < span class = "output" > notenblatt.pdf IDENTISCH</ span ></ div >
< div class = "terminal-line" > </ div >
< div class = "terminal-line" >< span class = "prompt" > user@documentor:~$</ span > < span class = "cursor-blink" ></ span ></ div >
</ div >
</ div >
</ section >
<!-- TECH STACK -->
< section id = "techstack" >
< div class = "section-label" > // TECHNOLOGIE</ div >
< h2 class = "section-title" > Tech-Stack</ h2 >
< div class = "tech-grid" >
< div class = "tech-item reveal" >
< span class = "tech-icon" > Py</ span >
< div class = "tech-name" > Python</ div >
< div class = "tech-desc" > Laufzeitumgebung</ div >
</ div >
< div class = "tech-item reveal" >
< span class = "tech-icon" > Qt</ span >
< div class = "tech-name" > PySide6</ div >
< div class = "tech-desc" > GUI-Framework</ div >
</ div >
< div class = "tech-item reveal" >
< span class = "tech-icon" > Sx</ span >
< div class = "tech-name" > Saxon</ div >
< div class = "tech-desc" > XSLT-Prozessor</ div >
</ div >
< div class = "tech-item reveal" >
< span class = "tech-icon" > Fp</ span >
< div class = "tech-name" > Apache FOP</ div >
< div class = "tech-desc" > PDF-Generierung</ div >
</ div >
< div class = "tech-item reveal" >
< span class = "tech-icon" > Df</ span >
< div class = "tech-name" > diff-pdf</ div >
< div class = "tech-desc" > PDF-Vergleich</ div >
</ div >
< div class = "tech-item reveal" >
< span class = "tech-icon" > Pg</ span >
< div class = "tech-name" > PostgreSQL</ div >
< div class = "tech-desc" > Datenbank</ div >
</ div >
< div class = "tech-item reveal" >
< span class = "tech-icon" > Pl</ span >
< div class = "tech-name" > Polars</ div >
< div class = "tech-desc" > DataFrames</ div >
</ div >
< div class = "tech-item reveal" >
< span class = "tech-icon" > Pd</ span >
< div class = "tech-name" > Pydantic</ div >
< div class = "tech-desc" > Konfiguration</ div >
</ div >
</ div >
</ section >
<!-- DOWNLOAD -->
< section id = "download" >
< div class = "section-label" > // INSTALLATION</ div >
< h2 class = "section-title" > Erste Schritte</ h2 >
< div class = "install-block" >
< div class = "install-label" > Repository klonen</ div >
< div class = "install-cmd" onclick = "copyCmd(this, 'git clone https://github.com/your-org/documentor.git')" >
< div >< span class = "cmd-prefix" > $ </ span > git clone https://github.com/your-org/documentor.git</ div >
< span class = "copy-hint" > [KLICK ZUM KOPIEREN]</ span >
</ div >
< div class = "install-label" style = "margin-top:20px" > Abhängigkeiten installieren</ div >
< div class = "install-cmd" onclick = "copyCmd(this, 'cd documentor && uv sync')" >
< div >< span class = "cmd-prefix" > $ </ span > cd documentor && uv sync</ div >
< span class = "copy-hint" > [KLICK ZUM KOPIEREN]</ span >
</ div >
< div class = "install-label" style = "margin-top:20px" > Anwendung starten</ div >
< div class = "install-cmd" onclick = "copyCmd(this, 'uv run python src/main.py')" >
< div >< span class = "cmd-prefix" > $ </ span > uv run python src/main.py</ div >
< span class = "copy-hint" > [KLICK ZUM KOPIEREN]</ span >
</ div >
< p class = "install-note" > // Verwendet den uv-Paketmanager für schnelle, reproduzierbare Builds</ p >
</ div >
< ul class = "requirements-list" >
< li > Python 3.13 oder höher</ li >
< li > Java Runtime für Saxon</ li >
< li > Apache FOP 2.x</ li >
< li > diff-pdf (optional, für PDF-Vergleich)</ li >
< li > PostgreSQL-Server (optional, für Datenbankintegration)</ li >
< li > uv-Paketmanager</ li >
</ ul >
</ section >
<!-- FOOTER -->
< footer >
< div class = "footer-inner" >
< div class = "footer-ascii" >
____ __ __ _
| _ \ ___ ___ _ | \/ | ___ _ __ | |_ ___ _ __
| | | |/ _ \ / __| | | | |\/| |/ _ \ '_ \| __/ _ \| '__|
| |_| | (_) | (__| |_| | | | | __/ | | | || (_) | |
|____/ \___/ \___|\__,_|_| |_|\___|_| |_|\__\___/|_|
</ div >
< div class = "footer-links" >
< a href = "#hero" > // NACH OBEN</ a >
< a href = "https://github.com/your-org/documentor" target = "_blank" > // GITHUB</ a >
< a href = "#features" > // FEATURES</ a >
< a href = "#download" > // DOWNLOAD</ a >
</ div >
< p class = "footer-copy" > © 2026 DocuMentor | XSL-Transformations-Toolkit | Gebaut mit PySide6</ p >
</ div >
</ footer >
< script >
// ============================
// Matrix Rain
// ============================
const canvas = document . getElementById ( 'matrix-canvas' );
const ctx = canvas . getContext ( '2d' );
function resizeCanvas () {
canvas . width = window . innerWidth ;
canvas . height = window . innerHeight ;
}
resizeCanvas ();
window . addEventListener ( 'resize' , resizeCanvas );
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789<>/={}[];:\'\"!@#$%^&*()_+-~`|\\' . split ( '' );
const fontSize = 14 ;
let columns = Math . floor ( canvas . width / fontSize );
let drops = Array ( columns ). fill ( 1 );
function drawMatrix () {
ctx . fillStyle = 'rgba(10, 10, 10, 0.05)' ;
ctx . fillRect ( 0 , 0 , canvas . width , canvas . height );
ctx . fillStyle = '#00ff41' ;
ctx . font = fontSize + 'px "Share Tech Mono", monospace' ;
for ( let i = 0 ; i < drops . length ; i ++ ) {
const text = chars [ Math . floor ( Math . random () * chars . length )];
ctx . fillText ( text , i * fontSize , drops [ i ] * fontSize );
if ( drops [ i ] * fontSize > canvas . height && Math . random () > 0.975 ) {
drops [ i ] = 0 ;
}
drops [ i ] ++ ;
}
}
setInterval ( drawMatrix , 50 );
window . addEventListener ( 'resize' , () => {
columns = Math . floor ( canvas . width / fontSize );
drops = Array ( columns ). fill ( 1 );
});
// ============================
// Boot Sequence Animation
// ============================
const bootLines = document . querySelectorAll ( '.boot-line' );
bootLines . forEach (( line , i ) => {
setTimeout (() => {
line . classList . add ( 'visible' );
}, 300 + i * 250 );
});
// ============================
// Tagline Typing Effect
// ============================
const tagline = 'XSL-Transformationen validieren. PDF-Änderungen visualisieren. Qualität sichern.' ;
const taglineEl = document . getElementById ( 'tagline' );
let charIndex = 0 ;
function typeTagline () {
if ( charIndex < tagline . length ) {
taglineEl . textContent = tagline . substring ( 0 , charIndex + 1 );
charIndex ++ ;
setTimeout ( typeTagline , 35 );
}
}
// Start typing after boot sequence
setTimeout ( typeTagline , 300 + bootLines . length * 250 + 500 );
// ============================
// Scroll Reveal
// ============================
const revealElements = document . querySelectorAll ( '.reveal, .workflow-step' );
const revealObserver = new IntersectionObserver (( entries ) => {
entries . forEach ( entry => {
if ( entry . isIntersecting ) {
entry . target . classList . add ( 'visible' );
}
});
}, {
threshold : 0.15 ,
rootMargin : '0px 0px -50px 0px'
});
revealElements . forEach ( el => revealObserver . observe ( el ));
// ============================
// Mobile Nav Toggle
// ============================
document . getElementById ( 'hamburger' ). addEventListener ( 'click' , () => {
document . getElementById ( 'nav-links' ). classList . toggle ( 'open' );
});
// Close nav on link click (mobile)
document . querySelectorAll ( '#nav-links a' ). forEach ( link => {
link . addEventListener ( 'click' , () => {
document . getElementById ( 'nav-links' ). classList . remove ( 'open' );
});
});
// ============================
// Copy Command to Clipboard
// ============================
function copyCmd ( el , text ) {
navigator . clipboard . writeText ( text ). then (() => {
const hint = el . querySelector ( '.copy-hint' );
const original = hint . textContent ;
hint . textContent = '[KOPIERT!]' ;
hint . style . color = 'var(--green)' ;
setTimeout (() => {
hint . textContent = original ;
hint . style . color = '' ;
}, 2000 );
});
}
</ script >
</ body >
</ html >