Spaces:
Runtime error
Runtime error
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>{{ title }}</title> | |
| <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&family=Plus+Jakarta+Sans:wght@300;400;500;600;700;800&display=swap" rel="stylesheet"> | |
| <style> | |
| :root { | |
| --bg-root: #f8fafc; | |
| --glass-bg: rgba(255, 255, 255, 0.75); | |
| --glass-surface: rgba(255, 255, 255, 0.4); | |
| --primary: #4f46e5; | |
| --primary-light: #818cf8; | |
| --primary-dim: rgba(79, 70, 229, 0.08); | |
| --accent: #ec4899; | |
| --accent-light: #f9a8d4; | |
| --text-main: #0f172a; | |
| --text-muted: #64748b; | |
| --success: #10b981; | |
| --warning: #f59e0b; | |
| --info: #3b82f6; | |
| --font-main: 'Plus Jakarta Sans', sans-serif; | |
| --font-code: 'JetBrains Mono', monospace; | |
| } | |
| * { box-sizing: border-box; margin: 0; padding: 0; } | |
| body { | |
| font-family: var(--font-main); | |
| background: #eef2f6; | |
| background-image: | |
| radial-gradient(at 0% 0%, rgba(99, 102, 241, 0.15) 0px, transparent 50%), | |
| radial-gradient(at 100% 100%, rgba(236, 72, 153, 0.15) 0px, transparent 50%); | |
| width: 100vw; | |
| height: 100vh; | |
| overflow: hidden; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| } | |
| .slide-wrap { | |
| width: 1920px; | |
| height: 1080px; | |
| background: var(--glass-bg); | |
| backdrop-filter: blur(20px); | |
| box-shadow: | |
| 0 25px 50px -12px rgba(0, 0, 0, 0.1), | |
| 0 0 0 1px rgba(255, 255, 255, 0.5) inset; | |
| border-radius: 24px; | |
| overflow: hidden; | |
| position: relative; | |
| display: flex; | |
| } | |
| .sidebar-decor { | |
| width: 12px; | |
| height: 100%; | |
| background: linear-gradient(180deg, var(--primary) 0%, var(--accent) 100%); | |
| flex-shrink: 0; | |
| } | |
| .slide { | |
| flex: 1; | |
| padding: 60px 80px; | |
| height: 100%; | |
| display: flex; | |
| flex-direction: column; | |
| z-index: 10; | |
| position: relative; | |
| overflow-y: auto; | |
| } | |
| .header { | |
| margin-bottom: 40px; | |
| flex-shrink: 0; | |
| position: relative; | |
| } | |
| .header::after { | |
| content: ''; | |
| position: absolute; | |
| bottom: -15px; | |
| left: 0; | |
| width: 80px; | |
| height: 4px; | |
| background: var(--primary); | |
| border-radius: 2px; | |
| } | |
| .title { | |
| font-size: 52px; | |
| font-weight: 800; | |
| color: var(--text-main); | |
| letter-spacing: -0.03em; | |
| line-height: 1.1; | |
| margin-bottom: 12px; | |
| } | |
| .subtitle { | |
| font-size: 22px; | |
| color: var(--text-muted); | |
| font-weight: 500; | |
| } | |
| .content-area { | |
| flex: 1; | |
| display: grid; | |
| grid-template-columns: 1fr 1fr; | |
| gap: 30px; | |
| } | |
| /* Section Styling */ | |
| .section { | |
| background: var(--glass-surface); | |
| border: 1px solid rgba(255, 255, 255, 0.6); | |
| border-radius: 20px; | |
| padding: 32px; | |
| box-shadow: | |
| inset 0 0 20px rgba(255, 255, 255, 0.5), | |
| 0 10px 30px rgba(0,0,0,0.03); | |
| position: relative; | |
| overflow: hidden; | |
| display: flex; | |
| flex-direction: column; | |
| } | |
| .section-header { | |
| display: flex; | |
| align-items: center; | |
| gap: 16px; | |
| margin-bottom: 24px; | |
| padding-bottom: 16px; | |
| border-bottom: 2px solid var(--primary-dim); | |
| } | |
| .section-icon { | |
| width: 48px; | |
| height: 48px; | |
| border-radius: 12px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| flex-shrink: 0; | |
| } | |
| .section-icon.functional { | |
| background: linear-gradient(135deg, var(--primary) 0%, var(--primary-light) 100%); | |
| } | |
| .section-icon.non-functional { | |
| background: linear-gradient(135deg, var(--accent) 0%, var(--accent-light) 100%); | |
| } | |
| .section-icon svg { | |
| width: 24px; | |
| height: 24px; | |
| stroke: white; | |
| fill: none; | |
| } | |
| .section-title { | |
| font-size: 28px; | |
| font-weight: 700; | |
| color: var(--text-main); | |
| letter-spacing: -0.02em; | |
| } | |
| /* Requirements Grid */ | |
| .requirements-grid { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 16px; | |
| overflow-y: auto; | |
| padding-right: 8px; | |
| } | |
| .requirements-grid::-webkit-scrollbar { | |
| width: 6px; | |
| } | |
| .requirements-grid::-webkit-scrollbar-track { | |
| background: rgba(0, 0, 0, 0.05); | |
| border-radius: 3px; | |
| } | |
| .requirements-grid::-webkit-scrollbar-thumb { | |
| background: var(--primary); | |
| border-radius: 3px; | |
| } | |
| .requirement-card { | |
| background: rgba(255, 255, 255, 0.6); | |
| border: 1px solid rgba(255, 255, 255, 0.8); | |
| border-radius: 16px; | |
| padding: 24px; | |
| transition: all 0.3s ease; | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .requirement-card::before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| width: 4px; | |
| height: 100%; | |
| background: var(--primary); | |
| opacity: 0; | |
| transition: opacity 0.3s ease; | |
| } | |
| .requirement-card.priority-high::before { background: var(--accent); opacity: 1; } | |
| .requirement-card.priority-medium::before { background: var(--warning); opacity: 1; } | |
| .requirement-card.priority-low::before { background: var(--info); opacity: 1; } | |
| .requirement-card:hover { | |
| transform: translateY(-4px); | |
| box-shadow: 0 12px 24px rgba(0, 0, 0, 0.08); | |
| background: rgba(255, 255, 255, 0.8); | |
| } | |
| .req-title { | |
| font-size: 18px; | |
| font-weight: 700; | |
| color: var(--text-main); | |
| margin-bottom: 8px; | |
| line-height: 1.3; | |
| } | |
| .req-description { | |
| font-size: 15px; | |
| color: var(--text-muted); | |
| line-height: 1.6; | |
| } | |
| /* Background Blobs */ | |
| .blob { | |
| position: absolute; | |
| filter: blur(80px); | |
| opacity: 0.4; | |
| z-index: 1; | |
| pointer-events: none; | |
| } | |
| .blob-1 { top: -10%; right: -5%; width: 600px; height: 600px; background: var(--primary-light); } | |
| .blob-2 { bottom: -10%; left: -5%; width: 500px; height: 500px; background: var(--accent); } | |
| /* Footer Tag */ | |
| .float-tag { | |
| position: absolute; | |
| bottom: 30px; | |
| right: 30px; | |
| display: flex; | |
| align-items: center; | |
| gap: 10px; | |
| background: #fff; | |
| padding: 8px 16px; | |
| border-radius: 50px; | |
| box-shadow: 0 4px 20px rgba(0,0,0,0.08); | |
| z-index: 20; | |
| } | |
| .dot { | |
| width: 8px; | |
| height: 8px; | |
| background: var(--accent); | |
| border-radius: 50%; | |
| animation: pulse 2s infinite; | |
| } | |
| .tag-text { | |
| font-family: var(--font-code); | |
| font-size: 12px; | |
| font-weight: 600; | |
| color: var(--text-main); | |
| } | |
| @keyframes pulse { | |
| 0% { box-shadow: 0 0 0 0 rgba(236, 72, 153, 0.7); } | |
| 70% { box-shadow: 0 0 0 6px rgba(236, 72, 153, 0); } | |
| 100% { box-shadow: 0 0 0 0 rgba(236, 72, 153, 0); } | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="slide-wrap"> | |
| <div class="sidebar-decor"></div> | |
| <div class="blob blob-1"></div> | |
| <div class="blob blob-2"></div> | |
| <div class="slide"> | |
| <div class="header"> | |
| <h1 class="title">{{ title or 'System Requirements' }}</h1> | |
| {% if subtitle %} | |
| <p class="subtitle">{{ subtitle }}</p> | |
| {% endif %} | |
| </div> | |
| <div class="content-area"> | |
| <!-- Functional Requirements Section --> | |
| <div class="section"> | |
| <div class="section-header"> | |
| <div class="section-icon functional"> | |
| <svg viewBox="0 0 24 24" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> | |
| <path d="M12 2L2 7l10 5 10-5-10-5z"></path> | |
| <path d="M2 17l10 5 10-5"></path> | |
| <path d="M2 12l10 5 10-5"></path> | |
| </svg> | |
| </div> | |
| <h2 class="section-title">Functional Requirements</h2> | |
| </div> | |
| <div class="requirements-grid"> | |
| {% for req in functional_requirements %} | |
| <div class="requirement-card priority-{{ req.priority|lower }}"> | |
| <h3 class="req-title">{{ req.title }}</h3> | |
| <p class="req-description">{{ req.description }}</p> | |
| </div> | |
| {% endfor %} | |
| </div> | |
| </div> | |
| <!-- Non-Functional Requirements Section --> | |
| <div class="section"> | |
| <div class="section-header"> | |
| <div class="section-icon non-functional"> | |
| <svg viewBox="0 0 24 24" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> | |
| <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path> | |
| </svg> | |
| </div> | |
| <h2 class="section-title">Non-Functional Requirements</h2> | |
| </div> | |
| <div class="requirements-grid"> | |
| {% for req in non_functional_requirements %} | |
| <div class="requirement-card priority-{{ req.priority|lower }}"> | |
| <h3 class="req-title">{{ req.title }}</h3> | |
| <p class="req-description">{{ req.description }}</p> | |
| </div> | |
| {% endfor %} | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="float-tag"> | |
| <div class="dot"></div> | |
| <span class="tag-text">{{ footer_tag or 'Requirements Overview' }}</span> | |
| </div> | |
| </div> | |
| </body> | |
| </html> |