/** * Blog Presentation Mode * Full-viewport slide renderer for blog posts * Zero dependencies — pure CSS */ /* ─── Presentation container ─── */ .presentation-mode { position: fixed; inset: 0; z-index: 9999; background: #0f172a; color: #f8fafc; overflow: hidden; font-family: 'Inter', system-ui, -apple-system, sans-serif; } /* ─── Slide viewport ─── */ .presentation-slides { width: 100%; height: 100%; position: relative; } .presentation-slide { position: absolute; inset: 0; display: flex; flex-direction: column; justify-content: center; padding: 4rem 8rem; opacity: 0; visibility: hidden; transition: opacity 0.4s ease, transform 0.4s ease; transform: translateX(40px); } .presentation-slide.active { opacity: 1; visibility: visible; transform: translateX(0); } .presentation-slide.exiting-left { opacity: 0; transform: translateX(-40px); } /* ─── Title slide ─── */ .presentation-slide.slide-title { text-align: center; justify-content: center; } .presentation-slide.slide-title h1 { font-size: 3rem; font-weight: 800; line-height: 1.15; margin-bottom: 1.5rem; background: linear-gradient(135deg, #818cf8, #6366f1, #a78bfa); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .presentation-slide.slide-title .slide-subtitle { font-size: 1.25rem; color: #94a3b8; max-width: 40rem; margin: 0 auto 2rem; line-height: 1.6; } .presentation-slide.slide-title .slide-meta { font-size: 0.875rem; color: #64748b; } /* ─── Content slides ─── */ .slide-heading { font-size: 2.25rem; font-weight: 700; margin-bottom: 2.5rem; color: #e2e8f0; line-height: 1.2; border-bottom: 3px solid #6366f1; padding-bottom: 0.75rem; } .slide-bullets { list-style: none; padding: 0; margin: 0; max-width: 52rem; } .slide-bullets li { font-size: 1.5rem; line-height: 1.5; margin-bottom: 1.25rem; padding-left: 2rem; position: relative; color: #cbd5e1; } .slide-bullets li::before { content: ''; position: absolute; left: 0; top: 0.65rem; width: 0.5rem; height: 0.5rem; border-radius: 50%; background: #6366f1; } /* ─── Navigation bar ─── */ .presentation-nav { position: absolute; bottom: 0; left: 0; right: 0; display: flex; align-items: center; justify-content: space-between; padding: 0.75rem 2rem; background: rgba(15, 23, 42, 0.9); border-top: 1px solid #1e293b; z-index: 10; } .presentation-nav button { background: none; border: 1px solid #334155; color: #94a3b8; padding: 0.5rem 1rem; border-radius: 0.375rem; cursor: pointer; font-size: 0.875rem; transition: all 0.2s; } .presentation-nav button:hover { background: #1e293b; color: #e2e8f0; border-color: #475569; } .presentation-nav button:disabled { opacity: 0.3; cursor: default; } .presentation-nav button:disabled:hover { background: none; color: #94a3b8; border-color: #334155; } .slide-counter { font-size: 0.875rem; color: #64748b; font-variant-numeric: tabular-nums; } .slide-progress { position: absolute; top: 0; left: 0; height: 3px; background: #6366f1; transition: width 0.4s ease; } /* ─── Notes panel ─── */ .presentation-notes { position: absolute; bottom: 3.5rem; left: 0; right: 0; max-height: 0; overflow: hidden; background: #1e293b; border-top: 1px solid #334155; transition: max-height 0.3s ease; z-index: 5; } .presentation-notes.open { max-height: 14rem; } .presentation-notes-inner { padding: 1.25rem 2rem; } .presentation-notes-label { font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: #6366f1; margin-bottom: 0.5rem; } .presentation-notes-text { font-size: 0.9375rem; line-height: 1.6; color: #94a3b8; max-height: 10rem; overflow-y: auto; } /* ─── Keyboard hints (shown briefly on enter) ─── */ .presentation-hints { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); background: rgba(30, 41, 59, 0.95); border: 1px solid #334155; border-radius: 0.75rem; padding: 2rem 3rem; z-index: 20; opacity: 0; pointer-events: none; transition: opacity 0.3s; } .presentation-hints.visible { opacity: 1; pointer-events: auto; } .presentation-hints h3 { font-size: 1rem; font-weight: 600; color: #e2e8f0; margin-bottom: 1rem; text-align: center; } .presentation-hints dl { display: grid; grid-template-columns: auto 1fr; gap: 0.5rem 1.5rem; } .presentation-hints dt { font-family: monospace; font-size: 0.875rem; color: #6366f1; text-align: right; } .presentation-hints dd { font-size: 0.875rem; color: #94a3b8; } /* ─── Responsive ─── */ @media (max-width: 768px) { .presentation-slide { padding: 3rem 2rem; } .presentation-slide.slide-title h1 { font-size: 2rem; } .slide-heading { font-size: 1.5rem; } .slide-bullets li { font-size: 1.125rem; } .presentation-nav { padding: 0.5rem 1rem; } } @media (max-width: 480px) { .presentation-slide { padding: 2rem 1.25rem; } .presentation-slide.slide-title h1 { font-size: 1.5rem; } .slide-heading { font-size: 1.25rem; margin-bottom: 1.5rem; } .slide-bullets li { font-size: 1rem; margin-bottom: 0.75rem; } } /* ─── Print: one slide per page ─── */ @media print { .presentation-mode { position: static; background: white; color: #1f2937; overflow: visible; } .presentation-slides { position: static; } .presentation-slide { position: static; opacity: 1; visibility: visible; transform: none; page-break-after: always; min-height: 100vh; padding: 3rem 4rem; border-bottom: 1px solid #e5e7eb; } .presentation-slide:last-child { page-break-after: avoid; } .presentation-slide.slide-title h1 { background: none; -webkit-text-fill-color: #1f2937; color: #1f2937; } .slide-heading { color: #1f2937; border-bottom-color: #6366f1; } .slide-bullets li { color: #374151; } .slide-bullets li::before { background: #6366f1; } .presentation-nav, .slide-progress, .presentation-hints { display: none !important; } .presentation-notes { position: static; max-height: none; overflow: visible; background: #f9fafb; border: 1px solid #e5e7eb; border-radius: 0.5rem; margin-top: 2rem; } .presentation-notes.open, .presentation-notes { max-height: none; } .presentation-notes-inner { padding: 1rem 1.5rem; } .presentation-notes-label { color: #6366f1; } .presentation-notes-text { color: #4b5563; max-height: none; overflow: visible; } }