diff --git a/script.js b/script.js new file mode 100644 index 0000000..a1b6b4a --- /dev/null +++ b/script.js @@ -0,0 +1,237 @@ +// State +let currentSlideIndex = 0; +let presentationSlides = []; + +// Demo presentation data +const demoSlides = [ + { + title: "AI Video Analytics — B2B Product", + bullets: ["Transforming video data into actionable business insights", "Powered by advanced computer vision and machine learning", "Built for enterprise-scale deployments"] + }, + { + title: "Business Problem", + bullets: ["Organizations generate 1000s of hours of video footage daily", "Manual review is time-consuming and error-prone", "Critical insights remain hidden in unstructured data", "Security and operational teams lack real-time visibility"] + }, + { + title: "Our Solution", + bullets: ["AI-powered video analytics platform", "Real-time object detection and behavior analysis", "Automated alerting and reporting", "Seamless integration with existing camera infrastructure"] + }, + { + title: "How It Works", + bullets: ["Connect existing IP cameras to our platform", "AI models process video streams in real-time", "Detect anomalies, track objects, recognize patterns", "Dashboard provides instant insights and alerts"] + }, + { + title: "Business Benefits", + bullets: ["Reduce manual monitoring costs by 70%", "Faster incident response time (from hours to seconds)", "Data-driven decision making", "Scalable from 10 to 10,000+ cameras"] + }, + { + title: "Next Steps", + bullets: ["Schedule a live demo of the platform", "Discuss your specific use cases", "Pilot program: 30-day free trial", "ROI analysis for your organization"] + } +]; + +// Navigation +function navigateTo(page) { + document.querySelectorAll('.page').forEach(p => p.classList.remove('active')); + document.querySelectorAll('.nav-link').forEach(l => l.classList.remove('active')); + + document.getElementById('page-' + page).classList.add('active'); + const navLink = document.querySelector('.nav-link[data-page="' + page + '"]'); + if (navLink) navLink.classList.add('active'); + + window.scrollTo(0, 0); +} + +// Form submission +document.getElementById('create-form').addEventListener('submit', function(e) { + e.preventDefault(); + + const topic = document.getElementById('topic').value; + const audience = document.querySelector('input[name="audience"]:checked').value; + const style = document.querySelector('input[name="style"]:checked').value; + const slides = document.querySelector('input[name="slides"]:checked').value; + + // Show loading + document.getElementById('loading').classList.add('active'); + + // Simulate AI generation (2 seconds) + setTimeout(function() { + document.getElementById('loading').classList.remove('active'); + + // Use demo slides (in real app, this would be AI-generated) + presentationSlides = demoSlides.slice(0, Math.min(slides, demoSlides.length)); + currentSlideIndex = 0; + + // Navigate to editor + navigateTo('editor'); + renderEditor(); + }, 1500); +}); + +// Render editor +function renderEditor() { + renderThumbnails(); + renderSlidePreview(); + updateSlideCounter(); +} + +// Render thumbnails +function renderThumbnails() { + const container = document.getElementById('slide-thumbnails'); + container.innerHTML = presentationSlides.map(function(slide, index) { + return '
' + + '
Slide ' + (index + 1) + '
' + + '
' + escapeHtml(slide.title) + '
' + + '
'; + }).join(''); +} + +// Render slide preview +function renderSlidePreview() { + const container = document.getElementById('slide-preview'); + const slide = presentationSlides[currentSlideIndex]; + + container.innerHTML = '
' + + '

' + escapeHtml(slide.title) + '

' + + '' + + '
'; +} + +// Update counter +function updateSlideCounter() { + document.getElementById('slide-counter').textContent = (currentSlideIndex + 1) + ' / ' + presentationSlides.length; +} + +// Navigation +function goToSlide(index) { + if (index >= 0 && index < presentationSlides.length) { + currentSlideIndex = index; + renderThumbnails(); + renderSlidePreview(); + updateSlideCounter(); + } +} + +function prevSlide() { + goToSlide(currentSlideIndex - 1); +} + +function nextSlide() { + goToSlide(currentSlideIndex + 1); +} + +// Editor actions +function editSlide() { + const slide = presentationSlides[currentSlideIndex]; + const newTitle = prompt('Edit slide title:', slide.title); + if (newTitle && newTitle.trim()) { + slide.title = newTitle.trim(); + renderEditor(); + } +} + +function regenerateSlide() { + // Simulate regeneration + const loading = document.getElementById('loading'); + loading.classList.add('active'); + loading.querySelector('p').textContent = 'Regenerating slide...'; + + setTimeout(function() { + loading.classList.remove('active'); + loading.querySelector('p').textContent = 'Generating your presentation...'; + + // For demo, just shuffle bullets slightly + const slide = presentationSlides[currentSlideIndex]; + if (slide.bullets.length > 1) { + const temp = slide.bullets[0]; + slide.bullets[0] = slide.bullets[1]; + slide.bullets[1] = temp; + renderSlidePreview(); + renderThumbnails(); + } + }, 1000); +} + +function addSlide() { + const newSlide = { + title: 'New Slide', + bullets: ['Add your content here', 'Click Edit to modify'] + }; + presentationSlides.splice(currentSlideIndex + 1, 0, newSlide); + currentSlideIndex++; + renderEditor(); +} + +function deleteSlide() { + if (presentationSlides.length <= 1) { + alert('Cannot delete the last slide'); + return; + } + + if (confirm('Delete this slide?')) { + presentationSlides.splice(currentSlideIndex, 1); + if (currentSlideIndex >= presentationSlides.length) { + currentSlideIndex = presentationSlides.length - 1; + } + renderEditor(); + } +} + +// Download presentation +function downloadPresentation() { + if (!window.PptxGenJS) { + alert('PPTX library not loaded'); + return; + } + + const pptx = new PptxGenJS(); + pptx.defineLayout({ name: 'W', width: 13.33, height: 7.5 }); + pptx.layout = 'W'; + + presentationSlides.forEach(function(slide) { + const sl = pptx.addSlide(); + sl.background = { color: 'FFFFFF' }; + sl.addText(slide.title, { + x: 0.7, + y: 0.5, + w: 12, + h: 1.2, + fontSize: 32, + bold: true, + color: '1A1A1A' + }); + + if (slide.bullets && slide.bullets.length > 0) { + sl.addText(slide.bullets.map(function(bullet) { + return { text: bullet, options: { bullet: true, breakLine: true } }; + }), { + x: 0.9, + y: 2.0, + w: 11.5, + h: 4.8, + fontSize: 18, + color: '495057', + lineSpacingMultiple: 1.4 + }); + } + }); + + pptx.writeFile({ fileName: 'AI-Presentation.pptx' }); +} + +// Utility +function escapeHtml(text) { + const div = document.createElement('div'); + div.textContent = text; + return div.innerHTML; +} + +// Keyboard navigation +document.addEventListener('keydown', function(e) { + if (document.getElementById('page-editor').classList.contains('active')) { + if (e.key === 'ArrowRight') nextSlide(); + if (e.key === 'ArrowLeft') prevSlide(); + } +}); diff --git a/style.css b/style.css new file mode 100644 index 0000000..05c2892 --- /dev/null +++ b/style.css @@ -0,0 +1,594 @@ +/* CSS Variables - Modern AI SaaS Theme */ +:root { + --bg-primary: #ffffff; + --bg-secondary: #f8f9fa; + --bg-tertiary: #f1f3f5; + --text-primary: #1a1a1a; + --text-secondary: #495057; + --text-muted: #868e96; + --accent: #6366f1; + --accent-hover: #4f46e5; + --accent-light: #eef2ff; + --danger: #ef4444; + --danger-hover: #dc2626; + --border: #e9ecef; + --shadow: 0 1px 3px rgba(0,0,0,0.1); + --shadow-lg: 0 10px 40px rgba(0,0,0,0.1); + --radius: 12px; + --radius-sm: 8px; +} + +/* Reset & Base */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; + background: var(--bg-primary); + color: var(--text-primary); + line-height: 1.6; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 0 24px; +} + +.container-narrow { + max-width: 680px; +} + +/* Header */ +.header { + background: var(--bg-primary); + border-bottom: 1px solid var(--border); + padding: 16px 0; + position: sticky; + top: 0; + z-index: 100; +} + +.header-content { + display: flex; + justify-content: space-between; + align-items: center; +} + +.logo { + display: flex; + align-items: center; + gap: 10px; + font-weight: 600; + font-size: 18px; +} + +.logo-icon { + font-size: 24px; +} + +.logo-text { + color: var(--text-primary); +} + +.nav { + display: flex; + gap: 24px; +} + +.nav-link { + color: var(--text-secondary); + text-decoration: none; + font-weight: 500; + padding: 8px 0; + border-bottom: 2px solid transparent; + transition: all 0.2s; +} + +.nav-link:hover, +.nav-link.active { + color: var(--accent); + border-bottom-color: var(--accent); +} + +/* Main Content */ +.main { + min-height: calc(100vh - 70px); +} + +.page { + display: none; + padding: 60px 0; +} + +.page.active { + display: block; +} + +/* Hero Section */ +.hero { + text-align: center; + padding: 80px 0; + max-width: 800px; + margin: 0 auto; +} + +.hero-title { + font-size: clamp(36px, 5vw, 56px); + font-weight: 700; + line-height: 1.1; + margin-bottom: 20px; + color: var(--text-primary); +} + +.hero-subtitle { + font-size: clamp(18px, 2vw, 22px); + color: var(--text-secondary); + margin-bottom: 40px; + line-height: 1.5; +} + +/* Features */ +.features { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 32px; + margin-top: 60px; +} + +.feature-card { + background: var(--bg-secondary); + padding: 32px; + border-radius: var(--radius); + text-align: center; + transition: transform 0.2s, box-shadow 0.2s; +} + +.feature-card:hover { + transform: translateY(-4px); + box-shadow: var(--shadow-lg); +} + +.feature-icon { + font-size: 48px; + margin-bottom: 16px; +} + +.feature-card h3 { + font-size: 20px; + font-weight: 600; + margin-bottom: 12px; + color: var(--text-primary); +} + +.feature-card p { + color: var(--text-secondary); + line-height: 1.6; +} + +/* Buttons */ +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 12px 24px; + border: none; + border-radius: var(--radius-sm); + font-size: 16px; + font-weight: 500; + cursor: pointer; + transition: all 0.2s; + text-decoration: none; +} + +.btn-primary { + background: var(--accent); + color: white; +} + +.btn-primary:hover { + background: var(--accent-hover); +} + +.btn-secondary { + background: var(--bg-tertiary); + color: var(--text-primary); +} + +.btn-secondary:hover { + background: var(--border); +} + +.btn-danger { + background: var(--danger); + color: white; +} + +.btn-danger:hover { + background: var(--danger-hover); +} + +.btn-lg { + padding: 16px 32px; + font-size: 18px; +} + +.btn-sm { + padding: 8px 16px; + font-size: 14px; +} + +.btn-block { + width: 100%; +} + +/* Forms */ +.form-card { + background: var(--bg-primary); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: 40px; + box-shadow: var(--shadow); +} + +.form-title { + font-size: 28px; + font-weight: 600; + margin-bottom: 32px; + color: var(--text-primary); + text-align: center; +} + +.form-group { + margin-bottom: 24px; +} + +.form-group label { + display: block; + font-weight: 500; + margin-bottom: 10px; + color: var(--text-primary); +} + +.form-group textarea { + width: 100%; + padding: 14px; + border: 1px solid var(--border); + border-radius: var(--radius-sm); + font-size: 16px; + font-family: inherit; + resize: vertical; + transition: border-color 0.2s; +} + +.form-group textarea:focus { + outline: none; + border-color: var(--accent); +} + +/* Radio Groups */ +.radio-group { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); + gap: 12px; +} + +.radio-card { + display: flex; + align-items: center; + justify-content: center; + padding: 14px 20px; + background: var(--bg-secondary); + border: 2px solid var(--border); + border-radius: var(--radius-sm); + cursor: pointer; + transition: all 0.2s; + font-weight: 500; +} + +.radio-card:hover { + border-color: var(--accent); + background: var(--accent-light); +} + +.radio-card input[type="radio"] { + display: none; +} + +.radio-card:has(input:checked) { + border-color: var(--accent); + background: var(--accent-light); + color: var(--accent); +} + +/* Slide Selector */ +.slide-selector { + display: flex; + gap: 12px; +} + +.slide-option { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + padding: 16px; + background: var(--bg-secondary); + border: 2px solid var(--border); + border-radius: var(--radius-sm); + cursor: pointer; + transition: all 0.2s; + font-weight: 600; + font-size: 18px; +} + +.slide-option:hover { + border-color: var(--accent); +} + +.slide-option input[type="radio"] { + display: none; +} + +.slide-option:has(input:checked) { + border-color: var(--accent); + background: var(--accent-light); + color: var(--accent); +} + +/* Editor Layout */ +.editor-container { + display: grid; + grid-template-columns: 280px 1fr 300px; + gap: 24px; + height: calc(100vh - 130px); + min-height: 600px; +} + +.editor-sidebar, +.editor-settings { + background: var(--bg-secondary); + border: 1px solid var(--border); + border-radius: var(--radius); + overflow: hidden; + display: flex; + flex-direction: column; +} + +.sidebar-header, +.settings-header { + padding: 20px; + border-bottom: 1px solid var(--border); + display: flex; + justify-content: space-between; + align-items: center; +} + +.sidebar-header h3, +.settings-header h3 { + font-size: 16px; + font-weight: 600; +} + +.slide-thumbnails { + flex: 1; + overflow-y: auto; + padding: 16px; +} + +.thumbnail { + background: var(--bg-primary); + border: 2px solid var(--border); + border-radius: var(--radius-sm); + padding: 12px; + margin-bottom: 12px; + cursor: pointer; + transition: all 0.2s; +} + +.thumbnail:hover { + border-color: var(--accent); +} + +.thumbnail.active { + border-color: var(--accent); + background: var(--accent-light); +} + +.thumbnail-number { + font-size: 12px; + color: var(--text-muted); + margin-bottom: 6px; +} + +.thumbnail-title { + font-size: 13px; + font-weight: 500; + color: var(--text-primary); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* Slide Preview */ +.editor-main { + display: flex; + flex-direction: column; + gap: 16px; +} + +.slide-preview-container { + flex: 1; + background: var(--bg-tertiary); + border-radius: var(--radius); + display: flex; + align-items: center; + justify-content: center; + padding: 40px; + overflow: auto; +} + +.slide-preview { + background: white; + width: 100%; + max-width: 900px; + aspect-ratio: 16/9; + border-radius: 8px; + box-shadow: var(--shadow-lg); + padding: 60px; + display: flex; + flex-direction: column; + justify-content: center; +} + +.slide-content { + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; +} + +.slide-content h2 { + font-size: 36px; + font-weight: 700; + color: var(--text-primary); + margin-bottom: 24px; + line-height: 1.2; +} + +.slide-content ul { + list-style: none; +} + +.slide-content li { + font-size: 20px; + color: var(--text-secondary); + padding: 12px 0; + padding-left: 28px; + position: relative; + line-height: 1.5; +} + +.slide-content li::before { + content: "•"; + position: absolute; + left: 0; + color: var(--accent); + font-size: 24px; + line-height: 1.4; +} + +.editor-controls { + display: flex; + justify-content: center; + align-items: center; + gap: 24px; + padding: 16px; +} + +.slide-counter { + font-weight: 600; + color: var(--text-secondary); + min-width: 80px; + text-align: center; +} + +/* Settings Panel */ +.settings-content { + padding: 20px; + display: flex; + flex-direction: column; + gap: 12px; +} + +.divider { + border: none; + border-top: 1px solid var(--border); + margin: 8px 0; +} + +/* Loading Overlay */ +.loading-overlay { + display: none; + position: fixed; + inset: 0; + background: rgba(255,255,255,0.95); + z-index: 1000; + align-items: center; + justify-content: center; +} + +.loading-overlay.active { + display: flex; +} + +.loading-content { + text-align: center; +} + +.loading-spinner { + width: 48px; + height: 48px; + border: 4px solid var(--border); + border-top-color: var(--accent); + border-radius: 50%; + animation: spin 1s linear infinite; + margin: 0 auto 20px; +} + +@keyframes spin { + to { transform: rotate(360deg); } +} + +.loading-content p { + font-size: 18px; + color: var(--text-secondary); +} + +/* Responsive */ +@media (max-width: 1024px) { + .editor-container { + grid-template-columns: 1fr; + height: auto; + } + + .editor-sidebar, + .editor-settings { + display: none; + } + + .slide-preview-container { + min-height: 400px; + } +} + +@media (max-width: 768px) { + .header-content { + flex-direction: column; + gap: 16px; + } + + .nav { + gap: 16px; + } + + .hero { + padding: 40px 0; + } + + .features { + grid-template-columns: 1fr; + } + + .form-card { + padding: 24px; + } + + .radio-group { + grid-template-columns: 1fr; + } +}