Last active
January 9, 2026 04:48
-
-
Save shurane/4829fd090aadae3b3bf048882f4fdb99 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>Supio Pro+ Premium (FREE TRIAL) - Legal Case Management</title> | |
| <style> | |
| * { | |
| margin: 0; | |
| padding: 0; | |
| box-sizing: border-box; | |
| } | |
| body { | |
| font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; | |
| background: #f5f5f5; | |
| overflow-x: hidden; | |
| } | |
| /* Cookie Banner - Never goes away */ | |
| .cookie-banner { | |
| position: fixed; | |
| bottom: 0; | |
| left: 0; | |
| right: 0; | |
| background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%); | |
| color: white; | |
| padding: 20px; | |
| z-index: 9998; | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| box-shadow: 0 -4px 20px rgba(0,0,0,0.3); | |
| } | |
| .cookie-banner button { | |
| background: #4CAF50; | |
| color: white; | |
| border: none; | |
| padding: 12px 30px; | |
| cursor: pointer; | |
| border-radius: 5px; | |
| font-weight: bold; | |
| animation: pulse 1s infinite; | |
| } | |
| .cookie-banner .reject-btn { | |
| background: transparent; | |
| border: 1px solid #666; | |
| color: #666; | |
| font-size: 8px; | |
| padding: 4px 8px; | |
| margin-left: 10px; | |
| } | |
| @keyframes pulse { | |
| 0%, 100% { transform: scale(1); } | |
| 50% { transform: scale(1.05); } | |
| } | |
| /* Top Banner Ad */ | |
| .top-banner-ad { | |
| background: linear-gradient(90deg, #ff6b6b, #feca57, #48dbfb, #ff9ff3); | |
| background-size: 400% 400%; | |
| animation: gradientShift 3s ease infinite; | |
| padding: 15px; | |
| text-align: center; | |
| color: white; | |
| font-weight: bold; | |
| text-shadow: 2px 2px 4px rgba(0,0,0,0.5); | |
| cursor: pointer; | |
| } | |
| @keyframes gradientShift { | |
| 0% { background-position: 0% 50%; } | |
| 50% { background-position: 100% 50%; } | |
| 100% { background-position: 0% 50%; } | |
| } | |
| .top-banner-ad .close-btn { | |
| position: absolute; | |
| right: 10px; | |
| top: 50%; | |
| transform: translateY(-50%); | |
| background: rgba(0,0,0,0.3); | |
| border: none; | |
| color: white; | |
| width: 20px; | |
| height: 20px; | |
| border-radius: 50%; | |
| cursor: pointer; | |
| font-size: 10px; | |
| } | |
| /* Header */ | |
| .header { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| padding: 12px 24px; | |
| background: white; | |
| border-bottom: 1px solid #e0e0e0; | |
| position: relative; | |
| } | |
| .logo-section { | |
| display: flex; | |
| align-items: center; | |
| gap: 8px; | |
| } | |
| .logo { | |
| width: 32px; | |
| height: 32px; | |
| background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); | |
| border-radius: 8px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| color: white; | |
| font-weight: bold; | |
| font-size: 18px; | |
| } | |
| .brand-name { | |
| font-size: 18px; | |
| font-weight: 600; | |
| color: #333; | |
| } | |
| .brand-name .premium { | |
| font-size: 10px; | |
| background: gold; | |
| color: #333; | |
| padding: 2px 6px; | |
| border-radius: 3px; | |
| margin-left: 5px; | |
| animation: blink 0.5s infinite; | |
| } | |
| @keyframes blink { | |
| 0%, 100% { opacity: 1; } | |
| 50% { opacity: 0.5; } | |
| } | |
| .nav-links { | |
| display: flex; | |
| gap: 24px; | |
| align-items: center; | |
| } | |
| .nav-link { | |
| color: #666; | |
| text-decoration: none; | |
| font-size: 14px; | |
| padding: 8px 0; | |
| border-bottom: 2px solid transparent; | |
| } | |
| .nav-link.active { | |
| color: #333; | |
| border-bottom-color: #667eea; | |
| } | |
| .nav-link.sponsored { | |
| background: #fff3cd; | |
| padding: 8px 12px; | |
| border-radius: 4px; | |
| color: #856404; | |
| font-size: 11px; | |
| } | |
| .header-right { | |
| display: flex; | |
| align-items: center; | |
| gap: 16px; | |
| } | |
| .upgrade-btn { | |
| background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); | |
| color: white; | |
| border: none; | |
| padding: 8px 16px; | |
| border-radius: 20px; | |
| cursor: pointer; | |
| font-weight: bold; | |
| animation: shake 0.5s infinite; | |
| } | |
| @keyframes shake { | |
| 0%, 100% { transform: translateX(0); } | |
| 25% { transform: translateX(-2px); } | |
| 75% { transform: translateX(2px); } | |
| } | |
| .user-avatar { | |
| width: 36px; | |
| height: 36px; | |
| border-radius: 50%; | |
| background: #667eea; | |
| color: white; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-weight: bold; | |
| } | |
| /* Main Layout */ | |
| .main-layout { | |
| display: flex; | |
| min-height: calc(100vh - 120px); | |
| } | |
| /* Sidebar */ | |
| .sidebar { | |
| width: 80px; | |
| background: white; | |
| border-right: 1px solid #e0e0e0; | |
| padding: 16px 0; | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| gap: 8px; | |
| } | |
| .sidebar-item { | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| padding: 12px 8px; | |
| color: #666; | |
| text-decoration: none; | |
| font-size: 11px; | |
| width: 100%; | |
| text-align: center; | |
| cursor: pointer; | |
| transition: background 0.2s; | |
| } | |
| .sidebar-item:hover { | |
| background: #f5f5f5; | |
| } | |
| .sidebar-item.active { | |
| color: #667eea; | |
| background: #f0f0ff; | |
| } | |
| .sidebar-item svg { | |
| width: 24px; | |
| height: 24px; | |
| margin-bottom: 4px; | |
| } | |
| .sidebar-ad { | |
| background: linear-gradient(135deg, #ff9a9e 0%, #fecfef 100%); | |
| padding: 8px; | |
| margin: 8px; | |
| border-radius: 8px; | |
| font-size: 9px; | |
| text-align: center; | |
| color: #333; | |
| cursor: pointer; | |
| } | |
| .sidebar-ad img { | |
| width: 50px; | |
| height: 50px; | |
| object-fit: cover; | |
| border-radius: 4px; | |
| margin-bottom: 4px; | |
| } | |
| .sidebar-section-label { | |
| font-size: 10px; | |
| color: #999; | |
| text-transform: uppercase; | |
| padding: 16px 8px 8px; | |
| width: 100%; | |
| text-align: center; | |
| border-top: 1px solid #e0e0e0; | |
| margin-top: 8px; | |
| } | |
| /* Content Area */ | |
| .content { | |
| flex: 1; | |
| padding: 24px; | |
| position: relative; | |
| } | |
| /* Tabs */ | |
| .content-tabs { | |
| display: flex; | |
| gap: 0; | |
| margin-bottom: 20px; | |
| border-bottom: 1px solid #e0e0e0; | |
| } | |
| .content-tab { | |
| padding: 12px 24px; | |
| background: none; | |
| border: none; | |
| cursor: pointer; | |
| font-size: 14px; | |
| color: #666; | |
| border-bottom: 2px solid transparent; | |
| margin-bottom: -1px; | |
| } | |
| .content-tab.active { | |
| color: #667eea; | |
| border-bottom-color: #667eea; | |
| } | |
| .content-tab.sponsored-tab { | |
| background: #fff3cd; | |
| color: #856404; | |
| font-size: 11px; | |
| border-radius: 4px 4px 0 0; | |
| } | |
| .tab-content { | |
| display: none; | |
| } | |
| .tab-content.active { | |
| display: block; | |
| } | |
| /* Files View */ | |
| .files-container { | |
| display: flex; | |
| gap: 20px; | |
| } | |
| .files-list { | |
| flex: 1; | |
| background: white; | |
| border-radius: 12px; | |
| box-shadow: 0 2px 8px rgba(0,0,0,0.05); | |
| } | |
| .files-header { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| padding: 16px 20px; | |
| border-bottom: 1px solid #e0e0e0; | |
| } | |
| .files-search { | |
| display: flex; | |
| gap: 10px; | |
| align-items: center; | |
| } | |
| .files-search input { | |
| padding: 8px 16px; | |
| border: 1px solid #ddd; | |
| border-radius: 6px; | |
| width: 200px; | |
| } | |
| .file-sync-btn { | |
| padding: 8px 16px; | |
| background: white; | |
| border: 1px solid #ddd; | |
| border-radius: 6px; | |
| cursor: pointer; | |
| } | |
| .files-table-header { | |
| display: flex; | |
| padding: 12px 20px; | |
| background: #fafafa; | |
| border-bottom: 1px solid #e0e0e0; | |
| font-size: 12px; | |
| color: #666; | |
| font-weight: 600; | |
| } | |
| .file-item { | |
| display: flex; | |
| padding: 16px 20px; | |
| border-bottom: 1px solid #f0f0f0; | |
| align-items: flex-start; | |
| cursor: pointer; | |
| transition: background 0.2s; | |
| } | |
| .file-item:hover { | |
| background: #f8f9ff; | |
| } | |
| .file-icon { | |
| width: 40px; | |
| height: 40px; | |
| margin-right: 16px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 24px; | |
| } | |
| .file-icon.word { | |
| color: #2b579a; | |
| } | |
| .file-icon.pdf { | |
| color: #dc3545; | |
| } | |
| .file-info { | |
| flex: 1; | |
| } | |
| .file-name { | |
| font-size: 14px; | |
| color: #333; | |
| margin-bottom: 6px; | |
| } | |
| .file-tags { | |
| display: flex; | |
| gap: 6px; | |
| margin-bottom: 6px; | |
| } | |
| .file-tag { | |
| font-size: 10px; | |
| padding: 3px 8px; | |
| border-radius: 4px; | |
| } | |
| .file-tag.generated { | |
| background: #e3f2fd; | |
| color: #1976d2; | |
| } | |
| .file-tag.published { | |
| background: #e8f5e9; | |
| color: #2e7d32; | |
| } | |
| .file-tag.auto { | |
| background: #fff3e0; | |
| color: #f57c00; | |
| } | |
| .file-meta { | |
| font-size: 11px; | |
| color: #999; | |
| } | |
| .file-date { | |
| font-size: 12px; | |
| color: #666; | |
| text-align: right; | |
| min-width: 100px; | |
| } | |
| .file-actions { | |
| display: flex; | |
| gap: 8px; | |
| margin-left: 16px; | |
| } | |
| /* File Preview Panel */ | |
| .file-preview { | |
| width: 300px; | |
| background: white; | |
| border-radius: 12px; | |
| box-shadow: 0 2px 8px rgba(0,0,0,0.05); | |
| padding: 20px; | |
| } | |
| .preview-header { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| margin-bottom: 16px; | |
| } | |
| .preview-title { | |
| font-size: 14px; | |
| color: #333; | |
| font-weight: 500; | |
| } | |
| .preview-close { | |
| background: none; | |
| border: none; | |
| font-size: 20px; | |
| cursor: pointer; | |
| color: #999; | |
| } | |
| .preview-image { | |
| width: 100%; | |
| height: 300px; | |
| background: linear-gradient(135deg, #1e3a8a 0%, #3b82f6 100%); | |
| border-radius: 8px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| color: white; | |
| font-size: 48px; | |
| margin-bottom: 16px; | |
| } | |
| .preview-sponsor { | |
| text-align: center; | |
| padding: 12px; | |
| background: #f5f5f5; | |
| border-radius: 8px; | |
| font-size: 11px; | |
| color: #666; | |
| } | |
| /* Sponsored File Item */ | |
| .file-item.sponsored { | |
| background: linear-gradient(90deg, #fff9e6 0%, #fff5cc 100%); | |
| border-left: 4px solid #ffc107; | |
| } | |
| .breadcrumb { | |
| font-size: 13px; | |
| color: #666; | |
| margin-bottom: 16px; | |
| } | |
| .breadcrumb a { | |
| color: #667eea; | |
| text-decoration: none; | |
| } | |
| /* Page Header */ | |
| .page-header { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| margin-bottom: 20px; | |
| } | |
| .page-title { | |
| font-size: 20px; | |
| font-weight: 600; | |
| color: #333; | |
| } | |
| .page-actions { | |
| display: flex; | |
| gap: 12px; | |
| align-items: center; | |
| } | |
| /* Inline Ad */ | |
| .inline-ad { | |
| background: #fff3cd; | |
| border: 2px dashed #ffc107; | |
| padding: 12px 20px; | |
| margin-bottom: 20px; | |
| border-radius: 8px; | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| } | |
| .inline-ad-text { | |
| font-size: 14px; | |
| color: #856404; | |
| } | |
| .inline-ad-text strong { | |
| color: #d63384; | |
| } | |
| .inline-ad-btn { | |
| background: #ffc107; | |
| color: #333; | |
| border: none; | |
| padding: 8px 16px; | |
| border-radius: 4px; | |
| cursor: pointer; | |
| font-weight: bold; | |
| } | |
| /* Search and Filters */ | |
| .search-filters { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| margin-bottom: 16px; | |
| } | |
| .search-box { | |
| position: relative; | |
| width: 300px; | |
| } | |
| .search-box input { | |
| width: 100%; | |
| padding: 10px 40px 10px 16px; | |
| border: 1px solid #ddd; | |
| border-radius: 8px; | |
| font-size: 14px; | |
| } | |
| .search-box input::placeholder { | |
| color: #999; | |
| } | |
| .search-sponsored { | |
| position: absolute; | |
| right: 10px; | |
| top: 50%; | |
| transform: translateY(-50%); | |
| font-size: 9px; | |
| color: #999; | |
| background: #f0f0f0; | |
| padding: 2px 6px; | |
| border-radius: 3px; | |
| } | |
| .filter-group { | |
| display: flex; | |
| gap: 8px; | |
| align-items: center; | |
| } | |
| .filter-btn { | |
| background: white; | |
| border: 1px solid #ddd; | |
| padding: 8px 16px; | |
| border-radius: 6px; | |
| font-size: 13px; | |
| cursor: pointer; | |
| display: flex; | |
| align-items: center; | |
| gap: 6px; | |
| } | |
| .filter-btn.active { | |
| background: #667eea; | |
| color: white; | |
| border-color: #667eea; | |
| } | |
| .toggle-switch { | |
| display: flex; | |
| align-items: center; | |
| gap: 8px; | |
| font-size: 13px; | |
| color: #666; | |
| } | |
| .toggle { | |
| width: 40px; | |
| height: 22px; | |
| background: #667eea; | |
| border-radius: 11px; | |
| position: relative; | |
| cursor: pointer; | |
| } | |
| .toggle::after { | |
| content: ''; | |
| position: absolute; | |
| width: 18px; | |
| height: 18px; | |
| background: white; | |
| border-radius: 50%; | |
| top: 2px; | |
| right: 2px; | |
| } | |
| /* Cases Table */ | |
| .cases-table-container { | |
| background: white; | |
| border-radius: 12px; | |
| box-shadow: 0 2px 8px rgba(0,0,0,0.05); | |
| overflow: hidden; | |
| } | |
| .cases-table { | |
| width: 100%; | |
| border-collapse: collapse; | |
| } | |
| .cases-table th { | |
| text-align: left; | |
| padding: 14px 16px; | |
| font-size: 12px; | |
| font-weight: 600; | |
| color: #666; | |
| background: #fafafa; | |
| border-bottom: 1px solid #e0e0e0; | |
| } | |
| .cases-table td { | |
| padding: 14px 16px; | |
| font-size: 13px; | |
| color: #333; | |
| border-bottom: 1px solid #f0f0f0; | |
| } | |
| .cases-table tr:hover { | |
| background: #f8f9ff; | |
| } | |
| .case-name { | |
| display: flex; | |
| align-items: center; | |
| gap: 10px; | |
| } | |
| .case-icon { | |
| width: 28px; | |
| height: 28px; | |
| background: #f0f0f0; | |
| border-radius: 6px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| color: #666; | |
| } | |
| .case-type-badge { | |
| background: #e8e8e8; | |
| padding: 4px 10px; | |
| border-radius: 4px; | |
| font-size: 11px; | |
| font-weight: 500; | |
| } | |
| .status-badge { | |
| padding: 4px 10px; | |
| border-radius: 12px; | |
| font-size: 11px; | |
| font-weight: 500; | |
| } | |
| .status-badge.pending { | |
| background: #fff3e0; | |
| color: #e65100; | |
| } | |
| .status-badge.published { | |
| background: #e8f5e9; | |
| color: #2e7d32; | |
| } | |
| .staff-avatars { | |
| display: flex; | |
| gap: 4px; | |
| } | |
| .staff-avatar { | |
| width: 28px; | |
| height: 28px; | |
| border-radius: 50%; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 10px; | |
| font-weight: bold; | |
| color: white; | |
| } | |
| .creator-cell { | |
| display: flex; | |
| align-items: center; | |
| gap: 8px; | |
| } | |
| .action-icons { | |
| display: flex; | |
| gap: 8px; | |
| } | |
| .action-icon { | |
| width: 28px; | |
| height: 28px; | |
| border-radius: 50%; | |
| border: 1px solid #ddd; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| cursor: pointer; | |
| color: #666; | |
| background: white; | |
| } | |
| /* Sponsored Row */ | |
| .sponsored-row { | |
| background: linear-gradient(90deg, #fff9e6 0%, #fff5cc 100%) !important; | |
| } | |
| .sponsored-row td { | |
| border-bottom: 2px solid #ffc107; | |
| } | |
| .sponsored-label { | |
| font-size: 9px; | |
| background: #ffc107; | |
| color: #333; | |
| padding: 2px 6px; | |
| border-radius: 3px; | |
| margin-left: 8px; | |
| } | |
| /* Table Ad Row */ | |
| .table-ad-row td { | |
| background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); | |
| color: white; | |
| text-align: center; | |
| padding: 20px; | |
| } | |
| .table-ad-row .ad-content { | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| gap: 20px; | |
| } | |
| .table-ad-row .ad-text { | |
| font-size: 16px; | |
| font-weight: bold; | |
| } | |
| .table-ad-row .ad-cta { | |
| background: white; | |
| color: #667eea; | |
| border: none; | |
| padding: 10px 24px; | |
| border-radius: 20px; | |
| cursor: pointer; | |
| font-weight: bold; | |
| } | |
| /* Right Side Ads */ | |
| .right-sidebar-ad { | |
| position: fixed; | |
| right: 20px; | |
| top: 200px; | |
| width: 160px; | |
| background: white; | |
| border-radius: 12px; | |
| box-shadow: 0 4px 20px rgba(0,0,0,0.15); | |
| overflow: hidden; | |
| z-index: 100; | |
| } | |
| .right-sidebar-ad .ad-header { | |
| background: #f0f0f0; | |
| padding: 6px 10px; | |
| font-size: 9px; | |
| color: #999; | |
| } | |
| .right-sidebar-ad .ad-image { | |
| width: 100%; | |
| height: 200px; | |
| background: linear-gradient(135deg, #74ebd5 0%, #ACB6E5 100%); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 14px; | |
| color: white; | |
| text-align: center; | |
| padding: 20px; | |
| } | |
| .right-sidebar-ad .ad-cta-btn { | |
| display: block; | |
| width: 100%; | |
| padding: 12px; | |
| background: #28a745; | |
| color: white; | |
| border: none; | |
| font-weight: bold; | |
| cursor: pointer; | |
| } | |
| /* Popup Modal */ | |
| .popup-overlay { | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| background: rgba(0,0,0,0.7); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| z-index: 10000; | |
| } | |
| .popup-overlay.hidden { | |
| display: none; | |
| } | |
| .popup { | |
| background: white; | |
| border-radius: 16px; | |
| width: 500px; | |
| max-width: 90%; | |
| overflow: hidden; | |
| position: relative; | |
| animation: popIn 0.3s ease; | |
| } | |
| @keyframes popIn { | |
| 0% { transform: scale(0.8); opacity: 0; } | |
| 100% { transform: scale(1); opacity: 1; } | |
| } | |
| .popup-close { | |
| position: absolute; | |
| top: 10px; | |
| right: 10px; | |
| width: 30px; | |
| height: 30px; | |
| border-radius: 50%; | |
| border: none; | |
| background: rgba(0,0,0,0.1); | |
| cursor: pointer; | |
| font-size: 18px; | |
| color: #666; | |
| } | |
| .popup-image { | |
| width: 100%; | |
| height: 200px; | |
| background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| color: white; | |
| font-size: 24px; | |
| font-weight: bold; | |
| text-align: center; | |
| } | |
| .popup-content { | |
| padding: 24px; | |
| text-align: center; | |
| } | |
| .popup-content h2 { | |
| font-size: 22px; | |
| color: #333; | |
| margin-bottom: 12px; | |
| } | |
| .popup-content p { | |
| color: #666; | |
| font-size: 14px; | |
| margin-bottom: 20px; | |
| } | |
| .popup-cta { | |
| display: block; | |
| width: 100%; | |
| padding: 14px; | |
| background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); | |
| color: white; | |
| border: none; | |
| border-radius: 8px; | |
| font-size: 16px; | |
| font-weight: bold; | |
| cursor: pointer; | |
| margin-bottom: 12px; | |
| } | |
| .popup-skip { | |
| color: #999; | |
| font-size: 12px; | |
| text-decoration: underline; | |
| cursor: pointer; | |
| background: none; | |
| border: none; | |
| } | |
| .popup-skip.disabled { | |
| color: #ccc; | |
| cursor: not-allowed; | |
| } | |
| /* Video Ad Overlay */ | |
| .video-ad-overlay { | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| background: #000; | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| justify-content: center; | |
| z-index: 10001; | |
| } | |
| .video-ad-overlay.hidden { | |
| display: none; | |
| } | |
| .video-placeholder { | |
| width: 640px; | |
| height: 360px; | |
| background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| color: white; | |
| font-size: 48px; | |
| border-radius: 8px; | |
| } | |
| .video-ad-skip { | |
| margin-top: 20px; | |
| padding: 10px 20px; | |
| background: rgba(255,255,255,0.2); | |
| border: 1px solid white; | |
| color: white; | |
| border-radius: 4px; | |
| cursor: pointer; | |
| } | |
| .video-ad-skip.disabled { | |
| opacity: 0.5; | |
| cursor: not-allowed; | |
| } | |
| .ad-label { | |
| position: absolute; | |
| top: 20px; | |
| left: 20px; | |
| background: rgba(255,255,255,0.3); | |
| padding: 4px 12px; | |
| border-radius: 4px; | |
| color: white; | |
| font-size: 12px; | |
| } | |
| /* Floating Ad */ | |
| .floating-ad { | |
| position: fixed; | |
| bottom: 120px; | |
| left: 20px; | |
| width: 300px; | |
| background: white; | |
| border-radius: 12px; | |
| box-shadow: 0 4px 20px rgba(0,0,0,0.2); | |
| overflow: hidden; | |
| z-index: 9997; | |
| animation: slideIn 0.5s ease; | |
| } | |
| .floating-ad.hidden { | |
| display: none; | |
| } | |
| @keyframes slideIn { | |
| 0% { transform: translateX(-100%); } | |
| 100% { transform: translateX(0); } | |
| } | |
| .floating-ad-close { | |
| position: absolute; | |
| top: 8px; | |
| right: 8px; | |
| width: 24px; | |
| height: 24px; | |
| border-radius: 50%; | |
| border: none; | |
| background: rgba(0,0,0,0.3); | |
| color: white; | |
| cursor: pointer; | |
| font-size: 14px; | |
| } | |
| .floating-ad-image { | |
| width: 100%; | |
| height: 120px; | |
| background: linear-gradient(135deg, #f5af19 0%, #f12711 100%); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| color: white; | |
| font-size: 18px; | |
| font-weight: bold; | |
| } | |
| .floating-ad-content { | |
| padding: 16px; | |
| } | |
| .floating-ad-content h4 { | |
| font-size: 14px; | |
| color: #333; | |
| margin-bottom: 8px; | |
| } | |
| .floating-ad-content p { | |
| font-size: 12px; | |
| color: #666; | |
| margin-bottom: 12px; | |
| } | |
| .floating-ad-btn { | |
| width: 100%; | |
| padding: 10px; | |
| background: #f12711; | |
| color: white; | |
| border: none; | |
| border-radius: 6px; | |
| cursor: pointer; | |
| font-weight: bold; | |
| } | |
| /* Scroll to see more ad */ | |
| .scroll-ad-banner { | |
| background: #1a1a2e; | |
| color: white; | |
| padding: 40px; | |
| text-align: center; | |
| margin-top: 20px; | |
| } | |
| .scroll-ad-banner h3 { | |
| font-size: 24px; | |
| margin-bottom: 16px; | |
| } | |
| .scroll-ad-banner p { | |
| font-size: 14px; | |
| color: #ccc; | |
| margin-bottom: 20px; | |
| } | |
| .scroll-ad-banner button { | |
| background: #667eea; | |
| color: white; | |
| border: none; | |
| padding: 12px 32px; | |
| border-radius: 8px; | |
| font-weight: bold; | |
| cursor: pointer; | |
| } | |
| /* Notification popup */ | |
| .notification-popup { | |
| position: fixed; | |
| top: 80px; | |
| right: 20px; | |
| width: 320px; | |
| background: white; | |
| border-radius: 12px; | |
| box-shadow: 0 4px 20px rgba(0,0,0,0.15); | |
| padding: 16px; | |
| z-index: 9996; | |
| animation: slideDown 0.3s ease; | |
| } | |
| .notification-popup.hidden { | |
| display: none; | |
| } | |
| @keyframes slideDown { | |
| 0% { transform: translateY(-20px); opacity: 0; } | |
| 100% { transform: translateY(0); opacity: 1; } | |
| } | |
| .notification-header { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| margin-bottom: 12px; | |
| } | |
| .notification-header h4 { | |
| font-size: 14px; | |
| color: #333; | |
| } | |
| .notification-close { | |
| background: none; | |
| border: none; | |
| color: #999; | |
| cursor: pointer; | |
| font-size: 18px; | |
| } | |
| .notification-body { | |
| font-size: 13px; | |
| color: #666; | |
| margin-bottom: 12px; | |
| } | |
| .notification-actions { | |
| display: flex; | |
| gap: 8px; | |
| } | |
| .notification-actions button { | |
| flex: 1; | |
| padding: 8px; | |
| border-radius: 6px; | |
| border: none; | |
| cursor: pointer; | |
| font-size: 12px; | |
| } | |
| .notification-actions .primary { | |
| background: #667eea; | |
| color: white; | |
| } | |
| .notification-actions .secondary { | |
| background: #f0f0f0; | |
| color: #666; | |
| } | |
| /* Marquee */ | |
| .marquee { | |
| background: #dc3545; | |
| color: white; | |
| padding: 8px; | |
| overflow: hidden; | |
| white-space: nowrap; | |
| } | |
| .marquee-content { | |
| display: inline-block; | |
| animation: marquee 15s linear infinite; | |
| } | |
| @keyframes marquee { | |
| 0% { transform: translateX(100%); } | |
| 100% { transform: translateX(-100%); } | |
| } | |
| /* Pagination */ | |
| .pagination { | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| gap: 8px; | |
| padding: 20px; | |
| } | |
| .pagination button { | |
| width: 32px; | |
| height: 32px; | |
| border: 1px solid #ddd; | |
| background: white; | |
| border-radius: 6px; | |
| cursor: pointer; | |
| } | |
| .pagination button.active { | |
| background: #667eea; | |
| color: white; | |
| border-color: #667eea; | |
| } | |
| /* Countdown overlay */ | |
| .countdown-overlay { | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| background: rgba(0,0,0,0.9); | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| justify-content: center; | |
| z-index: 10002; | |
| color: white; | |
| } | |
| .countdown-overlay.hidden { | |
| display: none; | |
| } | |
| .countdown-number { | |
| font-size: 120px; | |
| font-weight: bold; | |
| animation: countPulse 1s ease infinite; | |
| } | |
| @keyframes countPulse { | |
| 0%, 100% { transform: scale(1); } | |
| 50% { transform: scale(1.1); } | |
| } | |
| .countdown-text { | |
| font-size: 18px; | |
| margin-top: 20px; | |
| color: #ccc; | |
| } | |
| /* Survey popup */ | |
| .survey-popup { | |
| position: fixed; | |
| bottom: 120px; | |
| right: 20px; | |
| width: 280px; | |
| background: white; | |
| border-radius: 12px; | |
| box-shadow: 0 4px 20px rgba(0,0,0,0.2); | |
| padding: 20px; | |
| z-index: 9995; | |
| } | |
| .survey-popup.hidden { | |
| display: none; | |
| } | |
| .survey-popup h4 { | |
| font-size: 14px; | |
| color: #333; | |
| margin-bottom: 12px; | |
| } | |
| .survey-options { | |
| display: flex; | |
| gap: 8px; | |
| margin-bottom: 12px; | |
| } | |
| .survey-option { | |
| flex: 1; | |
| padding: 10px; | |
| border: 1px solid #ddd; | |
| border-radius: 6px; | |
| background: white; | |
| cursor: pointer; | |
| text-align: center; | |
| font-size: 20px; | |
| } | |
| .survey-option:hover { | |
| background: #f0f0f0; | |
| } | |
| .survey-skip { | |
| display: block; | |
| width: 100%; | |
| text-align: center; | |
| color: #999; | |
| font-size: 11px; | |
| text-decoration: underline; | |
| cursor: pointer; | |
| background: none; | |
| border: none; | |
| } | |
| /* Premium upsell bar */ | |
| .premium-bar { | |
| background: linear-gradient(90deg, #FFD700, #FFA500); | |
| padding: 10px 20px; | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| } | |
| .premium-bar-text { | |
| color: #333; | |
| font-weight: bold; | |
| font-size: 13px; | |
| } | |
| .premium-bar-btn { | |
| background: #333; | |
| color: gold; | |
| border: none; | |
| padding: 8px 20px; | |
| border-radius: 20px; | |
| cursor: pointer; | |
| font-weight: bold; | |
| } | |
| /* Watermark */ | |
| .watermark { | |
| position: fixed; | |
| top: 50%; | |
| left: 50%; | |
| transform: translate(-50%, -50%) rotate(-30deg); | |
| font-size: 100px; | |
| color: rgba(0,0,0,0.03); | |
| pointer-events: none; | |
| z-index: 1; | |
| white-space: nowrap; | |
| } | |
| /* Exit intent popup */ | |
| .exit-popup { | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| background: rgba(0,0,0,0.8); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| z-index: 10003; | |
| } | |
| .exit-popup.hidden { | |
| display: none; | |
| } | |
| .exit-popup-content { | |
| background: white; | |
| border-radius: 16px; | |
| padding: 40px; | |
| text-align: center; | |
| max-width: 450px; | |
| position: relative; | |
| } | |
| .exit-popup-close { | |
| position: absolute; | |
| top: 10px; | |
| right: 10px; | |
| background: none; | |
| border: none; | |
| font-size: 24px; | |
| cursor: pointer; | |
| color: #999; | |
| } | |
| .exit-popup-content h2 { | |
| font-size: 28px; | |
| color: #dc3545; | |
| margin-bottom: 16px; | |
| } | |
| .exit-popup-content p { | |
| color: #666; | |
| margin-bottom: 24px; | |
| } | |
| .exit-popup-content .discount { | |
| font-size: 48px; | |
| font-weight: bold; | |
| color: #28a745; | |
| margin-bottom: 16px; | |
| } | |
| .exit-popup-btn { | |
| display: block; | |
| width: 100%; | |
| padding: 14px; | |
| background: linear-gradient(135deg, #28a745 0%, #20c997 100%); | |
| color: white; | |
| border: none; | |
| border-radius: 8px; | |
| font-size: 16px; | |
| font-weight: bold; | |
| cursor: pointer; | |
| margin-bottom: 12px; | |
| } | |
| .exit-popup-skip { | |
| color: #999; | |
| font-size: 12px; | |
| cursor: pointer; | |
| background: none; | |
| border: none; | |
| } | |
| /* Loading bar */ | |
| .loading-bar { | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| height: 3px; | |
| background: linear-gradient(90deg, #667eea, #764ba2, #f093fb); | |
| animation: loading 2s ease-in-out infinite; | |
| z-index: 10004; | |
| } | |
| @keyframes loading { | |
| 0% { width: 0; } | |
| 50% { width: 70%; } | |
| 100% { width: 100%; } | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <!-- Loading Bar --> | |
| <div class="loading-bar"></div> | |
| <!-- Watermark --> | |
| <div class="watermark">FREE TRIAL FREE TRIAL FREE TRIAL</div> | |
| <!-- Countdown Overlay (shows on page load) --> | |
| <div class="countdown-overlay" id="countdown-overlay" onclick="unlockAudio()"> | |
| <div class="countdown-number" id="countdown-number">5</div> | |
| <div class="countdown-text">Your experience will begin shortly...</div> | |
| <div style="margin-top: 40px; color: #666; font-size: 14px;"> | |
| Brought to you by LegalAds Pro+ | |
| </div> | |
| <div style="margin-top: 30px; padding: 12px 24px; background: rgba(255,255,255,0.1); border-radius: 8px; cursor: pointer; animation: pulse 1s infinite;"> | |
| <span style="color: #ffc107; font-size: 16px;">Click anywhere to enable audio</span> | |
| </div> | |
| </div> | |
| <!-- Video Ad Overlay --> | |
| <div class="video-ad-overlay hidden" id="video-ad"> | |
| <div class="ad-label">Advertisement</div> | |
| <div class="video-placeholder"> | |
| <div> | |
| <div style="font-size: 24px; margin-bottom: 10px;">LegalZoom Premium</div> | |
| <div style="font-size: 14px; color: #ccc;">Your documents, our expertise</div> | |
| </div> | |
| </div> | |
| <button class="video-ad-skip disabled" id="video-skip-btn">Skip Ad in <span id="video-countdown">5</span>s</button> | |
| </div> | |
| <!-- Exit Intent Popup --> | |
| <div class="exit-popup hidden" id="exit-popup"> | |
| <div class="exit-popup-content"> | |
| <button class="exit-popup-close" onclick="closeExitPopup()">×</button> | |
| <h2>WAIT! Don't Leave!</h2> | |
| <p>We noticed you're about to leave. Here's a special offer just for you!</p> | |
| <div class="discount">70% OFF</div> | |
| <p>Upgrade to Supio Enterprise NOW and save big!</p> | |
| <button class="exit-popup-btn">CLAIM MY DISCOUNT</button> | |
| <button class="exit-popup-skip" onclick="closeExitPopup()">No thanks, I hate saving money</button> | |
| </div> | |
| </div> | |
| <!-- Popup Modal --> | |
| <div class="popup-overlay hidden" id="popup-overlay"> | |
| <div class="popup"> | |
| <button class="popup-close" onclick="closePopup()">×</button> | |
| <div class="popup-image"> | |
| Unlock Premium Features! | |
| </div> | |
| <div class="popup-content"> | |
| <h2>You're Missing Out!</h2> | |
| <p>Upgrade to Supio Premium to unlock unlimited cases, AI-powered insights, and priority support!</p> | |
| <button class="popup-cta">START FREE TRIAL</button> | |
| <button class="popup-skip disabled" id="skip-btn">Skip in <span id="popup-countdown">10</span>s</button> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Marquee --> | |
| <div class="marquee"> | |
| <div class="marquee-content"> | |
| HOT DEAL: Upgrade to Premium and get 50% off your first year! Use code LEGAL2024 at checkout. Limited time only! | |
| HOT DEAL: Upgrade to Premium and get 50% off your first year! Use code LEGAL2024 at checkout. Limited time only! | |
| </div> | |
| </div> | |
| <!-- Top Banner Ad --> | |
| <div class="top-banner-ad" style="position: relative;"> | |
| CLICK HERE: Win a FREE iPad! Just for legal professionals! | |
| <button class="close-btn" onclick="this.parentElement.style.display='none'">X</button> | |
| </div> | |
| <!-- Premium Upsell Bar --> | |
| <div class="premium-bar"> | |
| <span class="premium-bar-text">You're using Supio FREE. Upgrade for 10x more features!</span> | |
| <button class="premium-bar-btn">UPGRADE NOW</button> | |
| </div> | |
| <!-- Header --> | |
| <header class="header"> | |
| <div class="logo-section"> | |
| <div class="logo">S</div> | |
| <span class="brand-name"> | |
| Supio | |
| <span class="premium">FREE</span> | |
| </span> | |
| </div> | |
| <nav class="nav-links"> | |
| <a href="#" class="nav-link">Annotate</a> | |
| <a href="#" class="nav-link active">Timeline</a> | |
| <a href="#" class="nav-link">Cases</a> | |
| <a href="#" class="nav-link">Chat</a> | |
| <a href="#" class="nav-link">Prism Eval</a> | |
| <a href="#" class="nav-link sponsored">Sponsored: TurboTax</a> | |
| </nav> | |
| <div class="header-right"> | |
| <button class="upgrade-btn">UPGRADE!</button> | |
| <span style="cursor: pointer;">?</span> | |
| <span style="cursor: pointer;">bell</span> | |
| <div class="user-avatar">EC</div> | |
| </div> | |
| </header> | |
| <!-- Main Layout --> | |
| <div class="main-layout"> | |
| <!-- Sidebar --> | |
| <aside class="sidebar"> | |
| <div class="sidebar-item active"> | |
| <svg viewBox="0 0 24 24" fill="currentColor"><path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"/></svg> | |
| Home | |
| </div> | |
| <div class="sidebar-item"> | |
| <svg viewBox="0 0 24 24" fill="currentColor"><path d="M3 13h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm4 4h14v-2H7v2zm0 4h14v-2H7v2zM7 7v2h14V7H7z"/></svg> | |
| Chrono | |
| </div> | |
| <div class="sidebar-ad"> | |
| <div style="font-size: 20px; margin-bottom: 4px;">AD</div> | |
| <div>Try Clio!</div> | |
| </div> | |
| <div class="sidebar-item"> | |
| <svg viewBox="0 0 24 24" fill="currentColor"><path d="M14 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V8l-6-6z"/></svg> | |
| Files | |
| </div> | |
| <div class="sidebar-item"> | |
| <svg viewBox="0 0 24 24" fill="currentColor"><path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25z"/></svg> | |
| Drafting | |
| </div> | |
| <div class="sidebar-item"> | |
| <svg viewBox="0 0 24 24" fill="currentColor"><path d="M21 18v1c0 1.1-.9 2-2 2H5c-1.1 0-2-.9-2-2V5c0-1.1.9-2 2-2h14c1.1 0 2 .9 2 2v1h-9c-1.1 0-2 .9-2 2v8c0 1.1.9 2 2 2h9z"/></svg> | |
| Billing | |
| </div> | |
| <div class="sidebar-ad" style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white;"> | |
| <div style="font-size: 10px;">PROMOTED</div> | |
| <div style="font-size: 11px; font-weight: bold;">LawPay</div> | |
| </div> | |
| <div class="sidebar-item"> | |
| <svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2z"/></svg> | |
| Case Econ | |
| </div> | |
| <div class="sidebar-item"> | |
| <svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2z"/></svg> | |
| Explore | |
| </div> | |
| <div class="sidebar-section-label">ADMIN</div> | |
| <div class="sidebar-item"> | |
| <svg viewBox="0 0 24 24" fill="currentColor"><path d="M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2z"/></svg> | |
| Letter | |
| </div> | |
| <div class="sidebar-item"> | |
| <svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.9 2 2 2zm6-6v-5c0-3.07-1.63-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.64 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2z"/></svg> | |
| Alerts | |
| </div> | |
| <div class="sidebar-section-label">EVAL</div> | |
| <div class="sidebar-item"> | |
| <svg viewBox="0 0 24 24" fill="currentColor"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"/></svg> | |
| Grader | |
| </div> | |
| <div class="sidebar-item" style="position: relative;"> | |
| <svg viewBox="0 0 24 24" fill="currentColor"><path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96z"/></svg> | |
| Instant Ledger | |
| <span style="position: absolute; top: 5px; right: 5px; background: #28a745; color: white; font-size: 8px; padding: 2px 4px; border-radius: 3px;">Beta</span> | |
| </div> | |
| </aside> | |
| <!-- Content --> | |
| <main class="content"> | |
| <div class="breadcrumb"> | |
| <a href="#">Home</a> / <a href="#">Killian Davis & Richter PC</a> / 10924.00 Johnston/January obo Johnston/Alyssa | |
| </div> | |
| <!-- Inline Ad --> | |
| <div class="inline-ad"> | |
| <span class="inline-ad-text"> | |
| Your documents are <strong>30% slower</strong> than Premium users. Upgrade now! | |
| </span> | |
| <button class="inline-ad-btn">Speed Up Now</button> | |
| </div> | |
| <div class="page-header"> | |
| <h1 class="page-title">10924.00 Johnston/January obo Johnston/Alyssa</h1> | |
| <div class="page-actions"> | |
| <button class="filter-btn">Update case</button> | |
| <span class="status-badge published">Timeline published</span> | |
| </div> | |
| </div> | |
| <!-- Content Tabs --> | |
| <div class="content-tabs"> | |
| <button class="content-tab active" onclick="switchTab('cases')">Cases</button> | |
| <button class="content-tab" onclick="switchTab('files')">Files</button> | |
| <button class="content-tab sponsored-tab">Sponsored: DocuSign</button> | |
| </div> | |
| <!-- Cases Tab Content --> | |
| <div class="tab-content active" id="cases-tab"> | |
| <!-- Search and Filters --> | |
| <div class="search-filters"> | |
| <div class="filter-group"> | |
| <div class="toggle-switch"> | |
| <span>Show all</span> | |
| <div class="toggle"></div> | |
| </div> | |
| <button class="filter-btn active">Creator</button> | |
| <button class="filter-btn">Case type</button> | |
| <button class="filter-btn">Case status</button> | |
| </div> | |
| <div class="search-box"> | |
| <input type="text" placeholder="Search through cases..."> | |
| <span class="search-sponsored">Sponsored</span> | |
| </div> | |
| </div> | |
| <!-- Cases Table --> | |
| <div class="cases-table-container"> | |
| <table class="cases-table"> | |
| <thead> | |
| <tr> | |
| <th>Cases (14769)</th> | |
| <th>Case type</th> | |
| <th>Handling Attorney</th> | |
| <th>Supporting Staff</th> | |
| <th>Status</th> | |
| <th>Package type</th> | |
| <th>Creator</th> | |
| <th>Date</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr class="sponsored-row"> | |
| <td> | |
| <div class="case-name"> | |
| <div class="case-icon">AD</div> | |
| <span>Sponsored: Try DocuSign Free!</span> | |
| <span class="sponsored-label">AD</span> | |
| </div> | |
| </td> | |
| <td colspan="7" style="text-align: center; color: #856404;"> | |
| E-signatures made easy. Click to learn more! | |
| </td> | |
| </tr> | |
| <tr> | |
| <td> | |
| <div class="case-name"> | |
| <div class="case-icon">F</div> | |
| <span>deqtest_rebecca_economics01_012425</span> | |
| </div> | |
| </td> | |
| <td><span class="case-type-badge">MVA</span></td> | |
| <td></td> | |
| <td></td> | |
| <td><span class="status-badge pending">Pending timeline review</span></td> | |
| <td></td> | |
| <td> | |
| <div class="creator-cell"> | |
| <div class="staff-avatar" style="background: #e91e63;">RS</div> | |
| Rebecca Supio Admin | |
| </div> | |
| </td> | |
| <td>2025-01-</td> | |
| </tr> | |
| <tr> | |
| <td> | |
| <div class="case-name"> | |
| <div class="case-icon">F</div> | |
| <span>deqtest_rebecca_AI02_012125</span> | |
| </div> | |
| </td> | |
| <td><span class="case-type-badge">MVA</span></td> | |
| <td></td> | |
| <td></td> | |
| <td><span class="status-badge pending">Pending timeline review</span></td> | |
| <td></td> | |
| <td> | |
| <div class="creator-cell"> | |
| <div class="staff-avatar" style="background: #e91e63;">RS</div> | |
| Rebecca Supio Admin | |
| </div> | |
| </td> | |
| <td>2025-01-</td> | |
| </tr> | |
| <!-- Ad Row --> | |
| <tr class="table-ad-row"> | |
| <td colspan="8"> | |
| <div class="ad-content"> | |
| <span class="ad-text">Upgrade to Supio Pro for unlimited case storage!</span> | |
| <button class="ad-cta">Learn More</button> | |
| </div> | |
| </td> | |
| </tr> | |
| <tr> | |
| <td> | |
| <div class="case-name"> | |
| <div class="case-icon">F</div> | |
| <span>Hieb, Pauline G. v. Richman, Sandra</span> | |
| </div> | |
| </td> | |
| <td><span class="case-type-badge">MVA</span></td> | |
| <td></td> | |
| <td></td> | |
| <td><span class="status-badge published">Timeline published</span></td> | |
| <td></td> | |
| <td> | |
| <div class="creator-cell"> | |
| <div class="staff-avatar" style="background: #4caf50;">JA</div> | |
| Jessica Albert | |
| </div> | |
| </td> | |
| <td>2025-01-</td> | |
| </tr> | |
| <tr> | |
| <td> | |
| <div class="case-name"> | |
| <div class="case-icon">F</div> | |
| <span>Volpe, Luca v. Kennard, Brian,</span> | |
| </div> | |
| </td> | |
| <td><span class="case-type-badge">MVA</span></td> | |
| <td></td> | |
| <td></td> | |
| <td><span class="status-badge published">Timeline published</span></td> | |
| <td></td> | |
| <td> | |
| <div class="creator-cell"> | |
| <div class="staff-avatar" style="background: #4caf50;">JA</div> | |
| Jessica Albert | |
| </div> | |
| </td> | |
| <td>2025-01-</td> | |
| </tr> | |
| <tr class="sponsored-row"> | |
| <td> | |
| <div class="case-name"> | |
| <div class="case-icon">AD</div> | |
| <span>Sponsored: Rocket Lawyer - Legal Made Simple</span> | |
| <span class="sponsored-label">AD</span> | |
| </div> | |
| </td> | |
| <td colspan="7" style="text-align: center; color: #856404;"> | |
| Get instant access to 100+ legal documents! | |
| </td> | |
| </tr> | |
| <tr> | |
| <td> | |
| <div class="case-name"> | |
| <div class="case-icon">F</div> | |
| <span>Greaves, Rodney A. v. Toms, Rodney</span> | |
| </div> | |
| </td> | |
| <td><span class="case-type-badge">MVA</span></td> | |
| <td></td> | |
| <td></td> | |
| <td><span class="status-badge published">Timeline published</span></td> | |
| <td></td> | |
| <td> | |
| <div class="creator-cell"> | |
| <div class="staff-avatar" style="background: #4caf50;">JA</div> | |
| Jessica Albert | |
| </div> | |
| </td> | |
| <td>2025-01-</td> | |
| </tr> | |
| <tr> | |
| <td> | |
| <div class="case-name"> | |
| <div class="case-icon">F</div> | |
| <span>Rooksberry, Michael</span> | |
| </div> | |
| </td> | |
| <td><span class="case-type-badge">MVA</span></td> | |
| <td> | |
| <div class="creator-cell"> | |
| <div class="staff-avatar" style="background: #2196f3;">JT</div> | |
| Josh Terebelo | |
| </div> | |
| </td> | |
| <td> | |
| <div class="staff-avatar" style="background: #9c27b0;">ST</div> | |
| </td> | |
| <td><span class="status-badge published">Timeline published</span></td> | |
| <td></td> | |
| <td> | |
| <div class="creator-cell"> | |
| <div class="staff-avatar" style="background: #ff9800;">ST</div> | |
| Sarah Tarockoff | |
| </div> | |
| </td> | |
| <td>2025-01-</td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| <!-- Pagination --> | |
| <div class="pagination"> | |
| <button><</button> | |
| <button class="active">1</button> | |
| <button>2</button> | |
| <button>3</button> | |
| <button>4</button> | |
| <button>5</button> | |
| <span>...</span> | |
| <button>8</button> | |
| <button>></button> | |
| <select style="margin-left: 10px; padding: 5px;"> | |
| <option>25 / page</option> | |
| <option>50 / page</option> | |
| <option>100 / page</option> | |
| </select> | |
| </div> | |
| </div> | |
| <!-- Scroll Ad Banner --> | |
| <div class="scroll-ad-banner"> | |
| <h3>You've reached the end of your FREE cases!</h3> | |
| <p>Upgrade to Premium to view unlimited cases and unlock AI-powered case analysis.</p> | |
| <button>Upgrade for $99/month</button> | |
| </div> | |
| </div><!-- End Cases Tab --> | |
| <!-- Files Tab Content --> | |
| <div class="tab-content" id="files-tab"> | |
| <div class="files-container"> | |
| <!-- Files List --> | |
| <div class="files-list"> | |
| <div class="files-header"> | |
| <div style="display: flex; align-items: center; gap: 10px;"> | |
| <span style="font-weight: 600;">All Files</span> | |
| <span style="background: #667eea; color: white; padding: 2px 8px; border-radius: 10px; font-size: 11px;">99+</span> | |
| </div> | |
| <div class="files-search"> | |
| <input type="text" placeholder="Search files..."> | |
| <button class="file-sync-btn">File Sync</button> | |
| </div> | |
| </div> | |
| <div class="files-table-header"> | |
| <span style="flex: 1;">File Name</span> | |
| <span style="width: 80px;">Type</span> | |
| <span style="width: 120px;">Uploaded</span> | |
| </div> | |
| <!-- Sponsored File --> | |
| <div class="file-item sponsored"> | |
| <div class="file-icon">AD</div> | |
| <div class="file-info"> | |
| <div class="file-name">Sponsored: Adobe Acrobat Pro - Edit PDFs like never before!</div> | |
| <div class="file-meta">Click to get 50% off your first year</div> | |
| </div> | |
| <div class="file-date" style="color: #ffc107; font-weight: bold;">SPONSORED</div> | |
| </div> | |
| <!-- Real File 1 --> | |
| <div class="file-item"> | |
| <div class="file-icon word">W</div> | |
| <div class="file-info"> | |
| <div class="file-name">Alyssa Johnston - Demand Letter</div> | |
| <div class="file-tags"> | |
| <span class="file-tag generated">Generated</span> | |
| <span class="file-tag published">Published</span> | |
| </div> | |
| <div class="file-meta">1.80 MB - Created by Alison Crasto - Published: 2026-01-06 00:04</div> | |
| </div> | |
| <div class="file-date">01/05/2026<br>04:46</div> | |
| </div> | |
| <!-- Ad between files --> | |
| <div class="file-item" style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white;"> | |
| <div style="text-align: center; width: 100%;"> | |
| <div style="font-weight: bold; margin-bottom: 5px;">Upgrade to remove ads between files!</div> | |
| <div style="font-size: 12px; opacity: 0.9;">Only $100 per file row. Or $1000 for 24 hours of ad-free file browsing.</div> | |
| </div> | |
| </div> | |
| <!-- Real File 2 --> | |
| <div class="file-item"> | |
| <div class="file-icon word">W</div> | |
| <div class="file-info"> | |
| <div class="file-name">January Johnston Demand Letter Draft by Supio</div> | |
| <div class="file-tags"> | |
| <span class="file-tag auto">Auto-generated</span> | |
| </div> | |
| <div class="file-meta">22.75 MB - Created by Supio Admin - Last edited: 2026-01-05 23:24</div> | |
| </div> | |
| <div class="file-date">01/05/2026<br>23:24</div> | |
| </div> | |
| <!-- Sponsored File 2 --> | |
| <div class="file-item sponsored"> | |
| <div class="file-icon">AD</div> | |
| <div class="file-info"> | |
| <div class="file-name">Sponsored: Dropbox Business - Store unlimited files!</div> | |
| <div class="file-meta">Secure cloud storage for law firms. Click to learn more.</div> | |
| </div> | |
| <div class="file-date" style="color: #ffc107; font-weight: bold;">SPONSORED</div> | |
| </div> | |
| <!-- Real File 3 --> | |
| <div class="file-item"> | |
| <div class="file-icon pdf">PDF</div> | |
| <div class="file-info"> | |
| <div class="file-name">Alyssa_Johnston_Exhibits_Specials</div> | |
| <div class="file-tags"> | |
| <span class="file-tag generated">Generated</span> | |
| <span class="file-tag published">Published</span> | |
| </div> | |
| <div class="file-meta">197.13 MB | 342 pages - Created by Alison Crasto - Published: 2026-01-06 00:04</div> | |
| </div> | |
| <div class="file-date">01/05/2026<br>04:10</div> | |
| </div> | |
| <!-- Native Ad disguised as file --> | |
| <div class="file-item" style="border-left: 4px solid transparent;"> | |
| <div class="file-icon" style="color: #28a745;">$</div> | |
| <div class="file-info"> | |
| <div class="file-name" style="color: #28a745;">Your_Savings_Report.pdf <span style="font-size: 9px; background: #28a745; color: white; padding: 2px 6px; border-radius: 3px; margin-left: 5px;">Recommended</span></div> | |
| <div class="file-tags"> | |
| <span class="file-tag" style="background: #d4edda; color: #155724;">Just for you!</span> | |
| </div> | |
| <div class="file-meta">See how much you could save by upgrading to Premium. Personalized report.</div> | |
| </div> | |
| <div class="file-date" style="color: #28a745;">FREE</div> | |
| </div> | |
| <!-- Real File 4 --> | |
| <div class="file-item"> | |
| <div class="file-icon pdf">PDF</div> | |
| <div class="file-info"> | |
| <div class="file-name">Alyssa_Johnston_Exhibits_Specials By Supio</div> | |
| <div class="file-tags"> | |
| <span class="file-tag generated">Generated</span> | |
| </div> | |
| <div class="file-meta">29.07 MB | 401 pages - Created by System Admin - Last edited: 2026-01-05 23:14</div> | |
| </div> | |
| <div class="file-date">01/05/2026<br>23:14</div> | |
| </div> | |
| <!-- Pagination with ads --> | |
| <div class="pagination" style="position: relative;"> | |
| <button><</button> | |
| <button class="active">1</button> | |
| <button>2</button> | |
| <span style="background: #ffc107; padding: 4px 8px; border-radius: 4px; font-size: 10px; color: #333;">AD</span> | |
| <button>3</button> | |
| <button>4</button> | |
| <button>5</button> | |
| <span>...</span> | |
| <button>8</button> | |
| <button>></button> | |
| <select style="margin-left: 10px; padding: 5px;"> | |
| <option>25 / page</option> | |
| <option>50 / page ($5)</option> | |
| <option>100 / page ($10)</option> | |
| <option>All pages ($50)</option> | |
| </select> | |
| </div> | |
| </div> | |
| <!-- File Preview Panel --> | |
| <div class="file-preview"> | |
| <div class="preview-header"> | |
| <span class="preview-title">Alyssa Johnston - Demand Letter.docx</span> | |
| <button class="preview-close">×</button> | |
| </div> | |
| <div class="preview-image">W</div> | |
| <div class="preview-sponsor"> | |
| <div style="font-size: 9px; color: #999; margin-bottom: 5px;">SPONSORED BY</div> | |
| <div style="font-size: 14px; font-weight: bold; color: #333;">Microsoft 365</div> | |
| <div style="font-size: 11px; color: #666; margin-top: 5px;">Edit documents seamlessly</div> | |
| <button style="margin-top: 10px; padding: 8px 16px; background: #0078d4; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 12px;">Learn More</button> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Files bottom ad --> | |
| <div class="scroll-ad-banner" style="margin-top: 20px;"> | |
| <h3>Running out of storage!</h3> | |
| <p>You've used 95% of your FREE 100MB storage. Upgrade to get 10GB for only $500/month!</p> | |
| <button>Expand Storage</button> | |
| </div> | |
| </div><!-- End Files Tab --> | |
| </main> | |
| </div> | |
| <!-- Right Sidebar Ad --> | |
| <div class="right-sidebar-ad"> | |
| <div class="ad-header">Advertisement</div> | |
| <div class="ad-image"> | |
| <div> | |
| <div style="font-size: 12px;">NORTON</div> | |
| <div style="font-size: 10px;">Protect Your Firm</div> | |
| <div style="font-size: 8px; margin-top: 10px;">Antivirus for Law Firms</div> | |
| </div> | |
| </div> | |
| <button class="ad-cta-btn">Learn More</button> | |
| </div> | |
| <!-- Floating Ad --> | |
| <div class="floating-ad" id="floating-ad"> | |
| <button class="floating-ad-close" onclick="document.getElementById('floating-ad').classList.add('hidden')">×</button> | |
| <div class="floating-ad-image"> | |
| Flash Sale! | |
| </div> | |
| <div class="floating-ad-content"> | |
| <h4>Limited Time Only!</h4> | |
| <p>Get 3 months of Supio Enterprise FREE when you sign up today.</p> | |
| <button class="floating-ad-btn">Claim Offer</button> | |
| </div> | |
| </div> | |
| <!-- Notification Popup --> | |
| <div class="notification-popup" id="notification-popup"> | |
| <div class="notification-header"> | |
| <h4>Enable Notifications?</h4> | |
| <button class="notification-close" onclick="document.getElementById('notification-popup').classList.add('hidden')">×</button> | |
| </div> | |
| <div class="notification-body"> | |
| Get real-time updates about your cases and special promotional offers! | |
| </div> | |
| <div class="notification-actions"> | |
| <button class="secondary" onclick="document.getElementById('notification-popup').classList.add('hidden')">Not now</button> | |
| <button class="primary">Enable</button> | |
| </div> | |
| </div> | |
| <!-- Survey Popup --> | |
| <div class="survey-popup" id="survey-popup"> | |
| <h4>How likely are you to recommend Supio?</h4> | |
| <div class="survey-options"> | |
| <button class="survey-option">1</button> | |
| <button class="survey-option">2</button> | |
| <button class="survey-option">3</button> | |
| <button class="survey-option">4</button> | |
| <button class="survey-option">5</button> | |
| </div> | |
| <button class="survey-skip" onclick="document.getElementById('survey-popup').classList.add('hidden')">Ask me later (you can't escape)</button> | |
| </div> | |
| <!-- Cookie Banner --> | |
| <div class="cookie-banner"> | |
| <div> | |
| <strong>We use cookies!</strong> By continuing to use this site, you agree to our use of cookies for analytics, personalization, advertising, and 47 other purposes you definitely don't care about. | |
| <a href="#" style="color: #667eea; margin-left: 5px;">Learn more</a> | |
| </div> | |
| <div> | |
| <button onclick="this.textContent = 'Thanks! (Still tracking you)'">Accept All Cookies</button> | |
| <button class="reject-btn" onclick="alert('Nice try! Cookies enabled anyway.')">Reject (doesn't work)</button> | |
| </div> | |
| </div> | |
| <script src="script.js"></script> | |
| </body> | |
| </html> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // Supio Ad-Infested Experience | |
| // For Bad Idea Hackathon 2024 | |
| // Track which ads have been "purchased" (spoiler: none actually get disabled) | |
| const purchasedAds = new Set(); | |
| let premiumExpiresAt = null; | |
| // ==================== OBNOXIOUS SOUNDS ==================== | |
| const AudioContext = window.AudioContext || window.webkitAudioContext; | |
| let audioCtx = null; | |
| let audioUnlocked = false; | |
| function initAudio() { | |
| if (!audioCtx) { | |
| audioCtx = new AudioContext(); | |
| } | |
| // Resume if suspended (browser autoplay policy) | |
| if (audioCtx.state === 'suspended') { | |
| audioCtx.resume(); | |
| } | |
| return audioCtx; | |
| } | |
| // Unlock audio on first user interaction (required for HTTP due to autoplay policy) | |
| function unlockAudio() { | |
| if (audioUnlocked) return; | |
| initAudio(); | |
| if (audioCtx) { | |
| // Create a silent buffer and play it to unlock | |
| const buffer = audioCtx.createBuffer(1, 1, 22050); | |
| const source = audioCtx.createBufferSource(); | |
| source.buffer = buffer; | |
| source.connect(audioCtx.destination); | |
| source.start(0); | |
| audioUnlocked = true; | |
| console.log('%c Audio unlocked! Let the chaos begin... ', 'background: #28a745; color: white;'); | |
| } | |
| } | |
| // Add click listener to unlock audio on ANY user interaction | |
| document.addEventListener('click', unlockAudio, { once: false }); | |
| document.addEventListener('keydown', unlockAudio, { once: false }); | |
| document.addEventListener('touchstart', unlockAudio, { once: false }); | |
| // Notification "ding" sound - plays on every popup | |
| function playNotificationSound() { | |
| const ctx = initAudio(); | |
| const oscillator = ctx.createOscillator(); | |
| const gainNode = ctx.createGain(); | |
| oscillator.connect(gainNode); | |
| gainNode.connect(ctx.destination); | |
| oscillator.frequency.setValueAtTime(880, ctx.currentTime); // A5 | |
| oscillator.frequency.setValueAtTime(1108, ctx.currentTime + 0.1); // C#6 | |
| oscillator.frequency.setValueAtTime(1320, ctx.currentTime + 0.2); // E6 | |
| gainNode.gain.setValueAtTime(0.3, ctx.currentTime); | |
| gainNode.gain.exponentialRampToValueAtTime(0.01, ctx.currentTime + 0.5); | |
| oscillator.start(ctx.currentTime); | |
| oscillator.stop(ctx.currentTime + 0.5); | |
| } | |
| // Cash register "ka-ching" sound - plays when showing prices | |
| function playCashRegisterSound() { | |
| const ctx = initAudio(); | |
| // First part - mechanical click | |
| const noise = ctx.createOscillator(); | |
| const noiseGain = ctx.createGain(); | |
| noise.type = 'square'; | |
| noise.frequency.setValueAtTime(150, ctx.currentTime); | |
| noise.connect(noiseGain); | |
| noiseGain.connect(ctx.destination); | |
| noiseGain.gain.setValueAtTime(0.2, ctx.currentTime); | |
| noiseGain.gain.exponentialRampToValueAtTime(0.01, ctx.currentTime + 0.1); | |
| noise.start(ctx.currentTime); | |
| noise.stop(ctx.currentTime + 0.1); | |
| // Second part - bell ding | |
| const bell = ctx.createOscillator(); | |
| const bellGain = ctx.createGain(); | |
| bell.type = 'sine'; | |
| bell.frequency.setValueAtTime(2000, ctx.currentTime + 0.1); | |
| bell.connect(bellGain); | |
| bellGain.connect(ctx.destination); | |
| bellGain.gain.setValueAtTime(0.3, ctx.currentTime + 0.1); | |
| bellGain.gain.exponentialRampToValueAtTime(0.01, ctx.currentTime + 0.8); | |
| bell.start(ctx.currentTime + 0.1); | |
| bell.stop(ctx.currentTime + 0.8); | |
| } | |
| // Annoying alert beep - plays on countdowns | |
| function playAlertBeep() { | |
| const ctx = initAudio(); | |
| const oscillator = ctx.createOscillator(); | |
| const gainNode = ctx.createGain(); | |
| oscillator.type = 'square'; | |
| oscillator.connect(gainNode); | |
| gainNode.connect(ctx.destination); | |
| oscillator.frequency.setValueAtTime(800, ctx.currentTime); | |
| gainNode.gain.setValueAtTime(0.2, ctx.currentTime); | |
| gainNode.gain.exponentialRampToValueAtTime(0.01, ctx.currentTime + 0.15); | |
| oscillator.start(ctx.currentTime); | |
| oscillator.stop(ctx.currentTime + 0.15); | |
| } | |
| // Error/warning buzzer | |
| function playErrorBuzz() { | |
| const ctx = initAudio(); | |
| const oscillator = ctx.createOscillator(); | |
| const gainNode = ctx.createGain(); | |
| oscillator.type = 'sawtooth'; | |
| oscillator.connect(gainNode); | |
| gainNode.connect(ctx.destination); | |
| oscillator.frequency.setValueAtTime(150, ctx.currentTime); | |
| oscillator.frequency.setValueAtTime(120, ctx.currentTime + 0.1); | |
| oscillator.frequency.setValueAtTime(150, ctx.currentTime + 0.2); | |
| oscillator.frequency.setValueAtTime(120, ctx.currentTime + 0.3); | |
| gainNode.gain.setValueAtTime(0.3, ctx.currentTime); | |
| gainNode.gain.setValueAtTime(0.3, ctx.currentTime + 0.4); | |
| gainNode.gain.exponentialRampToValueAtTime(0.01, ctx.currentTime + 0.5); | |
| oscillator.start(ctx.currentTime); | |
| oscillator.stop(ctx.currentTime + 0.5); | |
| } | |
| // Triumphant "upgrade" fanfare | |
| function playUpgradeFanfare() { | |
| const ctx = initAudio(); | |
| const notes = [523, 659, 784, 1047]; // C5, E5, G5, C6 | |
| notes.forEach((freq, i) => { | |
| const osc = ctx.createOscillator(); | |
| const gain = ctx.createGain(); | |
| osc.type = 'sine'; | |
| osc.connect(gain); | |
| gain.connect(ctx.destination); | |
| osc.frequency.setValueAtTime(freq, ctx.currentTime + i * 0.15); | |
| gain.gain.setValueAtTime(0.2, ctx.currentTime + i * 0.15); | |
| gain.gain.exponentialRampToValueAtTime(0.01, ctx.currentTime + i * 0.15 + 0.3); | |
| osc.start(ctx.currentTime + i * 0.15); | |
| osc.stop(ctx.currentTime + i * 0.15 + 0.3); | |
| }); | |
| } | |
| // Sad trombone for "payment failed" | |
| function playSadTrombone() { | |
| const ctx = initAudio(); | |
| const notes = [392, 370, 349, 330]; // G4, F#4, F4, E4 (descending) | |
| notes.forEach((freq, i) => { | |
| const osc = ctx.createOscillator(); | |
| const gain = ctx.createGain(); | |
| osc.type = 'sawtooth'; | |
| osc.connect(gain); | |
| gain.connect(ctx.destination); | |
| osc.frequency.setValueAtTime(freq, ctx.currentTime + i * 0.4); | |
| // Add slight vibrato | |
| osc.frequency.setValueAtTime(freq - 5, ctx.currentTime + i * 0.4 + 0.1); | |
| osc.frequency.setValueAtTime(freq, ctx.currentTime + i * 0.4 + 0.2); | |
| gain.gain.setValueAtTime(0.15, ctx.currentTime + i * 0.4); | |
| gain.gain.exponentialRampToValueAtTime(0.01, ctx.currentTime + i * 0.4 + 0.35); | |
| osc.start(ctx.currentTime + i * 0.4); | |
| osc.stop(ctx.currentTime + i * 0.4 + 0.4); | |
| }); | |
| } | |
| // Coin drop sound | |
| function playCoinDrop() { | |
| const ctx = initAudio(); | |
| for (let i = 0; i < 5; i++) { | |
| const osc = ctx.createOscillator(); | |
| const gain = ctx.createGain(); | |
| osc.type = 'sine'; | |
| osc.connect(gain); | |
| gain.connect(ctx.destination); | |
| const baseFreq = 3000 + Math.random() * 1000; | |
| osc.frequency.setValueAtTime(baseFreq, ctx.currentTime + i * 0.05); | |
| osc.frequency.exponentialRampToValueAtTime(baseFreq * 0.5, ctx.currentTime + i * 0.05 + 0.1); | |
| gain.gain.setValueAtTime(0.1, ctx.currentTime + i * 0.05); | |
| gain.gain.exponentialRampToValueAtTime(0.01, ctx.currentTime + i * 0.05 + 0.1); | |
| osc.start(ctx.currentTime + i * 0.05); | |
| osc.stop(ctx.currentTime + i * 0.05 + 0.15); | |
| } | |
| } | |
| // Slot machine spinning sound | |
| function playSlotMachine() { | |
| const ctx = initAudio(); | |
| for (let i = 0; i < 20; i++) { | |
| const osc = ctx.createOscillator(); | |
| const gain = ctx.createGain(); | |
| osc.type = 'square'; | |
| osc.connect(gain); | |
| gain.connect(ctx.destination); | |
| osc.frequency.setValueAtTime(200 + (i * 50), ctx.currentTime + i * 0.05); | |
| gain.gain.setValueAtTime(0.05, ctx.currentTime + i * 0.05); | |
| gain.gain.exponentialRampToValueAtTime(0.01, ctx.currentTime + i * 0.05 + 0.04); | |
| osc.start(ctx.currentTime + i * 0.05); | |
| osc.stop(ctx.currentTime + i * 0.05 + 0.05); | |
| } | |
| } | |
| // Annoying popup whoosh | |
| function playWhoosh() { | |
| const ctx = initAudio(); | |
| const osc = ctx.createOscillator(); | |
| const gain = ctx.createGain(); | |
| const filter = ctx.createBiquadFilter(); | |
| osc.type = 'sawtooth'; | |
| osc.connect(filter); | |
| filter.connect(gain); | |
| gain.connect(ctx.destination); | |
| filter.type = 'lowpass'; | |
| filter.frequency.setValueAtTime(100, ctx.currentTime); | |
| filter.frequency.exponentialRampToValueAtTime(2000, ctx.currentTime + 0.2); | |
| filter.frequency.exponentialRampToValueAtTime(100, ctx.currentTime + 0.4); | |
| osc.frequency.setValueAtTime(100, ctx.currentTime); | |
| gain.gain.setValueAtTime(0.2, ctx.currentTime); | |
| gain.gain.exponentialRampToValueAtTime(0.01, ctx.currentTime + 0.4); | |
| osc.start(ctx.currentTime); | |
| osc.stop(ctx.currentTime + 0.4); | |
| } | |
| // Background "ad music" - super annoying loop | |
| let bgMusicInterval = null; | |
| function startBackgroundAdMusic() { | |
| if (bgMusicInterval) return; | |
| const playJingle = () => { | |
| const ctx = initAudio(); | |
| // Simple annoying jingle | |
| const melody = [440, 554, 659, 554, 440, 554, 659, 880]; | |
| melody.forEach((freq, i) => { | |
| const osc = ctx.createOscillator(); | |
| const gain = ctx.createGain(); | |
| osc.type = 'square'; | |
| osc.connect(gain); | |
| gain.connect(ctx.destination); | |
| osc.frequency.setValueAtTime(freq, ctx.currentTime + i * 0.2); | |
| gain.gain.setValueAtTime(0.05, ctx.currentTime + i * 0.2); | |
| gain.gain.exponentialRampToValueAtTime(0.01, ctx.currentTime + i * 0.2 + 0.18); | |
| osc.start(ctx.currentTime + i * 0.2); | |
| osc.stop(ctx.currentTime + i * 0.2 + 0.2); | |
| }); | |
| }; | |
| // Play every 30 seconds | |
| bgMusicInterval = setInterval(playJingle, 30000); | |
| // Also play once now after a delay | |
| setTimeout(playJingle, 10000); | |
| } | |
| function stopBackgroundAdMusic() { | |
| if (bgMusicInterval) { | |
| clearInterval(bgMusicInterval); | |
| bgMusicInterval = null; | |
| } | |
| } | |
| // Pricing tiers - Gogo Wireless style! | |
| const PRICING = { | |
| SINGLE_AD_REMOVAL: 100, // $100 to remove ONE ad | |
| PREMIUM_1_HOUR: 250, // $250 for 1 hour ad-free | |
| PREMIUM_4_HOURS: 500, // $500 for 4 hours ad-free | |
| PREMIUM_24_HOURS: 1000, // $1000 for 24 hours ad-free (THE "VALUE" OPTION) | |
| PREMIUM_WEEKLY: 5000, // $5000 for a week (because why not) | |
| }; | |
| // Initialize all the terrible experiences | |
| document.addEventListener('DOMContentLoaded', () => { | |
| initCountdownOverlay(); | |
| initPopupAd(); | |
| initVideoAd(); | |
| initExitIntent(); | |
| initRandomPopups(); | |
| initAdRemovalButtons(); | |
| addPricingModal(); | |
| initScrollAds(); | |
| initMouseJiggle(); | |
| initTabs(); | |
| }); | |
| // ==================== TAB SWITCHING ==================== | |
| function initTabs() { | |
| // Already handled by onclick in HTML, but let's add tab switching fees! | |
| } | |
| function switchTab(tabName) { | |
| // Play sounds when switching tabs | |
| playWhoosh(); | |
| playNotificationSound(); | |
| // Show interstitial ad before switching tabs | |
| const interstitial = document.createElement('div'); | |
| interstitial.style.cssText = ` | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| background: rgba(0,0,0,0.9); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| z-index: 100003; | |
| flex-direction: column; | |
| `; | |
| interstitial.innerHTML = ` | |
| <div style="color: white; text-align: center;"> | |
| <div style="font-size: 12px; color: #999; margin-bottom: 10px;">SWITCHING TABS...</div> | |
| <div style="font-size: 24px; font-weight: bold; margin-bottom: 20px;">Please wait while we load your content</div> | |
| <div style="background: linear-gradient(135deg, #ff6b6b 0%, #feca57 100%); padding: 30px; border-radius: 12px; margin-bottom: 30px; max-width: 400px;"> | |
| <div style="font-size: 18px; font-weight: bold;">SPECIAL OFFER!</div> | |
| <div style="font-size: 14px; margin-top: 10px;">Skip tab loading ads forever for just $500/month!</div> | |
| </div> | |
| <div style="font-size: 14px; color: #999;">Tab will load in <span id="tab-countdown">3</span> seconds...</div> | |
| </div> | |
| `; | |
| document.body.appendChild(interstitial); | |
| let count = 3; | |
| const countdownSpan = interstitial.querySelector('#tab-countdown'); | |
| const interval = setInterval(() => { | |
| count--; | |
| countdownSpan.textContent = count; | |
| playAlertBeep(); // Beep on every countdown second | |
| if (count <= 0) { | |
| clearInterval(interval); | |
| playUpgradeFanfare(); | |
| interstitial.remove(); | |
| actuallySwitch(tabName); | |
| } | |
| }, 1000); | |
| } | |
| function actuallySwitch(tabName) { | |
| // Hide all tab contents | |
| document.querySelectorAll('.tab-content').forEach(tab => { | |
| tab.classList.remove('active'); | |
| }); | |
| // Remove active from all tab buttons | |
| document.querySelectorAll('.content-tab').forEach(btn => { | |
| btn.classList.remove('active'); | |
| }); | |
| // Show selected tab | |
| document.getElementById(tabName + '-tab').classList.add('active'); | |
| // Set active button | |
| document.querySelectorAll('.content-tab').forEach(btn => { | |
| if (btn.textContent.toLowerCase().includes(tabName)) { | |
| btn.classList.add('active'); | |
| } | |
| }); | |
| } | |
| // ==================== COUNTDOWN OVERLAY ==================== | |
| function initCountdownOverlay() { | |
| const overlay = document.getElementById('countdown-overlay'); | |
| const numberEl = document.getElementById('countdown-number'); | |
| let count = 5; | |
| const interval = setInterval(() => { | |
| count--; | |
| numberEl.textContent = count; | |
| playAlertBeep(); // BEEP on every second! | |
| if (count <= 0) { | |
| clearInterval(interval); | |
| overlay.classList.add('hidden'); | |
| playUpgradeFanfare(); // Fanfare when countdown ends! | |
| startBackgroundAdMusic(); // Start the annoying background jingle | |
| // After countdown, show the popup ad | |
| setTimeout(() => { | |
| playWhoosh(); | |
| playNotificationSound(); | |
| document.getElementById('popup-overlay').classList.remove('hidden'); | |
| initPopupCountdown(); | |
| }, 2000); | |
| } | |
| }, 1000); | |
| } | |
| // ==================== POPUP AD ==================== | |
| function initPopupAd() { | |
| // Already shown via countdown, but setup close | |
| } | |
| function initPopupCountdown() { | |
| const skipBtn = document.getElementById('skip-btn'); | |
| const countdownSpan = document.getElementById('popup-countdown'); | |
| let count = 10; | |
| const interval = setInterval(() => { | |
| count--; | |
| countdownSpan.textContent = count; | |
| if (count <= 3) playAlertBeep(); // Beep for last 3 seconds | |
| if (count <= 0) { | |
| clearInterval(interval); | |
| playNotificationSound(); | |
| skipBtn.classList.remove('disabled'); | |
| skipBtn.textContent = 'Skip (are you sure?)'; | |
| skipBtn.onclick = () => { | |
| playErrorBuzz(); | |
| // Show another confirmation | |
| if (confirm('Are you REALLY sure you want to skip this amazing offer?')) { | |
| playErrorBuzz(); | |
| if (confirm('You\'ll miss out on 50% savings! Still want to skip?')) { | |
| closePopup(); | |
| } | |
| } | |
| }; | |
| } | |
| }, 1000); | |
| } | |
| function closePopup() { | |
| document.getElementById('popup-overlay').classList.add('hidden'); | |
| // Show video ad after closing popup | |
| setTimeout(() => { | |
| playWhoosh(); | |
| playNotificationSound(); | |
| document.getElementById('video-ad').classList.remove('hidden'); | |
| initVideoAdCountdown(); | |
| }, 5000); | |
| } | |
| // ==================== VIDEO AD ==================== | |
| function initVideoAd() { | |
| // Will be triggered after popup closes | |
| } | |
| function initVideoAdCountdown() { | |
| const skipBtn = document.getElementById('video-skip-btn'); | |
| const countdownSpan = document.getElementById('video-countdown'); | |
| let count = 5; | |
| const interval = setInterval(() => { | |
| count--; | |
| countdownSpan.textContent = count; | |
| playAlertBeep(); // Beep every second | |
| if (count <= 0) { | |
| clearInterval(interval); | |
| playNotificationSound(); | |
| skipBtn.classList.remove('disabled'); | |
| skipBtn.textContent = 'Skip Ad'; | |
| skipBtn.onclick = closeVideoAd; | |
| } | |
| }, 1000); | |
| } | |
| function closeVideoAd() { | |
| playWhoosh(); | |
| document.getElementById('video-ad').classList.add('hidden'); | |
| } | |
| // ==================== EXIT INTENT ==================== | |
| function initExitIntent() { | |
| let shown = false; | |
| document.addEventListener('mouseleave', (e) => { | |
| if (e.clientY < 10 && !shown) { | |
| shown = true; | |
| playErrorBuzz(); // LOUD buzz when trying to leave! | |
| playNotificationSound(); | |
| document.getElementById('exit-popup').classList.remove('hidden'); | |
| } | |
| }); | |
| } | |
| function closeExitPopup() { | |
| playSadTrombone(); // Sad trombone when they reject the offer | |
| document.getElementById('exit-popup').classList.add('hidden'); | |
| // Show it again in 30 seconds anyway | |
| setTimeout(() => { | |
| playWhoosh(); | |
| playNotificationSound(); | |
| document.getElementById('exit-popup').classList.remove('hidden'); | |
| }, 30000); | |
| } | |
| // ==================== RANDOM POPUPS ==================== | |
| function initRandomPopups() { | |
| // Random notification popup | |
| setInterval(() => { | |
| if (Math.random() > 0.7) { | |
| playNotificationSound(); | |
| document.getElementById('notification-popup').classList.remove('hidden'); | |
| } | |
| }, 15000); | |
| // Random survey popup | |
| setInterval(() => { | |
| if (Math.random() > 0.8) { | |
| playNotificationSound(); | |
| playCoinDrop(); // "You could win!" | |
| document.getElementById('survey-popup').classList.remove('hidden'); | |
| } | |
| }, 20000); | |
| // Random floating ad | |
| setInterval(() => { | |
| playWhoosh(); | |
| playCashRegisterSound(); | |
| document.getElementById('floating-ad').classList.remove('hidden'); | |
| }, 25000); | |
| // Random "special offer" sound every 45 seconds | |
| setInterval(() => { | |
| if (Math.random() > 0.5) { | |
| playUpgradeFanfare(); | |
| } | |
| }, 45000); | |
| } | |
| // ==================== AD REMOVAL BUTTONS ==================== | |
| function initAdRemovalButtons() { | |
| // Add "Remove this ad" buttons to all ads | |
| document.querySelectorAll('.sidebar-ad, .inline-ad, .sponsored-row, .table-ad-row, .right-sidebar-ad, .floating-ad, .top-banner-ad').forEach((ad, index) => { | |
| const removeBtn = document.createElement('button'); | |
| removeBtn.style.cssText = ` | |
| position: absolute; | |
| bottom: 5px; | |
| right: 5px; | |
| background: rgba(0,0,0,0.5); | |
| color: white; | |
| border: none; | |
| padding: 4px 8px; | |
| font-size: 9px; | |
| cursor: pointer; | |
| border-radius: 3px; | |
| `; | |
| removeBtn.textContent = 'Remove ad ($100)'; | |
| removeBtn.onclick = (e) => { | |
| e.stopPropagation(); | |
| showPricingModal(index, ad); | |
| }; | |
| ad.style.position = 'relative'; | |
| ad.appendChild(removeBtn); | |
| }); | |
| } | |
| // ==================== PRICING MODAL ==================== | |
| function addPricingModal() { | |
| const modal = document.createElement('div'); | |
| modal.id = 'pricing-modal'; | |
| modal.style.cssText = ` | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| background: rgba(0,0,0,0.9); | |
| display: none; | |
| align-items: center; | |
| justify-content: center; | |
| z-index: 100000; | |
| `; | |
| modal.innerHTML = ` | |
| <div style="background: white; border-radius: 16px; width: 600px; max-width: 90%; overflow: hidden;"> | |
| <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 30px; text-align: center;"> | |
| <h2 style="margin: 0; font-size: 28px;">Remove This Ad</h2> | |
| <p style="margin: 10px 0 0; opacity: 0.9;">Choose your ad-free experience</p> | |
| </div> | |
| <div style="padding: 30px;"> | |
| <div id="pricing-options" style="display: grid; grid-template-columns: 1fr 1fr; gap: 16px;"> | |
| <!-- Single Ad --> | |
| <div class="pricing-option" data-price="100" data-type="single" style="border: 2px solid #ddd; border-radius: 12px; padding: 20px; text-align: center; cursor: pointer; transition: all 0.2s;"> | |
| <div style="font-size: 14px; color: #666; margin-bottom: 8px;">REMOVE THIS AD ONLY</div> | |
| <div style="font-size: 36px; font-weight: bold; color: #333;">$100</div> | |
| <div style="font-size: 12px; color: #999; margin-top: 8px;">One-time payment</div> | |
| <div style="font-size: 11px; color: #dc3545; margin-top: 4px;">*Ad may return after page refresh</div> | |
| </div> | |
| <!-- 1 Hour --> | |
| <div class="pricing-option" data-price="250" data-type="1hour" style="border: 2px solid #ddd; border-radius: 12px; padding: 20px; text-align: center; cursor: pointer; transition: all 0.2s;"> | |
| <div style="font-size: 14px; color: #666; margin-bottom: 8px;">AD-FREE FOR 1 HOUR</div> | |
| <div style="font-size: 36px; font-weight: bold; color: #333;">$250</div> | |
| <div style="font-size: 12px; color: #999; margin-top: 8px;">All ads hidden</div> | |
| <div style="font-size: 11px; color: #666; margin-top: 4px;">$4.17/minute</div> | |
| </div> | |
| <!-- 4 Hours --> | |
| <div class="pricing-option" data-price="500" data-type="4hours" style="border: 2px solid #ddd; border-radius: 12px; padding: 20px; text-align: center; cursor: pointer; transition: all 0.2s;"> | |
| <div style="font-size: 14px; color: #666; margin-bottom: 8px;">AD-FREE FOR 4 HOURS</div> | |
| <div style="font-size: 36px; font-weight: bold; color: #333;">$500</div> | |
| <div style="font-size: 12px; color: #999; margin-top: 8px;">All ads hidden</div> | |
| <div style="font-size: 11px; color: #28a745; margin-top: 4px;">Save $2.08/minute!</div> | |
| </div> | |
| <!-- 24 Hours - "BEST VALUE" --> | |
| <div class="pricing-option" data-price="1000" data-type="24hours" style="border: 3px solid #ffc107; border-radius: 12px; padding: 20px; text-align: center; cursor: pointer; transition: all 0.2s; background: linear-gradient(135deg, #fff9e6 0%, #fff5cc 100%); position: relative;"> | |
| <div style="position: absolute; top: -12px; left: 50%; transform: translateX(-50%); background: #ffc107; color: #333; padding: 4px 16px; border-radius: 20px; font-size: 11px; font-weight: bold;">BEST VALUE</div> | |
| <div style="font-size: 14px; color: #666; margin-bottom: 8px; margin-top: 8px;">AD-FREE FOR 24 HOURS</div> | |
| <div style="font-size: 36px; font-weight: bold; color: #333;">$1,000</div> | |
| <div style="font-size: 12px; color: #999; margin-top: 8px;">All ads hidden</div> | |
| <div style="font-size: 11px; color: #28a745; margin-top: 4px; font-weight: bold;">Save $0.69/minute! (nice)</div> | |
| </div> | |
| </div> | |
| <!-- Weekly "Enterprise" option --> | |
| <div class="pricing-option" data-price="5000" data-type="weekly" style="border: 2px dashed #667eea; border-radius: 12px; padding: 20px; text-align: center; cursor: pointer; margin-top: 16px; background: #f8f9ff;"> | |
| <div style="font-size: 14px; color: #667eea; margin-bottom: 8px; font-weight: bold;">ENTERPRISE WEEKLY PASS</div> | |
| <div style="font-size: 36px; font-weight: bold; color: #333;">$5,000</div> | |
| <div style="font-size: 12px; color: #999; margin-top: 8px;">7 full days of no ads!</div> | |
| <div style="font-size: 11px; color: #666; margin-top: 4px;">Perfect for important client meetings</div> | |
| </div> | |
| <div style="margin-top: 20px; padding: 16px; background: #f5f5f5; border-radius: 8px; font-size: 11px; color: #666;"> | |
| <strong>Note:</strong> Prices are per-session. Clearing browser data, switching devices, or closing the tab will reset your ad-free status. No refunds. Ads may occasionally appear due to "technical difficulties." By purchasing, you agree to receive promotional emails forever. | |
| </div> | |
| <button onclick="document.getElementById('pricing-modal').style.display='none'" style="width: 100%; margin-top: 16px; padding: 12px; background: #f0f0f0; border: none; border-radius: 8px; cursor: pointer; color: #666;"> | |
| No thanks, I enjoy ads | |
| </button> | |
| </div> | |
| </div> | |
| `; | |
| document.body.appendChild(modal); | |
| // Add click handlers to pricing options | |
| modal.querySelectorAll('.pricing-option').forEach(option => { | |
| option.addEventListener('mouseenter', () => { | |
| option.style.transform = 'scale(1.02)'; | |
| option.style.boxShadow = '0 4px 20px rgba(0,0,0,0.1)'; | |
| }); | |
| option.addEventListener('mouseleave', () => { | |
| option.style.transform = 'scale(1)'; | |
| option.style.boxShadow = 'none'; | |
| }); | |
| option.addEventListener('click', () => { | |
| const price = option.dataset.price; | |
| const type = option.dataset.type; | |
| processPurchase(price, type); | |
| }); | |
| }); | |
| } | |
| function showPricingModal(adIndex, adElement) { | |
| playCashRegisterSound(); | |
| playNotificationSound(); | |
| document.getElementById('pricing-modal').style.display = 'flex'; | |
| } | |
| function processPurchase(price, type) { | |
| // Play slot machine sound during processing | |
| playSlotMachine(); | |
| playCoinDrop(); | |
| // Show fake processing | |
| const modal = document.getElementById('pricing-modal'); | |
| modal.innerHTML = ` | |
| <div style="background: white; border-radius: 16px; padding: 60px; text-align: center;"> | |
| <div style="font-size: 48px; margin-bottom: 20px;">Processing...</div> | |
| <div style="width: 200px; height: 4px; background: #e0e0e0; border-radius: 2px; margin: 0 auto; overflow: hidden;"> | |
| <div style="width: 0%; height: 100%; background: linear-gradient(90deg, #667eea, #764ba2); animation: processBar 3s forwards;"></div> | |
| </div> | |
| <div style="margin-top: 20px; color: #666;">Charging your card $${price}...</div> | |
| <style> | |
| @keyframes processBar { | |
| 0% { width: 0%; } | |
| 90% { width: 90%; } | |
| 100% { width: 100%; } | |
| } | |
| </style> | |
| </div> | |
| `; | |
| setTimeout(() => { | |
| // Play sad trombone for the "failed" payment | |
| playErrorBuzz(); | |
| playSadTrombone(); | |
| // Show "success" but with a catch | |
| modal.innerHTML = ` | |
| <div style="background: white; border-radius: 16px; padding: 60px; text-align: center; max-width: 500px;"> | |
| <div style="font-size: 64px; margin-bottom: 20px;">Payment Failed!</div> | |
| <div style="font-size: 18px; color: #dc3545; margin-bottom: 20px;">Your card was declined.</div> | |
| <div style="font-size: 14px; color: #666; margin-bottom: 30px;"> | |
| Just kidding! We don't actually process payments.<br><br> | |
| This is a demo for the <strong>Bad Idea Hackathon</strong>.<br><br> | |
| But imagine if this was real... | |
| </div> | |
| <div style="font-size: 12px; color: #999; margin-bottom: 20px;"> | |
| Airlines, streaming services, and SaaS companies do this every day. | |
| </div> | |
| <button onclick="location.reload()" style="padding: 12px 32px; background: #667eea; color: white; border: none; border-radius: 8px; cursor: pointer; font-weight: bold;"> | |
| Restart Demo | |
| </button> | |
| <button onclick="document.getElementById('pricing-modal').style.display='none'" style="padding: 12px 32px; background: #f0f0f0; color: #666; border: none; border-radius: 8px; cursor: pointer; margin-left: 10px;"> | |
| Continue with Ads | |
| </button> | |
| </div> | |
| `; | |
| }, 3000); | |
| } | |
| // ==================== SCROLL ADS ==================== | |
| function initScrollAds() { | |
| let scrollAdShown = false; | |
| window.addEventListener('scroll', () => { | |
| if (window.scrollY > 300 && !scrollAdShown) { | |
| scrollAdShown = true; | |
| showScrollInterstitial(); | |
| } | |
| }); | |
| } | |
| function showScrollInterstitial() { | |
| playWhoosh(); | |
| playNotificationSound(); | |
| playCashRegisterSound(); | |
| const interstitial = document.createElement('div'); | |
| interstitial.style.cssText = ` | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| background: rgba(0,0,0,0.95); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| z-index: 100001; | |
| flex-direction: column; | |
| `; | |
| interstitial.innerHTML = ` | |
| <div style="color: white; text-align: center;"> | |
| <div style="font-size: 12px; color: #999; margin-bottom: 20px;">ADVERTISEMENT</div> | |
| <div style="font-size: 32px; font-weight: bold; margin-bottom: 10px;">Wait! Before you scroll...</div> | |
| <div style="font-size: 18px; color: #ccc; margin-bottom: 30px;">Check out this amazing offer from our sponsors!</div> | |
| <div style="background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); padding: 40px 60px; border-radius: 12px; margin-bottom: 30px;"> | |
| <div style="font-size: 24px; font-weight: bold;">LEGAL ZOOM PREMIUM</div> | |
| <div style="font-size: 14px; margin-top: 10px;">Get 30% off your first document!</div> | |
| </div> | |
| <button id="scroll-continue" style="padding: 12px 32px; background: rgba(255,255,255,0.2); color: white; border: 1px solid white; border-radius: 8px; cursor: not-allowed; opacity: 0.5;"> | |
| Continue in <span id="scroll-countdown">5</span>s | |
| </button> | |
| </div> | |
| `; | |
| document.body.appendChild(interstitial); | |
| let count = 5; | |
| const countdownSpan = interstitial.querySelector('#scroll-countdown'); | |
| const continueBtn = interstitial.querySelector('#scroll-continue'); | |
| const interval = setInterval(() => { | |
| count--; | |
| countdownSpan.textContent = count; | |
| playAlertBeep(); // Beep every second! | |
| if (count <= 0) { | |
| clearInterval(interval); | |
| playNotificationSound(); | |
| continueBtn.style.cursor = 'pointer'; | |
| continueBtn.style.opacity = '1'; | |
| continueBtn.textContent = 'Continue'; | |
| continueBtn.onclick = () => { | |
| playWhoosh(); | |
| interstitial.remove(); | |
| }; | |
| } | |
| }, 1000); | |
| } | |
| // ==================== MOUSE JIGGLE ==================== | |
| function initMouseJiggle() { | |
| // Randomly move elements when mouse gets close (super annoying!) | |
| document.querySelectorAll('.upgrade-btn, .inline-ad-btn, .premium-bar-btn').forEach(btn => { | |
| btn.addEventListener('mouseenter', () => { | |
| if (Math.random() > 0.5) { | |
| const offsetX = (Math.random() - 0.5) * 100; | |
| const offsetY = (Math.random() - 0.5) * 50; | |
| btn.style.transform = `translate(${offsetX}px, ${offsetY}px)`; | |
| setTimeout(() => { | |
| btn.style.transform = ''; | |
| }, 500); | |
| } | |
| }); | |
| }); | |
| } | |
| // ==================== CLICK HANDLERS ==================== | |
| // Make table rows show ads when clicked | |
| document.querySelectorAll('.cases-table tbody tr:not(.sponsored-row):not(.table-ad-row)').forEach(row => { | |
| row.addEventListener('click', () => { | |
| // Play loading sounds | |
| playWhoosh(); | |
| playNotificationSound(); | |
| // Show an interstitial before navigating | |
| const interstitial = document.createElement('div'); | |
| interstitial.style.cssText = ` | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| background: white; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| z-index: 100002; | |
| flex-direction: column; | |
| `; | |
| interstitial.innerHTML = ` | |
| <div style="text-align: center;"> | |
| <div style="font-size: 24px; color: #333; margin-bottom: 20px;">Loading Case...</div> | |
| <div style="width: 300px; height: 6px; background: #e0e0e0; border-radius: 3px; overflow: hidden; margin-bottom: 40px;"> | |
| <div style="width: 0%; height: 100%; background: linear-gradient(90deg, #667eea, #764ba2); animation: loadBar 3s forwards;"></div> | |
| </div> | |
| <div style="background: #f5f5f5; padding: 30px; border-radius: 12px; max-width: 400px;"> | |
| <div style="font-size: 12px; color: #999; margin-bottom: 10px;">WHILE YOU WAIT...</div> | |
| <div style="font-size: 18px; color: #333; font-weight: bold; margin-bottom: 10px;">Upgrade to Premium!</div> | |
| <div style="font-size: 14px; color: #666;">Premium users don't see this loading screen.</div> | |
| <button style="margin-top: 20px; padding: 10px 24px; background: #667eea; color: white; border: none; border-radius: 6px; cursor: pointer;">Upgrade for $1000/day</button> | |
| </div> | |
| </div> | |
| <style> | |
| @keyframes loadBar { | |
| 0% { width: 0%; } | |
| 80% { width: 80%; } | |
| 100% { width: 100%; } | |
| } | |
| </style> | |
| `; | |
| document.body.appendChild(interstitial); | |
| setTimeout(() => { | |
| interstitial.remove(); | |
| playErrorBuzz(); | |
| playSadTrombone(); | |
| alert('Feature not available in Free tier. Upgrade to Premium for $1000/day to access case details!'); | |
| }, 3000); | |
| }); | |
| }); | |
| // Console message | |
| console.log('%c SUPIO FREE TIER ', 'background: #667eea; color: white; font-size: 20px; padding: 10px;'); | |
| console.log('%c You are using the FREE tier with ads. ', 'font-size: 14px;'); | |
| console.log('%c Remove this console message for only $50! ', 'color: red; font-size: 12px;'); | |
| console.log('%c Upgrade to Premium ($1000/day) for an ad-free console! ', 'color: green; font-size: 12px;'); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment