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 %} +
+
+
+
+
+ {% if artist.image_url %} + {{ artist.name }} + {% else %} +
+ +
+ {% endif %} +
+
+
+ FEATURED ARTIST +

{{ artist.name }}

+

{{ artist.style }} Master

+

{{ artist.description }}

+
+
+
+
+ +
+
+
+

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. +

+ +
+
+
+
+
+
+
+
+
+ MASTER_ENGINE_X64 +
+
+
+ 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" }} -

-
-
- + + +
+
+
+
+

THE ROSTER

+

Explore the signature chains of guitar legends.

+
+
+ 14 +

Icons

+
+
+ + +
+
+ +
+
+
+
+

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 %} +
+
+
+
+ +

{{ preset.title }}

+

{{ preset.description }}

+
+ Artist: {{ preset.artist.name }} + Style: {{ preset.artist.style }} + 64-bit Ready +
+
+
+ +
+
+
+
+ +
+

Signal Chain Architecture

+ +
+
+
+
+ Input +
+ +
+ + {% for step in steps %} +
+
+
+ #{{ forloop.counter }} + +
+
+
+ +
+
{{ step.module.name }}
+ {{ step.module.get_category_display }} +
+ +
+
+ + {% if not forloop.last %} +
+ {% endif %} + {% endfor %} + +
+ +
+
+ Output +
+
+
+ +
+
+
+
+
Module Technical Specs
+
+
+
    + {% for step in steps %} +
  • +
    + {{ step.module.name }} + {{ step.module.get_category_display }} +
    + {{ step.settings_summary }} +
  • + {% endfor %} +
+
+
+
+
+
+
+
Engine Performance
+
+
+
+
0.03%
+ CPU Usage (64-bit Core) +
+
+
+
2.9 ms
+ Latency (ASIO) +
+
+
48 kHz
+ Sample Rate +
+
+
+
+
+
+
+ + +{% 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 %} +
+
+
+
+
+

Audio Engine Settings

+ 64-BIT STANDALONE MODE +
+
+
+ {% csrf_token %} +
+
+ + +
ASIO is recommended for professional audio interfaces.
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+ Estimated: 2.9 ms +
+
+
+ +
+ +
+ + +
+
+
+
+ +
+

+ 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

+ +
+
+
+
+ +

macOS (Silicon/Intel)

+

Standalone & AU/VST3

+ +
+
+
+ +
+
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