1+ <!DOCTYPE html>
2+ < html lang ="en ">
3+ < head >
4+ < meta charset ="UTF-8 ">
5+ < meta name ="viewport " content ="width=device-width, initial-scale=1.0 ">
6+ < title > jsPDF Test Report</ title >
7+ < script src ="https://unpkg.com/react@18/umd/react.development.js "> </ script >
8+ < script src ="https://unpkg.com/react-dom@18/umd/react-dom.development.js "> </ script >
9+ < script src ="https://unpkg.com/@babel/standalone/babel.min.js "> </ script >
10+ < link rel ="
stylesheet "
href ="
https://cdn.jsdelivr.net/npm/@radix-ui/[email protected] /styles.css "
> 11+ < script src ="test-results.js "> </ script >
12+ < style >
13+ : root {
14+ --background : 0 0% 100% ;
15+ --foreground : 222.2 84% 4.9% ;
16+ --muted : 210 40% 96.1% ;
17+ --muted-foreground : 215.4 16.3% 46.9% ;
18+ --popover : 0 0% 100% ;
19+ --popover-foreground : 222.2 84% 4.9% ;
20+ --card : 0 0% 100% ;
21+ --card-foreground : 222.2 84% 4.9% ;
22+ --border : 214.3 31.8% 91.4% ;
23+ --input : 214.3 31.8% 91.4% ;
24+ --primary : 222.2 47.4% 11.2% ;
25+ --primary-foreground : 210 40% 98% ;
26+ --secondary : 210 40% 96.1% ;
27+ --secondary-foreground : 222.2 47.4% 11.2% ;
28+ --accent : 210 40% 96.1% ;
29+ --accent-foreground : 222.2 47.4% 11.2% ;
30+ --destructive : 0 84.2% 60.2% ;
31+ --destructive-foreground : 210 40% 98% ;
32+ --ring : 215 20.2% 65.1% ;
33+ --radius : 0.5rem ;
34+ }
35+
36+ * {
37+ margin : 0 ;
38+ padding : 0 ;
39+ box-sizing : border-box;
40+ }
41+
42+ body {
43+ font-family : system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI' , Roboto, 'Helvetica Neue' , sans-serif;
44+ background-color : hsl (var (--background ));
45+ color : hsl (var (--foreground ));
46+ }
47+
48+ .layout {
49+ display : grid;
50+ grid-template-columns : 300px 1fr ;
51+ height : 100vh ;
52+ }
53+
54+ .sidebar {
55+ border-right : 1px solid hsl (var (--border ));
56+ padding : 1rem ;
57+ overflow-y : auto;
58+ }
59+
60+ .main {
61+ padding : 1rem ;
62+ overflow-y : auto;
63+ }
64+
65+ .test-item {
66+ padding : 0.75rem ;
67+ border : 1px solid hsl (var (--border ));
68+ border-radius : var (--radius );
69+ margin-bottom : 0.5rem ;
70+ cursor : pointer;
71+ }
72+
73+ .test-item : hover {
74+ background-color : hsl (var (--muted ));
75+ }
76+
77+ .test-item .failed {
78+ border-color : hsl (var (--destructive ));
79+ }
80+
81+ .pdf-viewer {
82+ width : 100% ;
83+ height : calc (100vh - 2rem );
84+ border : 1px solid hsl (var (--border ));
85+ border-radius : var (--radius );
86+ }
87+
88+ .viewer-controls {
89+ display : flex;
90+ gap : 1rem ;
91+ margin-bottom : 1rem ;
92+ }
93+
94+ .button {
95+ padding : 0.5rem 1rem ;
96+ background-color : hsl (var (--primary ));
97+ color : hsl (var (--primary-foreground ));
98+ border : none;
99+ border-radius : var (--radius );
100+ cursor : pointer;
101+ }
102+
103+ .button : hover {
104+ opacity : 0.9 ;
105+ }
106+
107+ .button .secondary {
108+ background-color : hsl (var (--secondary ));
109+ color : hsl (var (--secondary-foreground ));
110+ }
111+
112+ .hex-view {
113+ font-family : monospace;
114+ white-space : pre-wrap;
115+ padding : 1rem ;
116+ background-color : hsl (var (--muted ));
117+ border-radius : var (--radius );
118+ }
119+ </ style >
120+ </ head >
121+ < body >
122+ < div id ="root "> </ div >
123+ < script type ="text/babel ">
124+ function App ( ) {
125+ const [ selectedTest , setSelectedTest ] = React . useState ( null ) ;
126+ const [ viewMode , setViewMode ] = React . useState ( 'actual' ) ;
127+ const [ testResults , setTestResults ] = React . useState ( window . TEST_RESULTS ) ;
128+
129+ return (
130+ < div className = "layout" >
131+ < div className = "sidebar" >
132+ < h2 > Test Summary</ h2 >
133+ < div style = { { margin : '1rem 0' } } >
134+ < div > Total: { testResults . summary . total } </ div >
135+ < div style = { { color : 'green' } } > Passed: { testResults . summary . passed } </ div >
136+ < div style = { { color : 'orange' } } > Skipped: { testResults . summary . skipped } </ div >
137+ < div style = { { color : 'red' } } > Failed: { testResults . summary . failed } </ div >
138+ </ div >
139+ < h3 > Failed Tests</ h3 >
140+ { testResults . failures . map ( ( test , index ) => (
141+ < div
142+ key = { index }
143+ className = "test-item failed"
144+ onClick = { ( ) => setSelectedTest ( test ) }
145+ >
146+ < div > { test . name } </ div >
147+ < div style = { { fontSize : '0.875rem' , color : 'hsl(var(--muted-foreground))' } } >
148+ { test . differences . total } differences
149+ </ div >
150+ </ div >
151+ ) ) }
152+ </ div >
153+ < div className = "main" >
154+ { selectedTest ? (
155+ < >
156+ < div className = "viewer-controls" >
157+ < button
158+ className = { `button ${ viewMode === 'actual' ? '' : 'secondary' } ` }
159+ onClick = { ( ) => setViewMode ( 'actual' ) }
160+ >
161+ Actual
162+ </ button >
163+ < button
164+ className = { `button ${ viewMode === 'reference' ? '' : 'secondary' } ` }
165+ onClick = { ( ) => setViewMode ( 'reference' ) }
166+ >
167+ Reference
168+ </ button >
169+ < button
170+ className = { `button ${ viewMode === 'hex' ? '' : 'secondary' } ` }
171+ onClick = { ( ) => setViewMode ( 'hex' ) }
172+ >
173+ Hex Diff
174+ </ button >
175+ </ div >
176+ { viewMode === 'hex' ? (
177+ < div className = "hex-view" >
178+ { /* Placeholder for hex diff */ }
179+ Hex diff view coming soon...
180+ </ div >
181+ ) : (
182+ < iframe
183+ className = "pdf-viewer"
184+ src = { viewMode === 'actual' ? selectedTest . actualPdf : selectedTest . referencePdf }
185+ />
186+ ) }
187+ </ >
188+ ) : (
189+ < div style = { { padding : '2rem' , textAlign : 'center' } } >
190+ Select a test from the sidebar to view details
191+ </ div >
192+ ) }
193+ </ div >
194+ </ div >
195+ ) ;
196+ }
197+
198+ const root = ReactDOM . createRoot ( document . getElementById ( 'root' ) ) ;
199+ root . render ( < App /> ) ;
200+ </ script >
201+ </ body >
202+ </ html >
0 commit comments