diff --git a/docs/assets/cli-demo.png b/docs/assets/cli-demo.png new file mode 100644 index 0000000..10b4c43 Binary files /dev/null and b/docs/assets/cli-demo.png differ diff --git a/docs/assets/favicon.png b/docs/assets/favicon.png new file mode 100644 index 0000000..17f6386 Binary files /dev/null and b/docs/assets/favicon.png differ diff --git a/docs/assets/logo.png b/docs/assets/logo.png new file mode 100644 index 0000000..93ea53c Binary files /dev/null and b/docs/assets/logo.png differ diff --git a/docs/assets/report-demo-snippet.png b/docs/assets/report-demo-snippet.png new file mode 100644 index 0000000..583bbf8 Binary files /dev/null and b/docs/assets/report-demo-snippet.png differ diff --git a/docs/assets/web-ui-demo.png b/docs/assets/web-ui-demo.png new file mode 100644 index 0000000..4545741 Binary files /dev/null and b/docs/assets/web-ui-demo.png differ diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..f43c1a7 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,160 @@ + + + + + + + DORA - Data Oriented Report Automator + + + + + + + + + +
+ + +
+

Automate Data Analysis
in Seconds

+

From raw data to beautiful, actionable HTML reports instantly. The most powerful open-source EDA tool for + data scientists.

+ + + + +
+ +
+
+

Why DORA?

+
+
+ +

Instant Reports

+

Generate comprehensive EDA reports with a single command. No more writing boilerplate code + for basic analysis.

+
+
+ +

Interactive Visuals

+

Get rich, interactive charts powered by modern web technologies. Dive deep into your data + with zoom, pan, and hover details.

+
+
+ +

Kaggle Integration

+

Directly download and analyze datasets from Kaggle. DORA handles authentication and file + selection for you.

+
+
+
+
+ +
+
+

How It Works

+
+
+
1
+

Input Data

+

Provide a CSV, key in a Kaggle URL, or upload your file.

+
+
+
2
+

Process

+

DORA analyzes distributions, correlations, and missing values automatically.

+
+
+
3
+

Report

+

Receive a shareable HTML report with all insights ready to present.

+
+
+
+
+ +
+
+

Ready to Dive In?

+

Get up and running in less than a minute. +

+ +

Option 1: CLI Tool

+
+ + $ pip install dora-eda +
+ +

Option 2: Web Interface (No Install)

+

Use DORA directly in your browser without installing + anything.

+ Launch App +
+
+ + +
+ + + + \ No newline at end of file diff --git a/docs/script.js b/docs/script.js new file mode 100644 index 0000000..8d6acf1 --- /dev/null +++ b/docs/script.js @@ -0,0 +1,146 @@ +// Smooth scrolling for navigation links +document.querySelectorAll('a[href^="#"]').forEach(anchor => { + anchor.addEventListener('click', function (e) { + e.preventDefault(); + + const href = this.getAttribute('href'); + if (!href || href === '#') return; + + const target = document.querySelector(href); + if (target) { + target.scrollIntoView({ + behavior: 'smooth' + }); + } + }); +}); + +// Copy code to clipboard +function copyCode(elementId) { + const codeElement = document.getElementById(elementId); + let codeText = codeElement.innerText; + + // Remove the '$ ' prompt if present for copying + if (codeText.startsWith('$ ')) { + codeText = codeText.substring(2); + } + + navigator.clipboard.writeText(codeText).then(() => { + // Visual feedback + const btn = codeElement.parentElement.querySelector('.copy-btn'); + const originalText = btn.innerText; + btn.innerText = 'Copied!'; + btn.style.background = '#2b9388'; + + setTimeout(() => { + btn.innerText = originalText; + btn.style.background = ''; + }, 2000); + }).catch(err => { + console.error('Failed to copy: ', err); + }); +} + +// Simple fade-in animation on scroll +const observerOptions = { + threshold: 0.1 +}; + +const observer = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + entry.target.classList.add('visible'); + observer.unobserve(entry.target); + } + }); +}, observerOptions); + +document.querySelectorAll('.feature-card, .step').forEach(el => { + el.style.opacity = '0'; + el.style.transform = 'translateY(20px)'; + el.style.transition = 'opacity 0.6s ease, transform 0.6s ease'; + observer.observe(el); +}); + +// Add visible class styling +const style = document.createElement('style'); +style.textContent = ` + .visible { + opacity: 1 !important; + transform: translateY(0) !important; + } +`; +document.head.appendChild(style); + +// Gallery switching +const tabs = ['cli', 'web', 'report']; +let currentTabIndex = 0; +let autoRotateInterval; + +function switchGallery(tabId, event) { + // Update active state + // Buttons + document.querySelectorAll('.gallery-tab').forEach(tab => { + tab.classList.remove('active'); + // Check data attribute + if (tab.dataset.tab === tabId) { + tab.classList.add('active'); + } + }); + + // Content + document.querySelectorAll('.gallery-content').forEach(content => { + content.classList.remove('active'); + }); + document.getElementById('gallery-' + tabId).classList.add('active'); + + // Update current index for auto-rotation + currentTabIndex = tabs.indexOf(tabId); + + // Reset timer on manual interaction (if event exists and is trusted) + if (event && event.isTrusted) { + resetAutoRotate(); + } +} + +function autoRotate() { + currentTabIndex = (currentTabIndex + 1) % tabs.length; + switchGallery(tabs[currentTabIndex]); // No event passed for auto-rotation +} + +function resetAutoRotate() { + clearInterval(autoRotateInterval); + autoRotateInterval = setInterval(autoRotate, 5000); +} + +// Start auto-rotation +autoRotateInterval = setInterval(autoRotate, 5000); + +// Mobile Nav Toggle +const navToggle = document.getElementById('navToggle'); +const navLinks = document.getElementById('navLinks'); + +if (navToggle) { + navToggle.addEventListener('click', () => { + navLinks.classList.toggle('active'); + + // Change icon + const icon = navToggle.querySelector('i'); + if (navLinks.classList.contains('active')) { + icon.classList.remove('fa-bars'); + icon.classList.add('fa-times'); + } else { + icon.classList.remove('fa-times'); + icon.classList.add('fa-bars'); + } + }); + + // Close menu when clicking a link + navLinks.querySelectorAll('a').forEach(link => { + link.addEventListener('click', () => { + navLinks.classList.remove('active'); + navToggle.querySelector('i').classList.add('fa-bars'); + navToggle.querySelector('i').classList.remove('fa-times'); + }); + }); +} diff --git a/docs/style.css b/docs/style.css new file mode 100644 index 0000000..fa71155 --- /dev/null +++ b/docs/style.css @@ -0,0 +1,410 @@ +:root { + --primary-color: #4ecdc4; + --secondary-color: #2b9388; + --text-color: #333333; + --bg-color: #ffffff; + --light-bg: #f8fcfc; + --card-bg: #ffffff; + --border-radius: 12px; + --transition: all 0.3s ease; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Inter', sans-serif; + color: var(--text-color); + line-height: 1.6; + background-color: var(--bg-color); +} + +/* Typography */ +h1, +h2, +h3 { + font-weight: 700; + line-height: 1.2; +} + +h1 { + font-size: 3.5rem; + margin-bottom: 1rem; + background: linear-gradient(45deg, var(--primary-color), var(--secondary-color)); + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; +} + +h2 { + font-size: 2.5rem; + margin-bottom: 2rem; + text-align: center; +} + +h3 { + font-size: 1.5rem; + margin-bottom: 1rem; + color: var(--secondary-color); +} + +/* Layout */ +.container { + max-width: 1200px; + margin: 0 auto; + padding: 0 2rem; +} + +section { + padding: 5rem 0; +} + +/* Navigation */ +nav { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1.5rem 0; +} + +.logo { + font-size: 1.5rem; + font-weight: 800; + color: var(--secondary-color); + text-decoration: none; + display: flex; + align-items: center; + gap: 0.5rem; +} + +.logo span { + color: var(--primary-color); +} + +.nav-links a { + text-decoration: none; + color: var(--text-color); + margin-left: 2rem; + font-weight: 500; + transition: var(--transition); +} + +.nav-links a:hover { + color: var(--primary-color); +} + +.btn { + display: inline-block; + padding: 0.8rem 2rem; + border-radius: 50px; + text-decoration: none; + font-weight: 600; + transition: var(--transition); + cursor: pointer; +} + +.btn-primary { + background: linear-gradient(90deg, var(--primary-color) 0%, var(--secondary-color) 100%); + color: white; + border: none; +} + +.btn-primary:hover { + transform: translateY(-2px); + box-shadow: 0 4px 15px rgba(78, 205, 196, 0.4); +} + +.btn-secondary { + background: transparent; + border: 2px solid var(--primary-color); + color: var(--secondary-color); + margin-left: 1rem; +} + +.btn-secondary:hover { + background: rgba(78, 205, 196, 0.1); +} + +/* Hero Section */ +.hero { + text-align: center; + padding: 6rem 0; + background: radial-gradient(circle at 50% 50%, rgba(78, 205, 196, 0.1) 0%, rgba(255, 255, 255, 0) 70%); +} + +.hero p { + font-size: 1.25rem; + color: #666; + margin-bottom: 2.5rem; + max-width: 600px; + margin-left: auto; + margin-right: auto; +} + +/* Hero Gallery */ +.hero-gallery { + max-width: 900px; + margin: 4rem auto 0; + background: #ffffff; + border-radius: var(--border-radius); + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.1); + overflow: hidden; + border: 1px solid #eee; +} + +.gallery-tabs { + display: flex; + background: #f8fcfc; + border-bottom: 1px solid #eee; +} + +.gallery-tab { + flex: 1; + padding: 1rem; + border: none; + background: transparent; + font-weight: 600; + color: #666; + cursor: pointer; + transition: var(--transition); + border-bottom: 3px solid transparent; +} + +.gallery-tab:hover { + background: rgba(78, 205, 196, 0.05); + color: var(--secondary-color); +} + +.gallery-tab.active { + color: var(--secondary-color); + border-bottom-color: var(--primary-color); + background: #ffffff; +} + +.gallery-content { + display: none; + padding: 1rem; + min-height: 400px; + background: #ffffff; + animation: fadeIn 0.3s ease; +} + +.gallery-content.active { + display: block; +} + +.gallery-image { + width: 100%; + height: auto; + border-radius: 8px; + display: block; +} + +.gallery-placeholder { + height: 400px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + background: #f8fcfc; + border-radius: 8px; + color: #999; +} + +.gallery-placeholder i { + font-size: 4rem; + margin-bottom: 1rem; + opacity: 0.3; +} + +@keyframes fadeIn { + from { + opacity: 0.5; + transform: translateY(5px); + } + + to { + opacity: 1; + transform: translateY(0); + } +} + +/* Features Section */ +.features { + background-color: var(--light-bg); +} + +.feature-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 2rem; +} + +.feature-card { + background: var(--card-bg); + padding: 2.5rem; + border-radius: var(--border-radius); + text-align: left; + transition: var(--transition); + border: 1px solid #eee; +} + +.feature-card:hover { + transform: translateY(-5px); + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.05); + border-color: var(--primary-color); +} + +.icon { + font-size: 2.5rem; + margin-bottom: 1.5rem; + display: block; + color: var(--secondary-color); +} + +/* How It Works Section */ +.how-it-works { + text-align: center; +} + +.steps { + display: flex; + justify-content: center; + gap: 3rem; + flex-wrap: wrap; + margin-top: 3rem; +} + +.step { + flex: 1; + min-width: 250px; + max-width: 300px; +} + +.step-number { + width: 50px; + height: 50px; + background: var(--primary-color); + color: white; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 1.5rem; + font-weight: 700; + margin: 0 auto 1.5rem; +} + +/* Get Started / Installation */ +.get-started { + background: #2b9388; + color: white; + border-radius: 24px; + margin: 4rem auto; + text-align: center; + position: relative; + overflow: hidden; +} + +.get-started h2, +.get-started h3 { + color: white; +} + +.code-block { + background: rgba(0, 0, 0, 0.3); + padding: 1.5rem; + border-radius: 8px; + font-family: 'Fira Code', monospace; + text-align: left; + display: inline-block; + margin: 1.5rem 0; + position: relative; + min-width: 300px; +} + +.copy-btn { + position: absolute; + top: 10px; + right: 10px; + background: rgba(255, 255, 255, 0.2); + border: none; + color: white; + padding: 5px 10px; + border-radius: 4px; + font-size: 0.8rem; + cursor: pointer; +} + +.copy-btn:hover { + background: rgba(255, 255, 255, 0.3); +} + +/* Footer */ +footer { + padding: 3rem 0; + text-align: center; + border-top: 1px solid #eee; + color: #666; +} + +.footer-links { + margin-bottom: 1.5rem; +} + +.footer-links a { + color: var(--text-color); + text-decoration: none; + margin: 0 1rem; + transition: var(--transition); +} + +.footer-links a:hover { + color: var(--primary-color); +} + +/* Responsive */ +/* Responsive */ +.nav-toggle { + display: none; + font-size: 1.5rem; + color: var(--secondary-color); + cursor: pointer; +} + +@media (max-width: 768px) { + h1 { + font-size: 2.5rem; + } + + .nav-toggle { + display: block; + } + + .nav-links { + display: none; + flex-direction: column; + position: absolute; + top: 80px; + left: 0; + right: 0; + background: white; + padding: 1rem; + box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1); + text-align: center; + z-index: 100; + } + + .nav-links.active { + display: flex; + animation: fadeIn 0.3s ease; + } + + .nav-links a { + margin: 1rem 0; + display: block; + } +} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 4e3d20f..ad0ce6b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "dora-eda" -version = "4.0.1" +version = "4.0.2" description = "Exploratory data analysis and presentation tool" authors = [ {name = "Asif Sayyed",email = "asifdotexe@gmail.com"}