ricspse commited on
Commit
0444185
Β·
verified Β·
1 Parent(s): 8ad45f9

um criador de graficos a partir de csv no estilo liquid glass interativo e com animacoes

Browse files
Files changed (8) hide show
  1. README.md +8 -5
  2. about.html +44 -0
  3. components/footer.js +62 -0
  4. components/navbar.js +86 -0
  5. gallery.html +70 -0
  6. index.html +102 -19
  7. script.js +322 -0
  8. style.css +48 -18
README.md CHANGED
@@ -1,10 +1,13 @@
1
  ---
2
- title: Dataviz Liquid Glass Studio
3
- emoji: πŸ“ˆ
4
- colorFrom: indigo
5
- colorTo: blue
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
1
  ---
2
+ title: DataViz Liquid Glass Studio πŸ“Š
3
+ colorFrom: yellow
4
+ colorTo: pink
5
+ emoji: 🐳
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite-v3
10
  ---
11
 
12
+ # Welcome to your new DeepSite project!
13
+ This project was created with [DeepSite](https://huggingface.co/deepsite).
about.html ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>About - DataViz Liquid Glass Studio</title>
7
+ <link rel="icon" type="image/x-icon" href="/static/favicon.ico">
8
+ <link rel="stylesheet" href="style.css">
9
+ <script src="https://cdn.tailwindcss.com"></script>
10
+ <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
11
+ <script src="https://unpkg.com/feather-icons"></script>
12
+ <script src="https://cdn.jsdelivr.net/npm/vanta@latest/dist/vanta.globe.min.js"></script>
13
+ </head>
14
+ <body class="min-h-screen bg-gradient-to-br from-slate-900 via-purple-900 to-slate-900">
15
+ <custom-navbar></custom-navbar>
16
+
17
+ <main class="container mx-auto px-4 py-8">
18
+ <section class="text-center mb-12">
19
+ <h1 class="text-5xl md:text-7xl font-bold bg-gradient-to-r from-cyan-400 to-purple-400 bg-clip-text text-transparent mb-6">
20
+ About Liquid Glass
21
+ </h1>
22
+ <p class="text-xl text-gray-300 mb-8 max-w-3xl mx-auto">
23
+ Discover the magic behind our revolutionary data visualization technology
24
+ </p>
25
+ </section>
26
+
27
+ <div class="glass-card p-8 max-w-4xl mx-auto">
28
+ <div class="grid md:grid-cols-2 gap-8 items-center">
29
+ <div>
30
+ <h2 class="text-3xl font-bold text-white mb-4">The Future of Data Visualization</h2>
31
+ <p class="text-gray-300 mb-6 leading-relaxed">
32
+ Liquid Glass DataViz Studio combines cutting-edge web technologies with stunning visual design
33
+ to transform your CSV data into interactive, beautiful visualizations. Our unique liquid glass
34
+ interface provides a seamless and immersive experience for data exploration.
35
+ </p>
36
+ <div class="space-y-4">
37
+ <div class="flex items-center gap-3">
38
+ <i data-feather="zap" class="text-cyan-400"></i>
39
+ <span class="text-white">Real-time Data Processing</span>
40
+ </div>
41
+ <div class="flex items-center gap-3">
42
+ <i data-feather="eye" class="text-purple-{"ok":false,"message":"Request timeout: The AI model took too long to respond. Please try again with a simpler prompt or try a different model."}
43
+ </body>
44
+ </html>
components/footer.js ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class CustomFooter extends HTMLElement {
2
+ connectedCallback() {
3
+ this.attachShadow({ mode: 'open' });
4
+ this.shadowRoot.innerHTML = `
5
+ <style>
6
+ footer {
7
+ background: rgba(15, 23, 42, 0.8);
8
+ backdrop-filter: blur(20px);
9
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
10
+ color: white;
11
+ padding: 2rem;
12
+ text-align: center;
13
+ margin-top: auto;
14
+ }
15
+ .footer-content {
16
+ display: flex;
17
+ flex-direction: column;
18
+ gap: 1rem;
19
+ align-items: center;
20
+ }
21
+ .social-links {
22
+ display: flex;
23
+ gap: 1rem;
24
+ }
25
+ .social-links a {
26
+ color: white;
27
+ padding: 0.5rem;
28
+ border-radius: 8px;
29
+ transition: all 0.3s ease;
30
+ }
31
+ .social-links a:hover {
32
+ background: rgba(0, 255, 255, 0.1);
33
+ transform: translateY(-2px);
34
+ }
35
+ .made-with {
36
+ display: flex;
37
+ align-items: center;
38
+ gap: 0.5rem;
39
+ font-size: 0.875rem;
40
+ opacity: 0.8;
41
+ }
42
+ </style>
43
+ <footer>
44
+ <div class="footer-content">
45
+ <div class="social-links">
46
+ <a href="#" aria-label="GitHub"><i data-feather="github"></i></a>
47
+ <a href="#" aria-label="Twitter"><i data-feather="twitter"></i></a>
48
+ <a href="#" aria-label="LinkedIn"><i data-feather="linkedin"></i></a>
49
+ <a href="#" aria-label="Instagram"><i data-feather="instagram"></i></a>
50
+ </div>
51
+ <p class="made-with">
52
+ <span>Made with</span>
53
+ <i data-feather="heart" class="text-red-400"></i>
54
+ <span>using Liquid Glass technology</span>
55
+ </p>
56
+ <p>&copy; 2024 DataViz Liquid Glass Studio. All rights reserved.</p>
57
+ </div>
58
+ </footer>
59
+ `;
60
+ }
61
+ }
62
+ customElements.define('custom-footer', CustomFooter);
components/navbar.js ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class CustomNavbar extends HTMLElement {
2
+ connectedCallback() {
3
+ this.attachShadow({ mode: 'open' });
4
+ this.shadowRoot.innerHTML = `
5
+ <style>
6
+ nav {
7
+ background: rgba(15, 23, 42, 0.8);
8
+ backdrop-filter: blur(20px);
9
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
10
+ padding: 1rem 2rem;
11
+ display: flex;
12
+ justify-content: space-between;
13
+ align-items: center;
14
+ position: relative;
15
+ z-index: 50;
16
+ }
17
+ .logo {
18
+ background: linear-gradient(135deg, #00ffff, #a855f7);
19
+ -webkit-background-clip: text;
20
+ -webkit-text-fill-color: transparent;
21
+ font-weight: 700;
22
+ font-size: 1.5rem;
23
+ }
24
+ ul {
25
+ display: flex;
26
+ gap: 2rem;
27
+ list-style: none;
28
+ margin: 0;
29
+ padding: 0;
30
+ align-items: center;
31
+ }
32
+ a {
33
+ color: white;
34
+ text-decoration: none;
35
+ padding: 0.5rem 1rem;
36
+ border-radius: 12px;
37
+ transition: all 0.3s ease;
38
+ position: relative;
39
+ overflow: hidden;
40
+ }
41
+ a::before {
42
+ content: '';
43
+ position: absolute;
44
+ top: 0;
45
+ left: -100%;
46
+ width: 100%;
47
+ height: 100%;
48
+ background: linear-gradient(90deg, transparent, rgba(0, 255, 255, 0.2), transparent);
49
+ transition: left 0.5s;
50
+ }
51
+ a:hover::before {
52
+ left: 100%;
53
+ }
54
+ a:hover {
55
+ background: rgba(0, 255, 255, 0.1);
56
+ transform: translateY(-2px);
57
+ }
58
+ .nav-icon {
59
+ width: 20px;
60
+ height: 20px;
61
+ }
62
+ @media (max-width: 768px) {
63
+ nav {
64
+ padding: 1rem;
65
+ }
66
+ ul {
67
+ gap: 1rem;
68
+ }
69
+ a {
70
+ padding: 0.5rem;
71
+ font-size: 0.875rem;
72
+ }
73
+ }
74
+ </style>
75
+ <nav>
76
+ <div class="logo">LiquidGlassViz</div>
77
+ <ul>
78
+ <li><a href="/" class="flex items-center gap-2"><i data-feather="home" class="nav-icon"></i> Home</a></li>
79
+ <li><a href="/gallery.html" class="flex items-center gap-2"><i data-feather="image"></i> Gallery</a></li>
80
+ <li><a href="/about.html" class="flex items-center gap-2"><i data-feather="info"></i> About</a></li>
81
+ </ul>
82
+ </nav>
83
+ `;
84
+ }
85
+ }
86
+ customElements.define('custom-navbar', CustomNavbar);
gallery.html ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Visualization Gallery - DataViz Liquid Glass Studio</title>
7
+ <link rel="icon" type="image/x-icon" href="/static/favicon.ico">
8
+ <link rel="stylesheet" href="style.css">
9
+ <script src="https://cdn.tailwindcss.com"></script>
10
+ <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
11
+ <script src="https://unpkg.com/feather-icons"></script>
12
+ <script src="https://cdn.jsdelivr.net/npm/vanta@latest/dist/vanta.globe.min.js"></script>
13
+ <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
14
+ </head>
15
+ <body class="min-h-screen bg-gradient-to-br from-slate-900 via-purple-900 to-slate-900">
16
+ <custom-navbar></custom-navbar>
17
+
18
+ <main class="container mx-auto px-4 py-8">
19
+ <section class="text-center mb-12">
20
+ <h1 class="text-5xl md:text-7xl font-bold bg-gradient-to-r from-cyan-400 to-purple-400 bg-clip-text text-transparent mb-6">
21
+ Visualization Gallery
22
+ </h1>
23
+ <p class="text-xl text-gray-300 mb-8 max-w-3xl mx-auto">
24
+ Explore stunning data visualizations created with our liquid glass technology
25
+ </p>
26
+ </section>
27
+
28
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
29
+ <!-- Sample visualizations -->
30
+ <div class="glass-card p-6 hover-lift">
31
+ <div class="w-full h-48 bg-gradient-to-br from-cyan-500/20 to-purple-500/20 rounded-xl mb-4 flex items-center justify-center">
32
+ <i data-feather="bar-chart-2" class="w-16 h-16 text-cyan-400"></i>
33
+ </div>
34
+ <div class="glass-card p-6 hover-lift">
35
+ <div class="w-full h-48 bg-gradient-to-br from-purple-500/20 to-cyan-500/20 rounded-xl mb-4 flex items-center justify-center">
36
+ <i data-feather="trending-up" class="w-16 h-16 text-purple-400"></i>
37
+ </div>
38
+ <div class="glass-card p-6 hover-lift">
39
+ <div class="w-full h-48 bg-gradient-to-br from-cyan-500/20 to-purple-500/20 rounded-xl mb-4 flex items-center justify-center">
40
+ <i data-feather="pie-chart" class="w-16 h-16 text-cyan-400"></i>
41
+ </div>
42
+ </div>
43
+ </main>
44
+
45
+ <custom-footer></custom-footer>
46
+
47
+ <div id="vantaBackground" class="fixed top-0 left-0 w-full h-full -z-10"></div>
48
+
49
+ <script src="components/navbar.js"></script>
50
+ <script src="components/footer.js"></script>
51
+ <script src="script.js"></script>
52
+ <script>
53
+ feather.replace();
54
+
55
+ VANTA.GLOBE({
56
+ el: "#vantaBackground",
57
+ mouseControls: true,
58
+ touchControls: true,
59
+ gyroControls: false,
60
+ minHeight: 200.00,
61
+ minWidth: 200.00,
62
+ scale: 1.00,
63
+ scaleMobile: 1.00,
64
+ color: 0x00ffff,
65
+ backgroundColor: 0x0f172a,
66
+ size: 1.00
67
+ });
68
+ </script>
69
+ </body>
70
+ </html>
index.html CHANGED
@@ -1,19 +1,102 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>DataViz Liquid Glass Studio</title>
7
+ <link rel="icon" type="image/x-icon" href="/static/favicon.ico">
8
+ <link rel="stylesheet" href="style.css">
9
+ <script src="https://cdn.tailwindcss.com"></script>
10
+ <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
11
+ <script src="https://unpkg.com/feather-icons"></script>
12
+ <script src="https://cdn.jsdelivr.net/npm/vanta@latest/dist/vanta.globe.min.js"></script>
13
+ <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
14
+ </head>
15
+ <body class="min-h-screen bg-gradient-to-br from-slate-900 via-purple-900 to-slate-900">
16
+ <custom-navbar></custom-navbar>
17
+
18
+ <main class="container mx-auto px-4 py-8">
19
+ <!-- Hero Section -->
20
+ <section class="text-center mb-12">
21
+ <h1 class="text-5xl md:text-7xl font-bold bg-gradient-to-r from-cyan-400 to-purple-400 bg-clip-text text-transparent mb-6">
22
+ Liquid Glass DataViz
23
+ </h1>
24
+ <p class="text-xl text-gray-300 mb-8 max-w-3xl mx-auto">
25
+ Transform your CSV data into stunning interactive visualizations with our liquid glass interface
26
+ </p>
27
+ </section>
28
+
29
+ <!-- Upload Section -->
30
+ <section class="glass-card p-8 mb-12">
31
+ <div class="text-center mb-8">
32
+ <i data-feather="upload-cloud" class="w-16 h-16 text-cyan-400 mx-auto mb-4"></i>
33
+ <h2 class="text-3xl font-bold text-white mb-4">Upload Your CSV</h2>
34
+ <p class="text-gray-300">Drag and drop your CSV file or click to browse</p>
35
+ </div>
36
+
37
+ <div class="border-2 border-dashed border-cyan-400/30 rounded-2xl p-12 text-center transition-all duration-300 hover:border-cyan-400/60 hover:bg-cyan-400/5" id="dropZone">
38
+ <input type="file" id="csvFile" accept=".csv" class="hidden">
39
+ <div class="space-y-4">
40
+ <i data-feather="file-text" class="w-12 h-12 text-cyan-400 mx-auto"></i>
41
+ <p class="text-gray-300">Drop your CSV file here or <span class="text-cyan-400 cursor-pointer" onclick="document.getElementById('csvFile').click()">browse files</span></p>
42
+ <p class="text-sm text-gray-500">Supports files up to 10MB</p>
43
+ </div>
44
+ </div>
45
+ </section>
46
+
47
+ <!-- Preview Section -->
48
+ <section class="glass-card p-8 mb-12 hidden" id="previewSection">
49
+ <div class="flex justify-between items-center mb-6">
50
+ <h2 class="text-3xl font-bold text-white">Data Preview</h2>
51
+ <button id="generateViz" class="bg-gradient-to-r from-cyan-500 to-purple-500 text-white px-8 py-3 rounded-full font-semibold hover:shadow-2xl hover:shadow-cyan-500/25 transition-all duration-300">
52
+ Generate Visualizations
53
+ </button>
54
+ </div>
55
+ <div class="overflow-x-auto">
56
+ <table class="w-full text-white" id="dataTable">
57
+ <thead class="bg-cyan-500/20">
58
+ <tr id="tableHeaders"></tr>
59
+ </thead>
60
+ <tbody id="tableBody" class="divide-y divide-gray-700"></tbody>
61
+ </table>
62
+ </div>
63
+ </section>
64
+
65
+ <!-- Visualization Gallery -->
66
+ <section class="glass-card p-8 hidden" id="vizGallery">
67
+ <h2 class="text-3xl font-bold text-white mb-8 text-center">Your Visualizations</h2>
68
+ <div class="grid grid-cols-1 lg:grid-cols-2 gap-8" id="chartContainer">
69
+ <!-- Charts will be dynamically inserted here -->
70
+ </div>
71
+ </section>
72
+ </main>
73
+
74
+ <custom-footer></custom-footer>
75
+
76
+ <!-- Background Animation -->
77
+ <div id="vantaBackground" class="fixed top-0 left-0 w-full h-full -z-10"></div>
78
+
79
+ <script src="components/navbar.js"></script>
80
+ <script src="components/footer.js"></script>
81
+ <script src="script.js"></script>
82
+ <script>
83
+ feather.replace();
84
+
85
+ // Initialize Vanta.js background
86
+ VANTA.GLOBE({
87
+ el: "#vantaBackground",
88
+ mouseControls: true,
89
+ touchControls: true,
90
+ gyroControls: false,
91
+ minHeight: 200.00,
92
+ minWidth: 200.00,
93
+ scale: 1.00,
94
+ scaleMobile: 1.00,
95
+ color: 0x00ffff,
96
+ backgroundColor: 0x0f172a,
97
+ size: 1.00
98
+ });
99
+ </script>
100
+ <script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
101
+ </body>
102
+ </html>
script.js ADDED
@@ -0,0 +1,322 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Shared JavaScript across all pages
2
+ let csvData = [];
3
+ let headers = [];
4
+
5
+ // DOM Elements
6
+ const dropZone = document.getElementById('dropZone');
7
+ const csvFileInput = document.getElementById('csvFile');
8
+ const previewSection = document.getElementById('previewSection');
9
+ const tableHeaders = document.getElementById('tableHeaders');
10
+ const tableBody = document.getElementById('tableBody');
11
+ const generateVizBtn = document.getElementById('generateViz');
12
+ const vizGallery = document.getElementById('vizGallery');
13
+ const chartContainer = document.getElementById('chartContainer');
14
+
15
+ // Initialize app
16
+ document.addEventListener('DOMContentLoaded', function() {
17
+ initializeEventListeners();
18
+ });
19
+
20
+ function initializeEventListeners() {
21
+ // File input change
22
+ csvFileInput.addEventListener('change', handleFileSelect);
23
+
24
+ // Drag and drop events
25
+ dropZone.addEventListener('dragover', handleDragOver);
26
+ dropZone.addEventListener('dragleave', handleDragLeave);
27
+ dropZone.addEventListener('drop', handleDrop);
28
+
29
+ // Generate visualizations
30
+ generateVizBtn.addEventListener('click', generateVisualizations);
31
+ }
32
+
33
+ function handleDragOver(e) {
34
+ e.preventDefault();
35
+ dropZone.classList.add('drop-zone-active');
36
+ }
37
+
38
+ function handleDragLeave(e) {
39
+ e.preventDefault();
40
+ dropZone.classList.remove('drop-zone-active');
41
+ }
42
+
43
+ function handleDrop(e) {
44
+ e.preventDefault();
45
+ dropZone.classList.remove('drop-zone-active');
46
+
47
+ const files = e.dataTransfer.files;
48
+ if (files.length > 0) {
49
+ processCSVFile(files[0]);
50
+ }
51
+ }
52
+
53
+ function handleFileSelect(e) {
54
+ const file = e.target.files[0];
55
+ if (file) {
56
+ processCSVFile(file);
57
+ }
58
+ }
59
+
60
+ function processCSVFile(file) {
61
+ if (file.type !== 'text/csv' && !file.name.endsWith('.csv')) {
62
+ alert('Please upload a valid CSV file.');
63
+ return;
64
+ }
65
+
66
+ const reader = new FileReader();
67
+ reader.onload = function(e) {
68
+ const csvText = e.target.result;
69
+ parseCSV(csvText);
70
+ };
71
+ reader.readAsText(file);
72
+ }
73
+
74
+ function parseCSV(csvText) {
75
+ const lines = csvText.split('\n').filter(line => line.trim() !== '');
76
+ if (lines.length === 0) return;
77
+
78
+ // Extract headers
79
+ headers = lines[0].split(',').map(header => header.trim());
80
+
81
+ // Extract data rows
82
+ csvData = lines.slice(1).map(line => {
83
+ const values = line.split(',').map(value => value.trim());
84
+ return values;
85
+ });
86
+
87
+ displayPreview();
88
+ }
89
+
90
+ function displayPreview() {
91
+ // Show preview section
92
+ previewSection.classList.remove('hidden');
93
+
94
+ // Populate headers
95
+ tableHeaders.innerHTML = headers.map(header =>
96
+ `<th class="px-6 py-4 text-left font-semibold">${header}</th>`
97
+ ).join('');
98
+
99
+ // Populate data (show first 10 rows for preview)
100
+ const previewData = csvData.slice(0, 10);
101
+ tableBody.innerHTML = previewData.map(row =>
102
+ `<tr class="hover:bg-cyan-500/10">${row.map(cell =>
103
+ `<td class="px-6 py-4 border-b border-gray-700">${cell}</td>`
104
+ ).join('')}</tr>`
105
+ ).join('');
106
+
107
+ // Scroll to preview
108
+ previewSection.scrollIntoView({ behavior: 'smooth' });
109
+ }
110
+
111
+ function generateVisualizations() {
112
+ if (csvData.length === 0) return;
113
+
114
+ // Show visualization gallery
115
+ vizGallery.classList.remove('hidden');
116
+ chartContainer.innerHTML = '';
117
+
118
+ // Generate different chart types
119
+ generateBarChart();
120
+ generateLineChart();
121
+ generatePieChart();
122
+ generateScatterPlot();
123
+
124
+ // Scroll to gallery
125
+ vizGallery.scrollIntoView({ behavior: 'smooth' });
126
+ }
127
+
128
+ function generateBarChart() {
129
+ const canvas = document.createElement('canvas');
130
+ canvas.className = 'glass-card p-4';
131
+ chartContainer.appendChild(canvas);
132
+
133
+ // Sample data for demonstration
134
+ const ctx = canvas.getContext('2d');
135
+ new Chart(ctx, {
136
+ type: 'bar',
137
+ data: {
138
+ labels: headers.slice(0, 5),
139
+ datasets: [{
140
+ label: 'Sample Data',
141
+ data: [65, 59, 80, 81, 56],
142
+ backgroundColor: [
143
+ 'rgba(0, 255, 255, 0.7)',
144
+ 'rgba(168, 85, 247, 0.7)',
145
+ 'rgba(34, 211, 238, 0.7)',
146
+ 'rgba(139, 92, 246, 0.7)',
147
+ 'rgba(45, 212, 191, 0.7)'
148
+ ],
149
+ borderColor: [
150
+ 'rgba(0, 255, 255, 1)',
151
+ 'rgba(168, 85, 247, 1)',
152
+ 'rgba(34, 211, 238, 1)',
153
+ 'rgba(139, 92, 246, 1)',
154
+ 'rgba(45, 212, 191, 1)'
155
+ ],
156
+ borderWidth: 2
157
+ }]
158
+ },
159
+ options: {
160
+ responsive: true,
161
+ plugins: {
162
+ title: {
163
+ display: true,
164
+ text: 'Bar Chart Visualization',
165
+ color: 'white',
166
+ font: { size: 16 }
167
+ },
168
+ legend: {
169
+ labels: { color: 'white' }
170
+ }
171
+ },
172
+ scales: {
173
+ y: {
174
+ beginAtZero: true,
175
+ ticks: { color: 'white' }
176
+ },
177
+ x: {
178
+ ticks: { color: 'white' }
179
+ }
180
+ }
181
+ });
182
+ }
183
+
184
+ function generateLineChart() {
185
+ const canvas = document.createElement('canvas');
186
+ canvas.className = 'glass-card p-4';
187
+ chartContainer.appendChild(canvas);
188
+
189
+ const ctx = canvas.getContext('2d');
190
+ new Chart(ctx, {
191
+ type: 'line',
192
+ data: {
193
+ labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May'],
194
+ datasets: [{
195
+ label: 'Trend Line',
196
+ data: [12, 19, 3, 5, 2],
197
+ borderColor: 'rgba(0, 255, 255, 1)',
198
+ backgroundColor: 'rgba(0, 255, 255, 0.1)',
199
+ borderWidth: 3,
200
+ tension: 0.4,
201
+ fill: true
202
+ }]
203
+ },
204
+ options: {
205
+ responsive: true,
206
+ plugins: {
207
+ title: {
208
+ display: true,
209
+ text: 'Line Chart Trend',
210
+ color: 'white',
211
+ font: { size: 16 }
212
+ },
213
+ legend: {
214
+ labels: { color: 'white' }
215
+ }
216
+ },
217
+ scales: {
218
+ y: {
219
+ beginAtZero: true,
220
+ ticks: { color: 'white' }
221
+ },
222
+ x: {
223
+ ticks: { color: 'white' }
224
+ }
225
+ }
226
+ });
227
+ }
228
+
229
+ function generatePieChart() {
230
+ const canvas = document.createElement('canvas');
231
+ canvas.className = 'glass-card p-4';
232
+ chartContainer.appendChild(canvas);
233
+
234
+ const ctx = canvas.getContext('2d');
235
+ new Chart(ctx, {
236
+ type: 'pie',
237
+ data: {
238
+ labels: ['Category A', 'Category B', 'Category C', 'Category D'],
239
+ datasets: [{
240
+ data: [30, 25, 20, 25],
241
+ backgroundColor: [
242
+ 'rgba(0, 255, 255, 0.8)',
243
+ 'rgba(168, 85, 247, 0.8)',
244
+ 'rgba(34, 211, 238, 0.8)',
245
+ 'rgba(139, 92, 246, 0.8)'
246
+ ],
247
+ borderColor: 'rgba(255, 255, 255, 0.3)',
248
+ borderWidth: 2
249
+ }]
250
+ },
251
+ options: {
252
+ responsive: true,
253
+ plugins: {
254
+ title: {
255
+ display: true,
256
+ text: 'Pie Chart Distribution',
257
+ color: 'white',
258
+ font: { size: 16 }
259
+ },
260
+ legend: {
261
+ labels: { color: 'white' }
262
+ }
263
+ }
264
+ });
265
+ }
266
+
267
+ function generateScatterPlot() {
268
+ const canvas = document.createElement('canvas');
269
+ canvas.className = 'glass-card p-4';
270
+ chartContainer.appendChild(canvas);
271
+
272
+ const ctx = canvas.getContext('2d');
273
+ new Chart(ctx, {
274
+ type: 'scatter',
275
+ data: {
276
+ datasets: [{
277
+ label: 'Data Points',
278
+ data: [
279
+ { x: 10, y: 20 }, { x: 15, y: 25 }, { x: 20, y: 30 },
280
+ { x: 25, y: 35 }, { x: 30, y: 40 }, { x: 35, y: 45 }
281
+ ],
282
+ backgroundColor: 'rgba(168, 85, 247, 0.7)',
283
+ borderColor: 'rgba(168, 85, 247, 1)',
284
+ borderWidth: 2,
285
+ pointRadius: 6
286
+ }]
287
+ },
288
+ options: {
289
+ responsive: true,
290
+ plugins: {
291
+ title: {
292
+ display: true,
293
+ text: 'Scatter Plot Correlation',
294
+ color: 'white',
295
+ font: { size: 16 }
296
+ },
297
+ legend: {
298
+ labels: { color: 'white' }
299
+ }
300
+ },
301
+ scales: {
302
+ y: {
303
+ beginAtZero: true,
304
+ ticks: { color: 'white' }
305
+ },
306
+ x: {
307
+ ticks: { color: 'white' }
308
+ }
309
+ }
310
+ });
311
+ }
312
+
313
+ // Utility function to download visualization
314
+ function downloadChart(chartId, filename) {
315
+ const canvas = document.getElementById(chartId);
316
+ const link = document.createElement('a');
317
+ link.download = filename;
318
+ link.href = canvas.toDataURL();
319
+ link.click();
320
+ }
321
+
322
+ console.log('DataViz Liquid Glass Studio loaded successfully!');
style.css CHANGED
@@ -1,28 +1,58 @@
 
 
 
1
  body {
2
- padding: 2rem;
3
- font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  }
5
 
6
- h1 {
7
- font-size: 16px;
8
- margin-top: 0;
9
  }
10
 
11
- p {
12
- color: rgb(107, 114, 128);
13
- font-size: 15px;
14
- margin-bottom: 10px;
15
- margin-top: 5px;
16
  }
17
 
18
- .card {
19
- max-width: 620px;
20
- margin: 0 auto;
21
- padding: 16px;
22
- border: 1px solid lightgray;
23
- border-radius: 16px;
24
  }
25
 
26
- .card p:last-child {
27
- margin-bottom: 0;
 
28
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Shared styles across all pages */
2
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
3
+
4
  body {
5
+ font-family: 'Inter', sans-serif;
6
+ overflow-x: hidden;
7
+ }
8
+
9
+ /* Glass morphism effect */
10
+ .glass-card {
11
+ background: rgba(255, 255, 255, 0.1);
12
+ backdrop-filter: blur(20px);
13
+ border: 1px solid rgba(255, 255, 255, 0.2);
14
+ border-radius: 24px;
15
+ box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.36);
16
+ }
17
+
18
+ /* Custom scrollbar */
19
+ ::-webkit-scrollbar {
20
+ width: 8px;
21
  }
22
 
23
+ ::-webkit-scrollbar-track {
24
+ background: rgba(255, 255, 255, 0.1);
25
+ border-radius: 4px;
26
  }
27
 
28
+ ::-webkit-scrollbar-thumb {
29
+ background: linear-gradient(135deg, #00ffff, #a855f7);
30
+ border-radius: 4px;
 
 
31
  }
32
 
33
+ /* Smooth transitions */
34
+ * {
35
+ transition: all 0.3s ease;
 
 
 
36
  }
37
 
38
+ /* Hover effects */
39
+ .hover-lift:hover {
40
+ transform: translateY(-4px);
41
  }
42
+
43
+ /* Loading animation */
44
+ @keyframes pulse-glow {
45
+ 0%, 100% { opacity: 1; }
46
+ 50% { opacity: 0.7; }
47
+ }
48
+
49
+ .pulse-glow {
50
+ animation: pulse-glow 2s infinite;
51
+ }
52
+
53
+ /* File drop zone active state */
54
+ .drop-zone-active {
55
+ border-color: #00ffff !important;
56
+ background: rgba(0, 255, 255, 0.1) !important;
57
+ transform: scale(1.02);
58
+ }