- Implemented DeesPdfViewer for full-featured PDF viewing with toolbar and sidebar navigation. - Created DeesPdfPreview for lightweight PDF previews. - Introduced PdfManager for managing PDF document loading and caching. - Added CanvasPool for efficient canvas management. - Developed utility functions for performance monitoring and file size formatting. - Established styles for viewer and preview components to enhance UI/UX. - Included demo examples for showcasing PDF viewer capabilities.
		
			
				
	
	
		
			189 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { html } from '@design.estate/dees-element';
 | |
| 
 | |
| export const demo = () => {
 | |
|   const samplePdfs = [
 | |
|     'https://raw.githubusercontent.com/mozilla/pdf.js/ba2edeae/examples/learning/helloworld.pdf',
 | |
|     'https://raw.githubusercontent.com/mozilla/pdf.js/ba2edeae/web/compressed.tracemonkey-pldi-09.pdf',
 | |
|   ];
 | |
| 
 | |
|   const generateGridItems = (count: number) => {
 | |
|     const items = [];
 | |
|     for (let i = 0; i < count; i++) {
 | |
|       const pdfUrl = samplePdfs[i % samplePdfs.length];
 | |
|       items.push(html`
 | |
|         <dees-pdf-preview
 | |
|           pdfUrl="${pdfUrl}"
 | |
|           maxPages="3"
 | |
|           stackOffset="6"
 | |
|           clickable="true"
 | |
|           grid-mode
 | |
|           @pdf-preview-click=${(e: CustomEvent) => {
 | |
|             console.log('PDF Preview clicked:', e.detail);
 | |
|             alert(`PDF clicked: ${e.detail.pageCount} pages`);
 | |
|           }}
 | |
|         ></dees-pdf-preview>
 | |
|       `);
 | |
|     }
 | |
|     return items;
 | |
|   };
 | |
| 
 | |
|   return html`
 | |
|     <style>
 | |
|       .demo-container {
 | |
|         padding: 40px;
 | |
|         background: #f5f5f5;
 | |
|       }
 | |
| 
 | |
|       .demo-section {
 | |
|         margin-bottom: 60px;
 | |
|       }
 | |
| 
 | |
|       h3 {
 | |
|         margin-bottom: 20px;
 | |
|         font-size: 18px;
 | |
|         font-weight: 600;
 | |
|       }
 | |
| 
 | |
|       .preview-grid {
 | |
|         display: grid;
 | |
|         grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
 | |
|         gap: 24px;
 | |
|       }
 | |
| 
 | |
|       .preview-row {
 | |
|         display: flex;
 | |
|         gap: 24px;
 | |
|         align-items: center;
 | |
|         margin-bottom: 20px;
 | |
|       }
 | |
| 
 | |
|       .preview-label {
 | |
|         font-size: 14px;
 | |
|         font-weight: 500;
 | |
|         min-width: 100px;
 | |
|       }
 | |
| 
 | |
|       .performance-stats {
 | |
|         margin-top: 20px;
 | |
|         padding: 16px;
 | |
|         background: white;
 | |
|         border-radius: 8px;
 | |
|         font-size: 14px;
 | |
|       }
 | |
| 
 | |
|       .stats-grid {
 | |
|         display: grid;
 | |
|         grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
 | |
|         gap: 12px;
 | |
|         margin-top: 12px;
 | |
|       }
 | |
| 
 | |
|       .stat-item {
 | |
|         display: flex;
 | |
|         flex-direction: column;
 | |
|         gap: 4px;
 | |
|       }
 | |
| 
 | |
|       .stat-label {
 | |
|         font-size: 12px;
 | |
|         color: #666;
 | |
|       }
 | |
| 
 | |
|       .stat-value {
 | |
|         font-size: 16px;
 | |
|         font-weight: 600;
 | |
|       }
 | |
|     </style>
 | |
| 
 | |
|     <div class="demo-container">
 | |
|       <div class="demo-section">
 | |
|         <h3>Single PDF Preview with Stacked Pages</h3>
 | |
|         <dees-pdf-preview
 | |
|           pdfUrl="https://raw.githubusercontent.com/mozilla/pdf.js/ba2edeae/web/compressed.tracemonkey-pldi-09.pdf"
 | |
|           maxPages="3"
 | |
|           stackOffset="8"
 | |
|           clickable="true"
 | |
|         ></dees-pdf-preview>
 | |
|       </div>
 | |
| 
 | |
|       <div class="demo-section">
 | |
|         <h3>Different Sizes</h3>
 | |
|         <div class="preview-row">
 | |
|           <div class="preview-label">Small:</div>
 | |
|           <dees-pdf-preview
 | |
|             size="small"
 | |
|             pdfUrl="https://raw.githubusercontent.com/mozilla/pdf.js/ba2edeae/examples/learning/helloworld.pdf"
 | |
|             maxPages="2"
 | |
|             stackOffset="6"
 | |
|             clickable="true"
 | |
|           ></dees-pdf-preview>
 | |
|         </div>
 | |
| 
 | |
|         <div class="preview-row">
 | |
|           <div class="preview-label">Default:</div>
 | |
|           <dees-pdf-preview
 | |
|             pdfUrl="https://raw.githubusercontent.com/mozilla/pdf.js/ba2edeae/examples/learning/helloworld.pdf"
 | |
|             maxPages="3"
 | |
|             stackOffset="8"
 | |
|             clickable="true"
 | |
|           ></dees-pdf-preview>
 | |
|         </div>
 | |
| 
 | |
|         <div class="preview-row">
 | |
|           <div class="preview-label">Large:</div>
 | |
|           <dees-pdf-preview
 | |
|             size="large"
 | |
|             pdfUrl="https://raw.githubusercontent.com/mozilla/pdf.js/ba2edeae/examples/learning/helloworld.pdf"
 | |
|             maxPages="4"
 | |
|             stackOffset="10"
 | |
|             clickable="true"
 | |
|           ></dees-pdf-preview>
 | |
|         </div>
 | |
|       </div>
 | |
| 
 | |
|       <div class="demo-section">
 | |
|         <h3>Non-Clickable Preview</h3>
 | |
|         <dees-pdf-preview
 | |
|           pdfUrl="https://raw.githubusercontent.com/mozilla/pdf.js/ba2edeae/examples/learning/helloworld.pdf"
 | |
|           maxPages="3"
 | |
|           stackOffset="8"
 | |
|           clickable="false"
 | |
|         ></dees-pdf-preview>
 | |
|       </div>
 | |
| 
 | |
|       <div class="demo-section">
 | |
|         <h3>Performance Grid - 50 PDFs with Lazy Loading</h3>
 | |
|         <p style="margin-bottom: 20px; font-size: 14px; color: #666;">
 | |
|           This grid demonstrates the performance optimizations with 50 PDF previews.
 | |
|           Scroll to see lazy loading in action - previews render only when visible.
 | |
|         </p>
 | |
| 
 | |
|         <div class="preview-grid">
 | |
|           ${generateGridItems(50)}
 | |
|         </div>
 | |
| 
 | |
|         <div class="performance-stats">
 | |
|           <h4>Performance Features</h4>
 | |
|           <div class="stats-grid">
 | |
|             <div class="stat-item">
 | |
|               <span class="stat-label">Lazy Loading</span>
 | |
|               <span class="stat-value">✓ Enabled</span>
 | |
|             </div>
 | |
|             <div class="stat-item">
 | |
|               <span class="stat-label">Canvas Pooling</span>
 | |
|               <span class="stat-value">✓ Active</span>
 | |
|             </div>
 | |
|             <div class="stat-item">
 | |
|               <span class="stat-label">Memory Management</span>
 | |
|               <span class="stat-value">✓ Optimized</span>
 | |
|             </div>
 | |
|             <div class="stat-item">
 | |
|               <span class="stat-label">Intersection Observer</span>
 | |
|               <span class="stat-value">200px margin</span>
 | |
|             </div>
 | |
|           </div>
 | |
|         </div>
 | |
|       </div>
 | |
|     </div>
 | |
|   `;
 | |
| }; |