🔍 Overview
Browse filesA web-based or desktop app where creators type or speak a “music prompt” (e.g. “Upbeat 115 BPM house track with soulful vocals, optimized for workout playlists”).
The tool then generates, tags, and prepares the track so it’s most likely to be favored by recommendation algorithms on major DSPs.
🧠 Core Components
1. Prompt Interpreter
Converts the natural-language prompt (like you’d use in Suno or Udio) into structured music metadata:
Genre, mood, BPM, key, structure, energy curve, vocal presence, emotional intent.
Could use a large language model (LLM) fine-tuned on hit songs’ metadata and listener engagement data.
2. AI Composition Engine
Connects to generative music APIs (like Suno, Udio, Mubert, or an open-source model).
Generates stems, mix, and mastered audio using the structured metadata.
Outputs a fully mastered WAV/MP3 ready for upload.
3. Algorithmic “Fit” Analyzer
Compares the generated track’s features (spectral profile, tempo, loudness, dynamics) against those common in high-performing tracks in the same genre on SoundCloud/Spotify.
Uses machine learning to predict “algorithmic compatibility”:
🟢 High “skip-through” resistance (listeners stay past 30 s)
🟢 Ideal replay or playlist inclusion rate
🟢 Proper loudness normalization for Spotify (-14 LUFS)
4. Auto-Tag & Metadata Optimizer
Generates tags, descriptions, and titles optimized for each platform:
Spotify: playlist and editorial keyword alignment (e.g. “Chill Vibes,” “Deep Focus,” etc.)
SoundCloud: community & genre tags that improve “related tracks” matching.
Integrates with keyword databases of trending tags and listener behaviors.
5. Streaming Platform Integrations
SoundCloud API: Upload track with title, description, genre, and tags.
Spotify for Artists: Suggests submission categories for editorial or algorithmic playlists.
Analytics Sync: Pulls stream metrics to refine future prompts (“Your listeners skipped at 45 s; next time, try shorter intros”).
6. Feedback Loop / Learning System
Tracks which AI-generated songs perform best.
Retrains the prompt interpreter and metadata recommender.
Eventually predicts what kind of prompt phrasing yields the best results.
🛠️ Technical Requirements
Layer Tech/Method
Frontend React + Tailwind (for prompt entry and preview UI)
Backend Python FastAPI or Node.js
AI Modules LLM (OpenAI API / local fine-tuned model), Suno or Udio API
Audio Features Librosa, Essentia, Spotify Audio Features API
ML Model Gradient-boosted trees or neural net for pickup prediction
Databases PostgreSQL (metadata), MinIO or S3 (audio storage)
Auth OAuth2 (Spotify, SoundCloud)
Deployment Dockerized microservices on AWS / GCP
🎯 What It Would Do for Creators
Translate creative intent → optimized prompt → algorithm-friendly song.
Ensure that every generated track already aligns with the traits algorithms reward:
Loudness, hook timing, energy profile, and tagging accuracy.
Save time by automatically handling the technical “marketing layer” of music creation.
⚙️ Example Workflow
User enters:
“Catchy 2000s pop-punk vibe about moving on, 140 BPM, short intro, loud chorus.”
Tool generates song using Suno API.
Analyzes the song’s waveform → detects 28 s before first chorus (ideal).
Suggests optimized SoundCloud metadata:
Title: “Moving On (Pop-Punk Revival)”
Genre: “pop-punk”
Tags: “emo revival, 2000s punk, breakup song, upbeat”
Predicts Spotify “playlist fit”: 84% similarity to “All New Punk.”
Auto-uploads to SoundCloud with cover art and description.
- README.md +7 -4
- analytics.html +223 -0
- components/footer.js +97 -0
- components/navbar.js +119 -0
- generator.html +274 -0
- index.html +93 -19
- script.js +146 -0
- style.css +50 -18
|
@@ -1,10 +1,13 @@
|
|
| 1 |
---
|
| 2 |
-
title: Algorithmic Harmony Maestro
|
| 3 |
-
|
| 4 |
-
colorFrom: yellow
|
| 5 |
colorTo: blue
|
|
|
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
|
|
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: Algorithmic Harmony Maestro 🎵
|
| 3 |
+
colorFrom: pink
|
|
|
|
| 4 |
colorTo: blue
|
| 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://deepsite.hf.co).
|
|
@@ -0,0 +1,223 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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>Performance Analytics - Algorithmic Harmony Maestro</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/chart.js"></script>
|
| 13 |
+
</head>
|
| 14 |
+
<body class="bg-gradient-to-br from-purple-900 via-blue-900 to-indigo-900 min-h-screen">
|
| 15 |
+
<custom-navbar></custom-navbar>
|
| 16 |
+
|
| 17 |
+
<main class="container mx-auto px-4 py-8 pt-20">
|
| 18 |
+
<div class="max-w-6xl mx-auto">
|
| 19 |
+
<h1 class="text-4xl md:text-5xl font-bold text-white text-center mb-8">
|
| 20 |
+
Performance Analytics
|
| 21 |
+
</h1>
|
| 22 |
+
<p class="text-gray-300 text-center mb-12">
|
| 23 |
+
Track performance metrics and optimize your future creations
|
| 24 |
+
</p>
|
| 25 |
+
|
| 26 |
+
<!-- Platform Metrics -->
|
| 27 |
+
<div class="grid md:grid-cols-2 gap-8 mb-8">
|
| 28 |
+
<div class="glass rounded-2xl p-6">
|
| 29 |
+
<h2 class="text-2xl font-semibold text-white mb-6">Platform Performance</h2>
|
| 30 |
+
<div class="space-y-4">
|
| 31 |
+
<div class="flex justify-between items-center">
|
| 32 |
+
<span class="text-gray-300">Spotify Streams</span>
|
| 33 |
+
<span class="text-green-400 font-semibold">12,458</span>
|
| 34 |
+
</div>
|
| 35 |
+
<div class="flex justify-between items-center">
|
| 36 |
+
<span class="text-gray-300">SoundCloud Plays</span>
|
| 37 |
+
<span class="text-blue-400 font-semibold">8,923</span>
|
| 38 |
+
</div>
|
| 39 |
+
<div class="flex justify-between items-center">
|
| 40 |
+
<span class="text-gray-300">Playlist Adds</span>
|
| 41 |
+
<span class="text-purple-400 font-semibold">156</span>
|
| 42 |
+
</div>
|
| 43 |
+
</div>
|
| 44 |
+
</div>
|
| 45 |
+
<div class="glass rounded-2xl p-6">
|
| 46 |
+
<h2 class="text-2xl font-semibold text-white mb-6">Engagement Metrics</h2>
|
| 47 |
+
<div class="space-y-4">
|
| 48 |
+
<div class="flex justify-between items-center">
|
| 49 |
+
<span class="text-gray-300">Completion Rate</span>
|
| 50 |
+
<span class="text-yellow-400 font-semibold">78%</span>
|
| 51 |
+
</div>
|
| 52 |
+
<div class="flex justify-between items-center">
|
| 53 |
+
<span class="text-gray-300">Skip Rate</span>
|
| 54 |
+
<span class="text-red-400 font-semibold">12%</span>
|
| 55 |
+
</div>
|
| 56 |
+
<div class="flex justify-between items-center">
|
| 57 |
+
<span class="text-gray-300">Save Rate</span>
|
| 58 |
+
<span class="text-green-400 font-semibold">8%</span>
|
| 59 |
+
</div>
|
| 60 |
+
</div>
|
| 61 |
+
</div>
|
| 62 |
+
</div>
|
| 63 |
+
|
| 64 |
+
<!-- Charts Section -->
|
| 65 |
+
<div class="glass rounded-2xl p-8 mb-8">
|
| 66 |
+
<h2 class="text-2xl font-semibold text-white mb-6">Performance Trends</h2>
|
| 67 |
+
<div class="grid md:grid-cols-2 gap-8">
|
| 68 |
+
<div class="bg-gray-800/30 rounded-lg p-4">
|
| 69 |
+
<canvas id="streamsChart" width="400" height="300"></canvas>
|
| 70 |
+
</div>
|
| 71 |
+
<div class="bg-gray-800/30 rounded-lg p-4">
|
| 72 |
+
<canvas id="engagementChart" width="400" height="300"></canvas>
|
| 73 |
+
</div>
|
| 74 |
+
</div>
|
| 75 |
+
</div>
|
| 76 |
+
|
| 77 |
+
<!-- Algorithm Compatibility History -->
|
| 78 |
+
<div class="glass rounded-2xl p-8">
|
| 79 |
+
<h2 class="text-2xl font-semibold text-white mb-6">Algorithm Fit Evolution</h2>
|
| 80 |
+
<div class="bg-gray-800/30 rounded-lg p-4">
|
| 81 |
+
<canvas id="algorithmChart" width="400" height="300"></canvas>
|
| 82 |
+
</div>
|
| 83 |
+
</div>
|
| 84 |
+
</div>
|
| 85 |
+
</main>
|
| 86 |
+
|
| 87 |
+
<custom-footer></custom-footer>
|
| 88 |
+
|
| 89 |
+
<script src="components/navbar.js"></script>
|
| 90 |
+
<script src="components/footer.js"></script>
|
| 91 |
+
<script src="script.js"></script>
|
| 92 |
+
<script>
|
| 93 |
+
feather.replace();
|
| 94 |
+
|
| 95 |
+
// Initialize charts
|
| 96 |
+
document.addEventListener('DOMContentLoaded', function() {
|
| 97 |
+
// Streams Chart
|
| 98 |
+
const streamsCtx = document.getElementById('streamsChart').getContext('2d');
|
| 99 |
+
new Chart(streamsCtx, {
|
| 100 |
+
type: 'line',
|
| 101 |
+
data: {
|
| 102 |
+
labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'),
|
| 103 |
+
datasets: [{
|
| 104 |
+
label: 'Spotify Streams',
|
| 105 |
+
data: [3200, 4500, 3800, 5200, 6100, 7800],
|
| 106 |
+
borderColor: '#8b5cf6',
|
| 107 |
+
backgroundColor: 'rgba(139, 92, 246, 0.1),
|
| 108 |
+
tension: 0.4
|
| 109 |
+
}]
|
| 110 |
+
},
|
| 111 |
+
options: {
|
| 112 |
+
responsive: true,
|
| 113 |
+
plugins: {
|
| 114 |
+
legend: {
|
| 115 |
+
labels: { color: 'white' }
|
| 116 |
+
}
|
| 117 |
+
},
|
| 118 |
+
scales: {
|
| 119 |
+
y: {
|
| 120 |
+
beginAtZero: true,
|
| 121 |
+
ticks: { color: 'white' },
|
| 122 |
+
grid: { color: 'rgba(255, 255, 255, 0.1)
|
| 123 |
+
},
|
| 124 |
+
x: {
|
| 125 |
+
ticks: { color: 'white' },
|
| 126 |
+
grid: { color: 'rgba(255, 255, 255, 0.1)
|
| 127 |
+
}
|
| 128 |
+
}
|
| 129 |
+
}
|
| 130 |
+
});
|
| 131 |
+
|
| 132 |
+
// Engagement Chart
|
| 133 |
+
const engagementCtx = document.getElementById('engagementChart').getContext('2d');
|
| 134 |
+
new Chart(engagementCtx, {
|
| 135 |
+
type: 'bar',
|
| 136 |
+
data: {
|
| 137 |
+
labels: ['Track 1', 'Track 2', 'Track 3', 'Track 4'],
|
| 138 |
+
datasets: [{
|
| 139 |
+
label: 'Completion Rate %',
|
| 140 |
+
data: [72, 85, 78, 91],
|
| 141 |
+
backgroundColor: [
|
| 142 |
+
'rgba(139, 92, 246, 0.6),
|
| 143 |
+
'rgba(59, 130, 246, 0.6),
|
| 144 |
+
'rgba(236, 72, 153, 0.6),
|
| 145 |
+
'rgba(16, 185, 129, 0.6)
|
| 146 |
+
],
|
| 147 |
+
borderColor: [
|
| 148 |
+
'rgb(139, 92, 246)',
|
| 149 |
+
'rgb(59, 130, 246)',
|
| 150 |
+
'rgb(236, 72, 153)',
|
| 151 |
+
'rgb(16, 185, 129)'
|
| 152 |
+
],
|
| 153 |
+
borderWidth: 1
|
| 154 |
+
}]
|
| 155 |
+
},
|
| 156 |
+
options: {
|
| 157 |
+
responsive: true,
|
| 158 |
+
plugins: {
|
| 159 |
+
legend: {
|
| 160 |
+
labels: { color: 'white' }
|
| 161 |
+
}
|
| 162 |
+
},
|
| 163 |
+
scales: {
|
| 164 |
+
y: {
|
| 165 |
+
beginAtZero: true,
|
| 166 |
+
max: 100,
|
| 167 |
+
ticks: { color: 'white' },
|
| 168 |
+
grid: { color: 'rgba(255, 255, 255, 0.1)
|
| 169 |
+
},
|
| 170 |
+
x: {
|
| 171 |
+
ticks: { color: 'white' },
|
| 172 |
+
grid: { color: 'rgba(255, 255, 255, 0.1)
|
| 173 |
+
}
|
| 174 |
+
}
|
| 175 |
+
}
|
| 176 |
+
});
|
| 177 |
+
|
| 178 |
+
// Algorithm Chart
|
| 179 |
+
const algorithmCtx = document.getElementById('algorithmChart').getContext('2d');
|
| 180 |
+
new Chart(algorithmCtx, {
|
| 181 |
+
type: 'radar',
|
| 182 |
+
data: {
|
| 183 |
+
labels: ['Skip Resistance', 'Replay Value', 'Playlist Fit', 'Loudness', 'Energy Curve'],
|
| 184 |
+
datasets: [
|
| 185 |
+
{
|
| 186 |
+
label: 'Current Track',
|
| 187 |
+
data: [88, 92, 84, 95, 87],
|
| 188 |
+
backgroundColor: 'rgba(139, 92, 246, 0.2),
|
| 189 |
+
borderColor: '#8b5cf6',
|
| 190 |
+
pointBackgroundColor: '#8b5cf6'
|
| 191 |
+
},
|
| 192 |
+
{
|
| 193 |
+
label: 'Platform Average',
|
| 194 |
+
data: [72, 68, 61, 78, 65],
|
| 195 |
+
backgroundColor: 'rgba(59, 130, 246, 0.2),
|
| 196 |
+
borderColor: '#3b82f6',
|
| 197 |
+
pointBackgroundColor: '#3b82f6'
|
| 198 |
+
}
|
| 199 |
+
]
|
| 200 |
+
},
|
| 201 |
+
options: {
|
| 202 |
+
responsive: true,
|
| 203 |
+
plugins: {
|
| 204 |
+
legend: {
|
| 205 |
+
labels: { color: 'white' }
|
| 206 |
+
}
|
| 207 |
+
},
|
| 208 |
+
scales: {
|
| 209 |
+
r: {
|
| 210 |
+
angleLines: { color: 'rgba(255, 255, 255, 0.1)
|
| 211 |
+
},
|
| 212 |
+
scales: {
|
| 213 |
+
r: {
|
| 214 |
+
angleLines: { color: 'rgba(255, 255, 255, 0.1),
|
| 215 |
+
grid: { color: 'rgba(255, 255, 255, 0.1),
|
| 216 |
+
pointLabels: { color: 'white' },
|
| 217 |
+
ticks: { color: 'white', backdropColor: 'transparent' }
|
| 218 |
+
}
|
| 219 |
+
});
|
| 220 |
+
});
|
| 221 |
+
</script>
|
| 222 |
+
</body>
|
| 223 |
+
</html>
|
|
@@ -0,0 +1,97 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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.9);
|
| 8 |
+
color: white;
|
| 9 |
+
padding: 3rem 2rem;
|
| 10 |
+
text-align: center;
|
| 11 |
+
margin-top: auto;
|
| 12 |
+
border-top: 1px solid rgba(255, 255, 255, 0.1);
|
| 13 |
+
}
|
| 14 |
+
.footer-content {
|
| 15 |
+
max-width: 1200px;
|
| 16 |
+
margin: 0 auto;
|
| 17 |
+
display: grid;
|
| 18 |
+
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
| 19 |
+
gap: 2rem;
|
| 20 |
+
text-align: left;
|
| 21 |
+
}
|
| 22 |
+
.footer-section h3 {
|
| 23 |
+
color: #a78bfa;
|
| 24 |
+
margin-bottom: 1rem;
|
| 25 |
+
font-size: 1.125rem;
|
| 26 |
+
}
|
| 27 |
+
.footer-links {
|
| 28 |
+
display: flex;
|
| 29 |
+
flex-direction: column;
|
| 30 |
+
gap: 0.5rem;
|
| 31 |
+
}
|
| 32 |
+
.footer-links a {
|
| 33 |
+
color: #cbd5e1;
|
| 34 |
+
text-decoration: none;
|
| 35 |
+
transition: color 0.3s ease;
|
| 36 |
+
}
|
| 37 |
+
.footer-links a:hover {
|
| 38 |
+
color: #8b5cf6;
|
| 39 |
+
}
|
| 40 |
+
.social-links {
|
| 41 |
+
display: flex;
|
| 42 |
+
gap: 1rem;
|
| 43 |
+
margin-top: 1rem;
|
| 44 |
+
}
|
| 45 |
+
.social-links a {
|
| 46 |
+
color: white;
|
| 47 |
+
transition: color 0.3s ease;
|
| 48 |
+
}
|
| 49 |
+
.social-links a:hover {
|
| 50 |
+
color: #8b5cf6;
|
| 51 |
+
}
|
| 52 |
+
.copyright {
|
| 53 |
+
margin-top: 2rem;
|
| 54 |
+
padding-top: 2rem;
|
| 55 |
+
border-top: 1px solid rgba(255, 255, 255, 0.1);
|
| 56 |
+
color: #94a3b8;
|
| 57 |
+
}
|
| 58 |
+
@media (max-width: 768px) {
|
| 59 |
+
.footer-content {
|
| 60 |
+
text-align: center;
|
| 61 |
+
}
|
| 62 |
+
}
|
| 63 |
+
</style>
|
| 64 |
+
<footer>
|
| 65 |
+
<div class="footer-content">
|
| 66 |
+
<div class="footer-section">
|
| 67 |
+
<h3>Algorithmic Harmony Maestro</h3>
|
| 68 |
+
<p>AI-powered music creation optimized for streaming algorithms. Transform your creative vision into algorithm-friendly hits.</p>
|
| 69 |
+
</div>
|
| 70 |
+
<div class="footer-section">
|
| 71 |
+
<h3>Quick Links</h3>
|
| 72 |
+
<div class="footer-links">
|
| 73 |
+
<a href="/generator.html"><i data-feather="play" class="inline mr-2"></i>Track Generator</a>
|
| 74 |
+
<a href="/analytics.html"><i data-feather="bar-chart-2" class="inline mr-2"></i>Performance Analytics</a>
|
| 75 |
+
<a href="/projects.html"><i data-feather="folder" class="inline mr-2"></i>My Projects</a>
|
| 76 |
+
<a href="/features.html"><i data-feather="info" class="inline mr-2"></i>Features</a>
|
| 77 |
+
</div>
|
| 78 |
+
</div>
|
| 79 |
+
<div class="footer-section">
|
| 80 |
+
<h3>Connect</h3>
|
| 81 |
+
<div class="social-links">
|
| 82 |
+
<a href="#"><i data-feather="github"></i></a>
|
| 83 |
+
<a href="#"><i data-feather="twitter"></i></a>
|
| 84 |
+
<a href="#"><i data-feather="instagram"></i></a>
|
| 85 |
+
<a href="#"><i data-feather="youtube"></i></a>
|
| 86 |
+
</div>
|
| 87 |
+
</div>
|
| 88 |
+
</div>
|
| 89 |
+
<div class="copyright">
|
| 90 |
+
<p>© 2024 Algorithmic Harmony Maestro. All rights reserved. Made with <i data-feather="heart" class="inline text-red-400"></i> for creators</p>
|
| 91 |
+
</div>
|
| 92 |
+
</footer>
|
| 93 |
+
`;
|
| 94 |
+
}
|
| 95 |
+
}
|
| 96 |
+
|
| 97 |
+
customElements.define('custom-footer', CustomFooter);
|
|
@@ -0,0 +1,119 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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(10px);
|
| 9 |
+
padding: 1rem 2rem;
|
| 10 |
+
display: flex;
|
| 11 |
+
justify-content: space-between;
|
| 12 |
+
align-items: center;
|
| 13 |
+
position: fixed;
|
| 14 |
+
top: 0;
|
| 15 |
+
left: 0;
|
| 16 |
+
right: 0;
|
| 17 |
+
z-index: 1000;
|
| 18 |
+
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
| 19 |
+
}
|
| 20 |
+
.logo {
|
| 21 |
+
color: white;
|
| 22 |
+
font-weight: bold;
|
| 23 |
+
font-size: 1.5rem;
|
| 24 |
+
background: linear-gradient(45deg, #8b5cf6, #ec4899);
|
| 25 |
+
background-clip: text;
|
| 26 |
+
-webkit-background-clip: text;
|
| 27 |
+
-webkit-text-fill-color: transparent;
|
| 28 |
+
}
|
| 29 |
+
ul {
|
| 30 |
+
display: flex;
|
| 31 |
+
gap: 2rem;
|
| 32 |
+
list-style: none;
|
| 33 |
+
margin: 0;
|
| 34 |
+
padding: 0;
|
| 35 |
+
align-items: center;
|
| 36 |
+
}
|
| 37 |
+
a {
|
| 38 |
+
color: white;
|
| 39 |
+
text-decoration: none;
|
| 40 |
+
transition: all 0.3s ease;
|
| 41 |
+
display: flex;
|
| 42 |
+
align-items: center;
|
| 43 |
+
gap: 0.5rem;
|
| 44 |
+
}
|
| 45 |
+
a:hover {
|
| 46 |
+
color: #a78bfa;
|
| 47 |
+
transform: translateY(-2px);
|
| 48 |
+
}
|
| 49 |
+
.nav-link {
|
| 50 |
+
padding: 0.5rem 1rem;
|
| 51 |
+
border-radius: 0.5rem;
|
| 52 |
+
transition: all 0.3s ease;
|
| 53 |
+
}
|
| 54 |
+
.nav-link:hover {
|
| 55 |
+
background: rgba(255, 255, 255, 0.1);
|
| 56 |
+
}
|
| 57 |
+
.mobile-menu-btn {
|
| 58 |
+
display: none;
|
| 59 |
+
background: none;
|
| 60 |
+
border: none;
|
| 61 |
+
color: white;
|
| 62 |
+
cursor: pointer;
|
| 63 |
+
}
|
| 64 |
+
@media (max-width: 768px) {
|
| 65 |
+
nav {
|
| 66 |
+
padding: 1rem;
|
| 67 |
+
}
|
| 68 |
+
ul {
|
| 69 |
+
display: none;
|
| 70 |
+
position: absolute;
|
| 71 |
+
top: 100%;
|
| 72 |
+
left: 0;
|
| 73 |
+
right: 0;
|
| 74 |
+
background: rgba(15, 23, 42, 0.95);
|
| 75 |
+
backdrop-filter: blur(20px);
|
| 76 |
+
flex-direction: column;
|
| 77 |
+
padding: 1rem;
|
| 78 |
+
gap: 1rem;
|
| 79 |
+
}
|
| 80 |
+
ul.mobile-open {
|
| 81 |
+
display: flex;
|
| 82 |
+
}
|
| 83 |
+
.mobile-menu-btn {
|
| 84 |
+
display: block;
|
| 85 |
+
}
|
| 86 |
+
}
|
| 87 |
+
</style>
|
| 88 |
+
<nav>
|
| 89 |
+
<div class="logo">Harmony Maestro</div>
|
| 90 |
+
<button class="mobile-menu-btn">
|
| 91 |
+
<i data-feather="menu"></i>
|
| 92 |
+
</button>
|
| 93 |
+
<ul>
|
| 94 |
+
<li><a href="/" class="nav-link"><i data-feather="home"></i> Home</a></li>
|
| 95 |
+
<li><a href="/generator.html" class="nav-link"><i data-feather="play"></i> Generator</a></li>
|
| 96 |
+
<li><a href="/analytics.html" class="nav-link"><i data-feather="bar-chart-2"></i> Analytics</a></li>
|
| 97 |
+
<li><a href="/projects.html" class="nav-link"><i data-feather="folder"></i> Projects</a></li>
|
| 98 |
+
<li><a href="/features.html" class="nav-link"><i data-feather="info"></i> Features</a></li>
|
| 99 |
+
</ul>
|
| 100 |
+
</nav>
|
| 101 |
+
`;
|
| 102 |
+
|
| 103 |
+
// Mobile menu functionality
|
| 104 |
+
const menuBtn = this.shadowRoot.querySelector('.mobile-menu-btn');
|
| 105 |
+
const menu = this.shadowRoot.querySelector('ul');
|
| 106 |
+
|
| 107 |
+
menuBtn.addEventListener('click', () => {
|
| 108 |
+
menu.classList.toggle('mobile-open');
|
| 109 |
+
const icon = menuBtn.querySelector('i');
|
| 110 |
+
if (menu.classList.contains('mobile-open')) {
|
| 111 |
+
feather.replace();
|
| 112 |
+
} else {
|
| 113 |
+
feather.replace();
|
| 114 |
+
}
|
| 115 |
+
});
|
| 116 |
+
}
|
| 117 |
+
}
|
| 118 |
+
|
| 119 |
+
customElements.define('custom-navbar', CustomNavbar);
|
|
@@ -0,0 +1,274 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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>Track Generator - Algorithmic Harmony Maestro</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 |
+
</head>
|
| 13 |
+
<body class="bg-gradient-to-br from-purple-900 via-blue-900 to-indigo-900 min-h-screen">
|
| 14 |
+
<custom-navbar></custom-navbar>
|
| 15 |
+
|
| 16 |
+
<main class="container mx-auto px-4 py-8 pt-20">
|
| 17 |
+
<div class="max-w-4xl mx-auto">
|
| 18 |
+
<h1 class="text-4xl md:text-5xl font-bold text-white text-center mb-8">
|
| 19 |
+
AI Music Generator
|
| 20 |
+
</h1>
|
| 21 |
+
<p class="text-gray-300 text-center mb-12">
|
| 22 |
+
Describe your musical vision and let AI create an algorithm-optimized masterpiece
|
| 23 |
+
</p>
|
| 24 |
+
|
| 25 |
+
<!-- Prompt Input Section -->
|
| 26 |
+
<div class="glass rounded-2xl p-8 mb-8">
|
| 27 |
+
<div class="flex items-center justify-between mb-6">
|
| 28 |
+
<h2 class="text-2xl font-semibold text-white">Enter Your Music Prompt</h2>
|
| 29 |
+
<button id="voice-btn" class="bg-purple-600 hover:bg-purple-700 p-3 rounded-full transition-all">
|
| 30 |
+
<i data-feather="mic" class="text-white"></i>
|
| 31 |
+
</button>
|
| 32 |
+
</div>
|
| 33 |
+
|
| 34 |
+
<div class="space-y-6">
|
| 35 |
+
<div>
|
| 36 |
+
<label class="block text-gray-300 mb-2">Describe your track:</label>
|
| 37 |
+
<textarea
|
| 38 |
+
id="music-prompt"
|
| 39 |
+
placeholder="e.g., 'Upbeat 115 BPM house track with soulful vocals, optimized for workout playlists'"
|
| 40 |
+
class="w-full h-32 bg-gray-800/50 border border-gray-700 rounded-lg p-4 text-white resize-none focus:outline-none focus:ring-2 focus:ring-purple-500"
|
| 41 |
+
></textarea>
|
| 42 |
+
</div>
|
| 43 |
+
|
| 44 |
+
<!-- Quick Templates -->
|
| 45 |
+
<div>
|
| 46 |
+
<label class="block text-gray-300 mb-2">Quick Templates:</label>
|
| 47 |
+
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
|
| 48 |
+
<button class="template-btn bg-gray-800/50 hover:bg-gray-700/50 border border-gray-700 rounded-lg p-4 text-left text-white transition-all">
|
| 49 |
+
<div class="font-semibold">Workout Energy</div>
|
| 50 |
+
<div class="text-sm text-gray-400">High BPM, driving beat, motivational</button>
|
| 51 |
+
<button class="template-btn bg-gray-800/50 hover:bg-gray-700/50 border border-gray-700 rounded-lg p-4 text-left text-white transition-all">
|
| 52 |
+
<div class="font-semibold">Chill Focus</div>
|
| 53 |
+
<div class="text-sm text-gray-400">Ambient, lo-fi, study-friendly</button>
|
| 54 |
+
<button class="template-btn bg-gray-800/50 hover:bg-gray-700/50 border border-gray-700 rounded-lg p-4 text-left text-white transition-all">
|
| 55 |
+
<div class="font-semibold">Emotional Ballad</div>
|
| 56 |
+
<div class="text-sm text-gray-400">Slow tempo, emotional vocals, cinematic</button>
|
| 57 |
+
<button class="template-btn bg-gray-800/50 hover:bg-gray-700/50 border border-gray-700 rounded-lg p-4 text-left text-white transition-all">
|
| 58 |
+
<div class="font-semibold">Party Anthem</div>
|
| 59 |
+
<div class="text-sm text-gray-400">Catchy hooks, danceable, festival-ready</button>
|
| 60 |
+
</div>
|
| 61 |
+
</div>
|
| 62 |
+
|
| 63 |
+
<!-- Advanced Settings -->
|
| 64 |
+
<div class="bg-gray-800/30 rounded-lg p-4">
|
| 65 |
+
<div class="flex items-center justify-between cursor-pointer" onclick="toggleAdvancedSettings()">
|
| 66 |
+
<span class="text-white font-semibold">Advanced Settings</span>
|
| 67 |
+
<i data-feather="chevron-down" class="text-gray-400"></i>
|
| 68 |
+
</div>
|
| 69 |
+
<div id="advanced-settings" class="hidden space-y-4 mt-4">
|
| 70 |
+
<div class="grid grid-cols-2 gap-4">
|
| 71 |
+
<div>
|
| 72 |
+
<label class="block text-gray-300 text-sm mb-1">BPM Range</label>
|
| 73 |
+
<input type="range" min="60" max="200" value="120" class="w-full">
|
| 74 |
+
</div>
|
| 75 |
+
<div>
|
| 76 |
+
<label class="block text-gray-300 text-sm mb-1">Energy Level</label>
|
| 77 |
+
<input type="range" min="1" max="10" value="7" class="w-full">
|
| 78 |
+
</div>
|
| 79 |
+
</div>
|
| 80 |
+
<div class="grid grid-cols-2 gap-4">
|
| 81 |
+
<div>
|
| 82 |
+
<label class="block text-gray-300 text-sm mb-1">Duration (seconds)</label>
|
| 83 |
+
<input type="number" value="180" class="w-full bg-gray-700/50 border border-gray-600 rounded px-3 py-2 text-white">
|
| 84 |
+
</div>
|
| 85 |
+
<div>
|
| 86 |
+
<label class="block text-gray-300 text-sm mb-1">Key</label>
|
| 87 |
+
<select class="w-full bg-gray-700/50 border border-gray-600 rounded px-3 py-2 text-white">
|
| 88 |
+
<option>C Major</option>
|
| 89 |
+
<option>A Minor</option>
|
| 90 |
+
<option>G Major</option>
|
| 91 |
+
<option>E Minor</option>
|
| 92 |
+
</select>
|
| 93 |
+
</div>
|
| 94 |
+
</div>
|
| 95 |
+
</div>
|
| 96 |
+
</div>
|
| 97 |
+
|
| 98 |
+
<button id="generate-btn" class="w-full bg-gradient-to-r from-purple-600 to-pink-600 hover:from-purple-700 hover:to-pink-700 text-white font-semibold py-4 rounded-lg transition-all transform hover:scale-105 pulse-glow">
|
| 99 |
+
<i data-feather="zap" class="inline mr-2"></i>
|
| 100 |
+
Generate Track
|
| 101 |
+
</button>
|
| 102 |
+
</div>
|
| 103 |
+
</div>
|
| 104 |
+
|
| 105 |
+
<!-- Results Section -->
|
| 106 |
+
<div id="results-section" class="hidden glass rounded-2xl p-8">
|
| 107 |
+
<h2 class="text-2xl font-semibold text-white mb-6">Generated Track</h2>
|
| 108 |
+
|
| 109 |
+
<!-- Audio Player -->
|
| 110 |
+
<div class="mb-6">
|
| 111 |
+
<div class="bg-gray-800/50 rounded-lg p-4">
|
| 112 |
+
<div class="flex items-center justify-between mb-4">
|
| 113 |
+
<div class="text-white font-semibold" id="track-title">Your Generated Track</div>
|
| 114 |
+
<div class="text-gray-400 text-sm" id="track-duration">0:00 / 3:00</div>
|
| 115 |
+
</div>
|
| 116 |
+
<audio id="audio-player" controls class="w-full">
|
| 117 |
+
Your browser does not support the audio element.
|
| 118 |
+
</audio>
|
| 119 |
+
</div>
|
| 120 |
+
|
| 121 |
+
<!-- Algorithm Analysis -->
|
| 122 |
+
<div class="grid md:grid-cols-2 gap-6 mb-6">
|
| 123 |
+
<div class="bg-gray-800/30 rounded-lg p-4">
|
| 124 |
+
<h3 class="text-white font-semibold mb-3">Algorithm Compatibility</h3>
|
| 125 |
+
<div class="space-y-3">
|
| 126 |
+
<div class="flex justify-between items-center">
|
| 127 |
+
<span class="text-gray-300">Spotify Fit</span>
|
| 128 |
+
<span class="text-green-400 font-semibold" id="spotify-fit">84%</span>
|
| 129 |
+
</div>
|
| 130 |
+
<div class="flex justify-between items-center">
|
| 131 |
+
<span class="text-gray-300">SoundCloud Match</span>
|
| 132 |
+
<span class="text-green-400 font-semibold" id="soundcloud-match">92%</span>
|
| 133 |
+
</div>
|
| 134 |
+
<div class="flex justify-between items-center">
|
| 135 |
+
<span class="text-gray-300">Skip Resistance</span>
|
| 136 |
+
<span class="text-green-400 font-semibold" id="skip-resistance">88%</span>
|
| 137 |
+
</div>
|
| 138 |
+
</div>
|
| 139 |
+
</div>
|
| 140 |
+
<div class="bg-gray-800/30 rounded-lg p-4">
|
| 141 |
+
<h3 class="text-white font-semibold mb-3">Audio Features</h3>
|
| 142 |
+
<div class="space-y-2">
|
| 143 |
+
<div class="text-sm text-gray-300">Loudness: -14.2 LUFS</div>
|
| 144 |
+
<div class="text-sm text-gray-300">Tempo: 115 BPM</div>
|
| 145 |
+
<div class="text-sm text-gray-300">Key: C Major</div>
|
| 146 |
+
</div>
|
| 147 |
+
</div>
|
| 148 |
+
</div>
|
| 149 |
+
|
| 150 |
+
<!-- Recommended Tags -->
|
| 151 |
+
<div class="bg-gray-800/30 rounded-lg p-4">
|
| 152 |
+
<h3 class="text-white font-semibold mb-3">Optimized Metadata</h3>
|
| 153 |
+
<div class="space-y-3">
|
| 154 |
+
<div>
|
| 155 |
+
<label class="text-gray-300 text-sm">Title Suggestion:</label>
|
| 156 |
+
<input type="text" value="Soulful House Workout" class="w-full bg-gray-700/50 border border-gray-600 rounded px-3 py-2 text-white">
|
| 157 |
+
</div>
|
| 158 |
+
<div>
|
| 159 |
+
<label class="text-gray-300 text-sm">Tags:</label>
|
| 160 |
+
<div class="flex flex-wrap gap-2 mt-2">
|
| 161 |
+
<span class="bg-purple-600/50 text-white px-3 py-1 rounded-full text-sm">
|
| 162 |
+
house
|
| 163 |
+
</span>
|
| 164 |
+
<span class="bg-blue-600/50 text-white px-3 py-1 rounded-full text-sm">
|
| 165 |
+
workout
|
| 166 |
+
</span>
|
| 167 |
+
<span class="bg-pink-600/50 text-white px-3 py-1 rounded-full text-sm">
|
| 168 |
+
soulful
|
| 169 |
+
</span>
|
| 170 |
+
<span class="bg-indigo-600/50 text-white px-3 py-1 rounded-full text-sm">
|
| 171 |
+
electronic
|
| 172 |
+
</span>
|
| 173 |
+
</div>
|
| 174 |
+
</div>
|
| 175 |
+
</div>
|
| 176 |
+
|
| 177 |
+
<!-- Action Buttons -->
|
| 178 |
+
<div class="flex flex-col sm:flex-row gap-4 mt-6">
|
| 179 |
+
<button class="flex-1 bg-green-600 hover:bg-green-700 text-white py-3 rounded-lg font-semibold transition-all">
|
| 180 |
+
<i data-feather="upload" class="inline mr-2"></i>
|
| 181 |
+
Upload to SoundCloud
|
| 182 |
+
</button>
|
| 183 |
+
<button class="flex-1 bg-blue-600 hover:bg-blue-700 text-white py-3 rounded-lg font-semibold transition-all">
|
| 184 |
+
<i data-feather="music" class="inline mr-2"></i>
|
| 185 |
+
Submit to Spotify
|
| 186 |
+
</button>
|
| 187 |
+
<button class="flex-1 bg-gray-600 hover:bg-gray-700 text-white py-3 rounded-lg font-semibold transition-all">
|
| 188 |
+
<i data-feather="download" class="inline mr-2"></i>
|
| 189 |
+
Download WAV
|
| 190 |
+
</button>
|
| 191 |
+
</div>
|
| 192 |
+
</div>
|
| 193 |
+
</div>
|
| 194 |
+
</div>
|
| 195 |
+
</main>
|
| 196 |
+
|
| 197 |
+
<custom-footer></custom-footer>
|
| 198 |
+
|
| 199 |
+
<script src="components/navbar.js"></script>
|
| 200 |
+
<script src="components/footer.js"></script>
|
| 201 |
+
<script src="script.js"></script>
|
| 202 |
+
<script>
|
| 203 |
+
feather.replace();
|
| 204 |
+
|
| 205 |
+
// Voice recognition
|
| 206 |
+
const voiceBtn = document.getElementById('voice-btn');
|
| 207 |
+
const promptTextarea = document.getElementById('music-prompt');
|
| 208 |
+
const voiceRecognition = new VoiceRecognition();
|
| 209 |
+
|
| 210 |
+
voiceBtn.addEventListener('click', function() {
|
| 211 |
+
if (voiceRecognition.isListening) {
|
| 212 |
+
voiceRecognition.stopListening();
|
| 213 |
+
voiceBtn.innerHTML = '<i data-feather="mic" class="text-white"></i>';
|
| 214 |
+
feather.replace();
|
| 215 |
+
} else {
|
| 216 |
+
voiceRecognition.startListening(
|
| 217 |
+
(transcript) => {
|
| 218 |
+
promptTextarea.value = transcript;
|
| 219 |
+
voiceBtn.innerHTML = '<i data-feather="mic" class="text-white"></i>';
|
| 220 |
+
feather.replace();
|
| 221 |
+
},
|
| 222 |
+
(error) => {
|
| 223 |
+
alert('Voice recognition error: ' + error);
|
| 224 |
+
}
|
| 225 |
+
);
|
| 226 |
+
voiceBtn.innerHTML = '<i data-feather="square" class="text-white"></i>';
|
| 227 |
+
feather.replace();
|
| 228 |
+
}
|
| 229 |
+
});
|
| 230 |
+
|
| 231 |
+
// Template buttons
|
| 232 |
+
document.querySelectorAll('.template-btn').forEach(btn => {
|
| 233 |
+
btn.addEventListener('click', function() {
|
| 234 |
+
const title = this.querySelector('.font-semibold').textContent;
|
| 235 |
+
const description = this.querySelector('.text-sm').textContent;
|
| 236 |
+
promptTextarea.value = `${title} - ${description}`;
|
| 237 |
+
});
|
| 238 |
+
});
|
| 239 |
+
|
| 240 |
+
// Generate button
|
| 241 |
+
document.getElementById('generate-btn').addEventListener('click', async function() {
|
| 242 |
+
const prompt = promptTextarea.value.trim();
|
| 243 |
+
if (!prompt) {
|
| 244 |
+
alert('Please enter a music prompt first!');
|
| 245 |
+
return;
|
| 246 |
+
}
|
| 247 |
+
|
| 248 |
+
// Show loading state
|
| 249 |
+
this.innerHTML = '<i data-feather="loader" class="animate-spin inline mr-2"></i> Generating...';
|
| 250 |
+
feather.replace();
|
| 251 |
+
|
| 252 |
+
// Simulate generation process
|
| 253 |
+
setTimeout(() => {
|
| 254 |
+
document.getElementById('results-section').classList.remove('hidden');
|
| 255 |
+
this.innerHTML = '<i data-feather="zap" class="inline mr-2"></i> Generate Track';
|
| 256 |
+
feather.replace();
|
| 257 |
+
}, 3000);
|
| 258 |
+
});
|
| 259 |
+
|
| 260 |
+
function toggleAdvancedSettings() {
|
| 261 |
+
const settings = document.getElementById('advanced-settings');
|
| 262 |
+
const icon = settings.previousElementSibling.querySelector('i');
|
| 263 |
+
|
| 264 |
+
settings.classList.toggle('hidden');
|
| 265 |
+
if (settings.classList.contains('hidden')) {
|
| 266 |
+
icon.setAttribute('data-feather', 'chevron-down');
|
| 267 |
+
} else {
|
| 268 |
+
icon.setAttribute('data-feather', 'chevron-up');
|
| 269 |
+
}
|
| 270 |
+
feather.replace();
|
| 271 |
+
}
|
| 272 |
+
</script>
|
| 273 |
+
</body>
|
| 274 |
+
</html>
|
|
@@ -1,19 +1,93 @@
|
|
| 1 |
-
<!
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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>Algorithmic Harmony Maestro - AI Music Optimization</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="bg-gradient-to-br from-purple-900 via-blue-900 to-indigo-900 min-h-screen">
|
| 15 |
+
<custom-navbar></custom-navbar>
|
| 16 |
+
|
| 17 |
+
<!-- Hero Section -->
|
| 18 |
+
<section id="hero" class="relative min-h-screen flex items-center justify-center overflow-hidden">
|
| 19 |
+
<div class="absolute inset-0 z-0" id="vanta-bg"></div>
|
| 20 |
+
<div class="relative z-10 text-center text-white px-4 max-w-4xl mx-auto">
|
| 21 |
+
<h1 class="text-5xl md:text-7xl font-bold mb-6 bg-gradient-to-r from-purple-400 to-pink-400 bg-clip-text text-transparent">
|
| 22 |
+
Algorithmic Harmony Maestro
|
| 23 |
+
</h1>
|
| 24 |
+
<p class="text-xl md:text-2xl mb-8 text-gray-200">
|
| 25 |
+
Transform your musical vision into algorithm-friendly hits with AI-powered optimization
|
| 26 |
+
</p>
|
| 27 |
+
<div class="flex flex-col sm:flex-row gap-4 justify-center">
|
| 28 |
+
<a href="/generator.html" class="bg-purple-600 hover:bg-purple-700 text-white px-8 py-4 rounded-lg font-semibold text-lg transition-all duration-300 transform hover:scale-105">
|
| 29 |
+
<i data-feather="play" class="inline mr-2"></i>
|
| 30 |
+
Start Creating
|
| 31 |
+
</a>
|
| 32 |
+
<a href="/features.html" class="border-2 border-white hover:bg-white hover:text-purple-900 text-white px-8 py-4 rounded-lg font-semibold text-lg transition-all duration-300">
|
| 33 |
+
Learn More
|
| 34 |
+
</a>
|
| 35 |
+
</div>
|
| 36 |
+
</div>
|
| 37 |
+
</section>
|
| 38 |
+
|
| 39 |
+
<!-- Features Overview -->
|
| 40 |
+
<section class="py-20 bg-white/5 backdrop-blur-sm">
|
| 41 |
+
<div class="container mx-auto px-4">
|
| 42 |
+
<h2 class="text-3xl md:text-4xl font-bold text-center text-white mb-12">
|
| 43 |
+
AI-Powered Music Creation Pipeline
|
| 44 |
+
</h2>
|
| 45 |
+
<div class="grid md:grid-cols-3 gap-8">
|
| 46 |
+
<div class="bg-gradient-to-br from-purple-600/20 to-blue-600/20 p-6 rounded-xl border border-white/10">
|
| 47 |
+
<div class="w-12 h-12 bg-purple-500 rounded-lg flex items-center justify-center mb-4">
|
| 48 |
+
<i data-feather="message-square" class="text-white"></i>
|
| 49 |
+
</div>
|
| 50 |
+
<h3 class="text-xl font-semibold text-white mb-2">Prompt Interpreter</h3>
|
| 51 |
+
<p class="text-gray-300">Natural language to structured music metadata with LLM intelligence</p>
|
| 52 |
+
</div>
|
| 53 |
+
<div class="bg-gradient-to-br from-blue-600/20 to-indigo-600/20 p-6 rounded-xl border border-white/10">
|
| 54 |
+
<div class="w-12 h-12 bg-blue-500 rounded-lg flex items-center justify-center mb-4">
|
| 55 |
+
<i data-feather="music" class="text-white"></i>
|
| 56 |
+
</div>
|
| 57 |
+
<h3 class="text-xl font-semibold text-white mb-2">AI Composition</h3>
|
| 58 |
+
<p class="text-gray-300">Generate mastered tracks using Suno, Udio, and Mubert APIs</p>
|
| 59 |
+
</div>
|
| 60 |
+
<div class="bg-gradient-to-br from-indigo-600/20 to-purple-600/20 p-6 rounded-xl border border-white/10">
|
| 61 |
+
<div class="w-12 h-12 bg-indigo-500 rounded-lg flex items-center justify-center mb-4">
|
| 62 |
+
<i data-feather="trending-up" class="text-white"></i>
|
| 63 |
+
</div>
|
| 64 |
+
<h3 class="text-xl font-semibold text-white mb-2">Algorithm Fit</h3>
|
| 65 |
+
<p class="text-gray-300">Optimize for Spotify, SoundCloud algorithms with ML predictions</p>
|
| 66 |
+
</div>
|
| 67 |
+
</div>
|
| 68 |
+
</section>
|
| 69 |
+
|
| 70 |
+
<custom-footer></custom-footer>
|
| 71 |
+
|
| 72 |
+
<script src="components/navbar.js"></script>
|
| 73 |
+
<script src="components/footer.js"></script>
|
| 74 |
+
<script src="script.js"></script>
|
| 75 |
+
<script>
|
| 76 |
+
feather.replace();
|
| 77 |
+
// Initialize Vanta.js background
|
| 78 |
+
VANTA.GLOBE({
|
| 79 |
+
el: "#vanta-bg",
|
| 80 |
+
mouseControls: true,
|
| 81 |
+
touchControls: true,
|
| 82 |
+
gyroControls: false,
|
| 83 |
+
minHeight: 200.00,
|
| 84 |
+
minWidth: 200.00,
|
| 85 |
+
scale: 1.00,
|
| 86 |
+
scaleMobile: 1.00,
|
| 87 |
+
color: 0x7c3aed,
|
| 88 |
+
backgroundColor: 0x0
|
| 89 |
+
});
|
| 90 |
+
</script>
|
| 91 |
+
<script src="https://deepsite.hf.co/deepsite-badge.js"></script>
|
| 92 |
+
</body>
|
| 93 |
+
</html>
|
|
@@ -0,0 +1,146 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// Shared JavaScript across all pages
|
| 2 |
+
|
| 3 |
+
// Audio context for audio visualization
|
| 4 |
+
let audioContext = null;
|
| 5 |
+
|
| 6 |
+
// Initialize app
|
| 7 |
+
document.addEventListener('DOMContentLoaded', function() {
|
| 8 |
+
console.log('Algorithmic Harmony Maestro loaded');
|
| 9 |
+
|
| 10 |
+
// Check for audio context support
|
| 11 |
+
if (window.AudioContext || window.webkitAudioContext) {
|
| 12 |
+
audioContext = new (window.AudioContext || window.webkitAudioContext)();
|
| 13 |
+
}
|
| 14 |
+
|
| 15 |
+
// Utility function for formatting time
|
| 16 |
+
function formatTime(seconds) {
|
| 17 |
+
const mins = Math.floor(seconds / 60);
|
| 18 |
+
const secs = Math.floor(seconds % 60);
|
| 19 |
+
return `${mins}:${secs.toString().padStart(2, '0')}`;
|
| 20 |
+
}
|
| 21 |
+
|
| 22 |
+
// API integration functions
|
| 23 |
+
class MusicAPI {
|
| 24 |
+
static async generateTrack(prompt, metadata) {
|
| 25 |
+
try {
|
| 26 |
+
// Simulate API call to generative music service
|
| 27 |
+
const response = await fetch('/api/generate', {
|
| 28 |
+
method: 'POST',
|
| 29 |
+
headers: {
|
| 30 |
+
'Content-Type': 'application/json',
|
| 31 |
+
},
|
| 32 |
+
body: JSON.stringify({
|
| 33 |
+
prompt: prompt,
|
| 34 |
+
metadata: metadata,
|
| 35 |
+
platform: 'suno' // or 'udio', 'mubert'
|
| 36 |
+
})
|
| 37 |
+
});
|
| 38 |
+
|
| 39 |
+
if (!response.ok) throw new Error('Generation failed');
|
| 40 |
+
return await response.json();
|
| 41 |
+
} catch (error) {
|
| 42 |
+
console.error('Generation error:', error);
|
| 43 |
+
throw error;
|
| 44 |
+
}
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
static async analyzeTrack(audioFile) {
|
| 48 |
+
try {
|
| 49 |
+
const formData = new FormData();
|
| 50 |
+
formData.append('audio', audioFile);
|
| 51 |
+
|
| 52 |
+
const response = await fetch('/api/analyze', {
|
| 53 |
+
method: 'POST',
|
| 54 |
+
body: formData
|
| 55 |
+
});
|
| 56 |
+
|
| 57 |
+
if (!response.ok) throw new Error('Analysis failed');
|
| 58 |
+
return await response.json();
|
| 59 |
+
} catch (error) {
|
| 60 |
+
console.error('Analysis error:', error);
|
| 61 |
+
throw error;
|
| 62 |
+
}
|
| 63 |
+
}
|
| 64 |
+
|
| 65 |
+
static async getPlatformTags(genre, mood) {
|
| 66 |
+
try {
|
| 67 |
+
const response = await fetch(`/api/tags?genre=${genre}&mood=${mood}`);
|
| 68 |
+
if (!response.ok) throw new Error('Tag fetch failed');
|
| 69 |
+
return await response.json();
|
| 70 |
+
} catch (error) {
|
| 71 |
+
console.error('Tag fetch error:', error);
|
| 72 |
+
return {
|
| 73 |
+
spotify: ['Chill Vibes', 'Deep Focus'],
|
| 74 |
+
soundcloud: [genre, mood, 'instrumental']
|
| 75 |
+
};
|
| 76 |
+
}
|
| 77 |
+
}
|
| 78 |
+
}
|
| 79 |
+
|
| 80 |
+
// Local storage management
|
| 81 |
+
class StorageManager {
|
| 82 |
+
static saveProject(projectData) {
|
| 83 |
+
const projects = this.getProjects();
|
| 84 |
+
projects.push({
|
| 85 |
+
id: Date.now().toString(),
|
| 86 |
+
...projectData,
|
| 87 |
+
createdAt: new Date().toISOString()
|
| 88 |
+
});
|
| 89 |
+
localStorage.setItem('music_projects', JSON.stringify(projects));
|
| 90 |
+
}
|
| 91 |
+
|
| 92 |
+
static getProjects() {
|
| 93 |
+
return JSON.parse(localStorage.getItem('music_projects') || '[]');
|
| 94 |
+
}
|
| 95 |
+
|
| 96 |
+
static deleteProject(projectId) {
|
| 97 |
+
const projects = this.getProjects().filter(p => p.id !== projectId);
|
| 98 |
+
localStorage.setItem('music_projects', JSON.stringify(projects));
|
| 99 |
+
}
|
| 100 |
+
}
|
| 101 |
+
|
| 102 |
+
// Voice recognition
|
| 103 |
+
class VoiceRecognition {
|
| 104 |
+
constructor() {
|
| 105 |
+
this.recognition = null;
|
| 106 |
+
this.isListening = false;
|
| 107 |
+
|
| 108 |
+
if ('webkitSpeechRecognition' in window || 'SpeechRecognition' in window) {
|
| 109 |
+
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
|
| 110 |
+
this.recognition = new SpeechRecognition();
|
| 111 |
+
this.recognition.continuous = false;
|
| 112 |
+
this.recognition.interimResults = false;
|
| 113 |
+
}
|
| 114 |
+
}
|
| 115 |
+
|
| 116 |
+
startListening(onResult, onError) {
|
| 117 |
+
if (!this.recognition) {
|
| 118 |
+
onError('Voice recognition not supported in this browser');
|
| 119 |
+
return;
|
| 120 |
+
}
|
| 121 |
+
|
| 122 |
+
this.recognition.onresult = (event) => {
|
| 123 |
+
const transcript = event.results[0][0].transcript;
|
| 124 |
+
onResult(transcript);
|
| 125 |
+
};
|
| 126 |
+
|
| 127 |
+
this.recognition.onerror = (event) => {
|
| 128 |
+
onError(event.error);
|
| 129 |
+
};
|
| 130 |
+
|
| 131 |
+
this.recognition.start();
|
| 132 |
+
this.isListening = true;
|
| 133 |
+
}
|
| 134 |
+
|
| 135 |
+
stopListening() {
|
| 136 |
+
if (this.recognition && this.isListening) {
|
| 137 |
+
this.recognition.stop();
|
| 138 |
+
this.isListening = false;
|
| 139 |
+
}
|
| 140 |
+
}
|
| 141 |
+
}
|
| 142 |
+
|
| 143 |
+
// Export for use in other modules
|
| 144 |
+
window.MusicAPI = MusicAPI;
|
| 145 |
+
window.StorageManager = StorageManager;
|
| 146 |
+
window.VoiceRecognition = VoiceRecognition;
|
|
@@ -1,28 +1,60 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
body {
|
| 2 |
-
|
| 3 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
}
|
| 5 |
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
|
|
|
|
|
|
| 9 |
}
|
| 10 |
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
}
|
| 17 |
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
border: 1px solid lightgray;
|
| 23 |
-
border-radius: 16px;
|
| 24 |
}
|
| 25 |
|
| 26 |
-
|
| 27 |
-
|
|
|
|
| 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 |
+
}
|
| 7 |
+
|
| 8 |
+
/* Custom scrollbar */
|
| 9 |
+
::-webkit-scrollbar {
|
| 10 |
+
width: 8px;
|
| 11 |
+
}
|
| 12 |
+
|
| 13 |
+
::-webkit-scrollbar-track {
|
| 14 |
+
background: rgba(255, 255, 255, 0.1);
|
| 15 |
+
}
|
| 16 |
+
|
| 17 |
+
::-webkit-scrollbar-thumb {
|
| 18 |
+
background: rgba(139, 92, 246, 0.5);
|
| 19 |
+
border-radius: 4px;
|
| 20 |
+
}
|
| 21 |
+
|
| 22 |
+
::-webkit-scrollbar-thumb:hover {
|
| 23 |
+
background: rgba(139, 92, 246, 0.7);
|
| 24 |
}
|
| 25 |
|
| 26 |
+
/* Glass morphism effect */
|
| 27 |
+
.glass {
|
| 28 |
+
background: rgba(255, 255, 255, 0.1);
|
| 29 |
+
backdrop-filter: blur(10px);
|
| 30 |
+
border: 1px solid rgba(255, 255, 255, 0.2);
|
| 31 |
}
|
| 32 |
|
| 33 |
+
/* Gradient text animation */
|
| 34 |
+
.gradient-text {
|
| 35 |
+
background: linear-gradient(45deg, #8b5cf6, #ec4899, #3b82f6);
|
| 36 |
+
background-size: 200% 200%;
|
| 37 |
+
animation: gradient-shift 3s ease infinite;
|
| 38 |
}
|
| 39 |
|
| 40 |
+
@keyframes gradient-shift {
|
| 41 |
+
0% { background-position: 0% 50%; }
|
| 42 |
+
50% { background-position: 100% 50%; }
|
| 43 |
+
100% { background-position: 0% 50%; }
|
|
|
|
|
|
|
| 44 |
}
|
| 45 |
|
| 46 |
+
/* Pulse animation for loading states */
|
| 47 |
+
.pulse-glow {
|
| 48 |
+
animation: pulse-glow 2s infinite;
|
| 49 |
}
|
| 50 |
+
|
| 51 |
+
@keyframes pulse-glow {
|
| 52 |
+
0% { box-shadow: 0 0 0 0 rgba(139, 92, 246, 0.7); }
|
| 53 |
+
70% { box-shadow: 0 0 0 10px rgba(139, 92, 246, 0); }
|
| 54 |
+
100% { box-shadow: 0 0 0 0 rgba(139, 92, 246, 0); }
|
| 55 |
+
}
|
| 56 |
+
|
| 57 |
+
/* Smooth transitions for all interactive elements */
|
| 58 |
+
* {
|
| 59 |
+
transition: all 0.2s ease-in-out;
|
| 60 |
+
}
|