diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc
index a5ed392..c080906 100644
Binary files a/core/__pycache__/admin.cpython-311.pyc and b/core/__pycache__/admin.cpython-311.pyc differ
diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc
index e061640..747e90c 100644
Binary files a/core/__pycache__/models.cpython-311.pyc and b/core/__pycache__/models.cpython-311.pyc differ
diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc
index 5a69659..a9cee6c 100644
Binary files a/core/__pycache__/urls.cpython-311.pyc and b/core/__pycache__/urls.cpython-311.pyc differ
diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc
index 2a36fd6..7949d80 100644
Binary files a/core/__pycache__/views.cpython-311.pyc and b/core/__pycache__/views.cpython-311.pyc differ
diff --git a/core/admin.py b/core/admin.py
index 8c38f3f..859d648 100644
--- a/core/admin.py
+++ b/core/admin.py
@@ -1,3 +1,27 @@
from django.contrib import admin
+from .models import Artist, EffectModule, Preset, SignalChainStep, AudioEngineSettings
-# Register your models here.
+class SignalChainStepInline(admin.TabularInline):
+ model = SignalChainStep
+ extra = 3
+
+@admin.register(Artist)
+class ArtistAdmin(admin.ModelAdmin):
+ list_display = ('name', 'style')
+ prepopulated_fields = {'slug': ('name',)}
+
+@admin.register(EffectModule)
+class EffectModuleAdmin(admin.ModelAdmin):
+ list_display = ('name', 'category')
+ list_filter = ('category',)
+
+@admin.register(Preset)
+class PresetAdmin(admin.ModelAdmin):
+ list_display = ('title', 'artist', 'is_featured')
+ list_filter = ('artist', 'is_featured')
+ prepopulated_fields = {'slug': ('title',)}
+ inlines = [SignalChainStepInline]
+
+@admin.register(AudioEngineSettings)
+class AudioEngineSettingsAdmin(admin.ModelAdmin):
+ list_display = ('driver_type', 'sample_rate', 'buffer_size')
diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py
new file mode 100644
index 0000000..1d3498f
--- /dev/null
+++ b/core/migrations/0001_initial.py
@@ -0,0 +1,59 @@
+# Generated by Django 5.2.7 on 2026-02-02 00:51
+
+import django.db.models.deletion
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Artist',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=255)),
+ ('slug', models.SlugField(unique=True)),
+ ('description', models.TextField()),
+ ('image_url', models.URLField(blank=True, null=True)),
+ ('style', models.CharField(help_text='e.g. Rock, Metal, Blues', max_length=100)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='EffectModule',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=255)),
+ ('category', models.CharField(choices=[('pedal', 'Pedal'), ('amp', 'Amplifier'), ('cab', 'Cabinet'), ('rack', 'Rack Effect')], max_length=50)),
+ ('description', models.TextField(blank=True)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Preset',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(max_length=255)),
+ ('slug', models.SlugField(unique=True)),
+ ('description', models.TextField()),
+ ('is_featured', models.BooleanField(default=False)),
+ ('artist', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='presets', to='core.artist')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='SignalChainStep',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('order', models.PositiveIntegerField(default=0)),
+ ('settings_summary', models.CharField(blank=True, help_text='e.g. Gain: 8, Bass: 4', max_length=255)),
+ ('module', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.effectmodule')),
+ ('preset', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='steps', to='core.preset')),
+ ],
+ options={
+ 'ordering': ['order'],
+ },
+ ),
+ ]
diff --git a/core/migrations/0002_audioenginesettings_effectmodule_icon_class_and_more.py b/core/migrations/0002_audioenginesettings_effectmodule_icon_class_and_more.py
new file mode 100644
index 0000000..ab034fd
--- /dev/null
+++ b/core/migrations/0002_audioenginesettings_effectmodule_icon_class_and_more.py
@@ -0,0 +1,35 @@
+# Generated by Django 5.2.7 on 2026-02-02 03:02
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('core', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='AudioEngineSettings',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('driver_type', models.CharField(choices=[('asio', 'ASIO'), ('wasapi', 'WASAPI'), ('directsound', 'DirectSound')], default='asio', max_length=20)),
+ ('buffer_size', models.IntegerField(default=128)),
+ ('sample_rate', models.IntegerField(default=44100)),
+ ('input_device', models.CharField(default='Default Input', max_length=255)),
+ ('output_device', models.CharField(default='Default Output', max_length=255)),
+ ('is_standalone_mode', models.BooleanField(default=True)),
+ ],
+ ),
+ migrations.AddField(
+ model_name='effectmodule',
+ name='icon_class',
+ field=models.CharField(default='bi-cpu', help_text='Bootstrap Icon class', max_length=50),
+ ),
+ migrations.AlterField(
+ model_name='effectmodule',
+ name='category',
+ field=models.CharField(choices=[('dynamics', 'Dynamics (Gate/Comp)'), ('drive', 'Drive/Overdrive'), ('amp', 'Amplifier'), ('modulation', 'Modulation (Chorus/Flanger)'), ('delay_reverb', 'Delay/Reverb'), ('utility', 'Utility (IR Loader/Wah)'), ('cab', 'Cabinet')], max_length=50),
+ ),
+ ]
diff --git a/core/migrations/__pycache__/0001_initial.cpython-311.pyc b/core/migrations/__pycache__/0001_initial.cpython-311.pyc
new file mode 100644
index 0000000..ce2c24d
Binary files /dev/null and b/core/migrations/__pycache__/0001_initial.cpython-311.pyc differ
diff --git a/core/migrations/__pycache__/0002_audioenginesettings_effectmodule_icon_class_and_more.cpython-311.pyc b/core/migrations/__pycache__/0002_audioenginesettings_effectmodule_icon_class_and_more.cpython-311.pyc
new file mode 100644
index 0000000..d55a3d2
Binary files /dev/null and b/core/migrations/__pycache__/0002_audioenginesettings_effectmodule_icon_class_and_more.cpython-311.pyc differ
diff --git a/core/models.py b/core/models.py
index 71a8362..1e3c391 100644
--- a/core/models.py
+++ b/core/models.py
@@ -1,3 +1,68 @@
from django.db import models
+from django.urls import reverse
-# Create your models here.
+class Artist(models.Model):
+ name = models.CharField(max_length=255)
+ slug = models.SlugField(unique=True)
+ description = models.TextField()
+ image_url = models.URLField(blank=True, null=True)
+ style = models.CharField(max_length=100, help_text="e.g. Rock, Metal, Blues")
+
+ def __str__(self):
+ return self.name
+
+class EffectModule(models.Model):
+ CATEGORY_CHOICES = [
+ ('dynamics', 'Dynamics (Gate/Comp)'),
+ ('drive', 'Drive/Overdrive'),
+ ('amp', 'Amplifier'),
+ ('modulation', 'Modulation (Chorus/Flanger)'),
+ ('delay_reverb', 'Delay/Reverb'),
+ ('utility', 'Utility (IR Loader/Wah)'),
+ ('cab', 'Cabinet'),
+ ]
+ name = models.CharField(max_length=255)
+ category = models.CharField(max_length=50, choices=CATEGORY_CHOICES)
+ description = models.TextField(blank=True)
+ icon_class = models.CharField(max_length=50, default='bi-cpu', help_text="Bootstrap Icon class")
+
+ def __str__(self):
+ return self.name
+
+class Preset(models.Model):
+ artist = models.ForeignKey(Artist, on_delete=models.CASCADE, related_name='presets')
+ title = models.CharField(max_length=255)
+ slug = models.SlugField(unique=True)
+ description = models.TextField()
+ is_featured = models.BooleanField(default=False)
+
+ def __str__(self):
+ return f"{self.artist.name} - {self.title}"
+
+class SignalChainStep(models.Model):
+ preset = models.ForeignKey(Preset, on_delete=models.CASCADE, related_name='steps')
+ module = models.ForeignKey(EffectModule, on_delete=models.CASCADE)
+ order = models.PositiveIntegerField(default=0)
+ settings_summary = models.CharField(max_length=255, blank=True, help_text="e.g. Gain: 8, Bass: 4")
+
+ class Meta:
+ ordering = ['order']
+
+ def __str__(self):
+ return f"{self.preset.title} - {self.module.name} (Step {self.order})"
+
+class AudioEngineSettings(models.Model):
+ DRIVER_CHOICES = [
+ ('asio', 'ASIO'),
+ ('wasapi', 'WASAPI'),
+ ('directsound', 'DirectSound'),
+ ]
+ driver_type = models.CharField(max_length=20, choices=DRIVER_CHOICES, default='asio')
+ buffer_size = models.IntegerField(default=128)
+ sample_rate = models.IntegerField(default=44100)
+ input_device = models.CharField(max_length=255, default='Default Input')
+ output_device = models.CharField(max_length=255, default='Default Output')
+ is_standalone_mode = models.BooleanField(default=True)
+
+ def __str__(self):
+ return f"Settings ({self.driver_type})"
\ No newline at end of file
diff --git a/core/templates/base.html b/core/templates/base.html
index 1e7e5fb..9fbd72e 100644
--- a/core/templates/base.html
+++ b/core/templates/base.html
@@ -1,25 +1,70 @@
-
-
- {% block title %}Knowledge Base{% endblock %}
- {% if project_description %}
-
-
-
- {% endif %}
- {% if project_image_url %}
-
-
- {% endif %}
- {% load static %}
-
- {% block head %}{% endblock %}
+
+
+ {% block title %}Master of Tones - 64-bit Multi-Effects{% endblock %}
+ {% if project_description %}
+
+ {% endif %}
+ {% load static %}
+
+
+
+
+
+
+
+
+
+ {% block head %}{% endblock %}
+
+
+
+
-
- {% block content %}{% endblock %}
+
+ {% block content %}{% endblock %}
+
+
+
+
+
+
-
-
+
\ No newline at end of file
diff --git a/core/templates/core/artist_detail.html b/core/templates/core/artist_detail.html
new file mode 100644
index 0000000..5ab9cf2
--- /dev/null
+++ b/core/templates/core/artist_detail.html
@@ -0,0 +1,92 @@
+{% extends 'base.html' %}
+{% load static %}
+
+{% block content %}
+
+
+
+
+
+
SIGNATURE BANK
+
Choose a preset to explore the 64-bit signal chain.
+
+
+ BANK_ID: {{ artist.id|add:100 }}
+
+
+
+
+ {% for preset in presets %}
+
+
+
+
+
{{ preset.title }}
+
+
+
{{ preset.description|truncatewords:25 }}
+
+
+
+ {% for step in preset.steps.all|slice:":3" %}
+ {{ step.module.name }}
+ {% endfor %}
+ {% if preset.steps.count > 3 %}
+ +{{ preset.steps.count|add:"-3" }}
+ {% endif %}
+
+
+
+
VIEW CHAIN
+
+
+
+
+ {% empty %}
+
+
+
No presets found for this artist.
+
+
+ {% endfor %}
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/core/templates/core/index.html b/core/templates/core/index.html
index faec813..e96b930 100644
--- a/core/templates/core/index.html
+++ b/core/templates/core/index.html
@@ -1,145 +1,157 @@
-{% extends "base.html" %}
-
-{% block title %}{{ project_name }}{% endblock %}
-
-{% block head %}
-
-
-
-
-{% endblock %}
+{% extends 'base.html' %}
+{% load static %}
{% block content %}
-
-
-
Analyzing your requirements and generating your app…
-
-
Loading…
+
+
+
+
+
+
+
+
NEW ENGINE v2.0
+
LEGENDARY TONES
+
+ The most powerful multi-effects suite for guitarists. 70+ Signature presets from 14 icons.
+ Optimized for ASIO/WASAPI with a native 64-bit architecture .
+
+
+
+
+
+
+
+
+ LATENCY
+ 2.9ms
+
+
+
+
+
+ DSP LOAD
+ 0.03%
+
+
+
+
+
+
-
AppWizzy AI is collecting your requirements and applying the first changes.
-
This page will refresh automatically as the plan is implemented.
-
- Runtime: Django {{ django_version }} · Python {{ python_version }}
- — UTC {{ current_time|date:"Y-m-d H:i:s" }}
-
-
-
-
- Page updated: {{ current_time|date:"Y-m-d H:i:s" }} (UTC)
-
+
+
+
+
+
+
+
THE ROSTER
+
Explore the signature chains of guitar legends.
+
+
+
+
+
+ {% for artist in artists %}
+
+ {% endfor %}
+
+
+
+
+
+
+
+
+
64-BIT ACCELERATION
+
+ Our proprietary engine leverages native 64-bit processing for maximum dynamic range and zero audible distortion.
+ Whether you use ASIO on Windows or Core Audio on macOS,
+ the latency remains imperceptible.
+
+
+
+
+
+
+
+
Ultra Low Latency
+
Sub 3ms processing with WASAPI/ASIO.
+
+
+
+
+
+
Dual IR Loader
+
Blend two impulses for massive space.
+
+
+
+
+
+
Noise Gate
+
Advanced algorithms for dead silence.
+
+
+
+
+
+
64-Bit Core
+
Optimized for high-performance DSP.
+
+
+
+
+
+
+
+
+
{% endblock %}
\ No newline at end of file
diff --git a/core/templates/core/preset_detail.html b/core/templates/core/preset_detail.html
new file mode 100644
index 0000000..6187002
--- /dev/null
+++ b/core/templates/core/preset_detail.html
@@ -0,0 +1,146 @@
+{% extends 'base.html' %}
+{% load static %}
+
+{% block content %}
+
+
+
+
Signal Chain Architecture
+
+
+
+
+
+
+
+ {% for step in steps %}
+
+
+
+
+
+
+
+
{{ step.module.name }}
+
{{ step.module.get_category_display }}
+
+
+
+
+
+ {% if not forloop.last %}
+
+ {% endif %}
+ {% endfor %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
0.03%
+
CPU Usage (64-bit Core)
+
+
+
+
2.9 ms
+
Latency (ASIO)
+
+
+
+
+
+
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/core/templates/core/settings.html b/core/templates/core/settings.html
new file mode 100644
index 0000000..3046a7f
--- /dev/null
+++ b/core/templates/core/settings.html
@@ -0,0 +1,89 @@
+{% extends 'base.html' %}
+{% load static %}
+
+{% block content %}
+
+
+
+
+
+
+
+ These settings apply to the local audio engine proxy. Ensure your audio interface is connected.
+
+
+
+
+
+
+
+{% endblock %}
diff --git a/core/templates/core/standalone.html b/core/templates/core/standalone.html
new file mode 100644
index 0000000..4a9d856
--- /dev/null
+++ b/core/templates/core/standalone.html
@@ -0,0 +1,45 @@
+{% extends 'base.html' %}
+{% load static %}
+
+{% block content %}
+
+
+
+
Master of Tones v2.0
+
+ Experience the ultimate multi-effects suite as a standalone 64-bit application.
+ Full ASIO/WASAPI support, zero-latency monitoring, and dual-IR loader integration.
+
+
+
+
+
+
+
Windows 64-bit
+
Standalone & VST3 Included
+
DOWNLOAD (.exe)
+
+
+
+
+
+
macOS (Silicon/Intel)
+
Standalone & AU/VST3
+
DOWNLOAD (.dmg)
+
+
+
+
+
+
Minimum Requirements
+
+ Windows 10/11 64-bit or macOS 11+
+ Intel Core i5 / Apple M1 or better
+ 8GB RAM
+ ASIO compatible audio interface (recommended)
+
+
+
+
+
+{% endblock %}
diff --git a/core/urls.py b/core/urls.py
index 6299e3d..56295fb 100644
--- a/core/urls.py
+++ b/core/urls.py
@@ -1,7 +1,10 @@
from django.urls import path
-
-from .views import home
+from . import views
urlpatterns = [
- path("", home, name="home"),
-]
+ path('', views.index, name='index'),
+ path('artist/
/', views.artist_detail, name='artist_detail'),
+ path('preset//', views.preset_detail, name='preset_detail'),
+ path('settings/', views.audio_settings, name='audio_settings'),
+ path('standalone/', views.standalone_download, name='standalone_download'),
+]
\ No newline at end of file
diff --git a/core/views.py b/core/views.py
index c9aed12..9fdb61d 100644
--- a/core/views.py
+++ b/core/views.py
@@ -1,25 +1,42 @@
-import os
-import platform
+from django.shortcuts import render, get_object_or_404, redirect
+from .models import Artist, Preset, EffectModule, AudioEngineSettings
-from django import get_version as django_version
-from django.shortcuts import render
-from django.utils import timezone
+def index(request):
+ featured_presets = Preset.objects.filter(is_featured=True)[:6]
+ artists = Artist.objects.all()
+ return render(request, 'core/index.html', {
+ 'featured_presets': featured_presets,
+ 'artists': artists
+ })
+def artist_detail(request, slug):
+ artist = get_object_or_404(Artist, slug=slug)
+ presets = artist.presets.all()
+ return render(request, 'core/artist_detail.html', {
+ 'artist': artist,
+ 'presets': presets
+ })
-def home(request):
- """Render the landing screen with loader and environment details."""
- host_name = request.get_host().lower()
- agent_brand = "AppWizzy" if host_name == "appwizzy.com" else "Flatlogic"
- now = timezone.now()
+def preset_detail(request, slug):
+ preset = get_object_or_404(Preset, slug=slug)
+ steps = preset.steps.all().select_related('module')
+ return render(request, 'core/preset_detail.html', {
+ 'preset': preset,
+ 'steps': steps
+ })
- context = {
- "project_name": "New Style",
- "agent_brand": agent_brand,
- "django_version": django_version(),
- "python_version": platform.python_version(),
- "current_time": now,
- "host_name": host_name,
- "project_description": os.getenv("PROJECT_DESCRIPTION", ""),
- "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""),
- }
- return render(request, "core/index.html", context)
+def audio_settings(request):
+ settings, created = AudioEngineSettings.objects.get_or_create(pk=1)
+ if request.method == 'POST':
+ settings.driver_type = request.POST.get('driver_type')
+ settings.buffer_size = int(request.POST.get('buffer_size', 128))
+ settings.sample_rate = int(request.POST.get('sample_rate', 44100))
+ settings.save()
+ return redirect('audio_settings')
+
+ return render(request, 'core/settings.html', {
+ 'settings': settings
+ })
+
+def standalone_download(request):
+ return render(request, 'core/standalone.html')
\ No newline at end of file
diff --git a/seed_presets.py b/seed_presets.py
new file mode 100644
index 0000000..8fa3d53
--- /dev/null
+++ b/seed_presets.py
@@ -0,0 +1,66 @@
+from core.models import Artist, EffectModule, Preset, SignalChainStep
+from django.utils.text import slugify
+
+# 1. Create Effect Modules
+modules_data = [
+ ('Noise Gate', 'dynamics', 'bi-shield-shaded'),
+ ('Compressor', 'dynamics', 'bi-input-cursor'),
+ ('Overdrive TS-808', 'drive', 'bi-lightning-charge'),
+ ('High Gain Amp', 'amp', 'bi-speaker'),
+ ('Clean Tube Amp', 'amp', 'bi-speaker'),
+ ('Dual IR Loader', 'utility', 'bi-file-earmark-music'),
+ ('Stereo Chorus', 'modulation', 'bi-water'),
+ ('Classic Flanger', 'modulation', 'bi-wind'),
+ ('Analog Delay', 'delay_reverb', 'bi-hourglass-split'),
+ ('Wah Wah Pedal', 'utility', 'bi-reception-4'),
+]
+
+created_modules = {}
+for name, cat, icon in modules_data:
+ mod, _ = EffectModule.objects.get_or_create(
+ name=name,
+ defaults={'category': cat, 'icon_class': icon}
+ )
+ created_modules[name] = mod
+
+# 2. Get Artists
+artists = Artist.objects.all()
+
+# 3. Create 5 Presets per Artist
+for artist in artists:
+ for i in range(1, 6):
+ title = f"{artist.name} Signature {i}"
+ slug = slugify(f"{artist.name}-{i}-{title}")
+
+ preset, created = Preset.objects.get_or_create(
+ artist=artist,
+ slug=slug,
+ defaults={
+ 'title': title,
+ 'description': f"A signature tone for {artist.name}, optimized for {artist.style} style."
+ }
+ )
+
+ if created:
+ # Build a typical signal chain
+ # Order: Gate -> Comp -> Wah -> Drive -> Amp -> IR -> Mod -> Delay
+ steps = [
+ ('Noise Gate', 'Threshold: -40dB'),
+ ('Compressor', 'Ratio: 4:1'),
+ ('Wah Wah Pedal', 'Auto-sweep'),
+ ('Overdrive TS-808', 'Drive: 4, Tone: 6'),
+ ('High Gain Amp', 'Gain: 7, Bass: 5, Mid: 6, Treble: 7'),
+ ('Dual IR Loader', 'Cab A: 4x12 SM57, Cab B: 4x12 R121'),
+ ('Stereo Chorus', 'Rate: 0.5Hz, Depth: 40%'),
+ ('Analog Delay', 'Time: 450ms, Feedback: 30%'),
+ ]
+
+ for idx, (mod_name, settings) in enumerate(steps):
+ SignalChainStep.objects.create(
+ preset=preset,
+ module=created_modules[mod_name],
+ order=idx,
+ settings_summary=settings
+ )
+
+print("Successfully seeded 5 presets per artist.")
diff --git a/static/css/custom.css b/static/css/custom.css
index 925f6ed..4eea7b3 100644
--- a/static/css/custom.css
+++ b/static/css/custom.css
@@ -1,4 +1,144 @@
-/* Custom styles for the application */
-body {
- font-family: system-ui, -apple-system, sans-serif;
+@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600&family=Oswald:wght@500;700&display=swap');
+
+:root {
+ --bg-dark: #0A0A0B;
+ --card-bg: #161618;
+ --accent-gold: #FFD700;
+ --accent-cyan: #00E5FF;
+ --text-main: #E1E1E1;
+ --text-muted: #A0A0A0;
+ --border-color: #2D2D30;
}
+
+body {
+ background-color: var(--bg-dark);
+ color: var(--text-main);
+ font-family: 'Inter', sans-serif;
+ line-height: 1.6;
+}
+
+h1, h2, h3, h4, .brand-font {
+ font-family: 'Oswald', sans-serif;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+}
+
+/* Navbar */
+.navbar {
+ background-color: rgba(10, 10, 11, 0.95);
+ backdrop-filter: blur(10px);
+ border-bottom: 1px solid var(--border-color);
+}
+
+.navbar-brand {
+ font-family: 'Oswald', sans-serif;
+ color: var(--accent-gold) !important;
+ font-weight: 700;
+ font-size: 1.5rem;
+}
+
+/* Hero Section */
+.hero-section {
+ padding: 100px 0;
+ background: radial-gradient(circle at center, #1a1a1c 0%, #0A0A0B 100%);
+ position: relative;
+ overflow: hidden;
+}
+
+.hero-section::before {
+ content: '';
+ position: absolute;
+ top: -50%;
+ left: -50%;
+ width: 200%;
+ height: 200%;
+ background: radial-gradient(circle, rgba(255, 215, 0, 0.03) 0%, transparent 50%);
+ pointer-events: none;
+}
+
+.hero-title {
+ font-size: 4rem;
+ font-weight: 700;
+ color: #fff;
+ margin-bottom: 1rem;
+}
+
+.hero-accent {
+ color: var(--accent-gold);
+}
+
+/* Cards */
+.card-tone {
+ background-color: var(--card-bg);
+ border: 1px solid var(--border-color);
+ border-radius: 12px;
+ transition: all 0.3s ease;
+ overflow: hidden;
+}
+
+.card-tone:hover {
+ transform: translateY(-5px);
+ border-color: var(--accent-gold);
+ box-shadow: 0 10px 30px rgba(0,0,0,0.5);
+}
+
+.card-tone .card-body {
+ padding: 1.5rem;
+}
+
+.card-tone .artist-name {
+ color: var(--accent-gold);
+ margin-bottom: 0.5rem;
+}
+
+/* Signal Chain Widget */
+.signal-chain {
+ display: flex;
+ align-items: center;
+ gap: 15px;
+ padding: 20px;
+ background: #000;
+ border-radius: 8px;
+ overflow-x: auto;
+}
+
+.module-box {
+ min-width: 120px;
+ padding: 15px;
+ background: var(--card-bg);
+ border: 2px solid var(--border-color);
+ border-radius: 6px;
+ text-align: center;
+ position: relative;
+}
+
+.module-box.active {
+ border-color: var(--accent-cyan);
+ box-shadow: 0 0 15px rgba(0, 229, 255, 0.2);
+}
+
+.chain-arrow {
+ color: var(--text-muted);
+}
+
+/* Buttons */
+.btn-primary-tone {
+ background-color: var(--accent-gold);
+ color: #000;
+ font-family: 'Oswald', sans-serif;
+ font-weight: 600;
+ border: none;
+ padding: 12px 25px;
+ transition: all 0.2s;
+}
+
+.btn-primary-tone:hover {
+ background-color: #fff;
+ color: #000;
+ transform: scale(1.05);
+}
+
+/* Utility */
+.text-muted {
+ color: var(--text-muted) !important;
+}
\ No newline at end of file
diff --git a/staticfiles/css/custom.css b/staticfiles/css/custom.css
index 108056f..4eea7b3 100644
--- a/staticfiles/css/custom.css
+++ b/staticfiles/css/custom.css
@@ -1,21 +1,144 @@
+@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600&family=Oswald:wght@500;700&display=swap');
:root {
- --bg-color-start: #6a11cb;
- --bg-color-end: #2575fc;
- --text-color: #ffffff;
- --card-bg-color: rgba(255, 255, 255, 0.01);
- --card-border-color: rgba(255, 255, 255, 0.1);
+ --bg-dark: #0A0A0B;
+ --card-bg: #161618;
+ --accent-gold: #FFD700;
+ --accent-cyan: #00E5FF;
+ --text-main: #E1E1E1;
+ --text-muted: #A0A0A0;
+ --border-color: #2D2D30;
}
+
body {
- margin: 0;
+ background-color: var(--bg-dark);
+ color: var(--text-main);
font-family: 'Inter', sans-serif;
- background: linear-gradient(45deg, var(--bg-color-start), var(--bg-color-end));
- color: var(--text-color);
- display: flex;
- justify-content: center;
- align-items: center;
- min-height: 100vh;
- text-align: center;
+ line-height: 1.6;
+}
+
+h1, h2, h3, h4, .brand-font {
+ font-family: 'Oswald', sans-serif;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+}
+
+/* Navbar */
+.navbar {
+ background-color: rgba(10, 10, 11, 0.95);
+ backdrop-filter: blur(10px);
+ border-bottom: 1px solid var(--border-color);
+}
+
+.navbar-brand {
+ font-family: 'Oswald', sans-serif;
+ color: var(--accent-gold) !important;
+ font-weight: 700;
+ font-size: 1.5rem;
+}
+
+/* Hero Section */
+.hero-section {
+ padding: 100px 0;
+ background: radial-gradient(circle at center, #1a1a1c 0%, #0A0A0B 100%);
+ position: relative;
overflow: hidden;
+}
+
+.hero-section::before {
+ content: '';
+ position: absolute;
+ top: -50%;
+ left: -50%;
+ width: 200%;
+ height: 200%;
+ background: radial-gradient(circle, rgba(255, 215, 0, 0.03) 0%, transparent 50%);
+ pointer-events: none;
+}
+
+.hero-title {
+ font-size: 4rem;
+ font-weight: 700;
+ color: #fff;
+ margin-bottom: 1rem;
+}
+
+.hero-accent {
+ color: var(--accent-gold);
+}
+
+/* Cards */
+.card-tone {
+ background-color: var(--card-bg);
+ border: 1px solid var(--border-color);
+ border-radius: 12px;
+ transition: all 0.3s ease;
+ overflow: hidden;
+}
+
+.card-tone:hover {
+ transform: translateY(-5px);
+ border-color: var(--accent-gold);
+ box-shadow: 0 10px 30px rgba(0,0,0,0.5);
+}
+
+.card-tone .card-body {
+ padding: 1.5rem;
+}
+
+.card-tone .artist-name {
+ color: var(--accent-gold);
+ margin-bottom: 0.5rem;
+}
+
+/* Signal Chain Widget */
+.signal-chain {
+ display: flex;
+ align-items: center;
+ gap: 15px;
+ padding: 20px;
+ background: #000;
+ border-radius: 8px;
+ overflow-x: auto;
+}
+
+.module-box {
+ min-width: 120px;
+ padding: 15px;
+ background: var(--card-bg);
+ border: 2px solid var(--border-color);
+ border-radius: 6px;
+ text-align: center;
position: relative;
}
+
+.module-box.active {
+ border-color: var(--accent-cyan);
+ box-shadow: 0 0 15px rgba(0, 229, 255, 0.2);
+}
+
+.chain-arrow {
+ color: var(--text-muted);
+}
+
+/* Buttons */
+.btn-primary-tone {
+ background-color: var(--accent-gold);
+ color: #000;
+ font-family: 'Oswald', sans-serif;
+ font-weight: 600;
+ border: none;
+ padding: 12px 25px;
+ transition: all 0.2s;
+}
+
+.btn-primary-tone:hover {
+ background-color: #fff;
+ color: #000;
+ transform: scale(1.05);
+}
+
+/* Utility */
+.text-muted {
+ color: var(--text-muted) !important;
+}
\ No newline at end of file