Index: rnelRecordsMVC.Application/Services/AccountService.cs
===================================================================
--- KernelRecordsMVC.Application/Services/AccountService.cs	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ 	(revision )
@@ -1,6 +1,0 @@
-﻿namespace KernelRecordsMVC.Application.Services;
-
-public class AccountService
-{
-    
-}
Index: rnelRecordsMVC.Application/Services/OrderService.cs
===================================================================
--- KernelRecordsMVC.Application/Services/OrderService.cs	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ 	(revision )
@@ -1,6 +1,0 @@
-﻿namespace KernelRecordsMVC.Application.Services;
-
-public class OrderService
-{
-    
-}
Index: rnelRecordsMVC.Application/Services/ProductService.cs
===================================================================
--- KernelRecordsMVC.Application/Services/ProductService.cs	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ 	(revision )
@@ -1,6 +1,0 @@
-﻿namespace KernelRecordsMVC.Application.Services;
-
-public class ProductService
-{
-    
-}
Index: rnelRecordsMVC.Application/Services/ReleaseService.cs
===================================================================
--- KernelRecordsMVC.Application/Services/ReleaseService.cs	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ 	(revision )
@@ -1,6 +1,0 @@
-﻿namespace KernelRecordsMVC.Application.Services;
-
-public class ReleaseService
-{
-    
-}
Index: KernelRecordsMVC.Application/ViewModels/CreateReleaseViewModel.cs
===================================================================
--- KernelRecordsMVC.Application/ViewModels/CreateReleaseViewModel.cs	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
+++ KernelRecordsMVC.Application/ViewModels/CreateReleaseViewModel.cs	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -0,0 +1,6 @@
+﻿namespace KernelRecordsMVC.Application.ViewModels;
+
+public class CreateReleaseViewModel
+{
+    
+}
Index: KernelRecordsMVC.Application/ViewModels/CreateTrackViewModel.cs
===================================================================
--- KernelRecordsMVC.Application/ViewModels/CreateTrackViewModel.cs	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
+++ KernelRecordsMVC.Application/ViewModels/CreateTrackViewModel.cs	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -0,0 +1,6 @@
+﻿namespace KernelRecordsMVC.Application.ViewModels;
+
+public class CreateTrackViewModel
+{
+    
+}
Index: KernelRecordsMVC.Application/ViewModels/ProfileViewModel.cs
===================================================================
--- KernelRecordsMVC.Application/ViewModels/ProfileViewModel.cs	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
+++ KernelRecordsMVC.Application/ViewModels/ProfileViewModel.cs	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -0,0 +1,6 @@
+﻿namespace KernelRecordsMVC.Application.ViewModels;
+
+public class ProfileViewModel
+{
+    
+}
Index: KernelRecordsMVC.Application/ViewModels/SaleItemViewModel.cs
===================================================================
--- KernelRecordsMVC.Application/ViewModels/SaleItemViewModel.cs	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
+++ KernelRecordsMVC.Application/ViewModels/SaleItemViewModel.cs	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -0,0 +1,6 @@
+﻿namespace KernelRecordsMVC.Application.ViewModels;
+
+public class SaleItemViewModel
+{
+    
+}
Index: KernelRecordsMVC.Web/Controllers/AccountController.cs
===================================================================
--- KernelRecordsMVC.Web/Controllers/AccountController.cs	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Controllers/AccountController.cs	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -1,9 +1,11 @@
-﻿using Microsoft.AspNetCore.Mvc;
-using KernelRecordsMVC.Data;
+﻿using System.Security.Claims;
+using KernelRecordsMVC.Application.ViewModels;
+using KernelRecordsMVC.Infrastructure.Data;
 using KernelRecordsMVC.Models;
-using KernelRecordsMVC.Application.ViewModels;
-using Microsoft.AspNetCore.Http;
-
-namespace KernelRecordsMVC.Controllers;
+using Microsoft.AspNetCore.Authentication;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.EntityFrameworkCore;
+
+namespace KernelRecordsMVC.Web.Controllers;
 
 public class AccountController : Controller
@@ -16,7 +18,8 @@
     }
 
-    // ==============================
+
+    // =========================================================
     // REGISTER - GET
-    // ==============================
+    // =========================================================
 
     [HttpGet]
@@ -27,7 +30,7 @@
 
 
-    // ==============================
+    // =========================================================
     // REGISTER - POST
-    // ==============================
+    // =========================================================
 
     [HttpPost]
@@ -61,6 +64,6 @@
             Username = model.Username,
 
-            // We'll replace this with proper password hashing
-            // in the security cleanup section.
+            // TODO:
+            // Replace with password hashing later.
             Password = model.Password,
 
@@ -74,4 +77,5 @@
         _context.SaveChanges();
 
+
         // Every normal registered user is a Consumer.
         var consumer = new Consumer
@@ -89,7 +93,7 @@
 
 
-    // ==============================
+    // =========================================================
     // LOGIN - GET
-    // ==============================
+    // =========================================================
 
     [HttpGet]
@@ -100,11 +104,12 @@
 
 
-    // ==============================
+    // =========================================================
     // LOGIN - POST
-    // ==============================
+    // =========================================================
 
     [HttpPost]
     [ValidateAntiForgeryToken]
-    public IActionResult Login(LoginViewModel model)
+    public async Task<IActionResult> Login(
+        LoginViewModel model)
     {
         if (!ModelState.IsValid)
@@ -125,4 +130,78 @@
         }
 
+
+        // =====================================================
+        // DETERMINE ACCOUNT TYPE
+        // =====================================================
+
+        var admin = _context.Admins
+            .FirstOrDefault(x => x.UserId == user.UserId);
+
+        string role;
+
+        if (admin != null)
+        {
+            role = "Admin";
+        }
+        else
+        {
+            role = "Consumer";
+        }
+
+
+        // =====================================================
+        // CREATE CLAIMS
+        // =====================================================
+
+        var claims = new List<Claim>
+        {
+            new Claim(
+                ClaimTypes.NameIdentifier,
+                user.UserId.ToString()),
+
+            new Claim(
+                ClaimTypes.Name,
+                user.Username),
+
+            new Claim(
+                ClaimTypes.Email,
+                user.Email),
+
+            new Claim(
+                ClaimTypes.Role,
+                role)
+        };
+
+
+        if (admin != null)
+        {
+            claims.Add(
+                new Claim(
+                    "AdminType",
+                    admin.Type.ToString()));
+        }
+
+
+        var identity = new ClaimsIdentity(
+            claims,
+            "Cookies");
+
+        var principal =
+            new ClaimsPrincipal(identity);
+
+
+        // =====================================================
+        // SIGN IN
+        // =====================================================
+
+        await HttpContext.SignInAsync(
+            "Cookies",
+            principal);
+
+
+        // =====================================================
+        // KEEP SESSION FOR EXISTING CODE
+        // =====================================================
+
         HttpContext.Session.SetInt32(
             "UserId",
@@ -133,25 +212,15 @@
             user.Username);
 
-        // Determine account type from the actual
-        // ADMINS / CONSUMERS tables.
-        var admin = _context.Admins
-            .FirstOrDefault(x => x.UserId == user.UserId);
+        HttpContext.Session.SetString(
+            "Role",
+            role);
 
         if (admin != null)
         {
-            HttpContext.Session.SetString(
-                "Role",
-                "Admin");
-
             HttpContext.Session.SetString(
                 "AdminType",
                 admin.Type.ToString());
         }
-        else
-        {
-            HttpContext.Session.SetString(
-                "Role",
-                "Consumer");
-        }
+
 
         return RedirectToAction(
@@ -161,10 +230,195 @@
 
 
-    // ==============================
+    // =========================================================
+    // PROFILE - GET
+    // =========================================================
+
+    [HttpGet]
+    public IActionResult Profile()
+    {
+        // Get logged-in user's ID from authentication claims.
+        var userIdClaim = User.FindFirst(
+            ClaimTypes.NameIdentifier);
+
+        if (userIdClaim == null)
+            return RedirectToAction(nameof(Login));
+
+        if (!long.TryParse(
+                userIdClaim.Value,
+                out var userId))
+        {
+            return RedirectToAction(nameof(Login));
+        }
+
+
+        // Load user + consumer information.
+        var user = _context.Users
+            .Include(x => x.Consumer)
+            .FirstOrDefault(x =>
+                x.UserId == userId);
+
+        if (user == null)
+            return NotFound();
+
+
+        var model = new ProfileViewModel
+        {
+            UserId = user.UserId,
+
+            Username = user.Username,
+
+            Email = user.Email,
+
+            TelephoneNumber =
+                user.TelephoneNumber,
+
+            ShippingAddress =
+                user.ShippingAddress,
+
+            DateCreated =
+                user.DateCreated,
+
+            PointsCollected =
+                user.Consumer?.PointsCollected ?? 0
+        };
+
+
+        return View(model);
+    }
+
+
+    // =========================================================
+    // PROFILE - POST
+    // =========================================================
+
+    [HttpPost]
+    [ValidateAntiForgeryToken]
+    public async Task<IActionResult> Profile(
+        ProfileViewModel model)
+    {
+        // Get the currently authenticated user.
+        var userIdClaim = User.FindFirst(
+            ClaimTypes.NameIdentifier);
+
+        if (userIdClaim == null)
+            return RedirectToAction(nameof(Login));
+
+        if (!long.TryParse(
+                userIdClaim.Value,
+                out var userId))
+        {
+            return RedirectToAction(nameof(Login));
+        }
+
+
+        if (!ModelState.IsValid)
+            return View(model);
+
+
+        var user = _context.Users
+            .FirstOrDefault(x =>
+                x.UserId == userId);
+
+        if (user == null)
+            return NotFound();
+
+
+        // =====================================================
+        // CHECK EMAIL
+        // =====================================================
+
+        var emailExists = _context.Users.Any(x =>
+            x.Email == model.Email &&
+            x.UserId != userId);
+
+        if (emailExists)
+        {
+            ModelState.AddModelError(
+                nameof(model.Email),
+                "This email is already registered.");
+
+            return View(model);
+        }
+
+
+        // =====================================================
+        // UPDATE USER
+        // =====================================================
+
+        user.Email = model.Email;
+
+        user.TelephoneNumber =
+            model.TelephoneNumber;
+
+        user.ShippingAddress =
+            model.ShippingAddress;
+
+
+        _context.SaveChanges();
+
+
+        TempData["Success"] =
+            "Your profile has been updated successfully.";
+
+
+        // =====================================================
+        // REFRESH EMAIL CLAIM
+        // =====================================================
+
+        var claims = new List<Claim>
+        {
+            new Claim(
+                ClaimTypes.NameIdentifier,
+                user.UserId.ToString()),
+
+            new Claim(
+                ClaimTypes.Name,
+                user.Username),
+
+            new Claim(
+                ClaimTypes.Email,
+                user.Email),
+
+            new Claim(
+                ClaimTypes.Role,
+                User.IsInRole("Admin")
+                    ? "Admin"
+                    : "Consumer")
+        };
+
+
+        var identity = new ClaimsIdentity(
+            claims,
+            "Cookies");
+
+        var principal =
+            new ClaimsPrincipal(identity);
+
+
+        await HttpContext.SignInAsync(
+            "Cookies",
+            principal);
+
+
+        // Keep session synchronized.
+        HttpContext.Session.SetString(
+            "Username",
+            user.Username);
+
+
+        return RedirectToAction(nameof(Profile));
+    }
+
+
+    // =========================================================
     // LOGOUT
-    // ==============================
-
-    public IActionResult Logout()
-    {
+    // =========================================================
+
+    [HttpPost]
+    [ValidateAntiForgeryToken]
+    public async Task<IActionResult> Logout()
+    {
+        await HttpContext.SignOutAsync("Cookies");
+
         HttpContext.Session.Clear();
 
Index: KernelRecordsMVC.Web/Controllers/AdminController.cs
===================================================================
--- KernelRecordsMVC.Web/Controllers/AdminController.cs	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Controllers/AdminController.cs	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -1,11 +1,10 @@
-﻿using Microsoft.AspNetCore.Mvc;
+﻿using KernelRecordsMVC.Application.ViewModels;
+using KernelRecordsMVC.Domain.Enums;
+using KernelRecordsMVC.Infrastructure.Data;
+using KernelRecordsMVC.Models;
+using Microsoft.AspNetCore.Mvc;
 using Microsoft.EntityFrameworkCore;
-using KernelRecordsMVC.Data;
-using KernelRecordsMVC.Models;
-using KernelRecordsMVC.Domain.Enums;
-using KernelRecordsMVC.Application.ViewModels;
-using Microsoft.AspNetCore.Http;
-
-namespace KernelRecordsMVC.Controllers;
+
+namespace KernelRecordsMVC.Web.Controllers;
 
 public class AdminController : Controller
@@ -19,7 +18,7 @@
 
 
-    // ==========================================
+    // =========================================================
     // ADMIN DASHBOARD
-    // ==========================================
+    // =========================================================
 
     [HttpGet]
@@ -29,12 +28,50 @@
             return Forbid();
 
+
+        ViewBag.ProductCount =
+            _context.Products.Count();
+
+        ViewBag.ReleaseCount =
+            _context.Releases.Count();
+
+        ViewBag.OutOfStockCount =
+            _context.Products.Count(x =>
+                x.Stock <= 0);
+
+        ViewBag.LowStockCount =
+            _context.Products.Count(x =>
+                x.Stock > 0 &&
+                x.Stock <= 5);
+
+
         return View();
     }
 
 
-    // ==========================================
-    // UC008
-    // NEW PRODUCT - GET
-    // ==========================================
+    // =========================================================
+    // PRODUCTS
+    // =========================================================
+
+    [HttpGet]
+    public IActionResult Products()
+    {
+        if (!IsProductManager())
+            return Forbid();
+
+
+        var products = _context.Products
+            .Include(p => p.Release)
+            .OrderBy(p => p.Release.Title)
+            .ThenBy(p => p.Format)
+            .ToList();
+
+
+        return View(products);
+    }
+
+
+    // =========================================================
+    // CREATE PRODUCT - GET
+    // =========================================================
 
     [HttpGet]
@@ -44,16 +81,16 @@
             return Forbid();
 
-        ViewBag.Releases = _context.Releases
-            .OrderBy(x => x.Title)
-            .ToList();
-
-        return View(new CreateProductViewModel());
-    }
-
-
-    // ==========================================
-    // UC008
-    // NEW PRODUCT - POST
-    // ==========================================
+
+        LoadReleases();
+
+
+        return View(
+            new CreateProductViewModel());
+    }
+
+
+    // =========================================================
+    // CREATE PRODUCT - POST
+    // =========================================================
 
     [HttpPost]
@@ -65,89 +102,852 @@
             return Forbid();
 
+
         if (!ModelState.IsValid)
         {
             LoadReleases();
+
             return View(model);
         }
 
 
-        // Make sure the release actually exists.
         var release = _context.Releases
             .FirstOrDefault(x =>
                 x.ReleaseId == model.ReleaseId);
 
+
         if (release == null)
         {
             ModelState.AddModelError(
-                "ReleaseId",
+                nameof(model.ReleaseId),
                 "The selected release does not exist.");
 
+
             LoadReleases();
+
+
             return View(model);
         }
 
 
-        // Don't allow duplicate format for
-        // the same release.
-        var alreadyExists = _context.Products.Any(p =>
-            p.ReleaseId == model.ReleaseId &&
-            p.Format == model.Format);
+        var alreadyExists =
+            _context.Products.Any(p =>
+                p.ReleaseId == model.ReleaseId &&
+                p.Format == model.Format);
+
 
         if (alreadyExists)
         {
             ModelState.AddModelError(
-                "Format",
+                nameof(model.Format),
                 "This release already has a product in this format.");
 
+
             LoadReleases();
+
+
             return View(model);
         }
 
 
-        var product = new Product
-        {
-            ProductId = GetNextProductId(),
-
-            ReleaseId = model.ReleaseId,
-
-            Format = model.Format,
-
-            Price = model.Price,
-
-            ProductDescription =
-                model.ProductDescription,
-
-            Stock = model.Stock
-        };
-
-
-        _context.Products.Add(product);
-
-        _context.SaveChanges();
-
-
-        // Record the modification.
-        CreateModification(
-            ModificationType.CREATE,
-            product.ProductId);
-
-
-        TempData["Success"] =
-            "Product created successfully.";
-
-
-        return RedirectToAction(
-            nameof(Index));
-    }
-
-
-    // ==========================================
-    // HELPERS
-    // ==========================================
+        using var transaction =
+            _context.Database.BeginTransaction();
+
+
+        try
+        {
+            var product = new Product
+            {
+                ProductId =
+                    GetNextProductId(),
+
+                ReleaseId =
+                    model.ReleaseId,
+
+                Format =
+                    model.Format,
+
+                Price =
+                    model.Price,
+
+                ProductDescription =
+                    model.ProductDescription,
+
+                Stock =
+                    model.Stock
+            };
+
+
+            _context.Products.Add(product);
+
+            _context.SaveChanges();
+
+
+            CreateModification(
+                ModificationType.CREATE,
+                product.ProductId);
+
+
+            transaction.Commit();
+
+
+            TempData["Success"] =
+                $"{release.Title} ({product.Format}) was created successfully.";
+
+
+            return RedirectToAction(
+                nameof(Products));
+        }
+        catch
+        {
+            transaction.Rollback();
+
+            throw;
+        }
+    }
+
+
+    // =========================================================
+    // EDIT PRODUCT - GET
+    // =========================================================
+
+    [HttpGet]
+    public IActionResult EditProduct(long id)
+    {
+        if (!IsProductManager())
+            return Forbid();
+
+
+        var product = _context.Products
+            .Include(p => p.Release)
+            .FirstOrDefault(p =>
+                p.ProductId == id);
+
+
+        if (product == null)
+            return NotFound();
+
+
+        var model =
+            new EditProductViewModel
+            {
+                ProductId =
+                    product.ProductId,
+
+                ReleaseId =
+                    product.ReleaseId,
+
+                ReleaseTitle =
+                    product.Release.Title,
+
+                Format =
+                    product.Format,
+
+                Price =
+                    product.Price,
+
+                ProductDescription =
+                    product.ProductDescription,
+
+                Stock =
+                    product.Stock,
+
+                ModificationType =
+                    ModificationType.UPDATE
+            };
+
+
+        return View(model);
+    }
+
+
+    // =========================================================
+    // EDIT PRODUCT - POST
+    // =========================================================
+
+    [HttpPost]
+    [ValidateAntiForgeryToken]
+    public IActionResult EditProduct(
+        EditProductViewModel model)
+    {
+        if (!IsProductManager())
+            return Forbid();
+
+
+        var product = _context.Products
+            .Include(p => p.Release)
+            .FirstOrDefault(p =>
+                p.ProductId == model.ProductId);
+
+
+        if (product == null)
+            return NotFound();
+
+
+        // These values come from the database.
+        model.ReleaseId =
+            product.ReleaseId;
+
+        model.ReleaseTitle =
+            product.Release.Title;
+
+        model.Format =
+            product.Format;
+
+
+        // Display-only fields should not block
+        // validation of the submitted form.
+        ModelState.Remove(
+            nameof(model.ReleaseId));
+
+        ModelState.Remove(
+            nameof(model.ReleaseTitle));
+
+        ModelState.Remove(
+            nameof(model.Format));
+
+
+        // =====================================================
+        // DISCOUNT VALIDATION
+        // =====================================================
+
+        if (model.ModificationType ==
+            ModificationType.DISCOUNT)
+        {
+            if (!model.Discount.HasValue)
+            {
+                ModelState.AddModelError(
+                    nameof(model.Discount),
+                    "Please enter a discount percentage.");
+            }
+            else if (
+                model.Discount.Value <= 0 ||
+                model.Discount.Value >= 100)
+            {
+                ModelState.AddModelError(
+                    nameof(model.Discount),
+                    "Discount must be greater than 0 and less than 100.");
+            }
+        }
+
+
+        if (!ModelState.IsValid)
+            return View(model);
+
+
+        using var transaction =
+            _context.Database.BeginTransaction();
+
+
+        try
+        {
+            // =================================================
+            // APPLY DISCOUNT
+            // =================================================
+
+            if (model.ModificationType ==
+                ModificationType.DISCOUNT)
+            {
+                var discountPercentage =
+                    model.Discount!.Value;
+
+
+                var oldPrice =
+                    product.Price;
+
+
+                var discountAmount =
+                    oldPrice *
+                    (discountPercentage / 100m);
+
+
+                var newPrice =
+                    oldPrice - discountAmount;
+
+
+                newPrice =
+                    Math.Round(
+                        newPrice,
+                        2,
+                        MidpointRounding.AwayFromZero);
+
+
+                // Product.Price becomes the
+                // actual current sale price.
+                product.Price =
+                    newPrice;
+
+
+                _context.Products.Update(
+                    product);
+
+                _context.SaveChanges();
+
+
+                CreateModification(
+                    ModificationType.DISCOUNT,
+                    product.ProductId,
+                    discountPercentage);
+
+
+                transaction.Commit();
+
+
+                TempData["Success"] =
+                    $"{discountPercentage:0.##}% discount applied. " +
+                    $"Price changed from {oldPrice:C} to {newPrice:C}.";
+
+
+                return RedirectToAction(
+                    nameof(Products));
+            }
+
+
+            // =================================================
+            // NORMAL UPDATE
+            // =================================================
+
+            product.Price =
+                model.Price;
+
+            product.ProductDescription =
+                model.ProductDescription;
+
+            product.Stock =
+                model.Stock;
+
+
+            _context.Products.Update(
+                product);
+
+            _context.SaveChanges();
+
+
+            CreateModification(
+                ModificationType.UPDATE,
+                product.ProductId);
+
+
+            transaction.Commit();
+
+
+            TempData["Success"] =
+                $"{product.Release.Title} was updated successfully.";
+
+
+            return RedirectToAction(
+                nameof(Products));
+        }
+        catch
+        {
+            transaction.Rollback();
+
+            throw;
+        }
+    }
+
+
+    // =========================================================
+    // CREATE RELEASE - GET
+    // =========================================================
+
+    [HttpGet]
+    public IActionResult CreateRelease()
+    {
+        if (!IsAdmin())
+            return Forbid();
+
+
+        LoadArtists();
+
+
+        var model =
+            new CreateReleaseViewModel
+            {
+                ReleaseDate =
+                    DateTime.Today,
+
+                ReleaseType =
+                    "ALBUM",
+
+                // Start an album with one empty track.
+                Tracks =
+                    new List<CreateTrackViewModel>
+                    {
+                        new CreateTrackViewModel()
+                    }
+            };
+
+
+        return View(model);
+    }
+
+
+    // =========================================================
+    // CREATE RELEASE - POST
+    // =========================================================
+
+    [HttpPost]
+    [ValidateAntiForgeryToken]
+    public IActionResult CreateRelease(
+        CreateReleaseViewModel model)
+    {
+        if (!IsAdmin())
+            return Forbid();
+
+
+        // =====================================================
+        // RELEASE TYPE VALIDATION
+        // =====================================================
+
+        if (model.ReleaseType != "ALBUM" &&
+            model.ReleaseType != "SINGLE")
+        {
+            ModelState.AddModelError(
+                nameof(model.ReleaseType),
+                "Please select Album or Single.");
+        }
+
+
+        // =====================================================
+        // MAIN ARTIST VALIDATION
+        // =====================================================
+
+        var mainArtistExists =
+            _context.Artists.Any(a =>
+                a.ArtistId ==
+                model.MainArtistId);
+
+
+        if (!mainArtistExists)
+        {
+            ModelState.AddModelError(
+                nameof(model.MainArtistId),
+                "Please select a valid main artist.");
+        }
+
+
+        // =====================================================
+        // FEATURED ARTISTS
+        // =====================================================
+
+        model.FeaturedArtistIds ??=
+            new List<long>();
+
+
+        model.FeaturedArtistIds =
+            model.FeaturedArtistIds
+                .Distinct()
+                .ToList();
+
+
+        // Do not allow the main artist
+        // to also be a featured artist.
+        model.FeaturedArtistIds.Remove(
+            model.MainArtistId);
+
+
+        // Validate that featured artists exist.
+        if (model.FeaturedArtistIds.Count > 0)
+        {
+            var validFeaturedArtistCount =
+                _context.Artists.Count(a =>
+                    model.FeaturedArtistIds
+                        .Contains(a.ArtistId));
+
+
+            if (validFeaturedArtistCount !=
+                model.FeaturedArtistIds.Count)
+            {
+                ModelState.AddModelError(
+                    nameof(model.FeaturedArtistIds),
+                    "One or more featured artists are invalid.");
+            }
+        }
+
+
+        // =====================================================
+        // SINGLE VALIDATION
+        // =====================================================
+
+        if (model.ReleaseType == "SINGLE")
+        {
+            if (string.IsNullOrWhiteSpace(
+                model.SingleDuration))
+            {
+                ModelState.AddModelError(
+                    nameof(model.SingleDuration),
+                    "Duration is required for a single.");
+            }
+        }
+
+
+        // =====================================================
+        // ALBUM VALIDATION
+        // =====================================================
+
+        if (model.ReleaseType == "ALBUM")
+        {
+            model.Tracks ??=
+                new List<CreateTrackViewModel>();
+
+
+            // Remove completely empty rows.
+            model.Tracks =
+                model.Tracks
+                    .Where(t =>
+                        !string.IsNullOrWhiteSpace(
+                            t.SongName) ||
+                        !string.IsNullOrWhiteSpace(
+                            t.SongDuration))
+                    .ToList();
+
+
+            if (model.Tracks.Count == 0)
+            {
+                ModelState.AddModelError(
+                    nameof(model.Tracks),
+                    "An album must contain at least one track.");
+            }
+
+
+            for (var i = 0;
+                 i < model.Tracks.Count;
+                 i++)
+            {
+                var track =
+                    model.Tracks[i];
+
+
+                if (string.IsNullOrWhiteSpace(
+                    track.SongName))
+                {
+                    ModelState.AddModelError(
+                        $"Tracks[{i}].SongName",
+                        "Track name is required.");
+                }
+
+
+                if (string.IsNullOrWhiteSpace(
+                    track.SongDuration))
+                {
+                    ModelState.AddModelError(
+                        $"Tracks[{i}].SongDuration",
+                        "Track duration is required.");
+                }
+
+
+                track.ArtistIds ??=
+                    new List<long>();
+
+
+                track.ArtistIds =
+                    track.ArtistIds
+                        .Distinct()
+                        .ToList();
+
+
+                // Validate selected track artists.
+                if (track.ArtistIds.Count > 0)
+                {
+                    var validTrackArtistCount =
+                        _context.Artists.Count(a =>
+                            track.ArtistIds.Contains(
+                                a.ArtistId));
+
+
+                    if (validTrackArtistCount !=
+                        track.ArtistIds.Count)
+                    {
+                        ModelState.AddModelError(
+                            $"Tracks[{i}].ArtistIds",
+                            "One or more selected track artists are invalid.");
+                    }
+                }
+            }
+        }
+
+
+        if (!ModelState.IsValid)
+        {
+            LoadArtists();
+
+            return View(model);
+        }
+
+
+        using var transaction =
+            _context.Database.BeginTransaction();
+
+
+        try
+        {
+            // =================================================
+            // CREATE RELEASE
+            // =================================================
+
+            var release =
+                new Release
+                {
+                    ReleaseId =
+                        GetNextReleaseId(),
+
+                    Title =
+                        model.Title.Trim(),
+
+                    RecordLabel =
+                        string.IsNullOrWhiteSpace(
+                            model.RecordLabel)
+                            ? null
+                            : model.RecordLabel.Trim(),
+
+                    Genre =
+                        model.Genre.Trim(),
+
+                    ReleaseDate =
+                        model.ReleaseDate,
+
+                    CoverPhoto =
+                        model.CoverPhoto.Trim()
+                };
+
+
+            _context.Releases.Add(
+                release);
+
+            _context.SaveChanges();
+
+
+            // =================================================
+            // MAIN RELEASE ARTIST
+            // =================================================
+
+            var mainReleaseArtist =
+                new ReleaseArtist
+                {
+                    ReleaseId =
+                        release.ReleaseId,
+
+                    ArtistId =
+                        model.MainArtistId,
+
+                    ReleaseOrdinal = 1,
+
+                    Type =
+                        ArtistReleaseType.MAIN
+                };
+
+
+            _context.ReleaseArtists.Add(
+                mainReleaseArtist);
+
+
+            // =================================================
+            // FEATURED RELEASE ARTISTS
+            // =================================================
+
+            long releaseOrdinal = 2;
+
+
+            foreach (var artistId
+                     in model.FeaturedArtistIds)
+            {
+                var featuredArtist =
+                    new ReleaseArtist
+                    {
+                        ReleaseId =
+                            release.ReleaseId,
+
+                        ArtistId =
+                            artistId,
+
+                        ReleaseOrdinal =
+                            releaseOrdinal++,
+
+                        Type =
+                            ArtistReleaseType.FEATURE
+                    };
+
+
+                _context.ReleaseArtists.Add(
+                    featuredArtist);
+            }
+
+
+            _context.SaveChanges();
+
+
+            // =================================================
+            // ALBUM
+            // =================================================
+
+            if (model.ReleaseType == "ALBUM")
+            {
+                var album =
+                    new Album
+                    {
+                        ReleaseId =
+                            release.ReleaseId
+                    };
+
+
+                _context.Albums.Add(
+                    album);
+
+                _context.SaveChanges();
+
+
+                // =============================================
+                // TRACKS
+                // =============================================
+
+                foreach (var trackModel
+                         in model.Tracks)
+                {
+                    var song =
+                        new Song
+                        {
+                            SongId =
+                                GetNextSongId(),
+
+                            SongName =
+                                trackModel
+                                    .SongName
+                                    .Trim(),
+
+                            SongDuration =
+                                trackModel
+                                    .SongDuration
+                                    .Trim()
+                        };
+
+
+                    _context.Songs.Add(
+                        song);
+
+                    _context.SaveChanges();
+
+
+                    // =========================================
+                    // LINK SONG TO ALBUM
+                    // =========================================
+
+                    var albumSong =
+                        new AlbumSong
+                        {
+                            AlbumId =
+                                release.ReleaseId,
+
+                            SongId =
+                                song.SongId
+                        };
+
+
+                    _context.AlbumSongs.Add(
+                        albumSong);
+
+
+                    // =========================================
+                    // SONG ARTISTS
+                    // =========================================
+
+                    var trackArtistIds =
+                        trackModel.ArtistIds
+                            .Distinct()
+                            .ToList();
+
+
+                    // If no track artists were selected,
+                    // automatically use the release's
+                    // main artist.
+                    if (trackArtistIds.Count == 0)
+                    {
+                        trackArtistIds.Add(
+                            model.MainArtistId);
+                    }
+
+
+                    long songOrdinal = 1;
+
+
+                    foreach (var artistId
+                             in trackArtistIds)
+                    {
+                        var songArtist =
+                            new SongArtist
+                            {
+                                SongId =
+                                    song.SongId,
+
+                                ArtistId =
+                                    artistId,
+
+                                SongOrdinal =
+                                    songOrdinal++
+                            };
+
+
+                        _context.SongArtists.Add(
+                            songArtist);
+                    }
+
+
+                    _context.SaveChanges();
+                }
+            }
+
+
+            // =================================================
+            // SINGLE
+            // =================================================
+
+            else
+            {
+                var single =
+                    new SingleRelease
+                    {
+                        ReleaseId =
+                            release.ReleaseId,
+
+                        Duration =
+                            model.SingleDuration!
+                                .Trim()
+                    };
+
+
+                _context.SingleReleases.Add(
+                    single);
+
+                _context.SaveChanges();
+            }
+
+
+            transaction.Commit();
+
+
+            TempData["Success"] =
+                $"{release.Title} was created successfully.";
+
+
+            return RedirectToAction(
+                nameof(Index));
+        }
+        catch
+        {
+            transaction.Rollback();
+
+            throw;
+        }
+    }
+
+
+    // =========================================================
+    // AUTHORIZATION HELPERS
+    // =========================================================
 
     private bool IsAdmin()
     {
         return HttpContext.Session
-            .GetString("Role") == "Admin";
+            .GetString("Role") ==
+            "Admin";
     }
 
@@ -155,33 +955,80 @@
     private bool IsProductManager()
     {
-        var role = HttpContext.Session
-            .GetString("Role");
-
-        var adminType = HttpContext.Session
-            .GetString("AdminType");
+        var role =
+            HttpContext.Session
+                .GetString("Role");
+
+        var adminType =
+            HttpContext.Session
+                .GetString("AdminType");
+
 
         return role == "Admin" &&
-               (adminType == "PRODUCT_MANAGER" ||
-                adminType == "SUPER_ADMIN");
-    }
-
+               (
+                   adminType == "PRODUCT_MANAGER" ||
+                   adminType == "SUPER_ADMIN"
+               );
+    }
+
+
+    // =========================================================
+    // CURRENT ADMIN ID
+    // =========================================================
 
     private long? GetCurrentUserId()
     {
-        var value = HttpContext.Session
-            .GetString("UserId");
-
-        if (long.TryParse(value, out var userId))
-            return userId;
-
-        return null;
-    }
-
+        var userId =
+            HttpContext.Session
+                .GetInt32("UserId");
+
+
+        if (!userId.HasValue)
+            return null;
+
+
+        return userId.Value;
+    }
+
+
+    // =========================================================
+    // LOAD RELEASES
+    // =========================================================
+
+    private void LoadReleases()
+    {
+        ViewBag.Releases =
+            _context.Releases
+                .OrderBy(x =>
+                    x.Title)
+                .ToList();
+    }
+
+
+    // =========================================================
+    // LOAD ARTISTS
+    // =========================================================
+
+    private void LoadArtists()
+    {
+        ViewBag.Artists =
+            _context.Artists
+                .OrderBy(a =>
+                    a.ArtistName)
+                .ToList();
+    }
+
+
+    // =========================================================
+    // NEXT PRODUCT ID
+    // =========================================================
 
     private long GetNextProductId()
     {
-        var maxId = _context.Products
-            .Select(x => (long?)x.ProductId)
-            .Max();
+        var maxId =
+            _context.Products
+                .Select(x =>
+                    (long?)x.ProductId)
+                .Max();
+
 
         return (maxId ?? 0) + 1;
@@ -189,11 +1036,58 @@
 
 
-    private void LoadReleases()
-    {
-        ViewBag.Releases = _context.Releases
-            .OrderBy(x => x.Title)
-            .ToList();
-    }
-
+    // =========================================================
+    // NEXT RELEASE ID
+    // =========================================================
+
+    private long GetNextReleaseId()
+    {
+        var maxId =
+            _context.Releases
+                .Select(x =>
+                    (long?)x.ReleaseId)
+                .Max();
+
+
+        return (maxId ?? 0) + 1;
+    }
+
+
+    // =========================================================
+    // NEXT SONG ID
+    // =========================================================
+
+    private long GetNextSongId()
+    {
+        var maxId =
+            _context.Songs
+                .Select(x =>
+                    (long?)x.SongId)
+                .Max();
+
+
+        return (maxId ?? 0) + 1;
+    }
+
+
+    // =========================================================
+    // NEXT MODIFICATION ID
+    // =========================================================
+
+    private long GetNextModificationId()
+    {
+        var maxId =
+            _context.Modifications
+                .Select(x =>
+                    (long?)x.ModificationId)
+                .Max();
+
+
+        return (maxId ?? 0) + 1;
+    }
+
+
+    // =========================================================
+    // CREATE MODIFICATION RECORD
+    // =========================================================
 
     private void CreateModification(
@@ -202,26 +1096,37 @@
         decimal? discount = null)
     {
-        var adminId = GetCurrentUserId();
+        var adminId =
+            GetCurrentUserId();
+
 
         if (adminId == null)
-            return;
-
-
-        var modification = new Modification
-        {
-            ModificationId =
-                GetNextModificationId(),
-
-            AdminId = adminId.Value,
-
-            DateModified = DateTime.Today,
-
-            TypeOfModification = type,
-
-            Discount = discount
-        };
-
-
-        _context.Modifications.Add(modification);
+        {
+            throw new InvalidOperationException(
+                "The current admin could not be identified.");
+        }
+
+
+        var modification =
+            new Modification
+            {
+                ModificationId =
+                    GetNextModificationId(),
+
+                AdminId =
+                    adminId.Value,
+
+                DateModified =
+                    DateTime.Today,
+
+                TypeOfModification =
+                    type,
+
+                Discount =
+                    discount
+            };
+
+
+        _context.Modifications.Add(
+            modification);
 
         _context.SaveChanges();
@@ -234,5 +1139,6 @@
                     modification.ModificationId,
 
-                ProductId = productId
+                ProductId =
+                    productId
             };
 
@@ -243,146 +1149,3 @@
         _context.SaveChanges();
     }
-
-
-    private long GetNextModificationId()
-    {
-        var maxId = _context.Modifications
-            .Select(x => (long?)x.ModificationId)
-            .Max();
-
-        return (maxId ?? 0) + 1;
-    }
-    // ==========================================
-// UC009
-// MODIFY PRODUCT - GET
-// ==========================================
-
-    [HttpGet]
-    public IActionResult EditProduct(long id)
-    {
-        if (!IsProductManager())
-            return Forbid();
-
-        var product = _context.Products
-            .Include(p => p.Release)
-            .FirstOrDefault(p => p.ProductId == id);
-
-        if (product == null)
-            return NotFound();
-
-        var model = new EditProductViewModel
-        {
-            ProductId = product.ProductId,
-            ReleaseId = product.ReleaseId,
-            ReleaseTitle = product.Release.Title,
-            Format = product.Format,
-            Price = product.Price,
-            ProductDescription = product.ProductDescription,
-            Stock = product.Stock
-        };
-
-        return View(model);
-    }
-    // ==========================================
-// UC009
-// MODIFY PRODUCT - POST
-// ==========================================
-
-[HttpPost]
-[ValidateAntiForgeryToken]
-public IActionResult EditProduct(
-    EditProductViewModel model)
-{
-    if (!IsProductManager())
-        return Forbid();
-
-    var product = _context.Products
-        .Include(p => p.Release)
-        .FirstOrDefault(p =>
-            p.ProductId == model.ProductId);
-
-    if (product == null)
-        return NotFound();
-
-    if (!ModelState.IsValid)
-    {
-        model.ReleaseTitle = product.Release.Title;
-        model.ReleaseId = product.ReleaseId;
-        model.Format = product.Format;
-
-        return View(model);
-    }
-
-
-    // ==========================================
-    // DISCOUNT
-    // ==========================================
-
-    if (model.ModificationType ==
-        ModificationType.DISCOUNT)
-    {
-        if (!model.Discount.HasValue)
-        {
-            ModelState.AddModelError(
-                "Discount",
-                "Please enter a discount percentage.");
-
-            model.ReleaseTitle = product.Release.Title;
-            model.ReleaseId = product.ReleaseId;
-            model.Format = product.Format;
-
-            return View(model);
-        }
-
-        product.Price =
-            product.Price *
-            (1 - model.Discount.Value / 100m);
-    }
-    else
-    {
-        // ==========================================
-        // NORMAL UPDATE
-        // ==========================================
-
-        product.Price = model.Price;
-
-        product.ProductDescription =
-            model.ProductDescription;
-
-        product.Stock = model.Stock;
-    }
-
-
-    _context.SaveChanges();
-
-
-    // ==========================================
-    // RECORD MODIFICATION
-    // ==========================================
-
-    CreateModification(
-        model.ModificationType,
-        product.ProductId,
-        model.Discount);
-
-
-    TempData["Success"] =
-        "Product modified successfully.";
-
-    return RedirectToAction(nameof(Index));
 }
-[HttpGet]
-public IActionResult Products()
-{
-    if (!IsProductManager())
-        return Forbid();
-
-    var products = _context.Products
-        .Include(p => p.Release)
-        .OrderBy(p => p.Release.Title)
-        .ThenBy(p => p.Format)
-        .ToList();
-
-    return View(products);
-}
-}
Index: KernelRecordsMVC.Web/Controllers/HomeController.cs
===================================================================
--- KernelRecordsMVC.Web/Controllers/HomeController.cs	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Controllers/HomeController.cs	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -1,8 +1,7 @@
 using System.Diagnostics;
+using KernelRecordsMVC.Models;
 using Microsoft.AspNetCore.Mvc;
-using KernelRecordsMVC.Models;
-using Microsoft.Extensions.Logging;
 
-namespace KernelRecordsMVC.Controllers;
+namespace KernelRecordsMVC.Web.Controllers;
 
 public class HomeController : Controller
Index: KernelRecordsMVC.Web/Controllers/OrderController.cs
===================================================================
--- KernelRecordsMVC.Web/Controllers/OrderController.cs	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Controllers/OrderController.cs	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -1,12 +1,10 @@
-﻿using Microsoft.AspNetCore.Http;
-
-namespace KernelRecordsMVC.Controllers;
-
+﻿using KernelRecordsMVC.Application.ViewModels;
+using KernelRecordsMVC.Domain.Enums;
+using KernelRecordsMVC.Infrastructure.Data;
+using KernelRecordsMVC.Models;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.EntityFrameworkCore;
-using KernelRecordsMVC.Data;
-using KernelRecordsMVC.Models;
-using KernelRecordsMVC.Domain.Enums;
-using KernelRecordsMVC.Application.ViewModels;
+
+namespace KernelRecordsMVC.Web.Controllers;
 
 public class OrderController : Controller
@@ -67,17 +65,9 @@
             order = new Order
             {
-                OrderId = GetNextOrderId(),
                 UserId = userId.Value,
-
-                // The actual payment method will be
-                // selected during checkout.
                 PaymentMethod = PaymentMethodType.CARD,
-
                 PurchaseDate = DateTime.Today,
-
                 PointsEarned = 0,
-
                 PointsUsed = null,
-
                 Status = OrderStatusType.PENDING
             };
@@ -113,4 +103,29 @@
         else
         {
+            var discount = _context.ModificationProducts
+                .Include(mp => mp.Modification)
+                .Where(mp =>
+                    mp.ProductId == product.ProductId &&
+                    mp.Modification.TypeOfModification ==
+                    ModificationType.DISCOUNT &&
+                    mp.Modification.Discount.HasValue &&
+                    mp.Modification.Discount.Value > 0)
+                .Select(mp => mp.Modification)
+                .OrderByDescending(m => m.DateModified)
+                .FirstOrDefault();
+
+            var priceAtPurchase = product.Price;
+
+            if (discount != null)
+            {
+                priceAtPurchase =
+                    product.Price -
+                    (product.Price * discount.Discount!.Value / 100m);
+
+                priceAtPurchase = Math.Round(
+                    priceAtPurchase,
+                    2);
+            }
+
             var orderProduct = new OrderProduct
             {
@@ -186,5 +201,7 @@
 
                     Stock =
-                        op.Product.Stock
+                        op.Product.Stock,
+                    
+                    CoverPhoto = op.Product.Release.CoverPhoto
                 })
                 .ToList();
@@ -294,25 +311,10 @@
     private long? GetUserId()
     {
-        var value =
-            HttpContext.Session.GetString("UserId");
-
-        if (long.TryParse(value, out var userId))
-            return userId;
+        var userId = HttpContext.Session.GetInt32("UserId");
+
+        if (userId.HasValue)
+            return userId.Value;
 
         return null;
     }
-
-
-    // ==========================================
-    // ORDER ID
-    // ==========================================
-
-    private long GetNextOrderId()
-    {
-        var maxId = _context.Orders
-            .Select(x => (long?)x.OrderId)
-            .Max();
-
-        return (maxId ?? 0) + 1;
-    }
 }
Index: KernelRecordsMVC.Web/Controllers/ReleaseController.cs
===================================================================
--- KernelRecordsMVC.Web/Controllers/ReleaseController.cs	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Controllers/ReleaseController.cs	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -1,7 +1,8 @@
-﻿using Microsoft.AspNetCore.Mvc;
+﻿using KernelRecordsMVC.Domain.Enums;
+using KernelRecordsMVC.Infrastructure.Data;
+using Microsoft.AspNetCore.Mvc;
 using Microsoft.EntityFrameworkCore;
-using KernelRecordsMVC.Data;
 
-namespace KernelRecordsMVC.Controllers;
+namespace KernelRecordsMVC.Web.Controllers;
 
 public class ReleaseController : Controller
@@ -14,19 +15,37 @@
     }
 
-    // UC003 - Browse Releases
-    public IActionResult Index(string? search, string? genre)
+    // =========================================================
+    // BROWSE RELEASES
+    // =========================================================
+
+    public IActionResult Index(
+        string? search,
+        string? genre,
+        string? format,
+        string? type,
+        string? sort)
     {
         var query = _context.Releases
             .Include(r => r.Products)
             .Include(r => r.ReleaseArtists)
-            .ThenInclude(ra => ra.Artist)
+                .ThenInclude(ra => ra.Artist)
+            .Include(r => r.Album)
+            .Include(r => r.SingleRelease)
             .AsQueryable();
 
+        // SEARCH
         if (!string.IsNullOrWhiteSpace(search))
         {
+            search = search.Trim();
+
             query = query.Where(r =>
-                r.Title.ToLower().Contains(search.ToLower()));
+                r.Title.ToLower().Contains(search.ToLower()) ||
+                r.Genre.ToLower().Contains(search.ToLower()) ||
+                r.ReleaseArtists.Any(ra =>
+                    ra.Artist.ArtistName.ToLower()
+                        .Contains(search.ToLower())));
         }
 
+        // GENRE
         if (!string.IsNullOrWhiteSpace(genre))
         {
@@ -35,10 +54,66 @@
         }
 
-        var releases = query
-            .OrderBy(r => r.Title)
-            .ToList();
+        // FORMAT
+        if (!string.IsNullOrWhiteSpace(format))
+        {
+            query = query.Where(r =>
+                r.Products.Any(p =>
+                    p.Format.ToString() == format));
+        }
+
+        // TYPE
+        if (!string.IsNullOrWhiteSpace(type))
+        {
+            if (type.Equals("Album", StringComparison.OrdinalIgnoreCase))
+            {
+                query = query.Where(r => r.Album != null);
+            }
+            else if (type.Equals("Single", StringComparison.OrdinalIgnoreCase))
+            {
+                query = query.Where(r => r.SingleRelease != null);
+            }
+        }
+
+        // SORT
+        query = sort switch
+        {
+            "titleDesc" =>
+                query.OrderByDescending(r => r.Title),
+
+            "newest" =>
+                query.OrderByDescending(r => r.ReleaseDate),
+
+            "oldest" =>
+                query.OrderBy(r => r.ReleaseDate),
+
+            "format" =>
+                query.OrderBy(r =>
+                    r.Products
+                        .Select(p => p.Format.ToString())
+                        .FirstOrDefault()),
+
+            "priceAsc" =>
+                query.OrderBy(r =>
+                    r.Products
+                        .Select(p => (decimal?)p.Price)
+                        .Min()),
+
+            "priceDesc" =>
+                query.OrderByDescending(r =>
+                    r.Products
+                        .Select(p => (decimal?)p.Price)
+                        .Max()),
+
+            _ =>
+                query.OrderBy(r => r.Title)
+        };
+
+        var releases = query.ToList();
 
         ViewBag.Search = search;
         ViewBag.Genre = genre;
+        ViewBag.Format = format;
+        ViewBag.Type = type;
+        ViewBag.Sort = sort;
 
         ViewBag.Genres = _context.Releases
@@ -48,21 +123,33 @@
             .ToList();
 
+        ViewBag.Formats = Enum
+            .GetValues<ProductFormat>()
+            .Select(x => x.ToString())
+            .ToList();
+
         return View(releases);
     }
 
 
-    // Release details
+    // =========================================================
+    // DETAILS
+    // =========================================================
+
     public IActionResult Details(long id)
     {
         var release = _context.Releases
             .Include(r => r.Products)
+
             .Include(r => r.ReleaseArtists)
-            .ThenInclude(ra => ra.Artist)
+                .ThenInclude(ra => ra.Artist)
+
             .Include(r => r.Album)
-            .ThenInclude(a => a!.AlbumSongs)
-            .ThenInclude(x => x.Song)
+                .ThenInclude(a => a!.AlbumSongs)
+                    .ThenInclude(x => x.Song)
+                        .ThenInclude(s => s.SongArtists)
+                            .ThenInclude(sa => sa.Artist)
+
             .Include(r => r.SingleRelease)
-            .ThenInclude(s => s!.SingleFeatures)
-            .ThenInclude(x => x.Song)
+
             .FirstOrDefault(r => r.ReleaseId == id);
 
Index: KernelRecordsMVC.Web/Controllers/SaleController.cs
===================================================================
--- KernelRecordsMVC.Web/Controllers/SaleController.cs	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
+++ KernelRecordsMVC.Web/Controllers/SaleController.cs	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -0,0 +1,125 @@
+﻿using KernelRecordsMVC.Application.ViewModels;
+using KernelRecordsMVC.Domain.Enums;
+using KernelRecordsMVC.Infrastructure.Data;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.EntityFrameworkCore;
+
+namespace KernelRecordsMVC.Web.Controllers;
+
+public class SaleController : Controller
+{
+    private readonly KernelRecordsContext _context;
+
+    public SaleController(KernelRecordsContext context)
+    {
+        _context = context;
+    }
+
+    public IActionResult Index()
+    {
+        var products = _context.Products
+            .Include(p => p.Release)
+                .ThenInclude(r => r.ReleaseArtists)
+                    .ThenInclude(ra => ra.Artist)
+            .Include(p => p.ModificationProducts)
+                .ThenInclude(mp => mp.Modification)
+            .ToList();
+
+
+        var result = new List<SaleItemViewModel>();
+
+
+        foreach (var product in products)
+        {
+            // Get the latest modification for this product.
+            var latestModification = product.ModificationProducts
+                .Select(x => x.Modification)
+                .OrderByDescending(m => m.DateModified)
+                .ThenByDescending(m => m.ModificationId)
+                .FirstOrDefault();
+
+
+            // Product is only considered currently on sale
+            // if its latest modification is a discount.
+            if (latestModification == null ||
+                latestModification.TypeOfModification != ModificationType.DISCOUNT ||
+                !latestModification.Discount.HasValue ||
+                latestModification.Discount.Value <= 0)
+            {
+                continue;
+            }
+
+
+            var percentage =
+                latestModification.Discount.Value;
+
+
+            // IMPORTANT:
+            // Product.Price already contains the discounted price.
+            var salePrice =
+                product.Price;
+
+
+            // Reconstruct the price before the discount
+            // so it can be displayed crossed out.
+            var originalPrice =
+                percentage > 0 &&
+                percentage < 100
+                    ? Math.Round(
+                        salePrice /
+                        (1m - percentage / 100m),
+                        2,
+                        MidpointRounding.AwayFromZero)
+                    : salePrice;
+
+
+            result.Add(new SaleItemViewModel
+            {
+                ProductId =
+                    product.ProductId,
+
+                ReleaseId =
+                    product.ReleaseId,
+
+                ReleaseTitle =
+                    product.Release.Title,
+
+                CoverPhoto =
+                    product.Release.CoverPhoto,
+
+                Format =
+                    product.Format.ToString(),
+
+                OriginalPrice =
+                    originalPrice,
+
+                SalePrice =
+                    salePrice,
+
+                DiscountPercentage =
+                    percentage,
+
+                Stock =
+                    product.Stock,
+
+                ArtistName =
+                    string.Join(
+                        ", ",
+                        product.Release.ReleaseArtists
+                            .OrderBy(x => x.ReleaseOrdinal)
+                            .Select(x => x.Artist.ArtistName))
+            });
+        }
+
+
+        result = result
+            .OrderByDescending(x =>
+                x.DiscountPercentage)
+            .ThenBy(x =>
+                x.ReleaseTitle)
+            .ToList();
+
+
+        return View(result);
+    }
+}
Index: KernelRecordsMVC.Web/Controllers/TopSellersController.cs
===================================================================
--- KernelRecordsMVC.Web/Controllers/TopSellersController.cs	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
+++ KernelRecordsMVC.Web/Controllers/TopSellersController.cs	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -0,0 +1,79 @@
+﻿using KernelRecordsMVC.Application.ViewModels;
+using KernelRecordsMVC.Domain.Enums;
+using KernelRecordsMVC.Infrastructure.Data;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.EntityFrameworkCore;
+
+namespace KernelRecordsMVC.Web.Controllers;
+
+public class TopSellersController : Controller
+{
+    private readonly KernelRecordsContext _context;
+
+    public TopSellersController(KernelRecordsContext context)
+    {
+        _context = context;
+    }
+
+    public IActionResult Index()
+    {
+        var completedStatuses = new[]
+        {
+            OrderStatusType.PAID,
+            OrderStatusType.SHIPPED,
+            OrderStatusType.DELIVERED
+        };
+
+        var sellers = _context.OrderProducts
+            .Where(op =>
+                completedStatuses.Contains(op.Order.Status))
+            .GroupBy(op => op.ProductId)
+            .Select(g => new
+            {
+                ProductId = g.Key,
+                QuantitySold = g.Sum(x => x.Quantity)
+            })
+            .OrderByDescending(x => x.QuantitySold)
+            .Take(20)
+            .ToList();
+
+        var productIds = sellers
+            .Select(x => x.ProductId)
+            .ToList();
+
+        var products = _context.Products
+            .Include(p => p.Release)
+                .ThenInclude(r => r.ReleaseArtists)
+                    .ThenInclude(ra => ra.Artist)
+            .Where(p => productIds.Contains(p.ProductId))
+            .ToList();
+
+        var result = sellers
+            .Select(s =>
+            {
+                var product = products
+                    .First(p => p.ProductId == s.ProductId);
+
+                return new TopSellerViewModel
+                {
+                    ProductId = product.ProductId,
+                    ReleaseId = product.ReleaseId,
+                    ReleaseTitle = product.Release.Title,
+                    CoverPhoto = product.Release.CoverPhoto,
+                    Format = product.Format.ToString(),
+                    Price = product.Price,
+                    Stock = product.Stock,
+                    SoldQuantity = s.QuantitySold,
+
+                    ArtistName = string.Join(
+                        ", ",
+                        product.Release.ReleaseArtists
+                            .OrderBy(x => x.ReleaseOrdinal)
+                            .Select(x => x.Artist.ArtistName))
+                };
+            })
+            .ToList();
+
+        return View(result);
+    }
+}
Index: KernelRecordsMVC.Web/Controllers/WishlistController.cs
===================================================================
--- KernelRecordsMVC.Web/Controllers/WishlistController.cs	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
+++ KernelRecordsMVC.Web/Controllers/WishlistController.cs	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -0,0 +1,228 @@
+﻿using KernelRecordsMVC.Infrastructure.Data;
+using KernelRecordsMVC.Models;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.EntityFrameworkCore;
+
+namespace KernelRecordsMVC.Web.Controllers;
+
+public class WishlistController : Controller
+{
+    private readonly KernelRecordsContext _context;
+
+    public WishlistController(KernelRecordsContext context)
+    {
+        _context = context;
+    }
+
+    // ==========================================
+    // WISHLIST
+    // ==========================================
+
+    [HttpGet]
+    public IActionResult Index()
+    {
+        var userId = GetUserId();
+
+        if (userId == null)
+        {
+            return RedirectToAction(
+                "Login",
+                "Account");
+        }
+
+        var wishlist = _context.Wishlists
+            .Include(w => w.WishlistProducts)
+                .ThenInclude(wp => wp.Product)
+                    .ThenInclude(p => p.Release)
+            .FirstOrDefault(w => w.UserId == userId.Value);
+
+        if (wishlist == null)
+        {
+            return View(new Wishlist());
+        }
+
+        return View(wishlist);
+    }
+
+
+    // ==========================================
+    // ADD TO WISHLIST
+    // ==========================================
+
+    [HttpPost]
+    [ValidateAntiForgeryToken]
+    public IActionResult Add(long productId)
+    {
+        var userId = GetUserId();
+
+        if (userId == null)
+        {
+            return RedirectToAction(
+                "Login",
+                "Account");
+        }
+
+        var product = _context.Products
+            .Include(p => p.Release)
+            .FirstOrDefault(p => p.ProductId == productId);
+
+        if (product == null)
+            return NotFound();
+
+
+        // Find existing wishlist
+        var wishlist = _context.Wishlists
+            .Include(w => w.WishlistProducts)
+            .FirstOrDefault(w =>
+                w.UserId == userId.Value);
+
+
+        // Create wishlist if user doesn't have one
+        if (wishlist == null)
+        {
+            wishlist = new Wishlist
+            {
+                WishlistId = GetNextWishlistId(),
+                UserId = userId.Value
+            };
+
+            _context.Wishlists.Add(wishlist);
+            _context.SaveChanges();
+        }
+
+
+        // Check if product is already there
+        var alreadyExists = wishlist.WishlistProducts
+            .Any(x => x.ProductId == productId);
+
+        if (!alreadyExists)
+        {
+            var wishlistProduct = new WishlistProduct
+            {
+                WishlistId = wishlist.WishlistId,
+                ProductId = productId,
+                AddedAt = DateTime.Today
+            };
+
+            _context.WishlistProducts.Add(wishlistProduct);
+            _context.SaveChanges();
+
+            TempData["Success"] =
+                "Product added to your wishlist.";
+        }
+        else
+        {
+            TempData["Info"] =
+                "This product is already in your wishlist.";
+        }
+
+        return RedirectToAction(
+            "Details",
+            "Release",
+            new { id = product.ReleaseId });
+    }
+
+
+    // ==========================================
+    // REMOVE FROM WISHLIST
+    // ==========================================
+
+    [HttpPost]
+    [ValidateAntiForgeryToken]
+    public IActionResult Remove(long productId)
+    {
+        var userId = GetUserId();
+
+        if (userId == null)
+        {
+            return RedirectToAction(
+                "Login",
+                "Account");
+        }
+
+        var item = _context.WishlistProducts
+            .Include(x => x.Wishlist)
+            .FirstOrDefault(x =>
+                x.ProductId == productId &&
+                x.Wishlist.UserId == userId.Value);
+
+        if (item != null)
+        {
+            _context.WishlistProducts.Remove(item);
+            _context.SaveChanges();
+
+            TempData["Success"] =
+                "Product removed from your wishlist.";
+        }
+
+        return RedirectToAction(nameof(Index));
+    }
+
+
+    // ==========================================
+    // MOVE WISHLIST PRODUCT TO CART
+    // ==========================================
+
+    [HttpPost]
+    [ValidateAntiForgeryToken]
+    public IActionResult AddToCart(long productId)
+    {
+        var userId = GetUserId();
+
+        if (userId == null)
+        {
+            return RedirectToAction(
+                "Login",
+                "Account");
+        }
+
+        var product = _context.Products
+            .Include(p => p.Release)
+            .FirstOrDefault(p => p.ProductId == productId);
+
+        if (product == null)
+            return NotFound();
+
+        if (product.Stock <= 0)
+        {
+            TempData["Error"] =
+                "This product is currently out of stock.";
+
+            return RedirectToAction(nameof(Index));
+        }
+
+        return RedirectToAction(
+            "AddProduct",
+            "Order",
+            new { id = productId });
+    }
+
+
+    // ==========================================
+    // USER ID
+    // ==========================================
+
+    private long? GetUserId()
+    {
+        var userId = HttpContext.Session.GetInt32("UserId");
+
+        if (userId.HasValue)
+            return userId.Value;
+
+        return null;
+    }
+
+
+    // ==========================================
+    // WISHLIST ID
+    // ==========================================
+
+    private long GetNextWishlistId()
+    {
+        var maxId = _context.Wishlists
+            .Select(x => (long?)x.WishlistId)
+            .Max();
+
+        return (maxId ?? 0) + 1;
+    }
+}
Index: KernelRecordsMVC.Web/KernelRecordsMVC.Web.csproj
===================================================================
--- KernelRecordsMVC.Web/KernelRecordsMVC.Web.csproj	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/KernelRecordsMVC.Web.csproj	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -5,5 +5,6 @@
         <ImplicitUsings>enable</ImplicitUsings>
         <Nullable>enable</Nullable>
-    </PropertyGroup>
+      <UserSecretsId>7996030f-d5d7-4616-a943-1e4992329169</UserSecretsId>
+  </PropertyGroup>
 
     <ItemGroup>
@@ -37,4 +38,5 @@
     <ItemGroup>
       <PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.8" />
+      <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.8" />
     </ItemGroup>
 
Index: KernelRecordsMVC.Web/Program.cs
===================================================================
--- KernelRecordsMVC.Web/Program.cs	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Program.cs	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -1,16 +1,82 @@
 using Microsoft.EntityFrameworkCore;
-using KernelRecordsMVC.Data;
+using Npgsql;
+using Npgsql.NameTranslation;
+using KernelRecordsMVC.Domain.Enums;
+using KernelRecordsMVC.Infrastructure.Data;
 
 var builder = WebApplication.CreateBuilder(args);
 
+// ==========================================
+// AUTHENTICATION
+// ==========================================
+
+builder.Services
+    .AddAuthentication("Cookies")
+    .AddCookie("Cookies", options =>
+    {
+        options.LoginPath = "/Account/Login";
+        options.AccessDeniedPath = "/Account/Login";
+        options.ExpireTimeSpan = TimeSpan.FromHours(8);
+        options.SlidingExpiration = true;
+    });
+
+builder.Services.AddAuthorization();
+
 builder.Services.AddControllersWithViews();
 
+// ==========================================
+// DATABASE
+// ==========================================
+
+var dataSourceBuilder = new NpgsqlDataSourceBuilder(
+    builder.Configuration.GetConnectionString("KernelRecords"));
+
+var nameTranslator = new NpgsqlNullNameTranslator();
+
+dataSourceBuilder.MapEnum<AdminType>(
+    "project.admin_type",
+    nameTranslator);
+
+dataSourceBuilder.MapEnum<ProductFormat>(
+    "project.product_format",
+    nameTranslator);
+
+dataSourceBuilder.MapEnum<PaymentMethodType>(
+    "project.payment_method_type",
+    nameTranslator);
+
+dataSourceBuilder.MapEnum<OrderStatusType>(
+    "project.order_status_type",
+    nameTranslator);
+
+dataSourceBuilder.MapEnum<ModificationType>(
+    "project.modification_type",
+    nameTranslator);
+
+dataSourceBuilder.MapEnum<ArtistReleaseType>(
+    "project.artist_release_type",
+    nameTranslator);
+
+var dataSource = dataSourceBuilder.Build();
+
 builder.Services.AddDbContext<KernelRecordsContext>(options =>
-    options.UseNpgsql(
-        builder.Configuration.GetConnectionString("KernelRecords")));
+    options.UseNpgsql(dataSource));
 
-builder.Services.AddSession();
+// ==========================================
+// SESSION
+// ==========================================
+
+builder.Services.AddSession(options =>
+{
+    options.IdleTimeout = TimeSpan.FromHours(2);
+    options.Cookie.HttpOnly = true;
+    options.Cookie.IsEssential = true;
+});
 
 var app = builder.Build();
+
+// ==========================================
+// MIDDLEWARE
+// ==========================================
 
 if (!app.Environment.IsDevelopment())
@@ -21,4 +87,5 @@
 
 app.UseHttpsRedirection();
+
 app.UseStaticFiles();
 
@@ -26,4 +93,6 @@
 
 app.UseSession();
+
+app.UseAuthentication();
 
 app.UseAuthorization();
Index: KernelRecordsMVC.Web/Views/Account/Profile.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Account/Profile.cshtml	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
+++ KernelRecordsMVC.Web/Views/Account/Profile.cshtml	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -0,0 +1,216 @@
+﻿@model KernelRecordsMVC.Application.ViewModels.ProfileViewModel
+
+@{
+    ViewData["Title"] = "My Profile";
+}
+
+<div class="profile-page">
+
+    <div class="profile-header">
+
+        <span class="page-eyebrow">
+            ACCOUNT
+        </span>
+
+        <h1>My Profile</h1>
+
+        <p>
+            Manage your account information.
+        </p>
+
+    </div>
+
+
+    @if (TempData["Success"] != null)
+    {
+        <div class="profile-alert success">
+            @TempData["Success"]
+        </div>
+    }
+
+
+    <div class="profile-layout">
+
+        <!-- =================================================
+             ACCOUNT SUMMARY
+             ================================================= -->
+
+        <aside class="profile-sidebar">
+
+            <div class="profile-avatar">
+                @(string.IsNullOrWhiteSpace(Model.Username)
+                    ? "?"
+                    : Model.Username.Substring(0, 1).ToUpper())
+            </div>
+
+            <h2>
+                @Model.Username
+            </h2>
+
+            <p>
+                @Model.Email
+            </p>
+
+            <div class="profile-member">
+
+                <span>MEMBER SINCE</span>
+
+                <strong>
+                    @Model.DateCreated.ToString("MMMM yyyy")
+                </strong>
+
+            </div>
+
+
+            <div class="profile-points">
+
+                <span>REWARD POINTS</span>
+
+                <strong>
+                    @Model.PointsCollected
+                </strong>
+
+            </div>
+
+        </aside>
+
+
+        <!-- =================================================
+             EDIT PROFILE
+             ================================================= -->
+
+        <section class="profile-card">
+
+            <div class="profile-card-header">
+
+                <div>
+
+                    <span class="section-label">
+                        PERSONAL INFORMATION
+                    </span>
+
+                    <h2>Account Details</h2>
+
+                </div>
+
+            </div>
+
+
+            <form asp-action="Profile"
+                  method="post"
+                  class="profile-form">
+
+                @Html.AntiForgeryToken()
+
+
+                <div asp-validation-summary="ModelOnly"
+                     class="validation-summary">
+                </div>
+
+
+                <!-- USERNAME -->
+
+                <div class="profile-field">
+
+                    <label asp-for="Username">
+                        Username
+                    </label>
+
+                    <input asp-for="Username"
+                           type="text"
+                           readonly />
+
+                    <small>
+                        Your username cannot be changed.
+                    </small>
+
+                </div>
+
+
+                <!-- EMAIL -->
+
+                <div class="profile-field">
+
+                    <label asp-for="Email">
+                        Email
+                    </label>
+
+                    <input asp-for="Email" />
+
+                    <span asp-validation-for="Email"
+                          class="field-error">
+                    </span>
+
+                </div>
+
+
+                <!-- PHONE -->
+
+                <div class="profile-field">
+
+                    <label asp-for="TelephoneNumber">
+                        Telephone Number
+                    </label>
+
+                    <input asp-for="TelephoneNumber"
+                           placeholder="Enter your phone number" />
+
+                    <span asp-validation-for="TelephoneNumber"
+                          class="field-error">
+                    </span>
+
+                </div>
+
+
+                <!-- ADDRESS -->
+
+                <div class="profile-field">
+
+                    <label asp-for="ShippingAddress">
+                        Shipping Address
+                    </label>
+
+                    <textarea asp-for="ShippingAddress"
+                              rows="4"
+                              placeholder="Enter your shipping address">
+                    </textarea>
+
+                    <span asp-validation-for="ShippingAddress"
+                          class="field-error">
+                    </span>
+
+                </div>
+
+
+                <div class="profile-form-actions">
+
+                    <button type="submit"
+                            class="store-button primary">
+
+                        Save Changes
+
+                    </button>
+
+                    <a asp-controller="Home"
+                       asp-action="Index"
+                       class="store-button secondary">
+
+                        Cancel
+
+                    </a>
+
+                </div>
+
+            </form>
+
+        </section>
+
+    </div>
+
+</div>
+
+
+@section Scripts
+{
+    <partial name="_ValidationScriptsPartial" />
+}
Index: KernelRecordsMVC.Web/Views/Admin/CreateProduct.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Admin/CreateProduct.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Admin/CreateProduct.cshtml	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -1,168 +1,284 @@
 ﻿@model KernelRecordsMVC.Application.ViewModels.CreateProductViewModel
 
-<h1>New Product</h1>
-
-<p class="text-muted">
-    Add a physical product format for an existing release.
-</p>
-
-<form asp-action="CreateProduct"
-      method="post">
-
-    @Html.AntiForgeryToken()
-
-    <div asp-validation-summary="ModelOnly"
-         class="text-danger mb-3">
+@{
+    ViewData["Title"] = "New Product";
+}
+
+<div class="admin-page admin-form-page">
+
+    <!-- HEADER -->
+
+    <div class="admin-header">
+
+        <div>
+
+            <a asp-action="Products"
+               class="admin-back-link">
+
+                ← Products
+
+            </a>
+
+            <span class="admin-eyebrow">
+                INVENTORY
+            </span>
+
+            <h1>New Product</h1>
+
+            <p>
+                Add a new physical format to an existing release.
+            </p>
+
+        </div>
+
     </div>
 
 
-    <!-- RELEASE -->
-
-    <div class="mb-3">
-
-        <label asp-for="ReleaseId"
-               class="form-label">
-        </label>
-
-        <select asp-for="ReleaseId"
-                class="form-select">
-
-            <option value="">
-                -- Select Release --
-            </option>
-
-            @foreach (var release in ViewBag.Releases)
-            {
-                <option value="@release.ReleaseId">
-
-                    @release.Title
-                    (@release.ReleaseDate.ToString("yyyy"))
-
-                </option>
-            }
-
-        </select>
-
-        <span asp-validation-for="ReleaseId"
-              class="text-danger">
-        </span>
+    <div class="admin-form-layout">
+
+
+        <!-- =================================================
+             FORM
+             ================================================= -->
+
+        <section class="admin-form-card">
+
+            <div class="admin-form-card-header">
+
+                <span class="admin-eyebrow">
+                    PRODUCT INFORMATION
+                </span>
+
+                <h2>Product Details</h2>
+
+            </div>
+
+
+            <form asp-action="CreateProduct"
+                  method="post">
+
+                @Html.AntiForgeryToken()
+
+
+                <div asp-validation-summary="ModelOnly"
+                     class="admin-validation">
+                </div>
+
+
+                <!-- RELEASE -->
+
+                <div class="admin-form-field">
+
+                    <label asp-for="ReleaseId">
+                        Release
+                    </label>
+
+                    <select asp-for="ReleaseId">
+
+                        <option value="">
+                            Select a release
+                        </option>
+
+                        @foreach (var release in ViewBag.Releases)
+                        {
+                            <option value="@release.ReleaseId">
+
+                                @release.Title
+                                (@release.ReleaseDate.ToString("yyyy"))
+
+                            </option>
+                        }
+
+                    </select>
+
+                    <span asp-validation-for="ReleaseId"
+                          class="admin-field-error">
+                    </span>
+
+                    <small>
+                        Select the release this physical
+                        product belongs to.
+                    </small>
+
+                </div>
+
+
+                <div class="admin-form-row">
+
+
+                    <!-- FORMAT -->
+
+                    <div class="admin-form-field">
+
+                        <label asp-for="Format">
+                            Format
+                        </label>
+
+                        <select asp-for="Format"
+                                asp-items="Html.GetEnumSelectList<KernelRecordsMVC.Domain.Enums.ProductFormat>()">
+
+                            <option value="">
+                                Select format
+                            </option>
+
+                        </select>
+
+                        <span asp-validation-for="Format"
+                              class="admin-field-error">
+                        </span>
+
+                    </div>
+
+
+                    <!-- PRICE -->
+
+                    <div class="admin-form-field">
+
+                        <label asp-for="Price">
+                            Price
+                        </label>
+
+                        <div class="admin-input-prefix">
+
+                            <span>$</span>
+
+                            <input asp-for="Price"
+                                   type="number"
+                                   min="0"
+                                   step="0.01"
+                                   placeholder="0.00" />
+
+                        </div>
+
+                        <span asp-validation-for="Price"
+                              class="admin-field-error">
+                        </span>
+
+                    </div>
+
+                </div>
+
+
+                <!-- STOCK -->
+
+                <div class="admin-form-field">
+
+                    <label asp-for="Stock">
+                        Initial Stock
+                    </label>
+
+                    <input asp-for="Stock"
+                           type="number"
+                           min="0"
+                           placeholder="0" />
+
+                    <span asp-validation-for="Stock"
+                          class="admin-field-error">
+                    </span>
+
+                </div>
+
+
+                <!-- DESCRIPTION -->
+
+                <div class="admin-form-field">
+
+                    <label asp-for="ProductDescription">
+                        Product Description
+                    </label>
+
+                    <textarea asp-for="ProductDescription"
+                              rows="5"
+                              placeholder="Describe this physical edition..."></textarea>
+
+                    <span asp-validation-for="ProductDescription"
+                          class="admin-field-error">
+                    </span>
+
+                </div>
+
+
+                <!-- ACTIONS -->
+
+                <div class="admin-form-actions">
+
+                    <button type="submit"
+                            class="admin-button primary">
+
+                        Create Product
+
+                    </button>
+
+
+                    <a asp-action="Products"
+                       class="admin-button secondary">
+
+                        Cancel
+
+                    </a>
+
+                </div>
+
+            </form>
+
+        </section>
+
+
+        <!-- =================================================
+             SIDE INFO
+             ================================================= -->
+
+        <aside class="admin-help-card">
+
+            <span class="admin-eyebrow">
+                PRODUCT CREATION
+            </span>
+
+            <h3>Before you create</h3>
+
+            <div class="admin-help-item">
+
+                <strong>01</strong>
+
+                <p>
+                    A release can only have one product
+                    for each physical format.
+                </p>
+
+            </div>
+
+
+            <div class="admin-help-item">
+
+                <strong>02</strong>
+
+                <p>
+                    Stock can be updated later from
+                    Product Management.
+                </p>
+
+            </div>
+
+
+            <div class="admin-help-item">
+
+                <strong>03</strong>
+
+                <p>
+                    Creating the product will automatically
+                    create a modification record.
+                </p>
+
+            </div>
+
+        </aside>
 
     </div>
 
-
-    <!-- FORMAT -->
-
-    <div class="mb-3">
-
-        <label asp-for="Format"
-               class="form-label">
-        </label>
-
-        <select asp-for="Format"
-                asp-items="Html.GetEnumSelectList<KernelRecordsMVC.Domain.Enums.ProductFormat>()"
-                class="form-select">
-
-            <option value="">
-                -- Select Format --
-            </option>
-
-        </select>
-
-        <span asp-validation-for="Format"
-              class="text-danger">
-        </span>
-
-    </div>
-
-
-    <!-- PRICE -->
-
-    <div class="mb-3">
-
-        <label asp-for="Price"
-               class="form-label">
-        </label>
-
-        <div class="input-group">
-
-            <span class="input-group-text">
-                $
-            </span>
-
-            <input asp-for="Price"
-                   class="form-control"
-                   step="0.01"/>
-
-        </div>
-
-        <span asp-validation-for="Price"
-              class="text-danger">
-        </span>
-
-    </div>
-
-
-    <!-- DESCRIPTION -->
-
-    <div class="mb-3">
-
-        <label asp-for="ProductDescription"
-               class="form-label">
-        </label>
-
-        <textarea asp-for="ProductDescription"
-                  class="form-control"
-                  rows="4">
-        </textarea>
-
-        <span asp-validation-for="ProductDescription"
-              class="text-danger">
-        </span>
-
-    </div>
-
-
-    <!-- STOCK -->
-
-    <div class="mb-3">
-
-        <label asp-for="Stock"
-               class="form-label">
-        </label>
-
-        <input asp-for="Stock"
-               type="number"
-               min="0"
-               class="form-control"/>
-
-        <span asp-validation-for="Stock"
-              class="text-danger">
-        </span>
-
-    </div>
-
-
-    <div class="d-flex gap-2">
-
-        <button type="submit"
-                class="btn btn-success">
-
-            Create Product
-
-        </button>
-
-        <a asp-action="Index"
-           class="btn btn-secondary">
-
-            Cancel
-
-        </a>
-
-    </div>
-
-</form>
+</div>
+
 
 @section Scripts
 {
-    <partial name="_ValidationScriptsPartial"/>
+    <partial name="_ValidationScriptsPartial" />
 }
Index: KernelRecordsMVC.Web/Views/Admin/CreateRelease.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Admin/CreateRelease.cshtml	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
+++ KernelRecordsMVC.Web/Views/Admin/CreateRelease.cshtml	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -0,0 +1,1036 @@
+﻿@model KernelRecordsMVC.Application.ViewModels.CreateReleaseViewModel
+
+@{
+ViewData["Title"] = "Create Release";
+}
+
+<div class="admin-page admin-form-page">
+
+    <!-- =====================================================
+         HEADER
+         ===================================================== -->
+
+    <div class="admin-header">
+
+        <div>
+
+            <a asp-action="Index"
+               class="admin-back-link">
+                ← Dashboard
+            </a>
+
+            <span class="admin-eyebrow">
+                CATALOG MANAGEMENT
+            </span>
+
+            <h1>Create Release</h1>
+
+            <p>
+                Add an album or single, assign artists
+                and build its track listing.
+            </p>
+
+        </div>
+
+    </div>
+
+
+    <form asp-action="CreateRelease"
+          method="post"
+          id="createReleaseForm">
+
+        @Html.AntiForgeryToken()
+
+
+        <div asp-validation-summary="ModelOnly"
+             class="admin-validation">
+        </div>
+
+
+        <!-- =================================================
+             STEP 1 - RELEASE TYPE
+             ================================================= -->
+
+        <section class="admin-form-card release-create-section">
+
+            <div class="admin-form-card-header">
+
+                <span class="admin-eyebrow">
+                    STEP 01
+                </span>
+
+                <h2>Release Type</h2>
+
+                <p class="admin-section-description">
+                    Choose whether this release is an album
+                    or a single.
+                </p>
+
+            </div>
+
+
+            <div class="admin-modification-options">
+
+                <!-- ALBUM -->
+
+                <label class="admin-modification-option">
+
+                    <input asp-for="ReleaseType"
+                           type="radio"
+                           value="ALBUM"
+                           id="releaseTypeAlbum" />
+
+                    <span>
+
+                        <strong>
+                            Album
+                        </strong>
+
+                        <small>
+                            Create a release with multiple tracks.
+                        </small>
+
+                    </span>
+
+                </label>
+
+
+                <!-- SINGLE -->
+
+                <label class="admin-modification-option">
+
+                    <input asp-for="ReleaseType"
+                           type="radio"
+                           value="SINGLE"
+                           id="releaseTypeSingle" />
+
+                    <span>
+
+                        <strong>
+                            Single
+                        </strong>
+
+                        <small>
+                            Create an individual single release.
+                        </small>
+
+                    </span>
+
+                </label>
+
+            </div>
+
+
+            <span asp-validation-for="ReleaseType"
+                  class="admin-field-error">
+            </span>
+
+        </section>
+
+
+        <!-- =================================================
+             STEP 2 - RELEASE INFORMATION
+             ================================================= -->
+
+        <section class="admin-form-card release-create-section">
+
+            <div class="admin-form-card-header">
+
+                <span class="admin-eyebrow">
+                    STEP 02
+                </span>
+
+                <h2>Release Information</h2>
+
+                <p class="admin-section-description">
+                    Enter the main catalog information for this release.
+                </p>
+
+            </div>
+
+
+            <!-- TITLE -->
+
+            <div class="admin-form-field">
+
+                <label asp-for="Title">
+                    Title
+                </label>
+
+                <input asp-for="Title"
+                       placeholder="Enter release title" />
+
+                <span asp-validation-for="Title"
+                      class="admin-field-error">
+                </span>
+
+            </div>
+
+
+            <!-- GENRE + DATE -->
+
+            <div class="admin-form-row">
+
+                <div class="admin-form-field">
+
+                    <label asp-for="Genre">
+                        Genre
+                    </label>
+
+                    <input asp-for="Genre"
+                           placeholder="Rock, Pop, Jazz..." />
+
+                    <span asp-validation-for="Genre"
+                          class="admin-field-error">
+                    </span>
+
+                </div>
+
+
+                <div class="admin-form-field">
+
+                    <label asp-for="ReleaseDate">
+                        Release Date
+                    </label>
+
+                    <input asp-for="ReleaseDate"
+                           type="date" />
+
+                    <span asp-validation-for="ReleaseDate"
+                          class="admin-field-error">
+                    </span>
+
+                </div>
+
+            </div>
+
+
+            <!-- RECORD LABEL -->
+
+            <div class="admin-form-field">
+
+                <label asp-for="RecordLabel">
+                    Record Label
+                </label>
+
+                <input asp-for="RecordLabel"
+                       placeholder="Record label (optional)" />
+
+                <span asp-validation-for="RecordLabel"
+                      class="admin-field-error">
+                </span>
+
+            </div>
+
+
+            <!-- COVER PHOTO -->
+
+            <div class="admin-form-field">
+
+                <label asp-for="CoverPhoto">
+                    Cover Photo URL
+                </label>
+
+                <input asp-for="CoverPhoto"
+                       id="coverPhotoInput"
+                       placeholder="https://..." />
+
+                <span asp-validation-for="CoverPhoto"
+                      class="admin-field-error">
+                </span>
+
+                <small>
+                    Paste a direct image URL for the release artwork.
+                </small>
+
+            </div>
+
+
+            <!-- COVER PREVIEW -->
+
+            <div class="admin-cover-preview">
+
+                <span class="admin-eyebrow">
+                    COVER PREVIEW
+                </span>
+
+                <div class="admin-cover-preview-image"
+                     id="coverPreview">
+
+                    <span>♪</span>
+
+                </div>
+
+            </div>
+
+        </section>
+
+
+        <!-- =================================================
+             STEP 3 - ARTISTS
+             ================================================= -->
+
+        <section class="admin-form-card release-create-section">
+
+            <div class="admin-form-card-header">
+
+                <span class="admin-eyebrow">
+                    STEP 03
+                </span>
+
+                <h2>Artists</h2>
+
+                <p class="admin-section-description">
+                    Select the main artist and any featured artists
+                    for this release.
+                </p>
+
+            </div>
+
+
+            <!-- MAIN ARTIST -->
+
+            <div class="admin-form-field">
+
+                <label asp-for="MainArtistId">
+                    Main Artist
+                </label>
+
+                <select asp-for="MainArtistId">
+
+                    <option value="">
+                        Select main artist
+                    </option>
+
+                    @foreach (var artist in ViewBag.Artists)
+                    {
+                    <option value="@artist.ArtistId">
+                        @artist.ArtistName
+                    </option>
+                    }
+
+                </select>
+
+                <span asp-validation-for="MainArtistId"
+                      class="admin-field-error">
+                </span>
+
+                <small>
+                    The primary artist associated with this release.
+                </small>
+
+            </div>
+
+
+            <!-- FEATURED ARTISTS -->
+
+            <div class="admin-form-field">
+
+                <label asp-for="FeaturedArtistIds">
+                    Featured Artists
+                </label>
+
+                <select asp-for="FeaturedArtistIds"
+                        multiple
+                        class="admin-multi-select">
+
+                    @foreach (var artist in ViewBag.Artists)
+                    {
+                    <option value="@artist.ArtistId">
+                        @artist.ArtistName
+                    </option>
+                    }
+
+                </select>
+
+                <small>
+                    Hold Ctrl on Windows or Cmd on macOS
+                    to select multiple artists.
+                </small>
+
+                <span asp-validation-for="FeaturedArtistIds"
+                      class="admin-field-error">
+                </span>
+
+            </div>
+
+        </section>
+
+
+        <!-- =================================================
+             SINGLE SETTINGS
+             ================================================= -->
+
+        <section class="admin-form-card release-create-section"
+                 id="singleSection">
+
+            <div class="admin-form-card-header">
+
+                <span class="admin-eyebrow">
+                    STEP 04
+                </span>
+
+                <h2>Single Information</h2>
+
+                <p class="admin-section-description">
+                    Enter the duration of the single.
+                </p>
+
+            </div>
+
+
+            <div class="admin-form-field">
+
+                <label asp-for="SingleDuration">
+                    Duration
+                </label>
+
+                <input asp-for="SingleDuration"
+                       placeholder="03:45" />
+
+                <span asp-validation-for="SingleDuration"
+                      class="admin-field-error">
+                </span>
+
+                <small>
+                    Example: 03:45
+                </small>
+
+            </div>
+
+        </section>
+
+
+        <!-- =================================================
+             ALBUM TRACKS
+             ================================================= -->
+
+        <section class="admin-form-card release-create-section"
+                 id="albumSection">
+
+            <div class="admin-form-card-header track-header">
+
+                <div>
+
+                    <span class="admin-eyebrow">
+                        STEP 04
+                    </span>
+
+                    <h2>Track List</h2>
+
+                    <p class="admin-section-description">
+                        Add tracks in the order they appear
+                        on the album.
+                    </p>
+
+                </div>
+
+
+                <button type="button"
+                        class="admin-button secondary"
+                        id="addTrackButton">
+
+                    ＋ Add Track
+
+                </button>
+
+            </div>
+
+
+            <div id="tracksContainer">
+
+                @for (var i = 0;
+                i < Model.Tracks.Count;
+                i++)
+                {
+                <div class="admin-track-card"
+                     data-track-row>
+
+                    <!-- TRACK NUMBER -->
+
+                    <div class="admin-track-number">
+                        @(i + 1)
+                    </div>
+
+
+                    <!-- TRACK CONTENT -->
+
+                    <div class="admin-track-content">
+
+                        <div class="admin-form-row">
+
+                            <!-- TRACK NAME -->
+
+                            <div class="admin-form-field">
+
+                                <label>
+                                    Track Name
+                                </label>
+
+                                <input asp-for="Tracks[i].SongName"
+                                       data-field="SongName"
+                                       placeholder="Track title" />
+
+                                <span asp-validation-for="Tracks[i].SongName"
+                                      class="admin-field-error">
+                                    </span>
+
+                            </div>
+
+
+                            <!-- DURATION -->
+
+                            <div class="admin-form-field">
+
+                                <label>
+                                    Duration
+                                </label>
+
+                                <input asp-for="Tracks[i].SongDuration"
+                                       data-field="SongDuration"
+                                       placeholder="03:42" />
+
+                                <span asp-validation-for="Tracks[i].SongDuration"
+                                      class="admin-field-error">
+                                    </span>
+
+                            </div>
+
+                        </div>
+
+
+                        <!-- TRACK ARTISTS -->
+
+                        <div class="admin-form-field">
+
+                            <label>
+                                Track Artists
+                            </label>
+
+                            <select asp-for="Tracks[i].ArtistIds"
+                                    multiple
+                                    data-field="ArtistIds"
+                                    class="admin-multi-select">
+
+                                @foreach (var artist in ViewBag.Artists)
+                                {
+                                <option value="@artist.ArtistId">
+                                    @artist.ArtistName
+                                </option>
+                                }
+
+                            </select>
+
+                            <small>
+                                If no artist is selected,
+                                the release's main artist will
+                                automatically be used.
+                            </small>
+
+                        </div>
+
+                    </div>
+
+
+                    <!-- REMOVE TRACK -->
+
+                    <button type="button"
+                            class="admin-track-remove"
+                            data-remove-track
+                            title="Remove track">
+
+                        ×
+
+                    </button>
+
+                </div>
+                }
+
+            </div>
+
+        </section>
+
+
+        <!-- =================================================
+             SUBMIT
+             ================================================= -->
+
+        <div class="admin-release-submit">
+
+            <div>
+
+                <span class="admin-eyebrow">
+                    READY TO CREATE?
+                </span>
+
+                <p>
+                    The release, artists and tracks
+                    will be created together.
+                </p>
+
+            </div>
+
+
+            <div class="admin-form-actions release-actions">
+
+                <a asp-action="Index"
+                   class="admin-button secondary">
+
+                    Cancel
+
+                </a>
+
+
+                <button type="submit"
+                        class="admin-button primary">
+
+                    Create Release
+
+                </button>
+
+            </div>
+
+        </div>
+
+    </form>
+
+</div>
+
+
+<!-- =========================================================
+     TRACK TEMPLATE
+     ========================================================= -->
+
+<template id="trackTemplate">
+
+    <div class="admin-track-card"
+         data-track-row>
+
+        <!-- TRACK NUMBER -->
+
+        <div class="admin-track-number">
+            1
+        </div>
+
+
+        <!-- TRACK CONTENT -->
+
+        <div class="admin-track-content">
+
+            <div class="admin-form-row">
+
+                <!-- NAME -->
+
+                <div class="admin-form-field">
+
+                    <label>
+                        Track Name
+                    </label>
+
+                    <input type="text"
+                           data-field="SongName"
+                           placeholder="Track title" />
+
+                </div>
+
+
+                <!-- DURATION -->
+
+                <div class="admin-form-field">
+
+                    <label>
+                        Duration
+                    </label>
+
+                    <input type="text"
+                           data-field="SongDuration"
+                           placeholder="03:42" />
+
+                </div>
+
+            </div>
+
+
+            <!-- ARTISTS -->
+
+            <div class="admin-form-field">
+
+                <label>
+                    Track Artists
+                </label>
+
+                <select multiple
+                        data-field="ArtistIds"
+                        class="admin-multi-select">
+
+                    @foreach (var artist in ViewBag.Artists)
+                    {
+                    <option value="@artist.ArtistId">
+                        @artist.ArtistName
+                    </option>
+                    }
+
+                </select>
+
+                <small>
+                    If left empty, the release's main artist
+                    will automatically be assigned.
+                </small>
+
+            </div>
+
+        </div>
+
+
+        <!-- REMOVE -->
+
+        <button type="button"
+                class="admin-track-remove"
+                data-remove-track
+                title="Remove track">
+
+            ×
+
+        </button>
+
+    </div>
+
+</template>
+
+
+@section Scripts
+{
+<partial name="_ValidationScriptsPartial" />
+
+<script>
+
+    document.addEventListener(
+        "DOMContentLoaded",
+        function ()
+        {
+            // ==========================================
+            // ELEMENTS
+            // ==========================================
+
+            const albumRadio =
+                document.getElementById(
+                    "releaseTypeAlbum");
+
+            const singleRadio =
+                document.getElementById(
+                    "releaseTypeSingle");
+
+            const albumSection =
+                document.getElementById(
+                    "albumSection");
+
+            const singleSection =
+                document.getElementById(
+                    "singleSection");
+
+            const tracksContainer =
+                document.getElementById(
+                    "tracksContainer");
+
+            const addTrackButton =
+                document.getElementById(
+                    "addTrackButton");
+
+            const trackTemplate =
+                document.getElementById(
+                    "trackTemplate");
+
+            const form =
+                document.getElementById(
+                    "createReleaseForm");
+
+
+            // ==========================================
+            // RELEASE TYPE
+            // ==========================================
+
+            function updateReleaseType()
+            {
+                const isAlbum =
+                    albumRadio.checked;
+
+
+                // Show / hide sections.
+                albumSection.style.display =
+                    isAlbum
+                        ? "block"
+                        : "none";
+
+
+                singleSection.style.display =
+                    isAlbum
+                        ? "none"
+                        : "block";
+
+
+                // Disable fields belonging to
+                // the hidden release type.
+                const albumInputs =
+                    albumSection.querySelectorAll(
+                        "input, select, textarea");
+
+
+                const singleInputs =
+                    singleSection.querySelectorAll(
+                        "input, select, textarea");
+
+
+                albumInputs.forEach(
+                    function (input)
+                    {
+                        input.disabled =
+                            !isAlbum;
+                    });
+
+
+                singleInputs.forEach(
+                    function (input)
+                    {
+                        input.disabled =
+                            isAlbum;
+                    });
+            }
+
+
+            albumRadio.addEventListener(
+                "change",
+                updateReleaseType);
+
+
+            singleRadio.addEventListener(
+                "change",
+                updateReleaseType);
+
+
+            // ==========================================
+            // TRACK INDEXING
+            // ==========================================
+
+            function reindexTracks()
+            {
+                const rows =
+                    tracksContainer.querySelectorAll(
+                        "[data-track-row]");
+
+
+                rows.forEach(
+                    function (row, index)
+                    {
+                        const number =
+                            row.querySelector(
+                                ".admin-track-number");
+
+
+                        const songName =
+                            row.querySelector(
+                                '[data-field="SongName"]');
+
+
+                        const duration =
+                            row.querySelector(
+                                '[data-field="SongDuration"]');
+
+
+                        const artists =
+                            row.querySelector(
+                                '[data-field="ArtistIds"]');
+
+
+                        // Display number.
+                        number.textContent =
+                            index + 1;
+
+
+                        // Song name.
+                        songName.name =
+                            `Tracks[${index}].SongName`;
+
+                        songName.id =
+                            `Tracks_${index}__SongName`;
+
+
+                        // Duration.
+                        duration.name =
+                            `Tracks[${index}].SongDuration`;
+
+                        duration.id =
+                            `Tracks_${index}__SongDuration`;
+
+
+                        // Artists.
+                        artists.name =
+                            `Tracks[${index}].ArtistIds`;
+
+                        artists.id =
+                            `Tracks_${index}__ArtistIds`;
+                    });
+            }
+
+
+            // ==========================================
+            // ADD TRACK
+            // ==========================================
+
+            addTrackButton.addEventListener(
+                "click",
+                function ()
+                {
+                    const fragment =
+                        trackTemplate
+                            .content
+                            .cloneNode(true);
+
+
+                    tracksContainer.appendChild(
+                        fragment);
+
+
+                    reindexTracks();
+                });
+
+
+            // ==========================================
+            // REMOVE TRACK
+            // ==========================================
+
+            tracksContainer.addEventListener(
+                "click",
+                function (event)
+                {
+                    const button =
+                        event.target.closest(
+                            "[data-remove-track]");
+
+
+                    if (!button)
+                        return;
+
+
+                    const rows =
+                        tracksContainer.querySelectorAll(
+                            "[data-track-row]");
+
+
+                    // Album must always keep
+                    // at least one track row.
+                    if (rows.length <= 1)
+                    {
+                        alert(
+                            "An album must have at least one track.");
+
+                        return;
+                    }
+
+
+                    const row =
+                        button.closest(
+                            "[data-track-row]");
+
+
+                    row.remove();
+
+
+                    reindexTracks();
+                });
+
+
+            // ==========================================
+            // BEFORE SUBMIT
+            // ==========================================
+
+            form.addEventListener(
+                "submit",
+                function ()
+                {
+                    // Make sure indexes are always
+                    // sequential before ASP.NET binding.
+                    reindexTracks();
+                });
+
+
+            // ==========================================
+            // COVER PREVIEW
+            // ==========================================
+
+            const coverInput =
+                document.getElementById(
+                    "coverPhotoInput");
+
+
+            const coverPreview =
+                document.getElementById(
+                    "coverPreview");
+
+
+            function showCoverPlaceholder()
+            {
+                coverPreview.innerHTML =
+                    "<span>♪</span>";
+            }
+
+
+            function updateCoverPreview()
+            {
+                const url =
+                    coverInput.value.trim();
+
+
+                if (!url)
+                {
+                    showCoverPlaceholder();
+
+                    return;
+                }
+
+
+                coverPreview.innerHTML = "";
+
+
+                const image =
+                    document.createElement(
+                        "img");
+
+
+                image.src =
+                    url;
+
+                image.alt =
+                    "Cover preview";
+
+
+                image.addEventListener(
+                    "error",
+                    function ()
+                    {
+                        showCoverPlaceholder();
+                    });
+
+
+                coverPreview.appendChild(
+                    image);
+            }
+
+
+            coverInput.addEventListener(
+                "input",
+                updateCoverPreview);
+
+
+            // ==========================================
+            // INITIAL STATE
+            // ==========================================
+
+            updateReleaseType();
+
+            reindexTracks();
+
+            updateCoverPreview();
+        });
+
+</script>
+}
Index: KernelRecordsMVC.Web/Views/Admin/EditProduct.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Admin/EditProduct.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Admin/EditProduct.cshtml	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -1,206 +1,449 @@
 ﻿@model KernelRecordsMVC.Application.ViewModels.EditProductViewModel
 
-<h1>Modify Product</h1>
-
-<div class="card mb-4">
-
-    <div class="card-body">
-
-        <h4>@Model.ReleaseTitle</h4>
-
-        <p class="text-muted mb-0">
-
-            Format:
-
-            <strong>
-                @Model.Format
-            </strong>
-
-        </p>
+@{
+    ViewData["Title"] = "Modify Product";
+}
+
+<div class="admin-page admin-form-page">
+
+    <!-- HEADER -->
+
+    <div class="admin-header">
+
+        <div>
+
+            <a asp-action="Products"
+               class="admin-back-link">
+
+                ← Products
+
+            </a>
+
+            <span class="admin-eyebrow">
+                PRODUCT MANAGEMENT
+            </span>
+
+            <h1>Modify Product</h1>
+
+            <p>
+                Update inventory information or apply a discount.
+            </p>
+
+        </div>
 
     </div>
 
+
+    <!-- PRODUCT SUMMARY -->
+
+    <div class="admin-product-summary">
+
+        <div>
+
+            <span class="admin-eyebrow">
+                SELECTED PRODUCT
+            </span>
+
+            <h2>
+                @Model.ReleaseTitle
+            </h2>
+
+        </div>
+
+        <div class="admin-product-summary-meta">
+
+            <div>
+
+                <span>FORMAT</span>
+
+                <strong>
+                    @Model.Format
+                </strong>
+
+            </div>
+
+            <div>
+
+                <span>CURRENT PRICE</span>
+
+                <strong>
+                    @Model.Price.ToString("C")
+                </strong>
+
+            </div>
+
+            <div>
+
+                <span>STOCK</span>
+
+                <strong>
+                    @Model.Stock
+                </strong>
+
+            </div>
+
+        </div>
+
+    </div>
+
+
+    <section class="admin-form-card admin-edit-card">
+
+        <form asp-action="EditProduct"
+              method="post"
+              id="productEditForm">
+
+            @Html.AntiForgeryToken()
+
+            <input type="hidden"
+                   asp-for="ProductId" />
+
+
+            <div asp-validation-summary="ModelOnly"
+                 class="admin-validation">
+            </div>
+
+
+            <!-- =================================================
+                 MODIFICATION TYPE
+                 ================================================= -->
+
+            <div class="admin-form-field">
+
+                <label asp-for="ModificationType">
+                    What do you want to do?
+                </label>
+
+                <div class="admin-modification-options">
+
+                    <label class="admin-modification-option">
+
+                        <input type="radio"
+                               asp-for="ModificationType"
+                               value="UPDATE"
+                               id="updateOption" />
+
+                        <span>
+
+                            <strong>
+                                Update Product
+                            </strong>
+
+                            <small>
+                                Change price, description or stock.
+                            </small>
+
+                        </span>
+
+                    </label>
+
+
+                    <label class="admin-modification-option">
+
+                        <input type="radio"
+                               asp-for="ModificationType"
+                               value="DISCOUNT"
+                               id="discountOption" />
+
+                        <span>
+
+                            <strong>
+                                Apply Discount
+                            </strong>
+
+                            <small>
+                                Reduce the current selling price.
+                            </small>
+
+                        </span>
+
+                    </label>
+
+                </div>
+
+                <span asp-validation-for="ModificationType"
+                      class="admin-field-error">
+                </span>
+
+            </div>
+
+
+            <!-- =================================================
+                 UPDATE FIELDS
+                 ================================================= -->
+
+            <div id="updateFields"
+                 class="admin-edit-section">
+
+                <div class="admin-edit-section-heading">
+
+                    <span class="admin-eyebrow">
+                        PRODUCT UPDATE
+                    </span>
+
+                    <h3>Product Information</h3>
+
+                </div>
+
+
+                <div class="admin-form-row">
+
+                    <!-- PRICE -->
+
+                    <div class="admin-form-field">
+
+                        <label asp-for="Price">
+                            Price
+                        </label>
+
+                        <div class="admin-input-prefix">
+
+                            <span>$</span>
+
+                            <input asp-for="Price"
+                                   type="number"
+                                   min="0"
+                                   step="0.01" />
+
+                        </div>
+
+                        <span asp-validation-for="Price"
+                              class="admin-field-error">
+                        </span>
+
+                    </div>
+
+
+                    <!-- STOCK -->
+
+                    <div class="admin-form-field">
+
+                        <label asp-for="Stock">
+                            Stock
+                        </label>
+
+                        <input asp-for="Stock"
+                               type="number"
+                               min="0" />
+
+                        <span asp-validation-for="Stock"
+                              class="admin-field-error">
+                        </span>
+
+                    </div>
+
+                </div>
+
+
+                <div class="admin-form-field">
+
+                    <label asp-for="ProductDescription">
+                        Description
+                    </label>
+
+                    <textarea asp-for="ProductDescription"
+                              rows="5"></textarea>
+
+                    <span asp-validation-for="ProductDescription"
+                          class="admin-field-error">
+                    </span>
+
+                </div>
+
+            </div>
+
+
+            <!-- =================================================
+                 DISCOUNT
+                 ================================================= -->
+
+            <div id="discountFields"
+                 class="admin-edit-section">
+
+                <div class="admin-edit-section-heading">
+
+                    <span class="admin-eyebrow">
+                        PROMOTION
+                    </span>
+
+                    <h3>Apply Discount</h3>
+
+                    <p>
+                        The percentage will be deducted
+                        from the product's current price.
+                    </p>
+
+                </div>
+
+
+                <div class="admin-form-field">
+
+                    <label asp-for="Discount">
+                        Discount Percentage
+                    </label>
+
+                    <div class="admin-input-suffix">
+
+                        <input asp-for="Discount"
+                               type="number"
+                               min="0.01"
+                               max="99.99"
+                               step="0.01"
+                               placeholder="10" />
+
+                        <span>%</span>
+
+                    </div>
+
+                    <span asp-validation-for="Discount"
+                          class="admin-field-error">
+                    </span>
+
+                </div>
+
+
+                <div class="admin-discount-preview">
+
+                    <span>
+                        CURRENT PRICE
+                    </span>
+
+                    <strong id="currentPrice"
+                            data-price="@Model.Price">
+                        @Model.Price.ToString("C")
+                    </strong>
+
+
+                    <span>
+                        NEW PRICE
+                    </span>
+
+                    <strong id="discountedPrice">
+                        —
+                    </strong>
+
+                </div>
+
+            </div>
+
+
+            <!-- ACTIONS -->
+
+            <div class="admin-form-actions">
+
+                <button type="submit"
+                        class="admin-button primary">
+
+                    Save Changes
+
+                </button>
+
+                <a asp-action="Products"
+                   class="admin-button secondary">
+
+                    Cancel
+
+                </a>
+
+            </div>
+
+        </form>
+
+    </section>
+
 </div>
 
-
-<form asp-action="EditProduct"
-      method="post">
-
-    @Html.AntiForgeryToken()
-
-    <input type="hidden"
-           asp-for="ProductId" />
-
-    <div asp-validation-summary="ModelOnly"
-         class="text-danger mb-3">
-    </div>
-
-
-    <!-- MODIFICATION TYPE -->
-
-    <div class="mb-3">
-
-        <label asp-for="ModificationType"
-               class="form-label">
-
-            Modification Type
-
-        </label>
-
-        <select asp-for="ModificationType"
-                class="form-select">
-
-            <option value="UPDATE">
-                Update Product
-            </option>
-
-            <option value="DISCOUNT">
-                Apply Discount
-            </option>
-
-        </select>
-
-        <span asp-validation-for="ModificationType"
-              class="text-danger">
-        </span>
-
-    </div>
-
-
-    <!-- PRICE -->
-
-    <div class="mb-3">
-
-        <label asp-for="Price"
-               class="form-label">
-
-            Price
-
-        </label>
-
-        <div class="input-group">
-
-            <span class="input-group-text">
-                $
-            </span>
-
-            <input asp-for="Price"
-                   class="form-control"
-                   step="0.01" />
-
-        </div>
-
-        <span asp-validation-for="Price"
-              class="text-danger">
-        </span>
-
-    </div>
-
-
-    <!-- DISCOUNT -->
-
-    <div class="mb-3">
-
-        <label asp-for="Discount"
-               class="form-label">
-
-            Discount Percentage
-
-        </label>
-
-        <div class="input-group">
-
-            <input asp-for="Discount"
-                   class="form-control"
-                   type="number"
-                   min="0"
-                   max="100"
-                   step="0.01" />
-
-            <span class="input-group-text">
-                %
-            </span>
-
-        </div>
-
-        <small class="text-muted">
-            Only used when "Apply Discount" is selected.
-        </small>
-
-        <span asp-validation-for="Discount"
-              class="text-danger">
-        </span>
-
-    </div>
-
-
-    <!-- DESCRIPTION -->
-
-    <div class="mb-3">
-
-        <label asp-for="ProductDescription"
-               class="form-label">
-
-            Description
-
-        </label>
-
-        <textarea asp-for="ProductDescription"
-                  class="form-control"
-                  rows="4">
-        </textarea>
-
-        <span asp-validation-for="ProductDescription"
-              class="text-danger">
-        </span>
-
-    </div>
-
-
-    <!-- STOCK -->
-
-    <div class="mb-3">
-
-        <label asp-for="Stock"
-               class="form-label">
-
-            Stock
-
-        </label>
-
-        <input asp-for="Stock"
-               class="form-control"
-               type="number"
-               min="0" />
-
-        <span asp-validation-for="Stock"
-              class="text-danger">
-        </span>
-
-    </div>
-
-
-    <div class="d-flex gap-2">
-
-        <button type="submit"
-                class="btn btn-success">
-
-            Save Changes
-
-        </button>
-
-        <a asp-action="Index"
-           class="btn btn-secondary">
-
-            Cancel
-
-        </a>
-
-    </div>
-
-</form>
 
 @section Scripts
 {
-    <partial name="_ValidationScriptsPartial"/>
+    <partial name="_ValidationScriptsPartial" />
+
+    <script>
+
+        document.addEventListener("DOMContentLoaded", function ()
+        {
+            const updateOption =
+                document.getElementById("updateOption");
+
+            const discountOption =
+                document.getElementById("discountOption");
+
+            const updateFields =
+                document.getElementById("updateFields");
+
+            const discountFields =
+                document.getElementById("discountFields");
+
+            const discountInput =
+                document.getElementById("Discount");
+
+            const currentPriceElement =
+                document.getElementById("currentPrice");
+
+            const discountedPriceElement =
+                document.getElementById("discountedPrice");
+
+
+            function updateMode()
+            {
+                const isDiscount =
+                    discountOption.checked;
+
+                updateFields.style.display =
+                    isDiscount ? "none" : "block";
+
+                discountFields.style.display =
+                    isDiscount ? "block" : "none";
+            }
+
+
+            function updateDiscountPreview()
+            {
+                const currentPrice =
+                    parseFloat(
+                        currentPriceElement.dataset.price);
+
+                const discount =
+                    parseFloat(discountInput.value);
+
+
+                if (isNaN(discount) ||
+                    discount <= 0 ||
+                    discount >= 100)
+                {
+                    discountedPriceElement.textContent =
+                        "—";
+
+                    return;
+                }
+
+
+                const newPrice =
+                    currentPrice *
+                    (1 - discount / 100);
+
+
+                discountedPriceElement.textContent =
+                    "$" + newPrice.toFixed(2);
+            }
+
+
+            updateOption.addEventListener(
+                "change",
+                updateMode);
+
+            discountOption.addEventListener(
+                "change",
+                updateMode);
+
+            discountInput.addEventListener(
+                "input",
+                updateDiscountPreview);
+
+
+            updateMode();
+            updateDiscountPreview();
+        });
+
+    </script>
 }
Index: KernelRecordsMVC.Web/Views/Admin/Index.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Admin/Index.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Admin/Index.cshtml	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -3,47 +3,354 @@
 }
 
-<h1>Admin Dashboard</h1>
-
-@if (TempData["Success"] != null)
-{
-    <div class="alert alert-success">
-        @TempData["Success"]
+<div class="admin-page">
+
+    <!-- =====================================================
+         HEADER
+         ===================================================== -->
+
+    <div class="admin-header">
+
+        <div>
+
+            <span class="admin-eyebrow">
+                KERNEL RECORDS
+            </span>
+
+            <h1>Admin Dashboard</h1>
+
+            <p>
+                Manage catalog, inventory and store operations.
+            </p>
+
+        </div>
+
+
+        <div class="admin-header-actions">
+
+            <a asp-action="CreateRelease"
+               class="admin-button secondary">
+
+                <span>♪</span>
+                New Release
+
+            </a>
+
+
+            <a asp-action="CreateProduct"
+               class="admin-button primary">
+
+                <span>＋</span>
+                New Product
+
+            </a>
+
+        </div>
+
     </div>
-}
-
-<div class="row mt-4">
-
-    <div class="col-md-6 mb-3">
-
-        <div class="card h-100">
-
-            <div class="card-body">
-
-                <h4>Products</h4>
+
+
+    @if (TempData["Success"] != null)
+    {
+        <div class="admin-alert success">
+
+            <span>✓</span>
+
+            @TempData["Success"]
+
+        </div>
+    }
+
+
+    @if (TempData["Error"] != null)
+    {
+        <div class="admin-alert danger">
+
+            <span>!</span>
+
+            @TempData["Error"]
+
+        </div>
+    }
+
+
+    <!-- =====================================================
+         STATISTICS
+         ===================================================== -->
+
+    <div class="admin-stat-grid">
+
+        <div class="admin-stat-card">
+
+            <span class="admin-stat-label">
+                PRODUCTS
+            </span>
+
+            <strong>
+                @ViewBag.ProductCount
+            </strong>
+
+            <p>
+                Physical products in the store
+            </p>
+
+        </div>
+
+
+        <div class="admin-stat-card">
+
+            <span class="admin-stat-label">
+                RELEASES
+            </span>
+
+            <strong>
+                @ViewBag.ReleaseCount
+            </strong>
+
+            <p>
+                Albums and singles in the catalog
+            </p>
+
+        </div>
+
+
+        <div class="admin-stat-card warning">
+
+            <span class="admin-stat-label">
+                LOW STOCK
+            </span>
+
+            <strong>
+                @ViewBag.LowStockCount
+            </strong>
+
+            <p>
+                Products with 5 or fewer remaining
+            </p>
+
+        </div>
+
+
+        <div class="admin-stat-card danger">
+
+            <span class="admin-stat-label">
+                OUT OF STOCK
+            </span>
+
+            <strong>
+                @ViewBag.OutOfStockCount
+            </strong>
+
+            <p>
+                Products requiring restocking
+            </p>
+
+        </div>
+
+    </div>
+
+
+    <!-- =====================================================
+         CATALOG MANAGEMENT
+         ===================================================== -->
+
+    <section class="admin-section">
+
+        <div class="admin-section-heading">
+
+            <div>
+
+                <span class="admin-eyebrow">
+                    CATALOG MANAGEMENT
+                </span>
+
+                <h2>Releases & Products</h2>
 
                 <p>
-                    Create and modify products available
-                    in the music store.
+                    Create music releases and manage their physical formats.
                 </p>
 
-                <a asp-action="Products"
-                   class="btn btn-primary">
-
-                    Manage Products
-
-                </a>
-
-                <a asp-action="CreateProduct"
-                   class="btn btn-success">
-
-                    New Product
-
-                </a>
-
-            </div>
-
-        </div>
-
-    </div>
+            </div>
+
+        </div>
+
+
+        <div class="admin-action-grid">
+
+            <!-- CREATE RELEASE -->
+
+            <a asp-action="CreateRelease"
+               class="admin-action-card">
+
+                <div class="admin-action-icon">
+                    ♪
+                </div>
+
+                <div>
+
+                    <h3>Create Release</h3>
+
+                    <p>
+                        Create an album or single,
+                        assign artists and add album tracks.
+                    </p>
+
+                </div>
+
+                <span class="admin-action-arrow">
+                    →
+                </span>
+
+            </a>
+
+
+            <!-- CREATE PRODUCT -->
+
+            <a asp-action="CreateProduct"
+               class="admin-action-card">
+
+                <div class="admin-action-icon">
+                    ＋
+                </div>
+
+                <div>
+
+                    <h3>Create Product</h3>
+
+                    <p>
+                        Add vinyl, CD or cassette
+                        editions to an existing release.
+                    </p>
+
+                </div>
+
+                <span class="admin-action-arrow">
+                    →
+                </span>
+
+            </a>
+
+
+            <!-- MANAGE PRODUCTS -->
+
+            <a asp-action="Products"
+               class="admin-action-card">
+
+                <div class="admin-action-icon">
+                    ◫
+                </div>
+
+                <div>
+
+                    <h3>Manage Products</h3>
+
+                    <p>
+                        Update pricing, inventory,
+                        descriptions and discounts.
+                    </p>
+
+                </div>
+
+                <span class="admin-action-arrow">
+                    →
+                </span>
+
+            </a>
+
+        </div>
+
+    </section>
+
+
+    <!-- =====================================================
+         WORKFLOW INFO
+         ===================================================== -->
+
+    <section class="admin-section">
+
+        <div class="admin-section-heading">
+
+            <div>
+
+                <span class="admin-eyebrow">
+                    ADMIN WORKFLOW
+                </span>
+
+                <h2>Catalog Process</h2>
+
+            </div>
+
+        </div>
+
+
+        <div class="admin-workflow-grid">
+
+            <div class="admin-workflow-card">
+
+                <span class="admin-workflow-number">
+                    01
+                </span>
+
+                <div>
+
+                    <strong>
+                        Create Release
+                    </strong>
+
+                    <p>
+                        Add the album or single,
+                        artists and track information.
+                    </p>
+
+                </div>
+
+            </div>
+
+
+            <div class="admin-workflow-card">
+
+                <span class="admin-workflow-number">
+                    02
+                </span>
+
+                <div>
+
+                    <strong>
+                        Create Product
+                    </strong>
+
+                    <p>
+                        Add its vinyl, CD or cassette
+                        store edition.
+                    </p>
+
+                </div>
+
+            </div>
+
+
+            <div class="admin-workflow-card">
+
+                <span class="admin-workflow-number">
+                    03
+                </span>
+
+                <div>
+
+                    <strong>
+                        Manage Inventory
+                    </strong>
+
+                    <p>
+                        Change prices, stock,
+                        descriptions or apply discounts.
+                    </p>
+
+                </div>
+
+            </div>
+
+        </div>
+
+    </section>
 
 </div>
Index: KernelRecordsMVC.Web/Views/Admin/Products.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Admin/Products.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Admin/Products.cshtml	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -1,131 +1,225 @@
 ﻿@model IEnumerable<KernelRecordsMVC.Models.Product>
 
-<div class="d-flex justify-content-between align-items-center mb-4">
-
-    <div>
-
-        <h1>Product Management</h1>
-
-        <p class="text-muted">
-            Create and modify products in the store.
-        </p>
+@{
+    ViewData["Title"] = "Product Management";
+}
+
+<div class="admin-page">
+
+    <!-- HEADER -->
+
+    <div class="admin-header">
+
+        <div>
+
+            <a asp-action="Index"
+               class="admin-back-link">
+
+                ← Dashboard
+
+            </a>
+
+            <span class="admin-eyebrow">
+                INVENTORY
+            </span>
+
+            <h1>Product Management</h1>
+
+            <p>
+                Manage formats, prices and inventory.
+            </p>
+
+        </div>
+
+
+        <a asp-action="CreateProduct"
+           class="admin-button primary">
+
+            <span>＋</span>
+            New Product
+
+        </a>
 
     </div>
 
 
-    <a asp-action="CreateProduct"
-       class="btn btn-success">
-
-        + New Product
-
-    </a>
+    @if (TempData["Success"] != null)
+    {
+        <div class="admin-alert success">
+
+            <span>✓</span>
+
+            @TempData["Success"]
+
+        </div>
+    }
+
+
+    <!-- SUMMARY -->
+
+    <div class="admin-list-summary">
+
+        <span>
+            @Model.Count() products
+        </span>
+
+        <span>
+            @Model.Count(x => x.Stock <= 0) out of stock
+        </span>
+
+    </div>
+
+
+    <!-- TABLE -->
+
+    <div class="admin-table-wrapper">
+
+        <table class="admin-table">
+
+            <thead>
+
+            <tr>
+
+                <th>Release</th>
+
+                <th>Format</th>
+
+                <th>Price</th>
+
+                <th>Stock</th>
+
+                <th>Status</th>
+
+                <th></th>
+
+            </tr>
+
+            </thead>
+
+
+            <tbody>
+
+            @foreach (var product in Model)
+            {
+                <tr>
+
+                    <!-- RELEASE -->
+
+                    <td>
+
+                        <div class="admin-product-release">
+
+                            <div class="admin-product-cover">
+
+                                @if (!string.IsNullOrWhiteSpace(
+                                    product.Release.CoverPhoto))
+                                {
+                                    <img src="@product.Release.CoverPhoto"
+                                         alt="@product.Release.Title" />
+                                }
+                                else
+                                {
+                                    <span>♪</span>
+                                }
+
+                            </div>
+
+
+                            <div>
+
+                                <strong>
+                                    @product.Release.Title
+                                </strong>
+
+                                <small>
+                                    Product #@product.ProductId
+                                </small>
+
+                            </div>
+
+                        </div>
+
+                    </td>
+
+
+                    <!-- FORMAT -->
+
+                    <td>
+
+                        <span class="admin-format-badge">
+                            @product.Format
+                        </span>
+
+                    </td>
+
+
+                    <!-- PRICE -->
+
+                    <td class="admin-price">
+
+                        @product.Price.ToString("C")
+
+                    </td>
+
+
+                    <!-- STOCK -->
+
+                    <td>
+
+                        <strong>
+                            @product.Stock
+                        </strong>
+
+                    </td>
+
+
+                    <!-- STATUS -->
+
+                    <td>
+
+                        @if (product.Stock <= 0)
+                        {
+                            <span class="admin-stock danger">
+                                Out of stock
+                            </span>
+                        }
+                        else if (product.Stock <= 5)
+                        {
+                            <span class="admin-stock warning">
+                                Low stock
+                            </span>
+                        }
+                        else
+                        {
+                            <span class="admin-stock success">
+                                In stock
+                            </span>
+                        }
+
+                    </td>
+
+
+                    <!-- ACTION -->
+
+                    <td class="admin-table-action">
+
+                        <a asp-action="EditProduct"
+                           asp-route-id="@product.ProductId"
+                           class="admin-button secondary small">
+
+                            Modify
+
+                        </a>
+
+                    </td>
+
+                </tr>
+            }
+
+            </tbody>
+
+        </table>
+
+    </div>
 
 </div>
-
-
-@if (TempData["Success"] != null)
-{
-    <div class="alert alert-success">
-
-        @TempData["Success"]
-
-    </div>
-}
-
-
-<div class="table-responsive">
-
-    <table class="table table-hover align-middle">
-
-        <thead>
-
-        <tr>
-
-            <th>Release</th>
-
-            <th>Format</th>
-
-            <th>Price</th>
-
-            <th>Stock</th>
-
-            <th></th>
-
-        </tr>
-
-        </thead>
-
-
-        <tbody>
-
-        @foreach (var product in Model)
-        {
-            <tr>
-
-                <td>
-
-                    <strong>
-                        @product.Release.Title
-                    </strong>
-
-                </td>
-
-
-                <td>
-
-                    <span class="badge bg-secondary">
-
-                        @product.Format
-
-                    </span>
-
-                </td>
-
-
-                <td>
-
-                    $@product.Price.ToString("0.00")
-
-                </td>
-
-
-                <td>
-
-                    @if (product.Stock > 0)
-                    {
-                        <span class="text-success">
-
-                            @product.Stock
-
-                        </span>
-                    }
-                    else
-                    {
-                        <span class="text-danger">
-                            Out of stock
-                        </span>
-                    }
-
-                </td>
-
-
-                <td>
-
-                    <a asp-action="EditProduct"
-                       asp-route-id="@product.ProductId"
-                       class="btn btn-outline-primary">
-
-                        Modify
-
-                    </a>
-
-                </td>
-
-            </tr>
-        }
-
-        </tbody>
-
-    </table>
-
-</div>
Index: KernelRecordsMVC.Web/Views/Home/Index.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Home/Index.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Home/Index.cshtml	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -1,23 +1,178 @@
-﻿<div class="text-center py-5">
+﻿@{
+    ViewData["Title"] = "Home";
+}
 
-    <h1 class="display-3">
-        Music Store
-    </h1>
+<div class="home-page">
 
-    <p class="lead mt-3">
-        CDs · Vinyl · Cassettes
-    </p>
+    <!-- =====================================================
+         HERO
+         ===================================================== -->
 
-    <p class="text-muted">
-        Discover your next favorite release.
-    </p>
+    <section class="home-hero">
 
-    <a asp-controller="Release"
-       asp-action="Index"
-       class="btn btn-primary btn-lg mt-3">
+        <div class="home-hero-content">
 
-        Browse Releases
+            <span class="home-eyebrow">
+                KERNEL RECORDS
+            </span>
 
-    </a>
+            <h1>
+                MUSIC
+                <span>FOR</span>
+                YOUR COLLECTION.
+            </h1>
+
+            <p>
+                Discover vinyl records, CDs and cassettes
+                from artists and releases worth keeping.
+            </p>
+
+
+            <div class="home-hero-actions">
+
+                <a asp-controller="Release"
+                   asp-action="Index"
+                   class="home-button primary">
+
+                    Browse Collection
+
+                </a>
+
+                <a asp-controller="Sale"
+                   asp-action="Index"
+                   class="home-button secondary">
+
+                    Shop Sale
+
+                </a>
+
+            </div>
+
+        </div>
+
+
+        <div class="home-hero-mark">
+            K
+        </div>
+
+    </section>
+
+
+    <!-- =====================================================
+         QUICK LINKS
+         ===================================================== -->
+
+    <section class="home-section">
+
+        <div class="home-section-header">
+
+            <div>
+
+                <span class="section-label">
+                    SHOP
+                </span>
+
+                <h2>
+                    Find something you like.
+                </h2>
+
+            </div>
+
+        </div>
+
+
+        <div class="home-feature-grid">
+
+            <a asp-controller="Release"
+               asp-action="Index"
+               class="home-feature-card">
+
+                <span>01</span>
+
+                <h3>
+                    Browse Releases
+                </h3>
+
+                <p>
+                    Explore albums and singles.
+                </p>
+
+                <strong>
+                    Explore →
+                </strong>
+
+            </a>
+
+
+            <a asp-controller="TopSellers"
+               asp-action="Index"
+               class="home-feature-card">
+
+                <span>02</span>
+
+                <h3>
+                    Top Sellers
+                </h3>
+
+                <p>
+                    See what other collectors are buying.
+                </p>
+
+                <strong>
+                    View Top Sellers →
+                </strong>
+
+            </a>
+
+
+            <a asp-controller="Sale"
+               asp-action="Index"
+               class="home-feature-card sale-feature">
+
+                <span>03</span>
+
+                <h3>
+                    Sale
+                </h3>
+
+                <p>
+                    Find discounted physical releases.
+                </p>
+
+                <strong>
+                    Shop Sale →
+                </strong>
+
+            </a>
+
+        </div>
+
+    </section>
+
+
+    <!-- =====================================================
+         COLLECTION INFO
+         ===================================================== -->
+
+    <section class="home-collection">
+
+        <div>
+
+            <span class="section-label">
+                PHYSICAL MUSIC
+            </span>
+
+            <h2>
+                Vinyl. CDs. Cassettes.
+            </h2>
+
+        </div>
+
+        <p>
+            Build a physical collection with releases
+            available in the formats you actually want.
+        </p>
+
+    </section>
 
 </div>
Index: KernelRecordsMVC.Web/Views/Order/Cart.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Order/Cart.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Order/Cart.cshtml	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -1,44 +1,31 @@
 ﻿@model KernelRecordsMVC.Application.ViewModels.CartViewModel
 
-<div class="d-flex justify-content-between align-items-center mb-4">
-
-    <h1>Your Cart</h1>
-
-    <a asp-controller="Release"
-       asp-action="Index"
-       class="btn btn-outline-primary">
-
-        Continue Shopping
-
-    </a>
-
-</div>
-
-
-@if (TempData["Error"] != null)
-{
-    <div class="alert alert-danger">
-
-        @TempData["Error"]
-
-    </div>
+@{
+    ViewData["Title"] = "Cart";
 }
 
-
-@if (!Model.Items.Any())
-{
-    <div class="text-center py-5">
-
-        <h3>Your cart is empty.</h3>
-
-        <p class="text-muted">
-            Browse our releases and add something to your order.
-        </p>
+<div class="cart-page">
+
+    <div class="cart-header">
+
+        <div>
+
+            <span class="page-eyebrow">
+                YOUR ORDER
+            </span>
+
+            <h1>Your Cart</h1>
+
+            <p>
+                Review your selected physical releases.
+            </p>
+
+        </div>
 
         <a asp-controller="Release"
            asp-action="Index"
-           class="btn btn-primary">
-
-            Browse Releases
+           class="store-button secondary">
+
+            Continue Shopping
 
         </a>
@@ -46,180 +33,207 @@
     </div>
 
-    return;
-}
-
-
-<div class="table-responsive">
-
-    <table class="table align-middle">
-
-        <thead>
-
-        <tr>
-
-            <th>Release</th>
-
-            <th>Format</th>
-
-            <th>Price</th>
-
-            <th>Quantity</th>
-
-            <th>Total</th>
-
-            <th></th>
-
-        </tr>
-
-        </thead>
-
-
-        <tbody>
-
-        @foreach (var item in Model.Items)
-        {
-            <tr>
-
-                <td>
-
-                    <a asp-controller="Release"
-                       asp-action="Details"
-                       asp-route-id="@item.ReleaseId">
-
-                        @item.ReleaseTitle
-
-                    </a>
-
-                </td>
-
-
-                <td>
-
-                    <span class="badge bg-secondary">
-
-                        @item.Format
-
+
+    @if (TempData["Error"] != null)
+    {
+        <div class="profile-alert"
+             style="background:#f9e8e8;color:#a33;">
+            @TempData["Error"]
+        </div>
+    }
+
+
+    @if (!Model.Items.Any())
+    {
+        <div class="empty-store">
+
+            <div class="empty-store-icon">
+                🛒
+            </div>
+
+            <h2>Your cart is empty</h2>
+
+            <p>
+                Browse our releases and add something to your order.
+            </p>
+
+            <a asp-controller="Release"
+               asp-action="Index"
+               class="store-button primary">
+
+                Browse Releases
+
+            </a>
+
+        </div>
+    }
+    else
+    {
+        <div class="cart-layout">
+
+            <div class="cart-items">
+
+                <div class="cart-items-header">
+                    @Model.Items.Count item(s) in your cart
+                </div>
+
+
+                @foreach (var item in Model.Items)
+                {
+                    <div class="cart-item">
+
+                        <a asp-controller="Release"
+                           asp-action="Details"
+                           asp-route-id="@item.ReleaseId"
+                           class="cart-item-cover">
+
+                            @if (!string.IsNullOrWhiteSpace(item.CoverPhoto))
+                            {
+                                <img src="@item.CoverPhoto"
+                                     alt="@item.ReleaseTitle" />
+                            }
+                            else
+                            {
+                                <div class="cart-cover-placeholder">
+                                    ♪
+                                </div>
+                            }
+
+                        </a>
+
+
+                        <div class="cart-item-info">
+
+                            <span class="cart-item-type">
+                                @item.Format
+                            </span>
+
+                            <h2>
+
+                                <a asp-controller="Release"
+                                   asp-action="Details"
+                                   asp-route-id="@item.ReleaseId">
+
+                                    @item.ReleaseTitle
+
+                                </a>
+
+                            </h2>
+
+                            <div class="cart-item-price">
+
+                                @item.Price.ToString("C")
+                                each
+
+                            </div>
+
+                        </div>
+
+
+                        <div class="cart-item-quantity">
+
+                            <form asp-action="UpdateQuantity"
+                                  method="post">
+
+                                @Html.AntiForgeryToken()
+
+                                <input type="hidden"
+                                       name="id"
+                                       value="@item.ProductId" />
+
+                                <input type="number"
+                                       name="quantity"
+                                       value="@item.Quantity"
+                                       min="1"
+                                       max="@item.Stock" />
+
+                                <button type="submit">
+                                    Update
+                                </button>
+
+                            </form>
+
+                        </div>
+
+
+                        <div class="cart-item-total">
+
+                            @item.Total.ToString("C")
+
+                        </div>
+
+
+                        <form asp-action="RemoveProduct"
+                              method="post">
+
+                            @Html.AntiForgeryToken()
+
+                            <input type="hidden"
+                                   name="id"
+                                   value="@item.ProductId" />
+
+                            <button type="submit"
+                                    class="cart-remove"
+                                    title="Remove">
+
+                                ×
+
+                            </button>
+
+                        </form>
+
+                    </div>
+                }
+
+            </div>
+
+
+            <aside class="cart-summary">
+
+                <span class="section-label">
+                    ORDER SUMMARY
+                </span>
+
+                <h2>
+                    Your Order
+                </h2>
+
+
+                <div class="summary-line">
+
+                    <span>
+                        Items
                     </span>
 
-                </td>
-
-
-                <td>
-
-                    $@item.Price.ToString("0.00")
-
-                </td>
-
-
-                <td>
-
-                    <form asp-action="UpdateQuantity"
-                          method="post"
-                          class="d-flex">
-
-                        @Html.AntiForgeryToken()
-
-                        <input type="hidden"
-                               name="id"
-                               value="@item.ProductId" />
-
-                        <input type="number"
-                               name="quantity"
-                               value="@item.Quantity"
-                               min="1"
-                               max="@item.Stock"
-                               class="form-control"
-                               style="width:90px;" />
-
-                        <button type="submit"
-                                class="btn btn-outline-secondary ms-2">
-
-                            Update
-
-                        </button>
-
-                    </form>
-
-                </td>
-
-
-                <td>
-
                     <strong>
-
-                        $@item.Total.ToString("0.00")
-
+                        @Model.Items.Sum(x => x.Quantity)
                     </strong>
 
-                </td>
-
-
-                <td>
-
-                    <form asp-action="RemoveProduct"
-                          method="post">
-
-                        @Html.AntiForgeryToken()
-
-                        <input type="hidden"
-                               name="id"
-                               value="@item.ProductId" />
-
-                        <button type="submit"
-                                class="btn btn-outline-danger">
-
-                            Remove
-
-                        </button>
-
-                    </form>
-
-                </td>
-
-            </tr>
-        }
-
-        </tbody>
-
-    </table>
+                </div>
+
+
+                <div class="summary-line total">
+
+                    <span>
+                        Total
+                    </span>
+
+                    <strong>
+                        @Model.Total.ToString("C")
+                    </strong>
+
+                </div>
+
+
+                <a asp-action="Checkout"
+                   class="store-button primary full">
+
+                    Proceed to Checkout
+
+                </a>
+
+            </aside>
+
+        </div>
+    }
 
 </div>
-
-
-<div class="row justify-content-end">
-
-    <div class="col-md-4">
-
-        <div class="card">
-
-            <div class="card-body">
-
-                <h4>Order Summary</h4>
-
-                <hr />
-
-                <div class="d-flex justify-content-between">
-
-                    <span>Total</span>
-
-                    <strong>
-                        $@Model.Total.ToString("0.00")
-                    </strong>
-
-                </div>
-
-
-                <a asp-action="Checkout"
-                   class="btn btn-success w-100 mt-3">
-
-                    Proceed to Checkout
-
-                </a>
-
-            </div>
-
-        </div>
-
-    </div>
-
-</div>
Index: KernelRecordsMVC.Web/Views/Release/Details.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Release/Details.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Release/Details.cshtml	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -1,147 +1,387 @@
 ﻿@model KernelRecordsMVC.Models.Release
 
-<div class="row">
-
-    <div class="col-md-5">
-
-        <img src="@Model.CoverPhoto"
-             class="img-fluid rounded"
-             alt="@Model.Title" />
+@{
+    ViewData["Title"] = Model.Title;
+
+    var isAlbum = Model.Album != null;
+    var isSingle = Model.SingleRelease != null;
+
+    var releaseType =
+        isAlbum ? "ALBUM" :
+        isSingle ? "SINGLE" :
+        "RELEASE";
+
+    var artists = string.Join(
+        ", ",
+        Model.ReleaseArtists
+            .OrderBy(x => x.ReleaseOrdinal)
+            .Select(x => x.Artist.ArtistName)
+    );
+}
+
+<div class="release-details-page">
+
+    <div class="release-hero">
+
+        <div class="release-hero-cover">
+
+            @if (!string.IsNullOrWhiteSpace(Model.CoverPhoto))
+            {
+                <img src="@Model.CoverPhoto"
+                     alt="@Model.Title" />
+            }
+            else
+            {
+                <div class="release-no-cover">
+                    <span>♪</span>
+                </div>
+            }
+
+        </div>
+
+
+        <div class="release-hero-info">
+
+            <span class="page-eyebrow">
+                @releaseType
+            </span>
+
+            <h1>
+                @Model.Title
+            </h1>
+
+            <p class="release-artists-main">
+                @artists
+            </p>
+
+
+            <div class="release-facts">
+
+                <div>
+
+                    <span>Genre</span>
+
+                    <strong>
+                        @Model.Genre
+                    </strong>
+
+                </div>
+
+                <div>
+
+                    <span>Released</span>
+
+                    <strong>
+                        @Model.ReleaseDate.ToString("MMM dd, yyyy")
+                    </strong>
+
+                </div>
+
+                <div>
+
+                    <span>Label</span>
+
+                    <strong>
+                        @Model.RecordLabel
+                    </strong>
+
+                </div>
+
+            </div>
+
+
+            <div class="artist-section">
+
+                <span class="section-label">
+                    ARTISTS
+                </span>
+
+                <div class="release-artists">
+
+                    @foreach (var artist in Model.ReleaseArtists
+                        .OrderBy(x => x.ReleaseOrdinal))
+                    {
+                        <span class="artist-tag">
+
+                            @artist.Artist.ArtistName
+
+                            @if (artist.Type.ToString() == "FEATURE")
+                            {
+                                <span class="artist-role">
+                                    Featured
+                                </span>
+                            }
+
+                        </span>
+                    }
+
+                </div>
+
+            </div>
+
+        </div>
 
     </div>
 
 
-    <div class="col-md-7">
-
-        <h1>@Model.Title</h1>
-
-        <p class="lead">
-            @Model.Genre
-        </p>
-
-        <p>
-            <strong>Record Label:</strong>
-            @Model.RecordLabel
-        </p>
-
-        <p>
-            <strong>Release Date:</strong>
-            @Model.ReleaseDate.ToString("MMMM dd, yyyy")
-        </p>
-
-
-        <h5>Artists</h5>
-
-        <p>
-
-            @string.Join(
-                ", ",
-                Model.ReleaseArtists
-                    .OrderBy(x => x.ReleaseOrdinal)
-                    .Select(x => x.Artist.ArtistName)
-            )
-
-        </p>
-
-    </div>
+    <!-- =====================================================
+         PRODUCTS
+         ===================================================== -->
+
+    <section class="release-section">
+
+        <div class="section-heading">
+
+            <div>
+
+                <span class="section-label">
+                    AVAILABLE FORMATS
+                </span>
+
+                <h2>
+                    Choose your format
+                </h2>
+
+            </div>
+
+            <span class="track-count">
+                @Model.Products.Count product(s)
+            </span>
+
+        </div>
+
+
+        @if (!Model.Products.Any())
+        {
+            <div class="no-products">
+                No physical products are currently available.
+            </div>
+        }
+        else
+        {
+            <div class="product-grid">
+
+                @foreach (var product in Model.Products
+                    .OrderBy(x => x.Format))
+                {
+                    <div class="store-product-card">
+
+                        <div class="product-card-top">
+
+                            <span class="product-format">
+                                @product.Format
+                            </span>
+
+                            @if (product.Stock > 0)
+                            {
+                                <span class="product-stock available">
+                                    In stock
+                                </span>
+                            }
+                            else
+                            {
+                                <span class="product-stock unavailable">
+                                    Out of stock
+                                </span>
+                            }
+
+                        </div>
+
+
+                        <div class="product-price">
+                            @product.Price.ToString("C")
+                        </div>
+
+
+                        <p class="product-description">
+                            @product.ProductDescription
+                        </p>
+
+
+                        @if (product.Stock > 0)
+                        {
+                            <div class="product-actions">
+
+                                <a asp-controller="Order"
+                                   asp-action="AddProduct"
+                                   asp-route-id="@product.ProductId"
+                                   class="store-button primary">
+
+                                    Add to Cart
+
+                                </a>
+
+                                <a asp-controller="Wishlist"
+                                   asp-action="Add"
+                                   asp-route-productId="@product.ProductId"
+                                   class="store-button secondary">
+
+                                    ♡ Wishlist
+
+                                </a>
+
+                            </div>
+                        }
+                        else
+                        {
+                            <div class="product-actions">
+
+                                <a asp-controller="Wishlist"
+                                   asp-action="Add"
+                                   asp-route-productId="@product.ProductId"
+                                   class="store-button secondary full">
+
+                                    ♡ Add to Wishlist
+
+                                </a>
+
+                            </div>
+                        }
+
+                    </div>
+                }
+
+            </div>
+        }
+
+    </section>
+
+
+    <!-- =====================================================
+         ALBUM
+         ===================================================== -->
+
+    @if (Model.Album != null)
+    {
+        <section class="release-section">
+
+            <div class="section-heading">
+
+                <div>
+
+                    <span class="section-label">
+                        ALBUM
+                    </span>
+
+                    <h2>
+                        Track List
+                    </h2>
+
+                </div>
+
+                <span class="track-count">
+                    @Model.Album.AlbumSongs.Count tracks
+                </span>
+
+            </div>
+
+
+            <ol class="track-list">
+
+                @{
+                    var trackNumber = 1;
+                }
+
+                @foreach (var albumSong in Model.Album.AlbumSongs
+                    .OrderBy(x => x.SongId))
+                {
+                    <li class="track-row">
+
+                        <span class="track-number">
+                            @trackNumber.ToString("00")
+                        </span>
+
+                        <div class="track-main">
+
+                            <strong>
+                                @albumSong.Song.SongName
+                            </strong>
+
+                            @if (albumSong.Song.SongArtists.Any())
+                            {
+                                <div class="song-artists">
+
+                                    @string.Join(
+                                        ", ",
+                                        albumSong.Song.SongArtists
+                                            .OrderBy(x => x.SongOrdinal)
+                                            .Select(x => x.Artist.ArtistName)
+                                    )
+
+                                </div>
+                            }
+
+                        </div>
+
+                        <span class="track-duration">
+                            @albumSong.Song.SongDuration
+                        </span>
+
+                    </li>
+
+                    trackNumber++;
+                }
+
+            </ol>
+
+        </section>
+    }
+
+
+    <!-- =====================================================
+         SINGLE
+         ===================================================== -->
+
+    @if (Model.SingleRelease != null)
+    {
+        <section class="release-section">
+
+            <div class="section-heading">
+
+                <div>
+
+                    <span class="section-label">
+                        SINGLE
+                    </span>
+
+                    <h2>
+                        Single Information
+                    </h2>
+
+                </div>
+
+            </div>
+
+
+            <div class="single-info-card">
+
+                <div>
+
+                    <span class="section-label">
+                        RELEASE TYPE
+                    </span>
+
+                    <h2>
+                        Single
+                    </h2>
+
+                </div>
+
+                <div class="single-duration">
+
+                    <span>
+                        Duration
+                    </span>
+
+                    <strong>
+                        @Model.SingleRelease.Duration
+                    </strong>
+
+                </div>
+
+            </div>
+
+        </section>
+    }
 
 </div>
-
-
-<hr />
-
-
-<h2>Available Products</h2>
-
-<div class="row">
-
-@foreach (var product in Model.Products)
-{
-    <div class="col-md-4 mb-3">
-
-        <div class="card h-100">
-
-            <div class="card-body">
-
-                <h4>
-                    @product.Format
-                </h4>
-
-                <h5>
-                    $@product.Price
-                </h5>
-
-                <p>
-                    @product.ProductDescription
-                </p>
-
-
-                @if (product.Stock > 0)
-                {
-                    <p class="text-success">
-                        In stock: @product.Stock
-                    </p>
-
-                    <a asp-controller="Order"
-                       asp-action="AddProduct"
-                       asp-route-id="@product.ProductId"
-                       class="btn btn-success">
-
-                        Add to Cart
-
-                    </a>
-                }
-                else
-                {
-                    <p class="text-danger">
-                        Out of stock
-                    </p>
-                }
-
-            </div>
-
-        </div>
-
-    </div>
-}
-
-</div>
-
-
-@if (Model.Album != null)
-{
-    <hr />
-
-    <h2>Track List</h2>
-
-    <ol>
-
-    @foreach (var albumSong in Model.Album.AlbumSongs
-        .OrderBy(x => x.SongId))
-    {
-        <li>
-
-            @albumSong.Song.SongName
-
-            <span class="text-muted">
-                (@albumSong.Song.SongDuration)
-            </span>
-
-        </li>
-    }
-
-    </ol>
-}
-
-
-@if (Model.SingleRelease != null)
-{
-    <hr />
-
-    <h2>Single</h2>
-
-    <p>
-        Duration:
-        @Model.SingleRelease.Duration
-    </p>
-}
Index: KernelRecordsMVC.Web/Views/Release/Index.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Release/Index.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Release/Index.cshtml	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -1,148 +1,344 @@
 ﻿@model IEnumerable<KernelRecordsMVC.Models.Release>
 
-<div class="d-flex justify-content-between align-items-center mb-4">
-
-    <div>
-        <h1>Music Store</h1>
-        <p class="text-muted">
-            Browse CDs, vinyl records and cassettes.
-        </p>
+@{
+    ViewData["Title"] = "Browse Releases";
+}
+
+<div class="releases-page">
+
+    <!-- =====================================================
+         HEADER
+         ===================================================== -->
+
+    <div class="releases-header">
+
+        <div>
+            <span class="page-eyebrow">KERNEL RECORDS</span>
+
+            <h1>Browse Releases</h1>
+
+            <p>
+                Explore vinyl, CDs and cassettes from our collection.
+            </p>
+        </div>
+
+        <div class="release-count">
+            @Model.Count() releases
+        </div>
+
     </div>
 
+
+    <!-- =====================================================
+         FILTERS
+         ===================================================== -->
+
+    <form asp-action="Index"
+          method="get"
+          class="release-filters">
+
+        <div class="filter-search">
+
+            <label>Search</label>
+
+            <input type="text"
+                   name="search"
+                   value="@ViewBag.Search"
+                   placeholder="Search by title or artist..." />
+
+        </div>
+
+
+        <div>
+
+            <label>Genre</label>
+
+            <select name="genre">
+
+                <option value="">All Genres</option>
+
+                @foreach (var item in ViewBag.Genres)
+                {
+                    <option value="@item"
+                            selected="@(ViewBag.Genre == item ? "selected" : null)">
+                        @item
+                    </option>
+                }
+
+            </select>
+
+        </div>
+
+
+        <div>
+
+            <label>Format</label>
+
+            <select name="format">
+
+                <option value="">All Formats</option>
+
+                @foreach (var item in ViewBag.Formats)
+                {
+                    <option value="@item"
+                            selected="@(ViewBag.Format == item ? "selected" : null)">
+                        @item
+                    </option>
+                }
+
+            </select>
+
+        </div>
+
+
+        <div>
+
+            <label>Type</label>
+
+            <select name="type">
+
+                <option value="">All Types</option>
+
+                <option value="Album"
+                        selected="@(ViewBag.Type == "Album" ? "selected" : null)">
+                    Album
+                </option>
+
+                <option value="Single"
+                        selected="@(ViewBag.Type == "Single" ? "selected" : null)">
+                    Single
+                </option>
+
+            </select>
+
+        </div>
+
+
+        <div>
+
+            <label>Sort</label>
+
+            <select name="sort">
+
+                <option value="">Title A–Z</option>
+
+                <option value="titleDesc"
+                        selected="@(ViewBag.Sort == "titleDesc" ? "selected" : null)">
+                    Title Z–A
+                </option>
+
+                <option value="newest"
+                        selected="@(ViewBag.Sort == "newest" ? "selected" : null)">
+                    Newest
+                </option>
+
+                <option value="oldest"
+                        selected="@(ViewBag.Sort == "oldest" ? "selected" : null)">
+                    Oldest
+                </option>
+
+                <option value="format"
+                        selected="@(ViewBag.Sort == "format" ? "selected" : null)">
+                    Format
+                </option>
+
+                <option value="priceAsc"
+                        selected="@(ViewBag.Sort == "priceAsc" ? "selected" : null)">
+                    Price: Low to High
+                </option>
+
+                <option value="priceDesc"
+                        selected="@(ViewBag.Sort == "priceDesc" ? "selected" : null)">
+                    Price: High to Low
+                </option>
+
+            </select>
+
+        </div>
+
+
+        <div class="filter-button">
+
+            <button type="submit"
+                    class="store-button primary">
+
+                Apply Filters
+
+            </button>
+
+        </div>
+
+
+        @if (!string.IsNullOrWhiteSpace(ViewBag.Search as string) ||
+             !string.IsNullOrWhiteSpace(ViewBag.Genre as string) ||
+             !string.IsNullOrWhiteSpace(ViewBag.Format as string) ||
+             !string.IsNullOrWhiteSpace(ViewBag.Type as string) ||
+             !string.IsNullOrWhiteSpace(ViewBag.Sort as string))
+        {
+            <div class="clear-filter">
+
+                <a asp-action="Index">
+                    Clear all filters
+                </a>
+
+            </div>
+        }
+
+    </form>
+
+
+    <!-- =====================================================
+         RELEASE GRID
+         ===================================================== -->
+
+    @if (!Model.Any())
+    {
+        <div class="empty-store">
+
+            <div class="empty-store-icon">
+                ♪
+            </div>
+
+            <h2>No releases found</h2>
+
+            <p>
+                Try changing your search or filters.
+            </p>
+
+            <a asp-action="Index"
+               class="store-button primary">
+                View All Releases
+            </a>
+
+        </div>
+    }
+    else
+    {
+        <div class="release-grid">
+
+            @foreach (var release in Model)
+            {
+                var isAlbum = release.Album != null;
+                var isSingle = release.SingleRelease != null;
+
+                var releaseType =
+                    isAlbum ? "ALBUM" :
+                    isSingle ? "SINGLE" :
+                    "RELEASE";
+
+                var artists = string.Join(
+                    ", ",
+                    release.ReleaseArtists
+                        .OrderBy(x => x.ReleaseOrdinal)
+                        .Select(x => x.Artist.ArtistName)
+                );
+
+                var lowestPrice = release.Products
+                    .Select(x => (decimal?)x.Price)
+                    .Min();
+
+                <article class="release-card">
+
+                    <a asp-action="Details"
+                       asp-route-id="@release.ReleaseId"
+                       class="release-card-cover">
+
+                        @if (!string.IsNullOrWhiteSpace(release.CoverPhoto))
+                        {
+                            <img src="@release.CoverPhoto"
+                                 alt="@release.Title" />
+                        }
+                        else
+                        {
+                            <div class="release-no-cover">
+                                <span>♪</span>
+                            </div>
+                        }
+
+                        <span class="release-type-badge">
+                            @releaseType
+                        </span>
+
+                    </a>
+
+
+                    <div class="release-card-body">
+
+                        <div class="release-card-meta">
+
+                            <span>
+                                @release.Genre
+                            </span>
+
+                            <span>
+                                @release.ReleaseDate.ToString("yyyy")
+                            </span>
+
+                        </div>
+
+
+                        <h2>
+
+                            <a asp-action="Details"
+                               asp-route-id="@release.ReleaseId">
+
+                                @release.Title
+
+                            </a>
+
+                        </h2>
+
+
+                        <p class="release-card-artist">
+
+                            @artists
+
+                        </p>
+
+
+                        <div class="format-list">
+
+                            @foreach (var product in release.Products
+                                .GroupBy(x => x.Format)
+                                .Select(x => x.First()))
+                            {
+                                <span class="format-pill">
+                                    @product.Format
+                                </span>
+                            }
+
+                        </div>
+
+
+                        <div class="release-card-bottom">
+
+                            <div class="release-starting">
+
+                                Starting at
+
+                                <strong>
+                                    @(lowestPrice?.ToString("C") ?? "N/A")
+                                </strong>
+
+                            </div>
+
+
+                            <a asp-action="Details"
+                               asp-route-id="@release.ReleaseId"
+                               class="store-button primary small">
+
+                                View
+
+                            </a>
+
+                        </div>
+
+                    </div>
+
+                </article>
+            }
+
+        </div>
+    }
+
 </div>
-
-
-<!-- SEARCH -->
-
-<form asp-action="Index"
-      method="get"
-      class="row g-2 mb-4">
-
-    <div class="col-md-6">
-
-        <input type="text"
-               name="search"
-               value="@ViewBag.Search"
-               class="form-control"
-               placeholder="Search releases..." />
-
-    </div>
-
-
-    <div class="col-md-3">
-
-        <select name="genre"
-                class="form-select">
-
-            <option value="">
-                All genres
-            </option>
-
-            @foreach (var genre in ViewBag.Genres)
-            {
-                <option value="@genre"
-                        selected="@(ViewBag.Genre == genre)">
-
-                    @genre
-
-                </option>
-            }
-
-        </select>
-
-    </div>
-
-
-    <div class="col-md-3">
-
-        <button type="submit"
-                class="btn btn-primary w-100">
-
-            Search
-
-        </button>
-
-    </div>
-
-</form>
-
-
-<!-- RELEASES -->
-
-<div class="row">
-
-@foreach (var release in Model)
-{
-    <div class="col-md-4 mb-4">
-
-        <div class="card h-100 shadow-sm">
-
-            @if (!string.IsNullOrEmpty(release.CoverPhoto))
-            {
-                <img src="@release.CoverPhoto"
-                     class="card-img-top"
-                     style="height:300px; object-fit:cover;"
-                     alt="@release.Title" />
-            }
-
-            <div class="card-body">
-
-                <h4 class="card-title">
-                    @release.Title
-                </h4>
-
-                <p class="text-muted mb-1">
-                    @release.Genre
-                </p>
-
-                <p class="small">
-                    @release.ReleaseDate.ToString("yyyy")
-                </p>
-
-
-                <!-- ARTISTS -->
-
-                <p>
-
-                    @string.Join(
-                        ", ",
-                        release.ReleaseArtists
-                            .OrderBy(x => x.ReleaseOrdinal)
-                            .Select(x => x.Artist.ArtistName)
-                    )
-
-                </p>
-
-
-                <!-- AVAILABLE FORMATS -->
-
-                <div class="mb-3">
-
-                    @foreach (var product in release.Products)
-                    {
-                        <span class="badge bg-secondary me-1">
-
-                            @product.Format
-
-                        </span>
-                    }
-
-                </div>
-
-
-                <a asp-action="Details"
-                   asp-route-id="@release.ReleaseId"
-                   class="btn btn-primary">
-
-                    View Release
-
-                </a>
-
-            </div>
-
-        </div>
-
-    </div>
-}
-
-</div>
Index: KernelRecordsMVC.Web/Views/Sale/Index.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Sale/Index.cshtml	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
+++ KernelRecordsMVC.Web/Views/Sale/Index.cshtml	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -0,0 +1,160 @@
+﻿@model IEnumerable<KernelRecordsMVC.Application.ViewModels.SaleItemViewModel>
+
+@{
+    ViewData["Title"] = "Sale";
+}
+
+<div class="sale-page">
+
+    <div class="sale-header">
+
+        <span class="page-eyebrow">
+            KERNEL RECORDS
+        </span>
+
+        <h1>Sale</h1>
+
+        <p>
+            Limited-time prices on selected physical releases.
+        </p>
+
+    </div>
+
+
+    @if (!Model.Any())
+    {
+        <div class="no-sales-data">
+
+            <div class="empty-store-icon">
+                %
+            </div>
+
+            <h2>No items are currently on sale</h2>
+
+            <p>
+                Check back soon for new discounts.
+            </p>
+
+        </div>
+    }
+    else
+    {
+        <div class="sale-grid">
+
+            @foreach (var item in Model)
+            {
+                <article class="sale-card">
+
+                    <a asp-controller="Release"
+                       asp-action="Details"
+                       asp-route-id="@item.ReleaseId"
+                       class="sale-card-cover">
+
+                        @if (!string.IsNullOrWhiteSpace(item.CoverPhoto))
+                        {
+                            <img src="@item.CoverPhoto"
+                                 alt="@item.ReleaseTitle" />
+                        }
+                        else
+                        {
+                            <div class="release-no-cover">
+                                <span>♪</span>
+                            </div>
+                        }
+
+                        <span class="sale-badge">
+                            -@item.DiscountPercentage%
+                        </span>
+
+                    </a>
+
+
+                    <div class="sale-card-body">
+
+                        <div class="release-card-meta">
+
+                            <span>
+                                @item.Format
+                            </span>
+
+                            @if (item.Stock > 0)
+                            {
+                                <span class="stock available">
+                                    In stock
+                                </span>
+                            }
+                            else
+                            {
+                                <span class="stock unavailable">
+                                    Out of stock
+                                </span>
+                            }
+
+                        </div>
+
+
+                        <h2>
+
+                            <a asp-controller="Release"
+                               asp-action="Details"
+                               asp-route-id="@item.ReleaseId">
+
+                                @item.ReleaseTitle
+
+                            </a>
+
+                        </h2>
+
+
+                        <p class="release-card-artist">
+                            @item.ArtistName
+                        </p>
+
+
+                        <div class="sale-price-row">
+
+                            <span class="sale-old-price">
+                                @item.OriginalPrice.ToString("C")
+                            </span>
+
+                            <strong class="sale-price">
+                                @item.SalePrice.ToString("C")
+                            </strong>
+
+                        </div>
+
+
+                        <div class="sale-actions">
+
+                            @if (item.Stock > 0)
+                            {
+                                <a asp-controller="Order"
+                                   asp-action="AddProduct"
+                                   asp-route-id="@item.ProductId"
+                                   class="store-button primary full">
+
+                                    Add to Cart
+
+                                </a>
+                            }
+
+                            <a asp-controller="Release"
+                               asp-action="Details"
+                               asp-route-id="@item.ReleaseId"
+                               class="store-button secondary full">
+
+                                View Release
+
+                            </a>
+
+                        </div>
+
+                    </div>
+
+                </article>
+            }
+
+        </div>
+    }
+
+</div>
Index: KernelRecordsMVC.Web/Views/Shared/_Layout.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Shared/_Layout.cshtml	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/Views/Shared/_Layout.cshtml	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -1,49 +1,682 @@
-﻿<!DOCTYPE html>
+﻿@using Microsoft.AspNetCore.Http
+
+<!DOCTYPE html>
+
 <html lang="en">
 <head>
-    <meta charset="utf-8"/>
-    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
-    <title>@ViewData["Title"] - KernelRecordsMVC</title>
-    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css"/>
-    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true"/>
-    <link rel="stylesheet" href="~/KernelRecordsMVC.styles.css" asp-append-version="true"/>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+
+
+<title>@ViewData["Title"] - Kernel Records</title>
+
+<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
+
+
 </head>
+
 <body>
-<header>
-    <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
-        <div class="container-fluid">
-            <a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">KernelRecordsMVC</a>
-            <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
-                    aria-expanded="false" aria-label="Toggle navigation">
-                <span class="navbar-toggler-icon"></span>
-            </button>
-            <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
-                <ul class="navbar-nav flex-grow-1">
-                    <li class="nav-item">
-                        <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
-                    </li>
-                    <li class="nav-item">
-                        <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
-                    </li>
-                </ul>
+
+<header class="site-header">
+
+
+<!-- =====================================================
+     MAIN NAVBAR
+     ===================================================== -->
+
+<nav class="navbar">
+
+    <div class="navbar-container">
+
+        <!-- LOGO -->
+
+        <a class="brand"
+           asp-controller="Home"
+           asp-action="Index">
+
+            <span class="brand-main">
+                KERNEL
+            </span>
+
+            <span class="brand-sub">
+                RECORDS
+            </span>
+
+        </a>
+
+
+        <!-- MOBILE MENU BUTTON -->
+
+        <button class="mobile-menu-button"
+                type="button"
+                aria-label="Toggle navigation"
+                onclick="toggleMobileMenu()">
+
+            ☰
+
+        </button>
+
+
+        <!-- NAVBAR CONTENT -->
+
+        <div class="navbar-content"
+             id="navbarContent">
+
+
+            <!-- =================================================
+                 MAIN NAVIGATION
+                 ================================================= -->
+
+            <ul class="nav-links">
+
+                <!-- Browse -->
+
+                <li>
+
+                    <a asp-controller="Release"
+                       asp-action="Index">
+
+                        Browse
+
+                    </a>
+
+                </li>
+
+
+                <!-- Top Sellers -->
+
+                <li>
+
+                    <a asp-controller="TopSellers"
+                       asp-action="Index">
+
+                        Top Sellers
+
+                    </a>
+
+                </li>
+
+
+                <!-- Artists -->
+
+                <li>
+
+                    <a asp-controller="Artist"
+                       asp-action="Index">
+
+                        Artists
+
+                    </a>
+
+                </li>
+
+
+                <!-- Genres -->
+
+                <li class="nav-dropdown">
+
+                    <a href="#"
+                       class="dropdown-toggle">
+
+                        Genres
+
+                        <span class="arrow">
+                            ⌄
+                        </span>
+
+                    </a>
+
+
+                    <div class="dropdown-menu">
+
+                        <a asp-controller="Release"
+                           asp-action="Index"
+                           asp-route-genre="Rock">
+
+                            Rock
+
+                        </a>
+
+                        <a asp-controller="Release"
+                           asp-action="Index"
+                           asp-route-genre="Pop">
+
+                            Pop
+
+                        </a>
+
+                        <a asp-controller="Release"
+                           asp-action="Index"
+                           asp-route-genre="Hip-Hop">
+
+                            Hip-Hop
+
+                        </a>
+
+                        <a asp-controller="Release"
+                           asp-action="Index"
+                           asp-route-genre="Jazz">
+
+                            Jazz
+
+                        </a>
+
+                        <a asp-controller="Release"
+                           asp-action="Index"
+                           asp-route-genre="Electronic">
+
+                            Electronic
+
+                        </a>
+
+                        <a asp-controller="Release"
+                           asp-action="Index">
+
+                            All Genres
+
+                        </a>
+
+                    </div>
+
+                </li>
+
+
+                <!-- Sale -->
+
+                <li>
+
+                    <a asp-controller="Sale"
+                       asp-action="Index"
+                       class="nav-sale">
+
+                        Sale
+
+                    </a>
+
+                </li>
+
+            </ul>
+
+
+            <!-- =================================================
+                 SEARCH
+                 ================================================= -->
+
+            <form class="navbar-search"
+                  asp-controller="Release"
+                  asp-action="Index"
+                  method="get">
+
+                <input type="text"
+                       name="search"
+                       placeholder="Search releases..."
+                       autocomplete="off" />
+
+                <button type="submit"
+                        aria-label="Search">
+
+                    <span>
+                        ⌕
+                    </span>
+
+                </button>
+
+            </form>
+
+
+            <!-- =================================================
+                 RIGHT SIDE ACTIONS
+                 ================================================= -->
+
+            <div class="navbar-actions">
+
+
+                <!-- =================================================
+                     WISHLIST
+                     ================================================= -->
+
+                <a class="nav-icon"
+                   asp-controller="Wishlist"
+                   asp-action="Index"
+                   title="Wishlist">
+
+                    <span class="icon">
+                        ♡
+                    </span>
+
+                    <span class="icon-label">
+                        Wishlist
+                    </span>
+
+                </a>
+
+
+                <!-- =================================================
+                     CART
+                     ================================================= -->
+
+                <a class="nav-icon"
+                   asp-controller="Order"
+                   asp-action="Cart"
+                   title="Shopping Cart">
+
+                    <span class="icon cart-icon">
+                        🛒
+                    </span>
+
+                    <span class="icon-label">
+                        Cart
+                    </span>
+
+                </a>
+
+
+                <!-- =================================================
+                     ACCOUNT
+                     ================================================= -->
+
+                @if (Context.Session.GetInt32("UserId") != null)
+                {
+
+                    <!-- LOGGED IN -->
+
+                    <div class="account-dropdown">
+
+
+                        <button class="account-button"
+                                type="button">
+
+                            <span class="user-icon">
+                                ●
+                            </span>
+
+                            <span class="account-name">
+
+                                @Context.Session.GetString("Username")
+
+                            </span>
+
+                            <span class="arrow">
+                                ⌄
+                            </span>
+
+                        </button>
+
+
+                        <!-- ACCOUNT MENU -->
+
+                        <div class="account-menu">
+
+
+                            <!-- PROFILE -->
+
+                            <a asp-controller="Account"
+                               asp-action="Profile">
+
+                                <span>
+                                    👤
+                                </span>
+
+                                My Profile
+
+                            </a>
+
+
+                            <!-- ORDERS -->
+
+                            <a asp-controller="Order"
+                               asp-action="Cart">
+
+                                <span>
+                                    📦
+                                </span>
+
+                                My Orders
+
+                            </a>
+
+
+                            <!-- WISHLIST -->
+
+                            <a asp-controller="Wishlist"
+                               asp-action="Index">
+
+                                <span>
+                                    ♡
+                                </span>
+
+                                My Wishlist
+
+                            </a>
+
+
+                            <!-- ADMIN -->
+
+                            @if (Context.Session.GetString("Role") == "Admin")
+                            {
+
+                                <div class="menu-divider"></div>
+
+
+                                <a asp-controller="Admin"
+                                   asp-action="Index"
+                                   class="admin-link">
+
+                                    <span>
+                                        ⚙
+                                    </span>
+
+                                    Admin Dashboard
+
+                                </a>
+
+                            }
+
+
+                            <div class="menu-divider"></div>
+
+
+                            <!-- LOGOUT -->
+
+                            <form asp-controller="Account"
+                                  asp-action="Logout"
+                                  method="post">
+
+                                @Html.AntiForgeryToken()
+
+                                <button type="submit"
+                                        class="logout-button">
+
+                                    <span>↪</span>
+
+                                    Logout
+
+                                </button>
+
+                            </form>
+
+
+                        </div>
+
+                    </div>
+
+                }
+                else
+                {
+
+                    <!-- =================================================
+                         NOT LOGGED IN
+                         ================================================= -->
+
+                    <div class="auth-buttons">
+
+
+                        <a asp-controller="Account"
+                           asp-action="Login"
+                           class="login-button">
+
+                            Login
+
+                        </a>
+
+
+                        <a asp-controller="Account"
+                           asp-action="Register"
+                           class="register-button">
+
+                            Register
+
+                        </a>
+
+
+                    </div>
+
+                }
+
             </div>
+
         </div>
-    </nav>
+
+    </div>
+
+</nav>
+
+
+<!-- =====================================================
+     ANNOUNCEMENT BAR
+     ===================================================== -->
+
+<div class="announcement-bar">
+
+    <span>
+        FREE SHIPPING ON ORDERS OVER €50
+    </span>
+
+    <span class="announcement-separator">
+        •
+    </span>
+
+    <span>
+        NEW VINYL EVERY WEEK
+    </span>
+
+</div>
+
+
 </header>
-<div class="container">
-    <main role="main" class="pb-3">
-        @RenderBody()
-    </main>
+
+<!-- =========================================================
+     MAIN CONTENT
+     ========================================================= -->
+
+<main class="main-content">
+
+
+@RenderBody()
+
+
+</main>
+
+<!-- =========================================================
+     FOOTER
+     ========================================================= -->
+
+<footer class="site-footer">
+
+
+<div class="footer-container">
+
+
+    <!-- BRAND -->
+
+    <div class="footer-brand">
+
+        <div class="footer-logo">
+            KERNEL RECORDS
+        </div>
+
+        <p>
+            Your destination for vinyl, CDs and cassettes.
+        </p>
+
+    </div>
+
+
+    <!-- SHOP -->
+
+    <div class="footer-column">
+
+        <h4>
+            Shop
+        </h4>
+
+
+        <a asp-controller="Release"
+           asp-action="Index">
+
+            Releases
+
+        </a>
+
+
+        <a asp-controller="Release"
+           asp-action="Index">
+
+            New Releases
+
+        </a>
+
+
+        <a asp-controller="Artist"
+           asp-action="Index">
+
+            Artists
+
+        </a>
+
+    </div>
+
+
+    <!-- ACCOUNT -->
+
+    <div class="footer-column">
+
+        <h4>
+            Account
+        </h4>
+
+
+        @if (Context.Session.GetInt32("UserId") != null)
+        {
+
+            <a asp-controller="Account"
+               asp-action="Profile">
+
+                My Profile
+
+            </a>
+
+
+            <a asp-controller="Order"
+               asp-action="Cart">
+
+                My Orders
+
+            </a>
+
+
+            <a asp-controller="Wishlist"
+               asp-action="Index">
+
+                Wishlist
+
+            </a>
+
+        }
+        else
+        {
+
+            <a asp-controller="Account"
+               asp-action="Login">
+
+                Login
+
+            </a>
+
+
+            <a asp-controller="Account"
+               asp-action="Register">
+
+                Register
+
+            </a>
+
+        }
+
+    </div>
+
+
+    <!-- HELP -->
+
+    <div class="footer-column">
+
+        <h4>
+            Help
+        </h4>
+
+        <a href="#">
+            Shipping
+        </a>
+
+        <a href="#">
+            Returns
+        </a>
+
+        <a href="#">
+            Contact
+        </a>
+
+    </div>
+
 </div>
 
-<footer class="border-top footer text-muted">
-    <div class="container">
-        &copy; 2026 - KernelRecordsMVC - <a asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
-    </div>
+
+<!-- FOOTER BOTTOM -->
+
+<div class="footer-bottom">
+
+    <span>
+        © @DateTime.Now.Year Kernel Records
+    </span>
+
+    <span>
+        All rights reserved.
+    </span>
+
+</div>
+
+
 </footer>
-<script src="~/lib/jquery/dist/jquery.min.js"></script>
-<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
-<script src="~/js/site.js" asp-append-version="true"></script>
-@await RenderSectionAsync("Scripts", required: false)
+
+<!-- =========================================================
+     MOBILE NAVIGATION SCRIPT
+     ========================================================= -->
+
+<script>
+
+    function toggleMobileMenu()
+    {
+        const menu =
+            document.getElementById("navbarContent");
+
+        menu.classList.toggle("mobile-open");
+    }
+
+
+    // Close mobile menu when clicking outside
+
+    document.addEventListener("click", function (event)
+    {
+        const menu =
+            document.getElementById("navbarContent");
+
+        const button =
+            document.querySelector(".mobile-menu-button");
+
+
+        if (!menu.contains(event.target) &&
+            !button.contains(event.target))
+        {
+            menu.classList.remove("mobile-open");
+        }
+
+    });
+
+</script>
+
+@await RenderSectionAsync(
+"Scripts",
+required: false)
+
 </body>
 </html>
Index: KernelRecordsMVC.Web/Views/TopSellers/Index.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/TopSellers/Index.cshtml	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
+++ KernelRecordsMVC.Web/Views/TopSellers/Index.cshtml	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -0,0 +1,143 @@
+﻿@model IEnumerable<KernelRecordsMVC.Application.ViewModels.TopSellerViewModel>
+
+@{
+    ViewData["Title"] = "Top Sellers";
+}
+
+<div class="top-sellers-page">
+
+    <div class="top-sellers-header">
+
+        <span class="page-eyebrow">
+            KERNEL RECORDS
+        </span>
+
+        <h1>Top Sellers</h1>
+
+        <p>
+            The records our customers are buying the most.
+        </p>
+
+    </div>
+
+
+    @if (!Model.Any())
+    {
+        <div class="no-sales-data">
+
+            <div class="empty-store-icon">
+                ♪
+            </div>
+
+            <h2>No sales yet</h2>
+
+            <p>
+                Top sellers will appear here once orders are completed.
+            </p>
+
+        </div>
+    }
+    else
+    {
+        <div class="release-grid">
+
+            @{
+                var position = 1;
+            }
+
+            @foreach (var item in Model)
+            {
+                <article class="release-card">
+
+                    <a asp-controller="Release"
+                       asp-action="Details"
+                       asp-route-id="@item.ReleaseId"
+                       class="release-card-cover">
+
+                        @if (!string.IsNullOrWhiteSpace(item.CoverPhoto))
+                        {
+                            <img src="@item.CoverPhoto"
+                                 alt="@item.ReleaseTitle" />
+                        }
+                        else
+                        {
+                            <div class="release-no-cover">
+                                <span>♪</span>
+                            </div>
+                        }
+
+                        <span class="release-type-badge">
+                            #@position
+                        </span>
+
+                    </a>
+
+
+                    <div class="release-card-body">
+
+                        <div class="release-card-meta">
+
+                            <span>
+                                @item.Format
+                            </span>
+
+                            <span>
+                                @item.SoldQuantity sold
+                            </span>
+
+                        </div>
+
+
+                        <h2>
+
+                            <a asp-controller="Release"
+                               asp-action="Details"
+                               asp-route-id="@item.ReleaseId">
+
+                                @item.ReleaseTitle
+
+                            </a>
+
+                        </h2>
+
+
+                        <p class="release-card-artist">
+                            @item.ArtistName
+                        </p>
+
+
+                        <div class="release-card-bottom">
+
+                            <div class="release-starting">
+
+                                Price
+
+                                <strong>
+                                    @item.Price.ToString("C")
+                                </strong>
+
+                            </div>
+
+
+                            <a asp-controller="Release"
+                               asp-action="Details"
+                               asp-route-id="@item.ReleaseId"
+                               class="store-button primary small">
+
+                                View
+
+                            </a>
+
+                        </div>
+
+                    </div>
+
+                </article>
+
+                position++;
+            }
+
+        </div>
+    }
+
+</div>
Index: KernelRecordsMVC.Web/Views/Wishlist/Index.cshtml
===================================================================
--- KernelRecordsMVC.Web/Views/Wishlist/Index.cshtml	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
+++ KernelRecordsMVC.Web/Views/Wishlist/Index.cshtml	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -0,0 +1,167 @@
+﻿@model KernelRecordsMVC.Models.Wishlist
+
+@{
+    ViewData["Title"] = "My Wishlist";
+}
+
+<div class="wishlist-page">
+
+    <div class="page-header">
+        <div>
+            <span class="page-eyebrow">YOUR COLLECTION</span>
+            <h1>My Wishlist</h1>
+            <p>Save releases and physical formats you want to get later.</p>
+        </div>
+    </div>
+
+    @if (TempData["Success"] != null)
+    {
+        <div class="alert success">
+            @TempData["Success"]
+        </div>
+    }
+
+    @if (TempData["Info"] != null)
+    {
+        <div class="alert info">
+            @TempData["Info"]
+        </div>
+    }
+
+    @if (TempData["Error"] != null)
+    {
+        <div class="alert error">
+            @TempData["Error"]
+        </div>
+    }
+
+    @if (Model.WishlistProducts == null ||
+         !Model.WishlistProducts.Any())
+    {
+        <div class="empty-wishlist">
+
+            <div class="empty-icon">
+                ♡
+            </div>
+
+            <h2>Your wishlist is empty</h2>
+
+            <p>
+                Browse our releases and save products
+                you want to purchase later.
+            </p>
+
+            <a asp-controller="Release"
+               asp-action="Index"
+               class="btn-primary">
+                Browse Releases
+            </a>
+
+        </div>
+    }
+    else
+    {
+        <div class="wishlist-grid">
+
+            @foreach (var item in Model.WishlistProducts)
+            {
+                var product = item.Product;
+                var release = product.Release;
+
+                <div class="wishlist-card">
+
+                    <a asp-controller="Release"
+                       asp-action="Details"
+                       asp-route-id="@release.ReleaseId"
+                       class="wishlist-cover">
+
+                        <img src="@release.CoverPhoto"
+                             alt="@release.Title" />
+
+                    </a>
+
+                    <div class="wishlist-info">
+
+                        <span class="wishlist-format">
+                            @product.Format
+                        </span>
+
+                        <h2>
+                            <a asp-controller="Release"
+                               asp-action="Details"
+                               asp-route-id="@release.ReleaseId">
+                                @release.Title
+                            </a>
+                        </h2>
+
+                        <p class="wishlist-genre">
+                            @release.Genre
+                        </p>
+
+                        <div class="wishlist-price">
+                            @product.Price.ToString("C")
+                        </div>
+
+                        @if (product.Stock > 0)
+                        {
+                            <span class="stock available">
+                                In stock
+                            </span>
+                        }
+                        else
+                        {
+                            <span class="stock unavailable">
+                                Out of stock
+                            </span>
+                        }
+
+                        <div class="wishlist-actions">
+
+                            @if (product.Stock > 0)
+                            {
+                                <form asp-controller="Wishlist"
+                                      asp-action="AddToCart"
+                                      method="post">
+
+                                    @Html.AntiForgeryToken()
+
+                                    <input type="hidden"
+                                           name="productId"
+                                           value="@product.ProductId" />
+
+                                    <button type="submit"
+                                            class="btn-primary">
+                                        Add to Cart
+                                    </button>
+
+                                </form>
+                            }
+
+                            <form asp-controller="Wishlist"
+                                  asp-action="Remove"
+                                  method="post">
+
+                                @Html.AntiForgeryToken()
+
+                                <input type="hidden"
+                                       name="productId"
+                                       value="@product.ProductId" />
+
+                                <button type="submit"
+                                        class="btn-remove">
+                                    Remove
+                                </button>
+
+                            </form>
+
+                        </div>
+
+                    </div>
+
+                </div>
+            }
+
+        </div>
+    }
+
+</div>
Index: KernelRecordsMVC.Web/appsettings.json
===================================================================
--- KernelRecordsMVC.Web/appsettings.json	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/appsettings.json	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -1,3 +1,7 @@
 {
+  "ConnectionStrings": {
+    "KernelRecords": ""
+  },
+
   "Logging": {
     "LogLevel": {
@@ -6,4 +10,5 @@
     }
   },
+
   "AllowedHosts": "*"
 }
Index: KernelRecordsMVC.Web/bin/Debug/net8.0/KernelRecordsMVC.Web.deps.json
===================================================================
--- KernelRecordsMVC.Web/bin/Debug/net8.0/KernelRecordsMVC.Web.deps.json	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/bin/Debug/net8.0/KernelRecordsMVC.Web.deps.json	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -11,5 +11,6 @@
           "KernelRecordsMVC.Application": "1.0.0",
           "KernelRecordsMVC.Infrastructure": "1.0.0",
-          "Microsoft.EntityFrameworkCore": "8.0.8"
+          "Microsoft.EntityFrameworkCore": "8.0.8",
+          "Npgsql.EntityFrameworkCore.PostgreSQL": "8.0.8"
         },
         "runtime": {
Index: KernelRecordsMVC.Web/bin/Debug/net8.0/appsettings.json
===================================================================
--- KernelRecordsMVC.Web/bin/Debug/net8.0/appsettings.json	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/bin/Debug/net8.0/appsettings.json	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -1,3 +1,7 @@
 {
+  "ConnectionStrings": {
+    "KernelRecords": ""
+  },
+
   "Logging": {
     "LogLevel": {
@@ -6,4 +10,5 @@
     }
   },
+
   "AllowedHosts": "*"
 }
Index: KernelRecordsMVC.Web/obj/Debug/net8.0/KernelRecordsMVC.Web.AssemblyInfo.cs
===================================================================
--- KernelRecordsMVC.Web/obj/Debug/net8.0/KernelRecordsMVC.Web.AssemblyInfo.cs	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/obj/Debug/net8.0/KernelRecordsMVC.Web.AssemblyInfo.cs	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -11,8 +11,9 @@
 using System.Reflection;
 
+[assembly: Microsoft.Extensions.Configuration.UserSecrets.UserSecretsIdAttribute("7996030f-d5d7-4616-a943-1e4992329169")]
 [assembly: System.Reflection.AssemblyCompanyAttribute("KernelRecordsMVC.Web")]
 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
-[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
+[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+08aefc6f3b51f4bfcb7471a2fd319c064171b1c5")]
 [assembly: System.Reflection.AssemblyProductAttribute("KernelRecordsMVC.Web")]
 [assembly: System.Reflection.AssemblyTitleAttribute("KernelRecordsMVC.Web")]
Index: KernelRecordsMVC.Web/obj/Debug/net8.0/KernelRecordsMVC.Web.AssemblyInfoInputs.cache
===================================================================
--- KernelRecordsMVC.Web/obj/Debug/net8.0/KernelRecordsMVC.Web.AssemblyInfoInputs.cache	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/obj/Debug/net8.0/KernelRecordsMVC.Web.AssemblyInfoInputs.cache	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -1,1 +1,1 @@
-a4f4eb88e517c7eefc9f4de02b54f54cf2b8d15155e7524b493c4ff6d5ef0bd5
+c8c33cb9ccc0e5c5e6227ad0d596fbb462f0c80224c10ca755e42b9afff049e9
Index: KernelRecordsMVC.Web/obj/Debug/net8.0/KernelRecordsMVC.Web.GeneratedMSBuildEditorConfig.editorconfig
===================================================================
--- KernelRecordsMVC.Web/obj/Debug/net8.0/KernelRecordsMVC.Web.GeneratedMSBuildEditorConfig.editorconfig	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/obj/Debug/net8.0/KernelRecordsMVC.Web.GeneratedMSBuildEditorConfig.editorconfig	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -65,4 +65,8 @@
 build_metadata.AdditionalFiles.CssScope = 
 
+[C:/Users/Marko/RiderProjects/KernelRecordsMVC/KernelRecordsMVC.Web/Views/Account/Profile.cshtml]
+build_metadata.AdditionalFiles.TargetPath = Vmlld3NcQWNjb3VudFxQcm9maWxlLmNzaHRtbA==
+build_metadata.AdditionalFiles.CssScope = 
+
 [C:/Users/Marko/RiderProjects/KernelRecordsMVC/KernelRecordsMVC.Web/Views/Account/Register.cshtml]
 build_metadata.AdditionalFiles.TargetPath = Vmlld3NcQWNjb3VudFxSZWdpc3Rlci5jc2h0bWw=
@@ -71,4 +75,8 @@
 [C:/Users/Marko/RiderProjects/KernelRecordsMVC/KernelRecordsMVC.Web/Views/Admin/CreateProduct.cshtml]
 build_metadata.AdditionalFiles.TargetPath = Vmlld3NcQWRtaW5cQ3JlYXRlUHJvZHVjdC5jc2h0bWw=
+build_metadata.AdditionalFiles.CssScope = 
+
+[C:/Users/Marko/RiderProjects/KernelRecordsMVC/KernelRecordsMVC.Web/Views/Admin/CreateRelease.cshtml]
+build_metadata.AdditionalFiles.TargetPath = Vmlld3NcQWRtaW5cQ3JlYXRlUmVsZWFzZS5jc2h0bWw=
 build_metadata.AdditionalFiles.CssScope = 
 
@@ -96,2 +104,14 @@
 build_metadata.AdditionalFiles.TargetPath = Vmlld3NcUmVsZWFzZVxJbmRleC5jc2h0bWw=
 build_metadata.AdditionalFiles.CssScope = 
+
+[C:/Users/Marko/RiderProjects/KernelRecordsMVC/KernelRecordsMVC.Web/Views/Sale/Index.cshtml]
+build_metadata.AdditionalFiles.TargetPath = Vmlld3NcU2FsZVxJbmRleC5jc2h0bWw=
+build_metadata.AdditionalFiles.CssScope = 
+
+[C:/Users/Marko/RiderProjects/KernelRecordsMVC/KernelRecordsMVC.Web/Views/TopSellers/Index.cshtml]
+build_metadata.AdditionalFiles.TargetPath = Vmlld3NcVG9wU2VsbGVyc1xJbmRleC5jc2h0bWw=
+build_metadata.AdditionalFiles.CssScope = 
+
+[C:/Users/Marko/RiderProjects/KernelRecordsMVC/KernelRecordsMVC.Web/Views/Wishlist/Index.cshtml]
+build_metadata.AdditionalFiles.TargetPath = Vmlld3NcV2lzaGxpc3RcSW5kZXguY3NodG1s
+build_metadata.AdditionalFiles.CssScope = 
Index: KernelRecordsMVC.Web/obj/Debug/net8.0/KernelRecordsMVC.Web.csproj.CoreCompileInputs.cache
===================================================================
--- KernelRecordsMVC.Web/obj/Debug/net8.0/KernelRecordsMVC.Web.csproj.CoreCompileInputs.cache	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/obj/Debug/net8.0/KernelRecordsMVC.Web.csproj.CoreCompileInputs.cache	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -1,1 +1,1 @@
-9f4bc3ac55251cbca4306c0fb37573f798c006e8b97657e25caacf03d029d22e
+21c22170dbd5df356be1a77b3f77b619add1a8fb50970ec121bfff2f0bc30d5a
Index: KernelRecordsMVC.Web/obj/Debug/net8.0/KernelRecordsMVC.Web.csproj.FileListAbsolute.txt
===================================================================
--- KernelRecordsMVC.Web/obj/Debug/net8.0/KernelRecordsMVC.Web.csproj.FileListAbsolute.txt	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/obj/Debug/net8.0/KernelRecordsMVC.Web.csproj.FileListAbsolute.txt	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -26,4 +26,5 @@
 C:\Users\Marko\RiderProjects\KernelRecordsMVC\KernelRecordsMVC.Web\obj\Debug\net8.0\KernelRecordsMVC.Web.RazorAssemblyInfo.cache
 C:\Users\Marko\RiderProjects\KernelRecordsMVC\KernelRecordsMVC.Web\obj\Debug\net8.0\KernelRecordsMVC.Web.RazorAssemblyInfo.cs
+C:\Users\Marko\RiderProjects\KernelRecordsMVC\KernelRecordsMVC.Web\obj\Debug\net8.0\KernelRecordsMVC.Web.sourcelink.json
 C:\Users\Marko\RiderProjects\KernelRecordsMVC\KernelRecordsMVC.Web\obj\Debug\net8.0\staticwebassets.build.json
 C:\Users\Marko\RiderProjects\KernelRecordsMVC\KernelRecordsMVC.Web\obj\Debug\net8.0\staticwebassets.development.json
Index: KernelRecordsMVC.Web/obj/Debug/net8.0/KernelRecordsMVC.Web.sourcelink.json
===================================================================
--- KernelRecordsMVC.Web/obj/Debug/net8.0/KernelRecordsMVC.Web.sourcelink.json	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
+++ KernelRecordsMVC.Web/obj/Debug/net8.0/KernelRecordsMVC.Web.sourcelink.json	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -0,0 +1,1 @@
+{"documents":{"C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\*":"https://raw.githubusercontent.com/mmilevski/kernelrecords/08aefc6f3b51f4bfcb7471a2fd319c064171b1c5/*"}}
Index: KernelRecordsMVC.Web/obj/KernelRecordsMVC.Web.csproj.nuget.dgspec.json
===================================================================
--- KernelRecordsMVC.Web/obj/KernelRecordsMVC.Web.csproj.nuget.dgspec.json	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/obj/KernelRecordsMVC.Web.csproj.nuget.dgspec.json	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -69,5 +69,5 @@
             }
           },
-          "runtimeIdentifierGraphPath": "C:\\Users\\Marko\\.dotnet\\sdk\\8.0.422/PortableRuntimeIdentifierGraph.json"
+          "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.424/PortableRuntimeIdentifierGraph.json"
         }
       }
@@ -133,5 +133,5 @@
             }
           },
-          "runtimeIdentifierGraphPath": "C:\\Users\\Marko\\.dotnet\\sdk\\8.0.422/PortableRuntimeIdentifierGraph.json"
+          "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.424/PortableRuntimeIdentifierGraph.json"
         }
       }
@@ -208,5 +208,5 @@
             }
           },
-          "runtimeIdentifierGraphPath": "C:\\Users\\Marko\\.dotnet\\sdk\\8.0.422/PortableRuntimeIdentifierGraph.json"
+          "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.424/PortableRuntimeIdentifierGraph.json"
         }
       }
@@ -261,4 +261,8 @@
               "target": "Package",
               "version": "[8.0.8, )"
+            },
+            "Npgsql.EntityFrameworkCore.PostgreSQL": {
+              "target": "Package",
+              "version": "[8.0.8, )"
             }
           },
@@ -282,5 +286,5 @@
             }
           },
-          "runtimeIdentifierGraphPath": "C:\\Users\\Marko\\.dotnet\\sdk\\8.0.422/PortableRuntimeIdentifierGraph.json"
+          "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.424/PortableRuntimeIdentifierGraph.json"
         }
       }
Index: KernelRecordsMVC.Web/obj/KernelRecordsMVC.Web.csproj.nuget.g.props
===================================================================
--- KernelRecordsMVC.Web/obj/KernelRecordsMVC.Web.csproj.nuget.g.props	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/obj/KernelRecordsMVC.Web.csproj.nuget.g.props	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -8,5 +8,5 @@
     <NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\Marko\.nuget\packages\</NuGetPackageFolders>
     <NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
-    <NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">7.0.0</NuGetToolVersion>
+    <NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.11.2</NuGetToolVersion>
   </PropertyGroup>
   <ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
Index: KernelRecordsMVC.Web/obj/project.assets.json
===================================================================
--- KernelRecordsMVC.Web/obj/project.assets.json	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/obj/project.assets.json	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -772,5 +772,6 @@
       "KernelRecordsMVC.Application >= 1.0.0",
       "KernelRecordsMVC.Infrastructure >= 1.0.0",
-      "Microsoft.EntityFrameworkCore >= 8.0.8"
+      "Microsoft.EntityFrameworkCore >= 8.0.8",
+      "Npgsql.EntityFrameworkCore.PostgreSQL >= 8.0.8"
     ]
   },
@@ -827,4 +828,8 @@
             "target": "Package",
             "version": "[8.0.8, )"
+          },
+          "Npgsql.EntityFrameworkCore.PostgreSQL": {
+            "target": "Package",
+            "version": "[8.0.8, )"
           }
         },
@@ -848,5 +853,5 @@
           }
         },
-        "runtimeIdentifierGraphPath": "C:\\Users\\Marko\\.dotnet\\sdk\\8.0.422/PortableRuntimeIdentifierGraph.json"
+        "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.424/PortableRuntimeIdentifierGraph.json"
       }
     }
Index: KernelRecordsMVC.Web/obj/project.nuget.cache
===================================================================
--- KernelRecordsMVC.Web/obj/project.nuget.cache	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/obj/project.nuget.cache	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -1,5 +1,5 @@
 {
   "version": 2,
-  "dgSpecHash": "OEK7FBkFq/o=",
+  "dgSpecHash": "iFoBIOYqVS4=",
   "success": true,
   "projectFilePath": "C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Web\\KernelRecordsMVC.Web.csproj",
Index: KernelRecordsMVC.Web/obj/project.packagespec.json
===================================================================
--- KernelRecordsMVC.Web/obj/project.packagespec.json	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/obj/project.packagespec.json	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -1,1 +1,1 @@
-﻿"restore":{"projectUniqueName":"C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Web\\KernelRecordsMVC.Web.csproj","projectName":"KernelRecordsMVC.Web","projectPath":"C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Web\\KernelRecordsMVC.Web.csproj","packagesPath":"","outputPath":"C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Web\\obj\\","projectStyle":"PackageReference","originalTargetFrameworks":["net8.0"],"sources":{"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net8.0":{"targetAlias":"net8.0","projectReferences":{"C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Application\\KernelRecordsMVC.Application.csproj":{"projectPath":"C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Application\\KernelRecordsMVC.Application.csproj"},"C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Infrastructure\\KernelRecordsMVC.Infrastructure.csproj":{"projectPath":"C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Infrastructure\\KernelRecordsMVC.Infrastructure.csproj"}}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"}}"frameworks":{"net8.0":{"targetAlias":"net8.0","dependencies":{"Microsoft.EntityFrameworkCore":{"target":"Package","version":"[8.0.8, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"Microsoft.AspNetCore.App":{"privateAssets":"none"},"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"C:\\Users\\Marko\\.dotnet\\sdk\\8.0.422/PortableRuntimeIdentifierGraph.json"}}
+﻿"restore":{"projectUniqueName":"C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Web\\KernelRecordsMVC.Web.csproj","projectName":"KernelRecordsMVC.Web","projectPath":"C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Web\\KernelRecordsMVC.Web.csproj","packagesPath":"","outputPath":"C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Web\\obj\\","projectStyle":"PackageReference","originalTargetFrameworks":["net8.0"],"sources":{"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net8.0":{"targetAlias":"net8.0","projectReferences":{"C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Application\\KernelRecordsMVC.Application.csproj":{"projectPath":"C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Application\\KernelRecordsMVC.Application.csproj"},"C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Infrastructure\\KernelRecordsMVC.Infrastructure.csproj":{"projectPath":"C:\\Users\\Marko\\RiderProjects\\KernelRecordsMVC\\KernelRecordsMVC.Infrastructure\\KernelRecordsMVC.Infrastructure.csproj"}}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"}}"frameworks":{"net8.0":{"targetAlias":"net8.0","dependencies":{"Microsoft.EntityFrameworkCore":{"target":"Package","version":"[8.0.8, )"},"Npgsql.EntityFrameworkCore.PostgreSQL":{"target":"Package","version":"[8.0.8, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"Microsoft.AspNetCore.App":{"privateAssets":"none"},"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"C:\\Program Files\\dotnet\\sdk\\8.0.424/PortableRuntimeIdentifierGraph.json"}}
Index: KernelRecordsMVC.Web/obj/rider.project.model.nuget.info
===================================================================
--- KernelRecordsMVC.Web/obj/rider.project.model.nuget.info	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/obj/rider.project.model.nuget.info	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -1,1 +1,1 @@
-﻿17878899583857593
+﻿17882300160457909
Index: KernelRecordsMVC.Web/obj/rider.project.restore.info
===================================================================
--- KernelRecordsMVC.Web/obj/rider.project.restore.info	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/obj/rider.project.restore.info	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -1,1 +1,1 @@
-﻿17878899596274790
+﻿17882300160457909
Index: KernelRecordsMVC.Web/wwwroot/css/site.css
===================================================================
--- KernelRecordsMVC.Web/wwwroot/css/site.css	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ KernelRecordsMVC.Web/wwwroot/css/site.css	(revision fa0fbaf2cdd288351eeaf3d4d17d8a6158ea5adc)
@@ -1,22 +1,4140 @@
+/* =========================================================
+   KERNEL RECORDS
+   MAIN STYLESHEET
+   ========================================================= */
+
+* {
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+}
+
 html {
+  font-size: 16px;
+  scroll-behavior: smooth;
+}
+
+body {
+  font-family:
+          Inter,
+          -apple-system,
+          BlinkMacSystemFont,
+          "Segoe UI",
+          sans-serif;
+
+  background: #f5f5f3;
+  color: #171717;
+
+  min-height: 100vh;
+
+  display: flex;
+  flex-direction: column;
+}
+
+a {
+  color: inherit;
+  text-decoration: none;
+}
+
+button,
+input,
+select,
+textarea {
+  font: inherit;
+}
+
+button {
+  cursor: pointer;
+}
+
+
+/* =========================================================
+   NAVBAR
+   ========================================================= */
+
+.site-header {
+  position: relative;
+  z-index: 1000;
+}
+
+.navbar {
+  background: #111;
+  color: white;
+  border-bottom: 1px solid #292929;
+}
+
+.navbar-container {
+  max-width: 1450px;
+  height: 82px;
+
+  margin: auto;
+  padding: 0 30px;
+
+  display: flex;
+  align-items: center;
+  gap: 35px;
+}
+
+.brand {
+  display: flex;
+  flex-direction: column;
+  flex-shrink: 0;
+
+  line-height: .9;
+  letter-spacing: 2px;
+}
+
+.brand-main {
+  font-size: 25px;
+  font-weight: 900;
+}
+
+.brand-sub {
+  margin-top: 6px;
+
+  font-size: 11px;
+  font-weight: 600;
+  letter-spacing: 5px;
+
+  opacity: .65;
+}
+
+.navbar-content {
+  flex: 1;
+
+  display: flex;
+  align-items: center;
+  gap: 25px;
+}
+
+.nav-links {
+  display: flex;
+  align-items: center;
+  gap: 25px;
+
+  list-style: none;
+  white-space: nowrap;
+}
+
+.nav-links a {
+  position: relative;
+
+  color: #d5d5d5;
+
+  font-size: 13px;
+  font-weight: 700;
+}
+
+.nav-links a:hover {
+  color: white;
+}
+
+.nav-links > li > a::after {
+  content: "";
+
+  position: absolute;
+
+  left: 0;
+  bottom: -8px;
+
+  width: 0;
+  height: 2px;
+
+  background: white;
+
+  transition: width .2s ease;
+}
+
+.nav-links > li > a:hover::after {
+  width: 100%;
+}
+
+.nav-sale {
+  color: #ffb4b4 !important;
+}
+
+
+/* =========================================================
+   DROPDOWNS
+   ========================================================= */
+
+.nav-dropdown {
+  position: relative;
+}
+
+.dropdown-toggle {
+  display: flex;
+  align-items: center;
+  gap: 6px;
+}
+
+.arrow {
+  font-size: 12px;
+  opacity: .7;
+}
+
+.dropdown-menu {
+  position: absolute;
+
+  top: calc(100% + 22px);
+  left: -15px;
+
+  width: 190px;
+
+  padding: 8px 0;
+
+  background: #1b1b1b;
+
+  border: 1px solid #303030;
+  border-radius: 8px;
+
+  box-shadow: 0 15px 40px rgba(0,0,0,.35);
+
+  opacity: 0;
+  visibility: hidden;
+
+  transform: translateY(-5px);
+
+  transition:
+          opacity .2s ease,
+          transform .2s ease,
+          visibility .2s ease;
+}
+
+.nav-dropdown:hover .dropdown-menu {
+  opacity: 1;
+  visibility: visible;
+  transform: translateY(0);
+}
+
+.dropdown-menu a {
+  display: block;
+
+  padding: 11px 17px;
+
+  color: #ccc;
+}
+
+.dropdown-menu a:hover {
+  background: #292929;
+  color: white;
+}
+
+
+/* =========================================================
+   NAV SEARCH
+   ========================================================= */
+
+.navbar-search {
+  flex: 1;
+
+  max-width: 320px;
+  height: 40px;
+
+  margin-left: auto;
+
+  display: flex;
+
+  background: #242424;
+
+  border: 1px solid #343434;
+  border-radius: 6px;
+
+  overflow: hidden;
+}
+
+.navbar-search input {
+  flex: 1;
+
+  min-width: 0;
+
+  padding: 0 14px;
+
+  border: none;
+  outline: none;
+
+  background: transparent;
+  color: white;
+
+  font-size: 13px;
+}
+
+.navbar-search input::placeholder {
+  color: #888;
+}
+
+.navbar-search button {
+  width: 43px;
+
+  border: none;
+  background: transparent;
+
+  color: #aaa;
+
+  font-size: 22px;
+}
+
+.navbar-search button:hover {
+  background: #303030;
+  color: white;
+}
+
+
+/* =========================================================
+   NAV ACTIONS
+   ========================================================= */
+
+.navbar-actions {
+  display: flex;
+  align-items: center;
+  gap: 17px;
+
+  flex-shrink: 0;
+}
+
+.nav-icon {
+  display: flex;
+  align-items: center;
+  gap: 7px;
+
+  color: #d1d1d1;
+
+  transition: color .2s ease;
+}
+
+.nav-icon:hover {
+  color: white;
+}
+
+.icon {
+  font-size: 21px;
+}
+
+.icon-label {
+  font-size: 12px;
+  font-weight: 700;
+}
+
+.cart-icon {
+  font-size: 17px;
+}
+
+
+/* =========================================================
+   AUTH
+   ========================================================= */
+
+.auth-buttons {
+  display: flex;
+  align-items: center;
+  gap: 8px;
+}
+
+.login-button,
+.register-button {
+  height: 38px;
+
+  padding: 0 15px;
+
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+  border-radius: 5px;
+
+  font-size: 12px;
+  font-weight: 800;
+}
+
+.login-button {
+  border: 1px solid #555;
+  background: transparent;
+  color: #eee;
+}
+
+.login-button:hover {
+  background: #292929;
+}
+
+.register-button {
+  border: 1px solid white;
+  background: white;
+  color: #111;
+}
+
+.register-button:hover {
+  background: #ddd;
+}
+
+
+/* =========================================================
+   ACCOUNT
+   ========================================================= */
+
+.account-dropdown {
+  position: relative;
+}
+
+.account-button {
+  height: 40px;
+
+  display: flex;
+  align-items: center;
+  gap: 8px;
+
+  padding: 0 5px;
+
+  border: none;
+  background: transparent;
+  color: white;
+}
+
+.user-icon {
+  width: 28px;
+  height: 28px;
+
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+  border-radius: 50%;
+
+  background: #303030;
+  color: #aaa;
+
+  font-size: 10px;
+}
+
+.account-name {
+  max-width: 100px;
+
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+
+  font-size: 12px;
+  font-weight: 700;
+}
+
+.account-menu {
+  position: absolute;
+
+  right: 0;
+  top: calc(100% + 15px);
+
+  width: 210px;
+
+  padding: 7px 0;
+
+  background: #1b1b1b;
+
+  border: 1px solid #303030;
+  border-radius: 8px;
+
+  box-shadow: 0 15px 40px rgba(0,0,0,.35);
+
+  opacity: 0;
+  visibility: hidden;
+
+  transform: translateY(-5px);
+
+  transition:
+          opacity .2s ease,
+          transform .2s ease,
+          visibility .2s ease;
+}
+
+.account-dropdown:hover .account-menu {
+  opacity: 1;
+  visibility: visible;
+  transform: translateY(0);
+}
+
+.account-menu a,
+.logout-button {
+  width: 100%;
+
+  display: flex;
+  align-items: center;
+  gap: 11px;
+
+  padding: 11px 16px;
+
+  border: none;
+  background: transparent;
+
+  color: #d0d0d0;
+
+  font-size: 13px;
+  text-align: left;
+}
+
+.account-menu a:hover,
+.logout-button:hover {
+  background: #292929;
+  color: white;
+}
+
+.menu-divider {
+  height: 1px;
+
+  margin: 6px 0;
+
+  background: #303030;
+}
+
+
+/* =========================================================
+   ANNOUNCEMENT
+   ========================================================= */
+
+.announcement-bar {
+  height: 32px;
+
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  gap: 10px;
+
+  background: #e8e8e8;
+  color: #333;
+
+  font-size: 9px;
+  font-weight: 900;
+  letter-spacing: 1.3px;
+}
+
+.announcement-separator {
+  opacity: .45;
+}
+
+
+/* =========================================================
+   MAIN
+   ========================================================= */
+
+.main-content {
+  flex: 1;
+  width: 100%;
+}
+
+
+/* =========================================================
+   GENERAL
+   ========================================================= */
+
+.page-eyebrow,
+.section-label {
+  display: block;
+
+  color: #777;
+
+  font-size: 10px;
+  font-weight: 900;
+
+  letter-spacing: 1.8px;
+  text-transform: uppercase;
+}
+
+.store-button {
+  min-height: 42px;
+
+  display: inline-flex;
+  align-items: center;
+  justify-content: center;
+
+  padding: 0 18px;
+
+  border: 1px solid #171717;
+  border-radius: 6px;
+
+  font-size: 12px;
+  font-weight: 800;
+
+  transition:
+          background .2s ease,
+          color .2s ease,
+          transform .2s ease;
+}
+
+.store-button:hover {
+  transform: translateY(-1px);
+}
+
+.store-button.primary {
+  background: #171717;
+  color: white;
+}
+
+.store-button.primary:hover {
+  background: #333;
+}
+
+.store-button.secondary {
+  background: white;
+  color: #171717;
+  border-color: #d4d4d4;
+}
+
+.store-button.secondary:hover {
+  background: #eee;
+}
+
+.store-button.small {
+  min-height: 36px;
+  padding: 0 14px;
+}
+
+.store-button.full {
+  width: 100%;
+}
+
+
+/* =========================================================
+   RELEASE INDEX
+   ========================================================= */
+
+.releases-page {
+  max-width: 1380px;
+
+  margin: 0 auto;
+
+  padding: 55px 30px 80px;
+}
+
+.releases-header {
+  display: flex;
+  align-items: flex-end;
+  justify-content: space-between;
+
+  margin-bottom: 35px;
+}
+
+.releases-header h1 {
+  margin-top: 8px;
+
+  font-size: 44px;
+  font-weight: 900;
+  letter-spacing: -1.5px;
+}
+
+.releases-header p {
+  margin-top: 8px;
+
+  color: #777;
+
+  font-size: 15px;
+}
+
+.release-count {
+  color: #777;
+
+  font-size: 12px;
+  font-weight: 800;
+}
+
+
+/* =========================================================
+   FILTERS
+   ========================================================= */
+
+.release-filters {
+  display: grid;
+
+  grid-template-columns:
+        2fr
+        1fr
+        1fr
+        1fr
+        1fr
+        auto;
+
+  gap: 12px;
+
+  align-items: end;
+
+  padding: 18px;
+
+  margin-bottom: 35px;
+
+  background: white;
+
+  border: 1px solid #ddd;
+  border-radius: 10px;
+
+  box-shadow: 0 5px 20px rgba(0,0,0,.04);
+}
+
+.release-filters label {
+  display: block;
+
+  margin-bottom: 7px;
+
+  color: #666;
+
+  font-size: 9px;
+  font-weight: 900;
+
+  text-transform: uppercase;
+  letter-spacing: 1px;
+}
+
+.release-filters input,
+.release-filters select {
+  width: 100%;
+  height: 44px;
+
+  padding: 0 13px;
+
+  border: 1px solid #d5d5d5;
+  border-radius: 6px;
+
+  outline: none;
+
+  background: white;
+  color: #171717;
+
+  font-size: 12px;
+}
+
+.release-filters input:focus,
+.release-filters select:focus {
+  border-color: #777;
+}
+
+.filter-button .store-button {
+  height: 44px;
+}
+
+.clear-filter {
+  grid-column: 1 / -1;
+}
+
+.clear-filter a {
+  color: #777;
+
+  font-size: 11px;
+  font-weight: 700;
+}
+
+.clear-filter a:hover {
+  color: #111;
+}
+
+
+/* =========================================================
+   RELEASE GRID
+   ========================================================= */
+
+.release-grid {
+  display: grid;
+
+  grid-template-columns:
+        repeat(4, minmax(0, 1fr));
+
+  gap: 24px;
+}
+
+.release-card {
+  overflow: hidden;
+
+  background: white;
+
+  border: 1px solid #ddd;
+  border-radius: 10px;
+
+  transition:
+          transform .25s ease,
+          box-shadow .25s ease;
+}
+
+.release-card:hover {
+  transform: translateY(-5px);
+
+  box-shadow:
+          0 18px 40px rgba(0,0,0,.10);
+}
+
+.release-card-cover {
+  position: relative;
+
+  display: block;
+
+  aspect-ratio: 1 / 1;
+
+  overflow: hidden;
+
+  background: #ddd;
+}
+
+.release-card-cover img {
+  width: 100%;
+  height: 100%;
+
+  display: block;
+
+  object-fit: cover;
+
+  transition: transform .4s ease;
+}
+
+.release-card:hover .release-card-cover img {
+  transform: scale(1.04);
+}
+
+.release-no-cover {
+  width: 100%;
+  height: 100%;
+
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+  background:
+          linear-gradient(
+                  135deg,
+                  #222,
+                  #555
+          );
+
+  color: white;
+}
+
+.release-no-cover span {
+  font-size: 55px;
+}
+
+.release-type-badge {
+  position: absolute;
+
+  top: 12px;
+  left: 12px;
+
+  padding: 6px 9px;
+
+  background: rgba(17,17,17,.9);
+  color: white;
+
+  border-radius: 4px;
+
+  font-size: 9px;
+  font-weight: 900;
+
+  letter-spacing: 1px;
+}
+
+.release-card-body {
+  padding: 19px;
+}
+
+.release-card-meta {
+  display: flex;
+  justify-content: space-between;
+
+  margin-bottom: 8px;
+
+  color: #888;
+
+  font-size: 9px;
+  font-weight: 800;
+
+  text-transform: uppercase;
+  letter-spacing: .8px;
+}
+
+.release-card h2 {
+  margin-bottom: 5px;
+
+  font-size: 20px;
+  font-weight: 800;
+
+  line-height: 1.2;
+}
+
+.release-card h2 a:hover {
+  text-decoration: underline;
+}
+
+.release-card-artist {
+  min-height: 20px;
+
+  color: #666;
+
+  font-size: 13px;
+}
+
+.format-list {
+  display: flex;
+  flex-wrap: wrap;
+
+  gap: 6px;
+
+  margin-top: 14px;
+}
+
+.format-pill {
+  padding: 5px 8px;
+
+  background: #f0f0ee;
+
+  border-radius: 4px;
+
+  color: #555;
+
+  font-size: 9px;
+  font-weight: 900;
+
+  letter-spacing: .6px;
+}
+
+.release-card-bottom {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+
+  gap: 10px;
+
+  margin-top: 18px;
+  padding-top: 15px;
+
+  border-top: 1px solid #eee;
+}
+
+.release-starting {
+  color: #888;
+
+  font-size: 10px;
+}
+
+.release-starting strong {
+  display: block;
+
+  margin-top: 2px;
+
+  color: #171717;
+
   font-size: 14px;
 }
 
-@media (min-width: 768px) {
-  html {
-    font-size: 16px;
-  }
-}
-
-.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus {
-  box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb;
-}
-
-html {
+
+/* =========================================================
+   EMPTY STATES
+   ========================================================= */
+
+.empty-store,
+.no-sales-data {
+  padding: 80px 25px;
+
+  text-align: center;
+
+  background: white;
+
+  border: 1px solid #ddd;
+  border-radius: 10px;
+}
+
+.empty-store-icon {
+  margin-bottom: 15px;
+
+  color: #777;
+
+  font-size: 48px;
+}
+
+.empty-store h2,
+.no-sales-data h2 {
+  margin-bottom: 8px;
+
+  font-size: 25px;
+}
+
+.empty-store p,
+.no-sales-data p {
+  margin-bottom: 22px;
+
+  color: #777;
+}
+
+
+/* =========================================================
+   RELEASE DETAILS
+   ========================================================= */
+
+.release-details-page {
+  max-width: 1250px;
+
+  margin: 0 auto;
+
+  padding: 50px 30px 80px;
+}
+
+.release-hero {
+  display: grid;
+
+  grid-template-columns:
+        minmax(350px, 500px)
+        1fr;
+
+  gap: 55px;
+
+  align-items: start;
+}
+
+.release-hero-cover {
+  aspect-ratio: 1 / 1;
+
+  overflow: hidden;
+
+  border-radius: 8px;
+
+  background: #ddd;
+}
+
+.release-hero-cover img {
+  width: 100%;
+  height: 100%;
+
+  object-fit: cover;
+}
+
+.release-hero-info h1 {
+  margin-top: 8px;
+
+  font-size: 55px;
+  line-height: .95;
+  letter-spacing: -2px;
+  font-weight: 900;
+}
+
+.release-artists-main {
+  margin: 22px 0 32px;
+
+  color: #555;
+
+  font-size: 19px;
+}
+
+.release-facts {
+  display: grid;
+
+  grid-template-columns:
+        repeat(3, 1fr);
+
+  gap: 15px;
+
+  padding: 20px 0;
+
+  border-top: 1px solid #ddd;
+  border-bottom: 1px solid #ddd;
+}
+
+.release-facts div {
+  display: flex;
+  flex-direction: column;
+
+  gap: 5px;
+}
+
+.release-facts span {
+  color: #888;
+
+  font-size: 9px;
+  font-weight: 900;
+
+  text-transform: uppercase;
+  letter-spacing: 1px;
+}
+
+.release-facts strong {
+  font-size: 13px;
+}
+
+.artist-section {
+  margin-top: 25px;
+}
+
+.release-artists {
+  display: flex;
+  flex-wrap: wrap;
+
+  gap: 7px;
+
+  margin-top: 10px;
+}
+
+.artist-tag {
+  padding: 7px 10px;
+
+  background: white;
+
+  border: 1px solid #ddd;
+  border-radius: 5px;
+
+  font-size: 12px;
+  font-weight: 700;
+}
+
+.artist-role {
+  color: #888;
+
+  font-size: 9px;
+
+  text-transform: uppercase;
+}
+
+
+/* =========================================================
+   RELEASE SECTIONS
+   ========================================================= */
+
+.release-section {
+  margin-top: 70px;
+}
+
+.section-heading {
+  display: flex;
+  align-items: flex-end;
+  justify-content: space-between;
+
+  margin-bottom: 22px;
+  padding-bottom: 15px;
+
+  border-bottom: 1px solid #ddd;
+}
+
+.section-heading h2 {
+  margin-top: 5px;
+
+  font-size: 28px;
+  font-weight: 900;
+}
+
+.track-count {
+  color: #888;
+
+  font-size: 12px;
+}
+
+
+/* =========================================================
+   PRODUCT CARDS
+   ========================================================= */
+
+.product-grid {
+  display: grid;
+
+  grid-template-columns:
+        repeat(3, minmax(0, 1fr));
+
+  gap: 18px;
+}
+
+.store-product-card {
+  padding: 23px;
+
+  background: white;
+
+  border: 1px solid #ddd;
+  border-radius: 9px;
+
+  transition:
+          transform .2s ease,
+          box-shadow .2s ease;
+}
+
+.store-product-card:hover {
+  transform: translateY(-3px);
+
+  box-shadow:
+          0 12px 30px rgba(0,0,0,.08);
+}
+
+.product-card-top {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+
+  margin-bottom: 20px;
+}
+
+.product-format {
+  font-size: 13px;
+  font-weight: 900;
+
+  letter-spacing: 1px;
+}
+
+.product-stock {
+  font-size: 10px;
+  font-weight: 800;
+}
+
+.product-stock.available {
+  color: #27804d;
+}
+
+.product-stock.unavailable {
+  color: #a33;
+}
+
+.product-price {
+  margin-bottom: 10px;
+
+  font-size: 28px;
+  font-weight: 900;
+}
+
+.product-description {
+  min-height: 48px;
+
+  color: #777;
+
+  font-size: 12px;
+  line-height: 1.6;
+}
+
+.product-actions {
+  display: grid;
+
+  grid-template-columns:
+        1fr 1fr;
+
+  gap: 8px;
+
+  margin-top: 20px;
+}
+
+
+/* =========================================================
+   TRACK LIST
+   ========================================================= */
+
+.track-list {
+  background: white;
+
+  border: 1px solid #ddd;
+  border-radius: 8px;
+
+  overflow: hidden;
+
+  list-style: none;
+}
+
+.track-row {
+  min-height: 68px;
+
+  display: grid;
+
+  grid-template-columns:
+        55px 1fr auto;
+
+  align-items: center;
+
+  gap: 15px;
+
+  padding: 10px 20px;
+
+  border-bottom: 1px solid #eee;
+}
+
+.track-row:last-child {
+  border-bottom: none;
+}
+
+.track-number {
+  color: #999;
+
+  font-size: 12px;
+  font-weight: 800;
+}
+
+.track-main strong {
+  font-size: 13px;
+}
+
+.song-artists {
+  margin-top: 4px;
+
+  color: #888;
+
+  font-size: 11px;
+}
+
+.track-duration {
+  color: #777;
+
+  font-size: 12px;
+}
+
+
+/* =========================================================
+   SINGLE
+   ========================================================= */
+
+.single-info-card {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+
+  padding: 25px;
+
+  background: white;
+
+  border: 1px solid #ddd;
+  border-radius: 8px;
+}
+
+.single-info-card h2 {
+  margin-top: 5px;
+
+  font-size: 22px;
+}
+
+.single-duration {
+  text-align: right;
+}
+
+.single-duration span {
+  display: block;
+
+  color: #888;
+
+  font-size: 9px;
+  font-weight: 900;
+
+  text-transform: uppercase;
+  letter-spacing: 1px;
+}
+
+.single-duration strong {
+  display: block;
+
+  margin-top: 4px;
+
+  font-size: 20px;
+}
+
+
+/* =========================================================
+   CART
+   ========================================================= */
+
+.cart-page {
+  max-width: 1250px;
+
+  margin: 0 auto;
+
+  padding: 55px 30px 80px;
+}
+
+.cart-header {
+  display: flex;
+  align-items: flex-end;
+  justify-content: space-between;
+
+  margin-bottom: 35px;
+}
+
+.cart-header h1 {
+  margin-top: 7px;
+
+  font-size: 44px;
+  font-weight: 900;
+
+  letter-spacing: -1.5px;
+}
+
+.cart-header p {
+  margin-top: 8px;
+
+  color: #777;
+
+  font-size: 14px;
+}
+
+.cart-layout {
+  display: grid;
+
+  grid-template-columns:
+        1fr 330px;
+
+  gap: 25px;
+
+  align-items: start;
+}
+
+.cart-items {
+  background: white;
+
+  border: 1px solid #ddd;
+  border-radius: 9px;
+
+  overflow: hidden;
+}
+
+.cart-items-header {
+  padding: 16px 20px;
+
+  background: #fafafa;
+
+  border-bottom: 1px solid #ddd;
+
+  color: #777;
+
+  font-size: 12px;
+  font-weight: 800;
+}
+
+.cart-item {
+  min-height: 130px;
+
+  display: grid;
+
+  grid-template-columns:
+        90px 1fr auto auto 30px;
+
+  align-items: center;
+
+  gap: 18px;
+
+  padding: 20px;
+
+  border-bottom: 1px solid #eee;
+}
+
+.cart-item:last-child {
+  border-bottom: none;
+}
+
+.cart-item-cover {
+  width: 90px;
+  height: 90px;
+
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+  overflow: hidden;
+
+  background:
+          linear-gradient(
+                  135deg,
+                  #222,
+                  #555
+          );
+
+  color: white;
+
+  border-radius: 5px;
+}
+
+.cart-item-cover img {
+  width: 100%;
+  height: 100%;
+
+  object-fit: cover;
+}
+
+.cart-item-type {
+  color: #888;
+
+  font-size: 9px;
+  font-weight: 900;
+
+  text-transform: uppercase;
+  letter-spacing: 1px;
+}
+
+.cart-item-info h2 {
+  margin-top: 5px;
+
+  font-size: 17px;
+  font-weight: 800;
+}
+
+.cart-item-info h2 a:hover {
+  text-decoration: underline;
+}
+
+.cart-item-price {
+  margin-top: 6px;
+
+  color: #777;
+
+  font-size: 11px;
+}
+
+.cart-item-quantity form {
+  display: flex;
+  align-items: center;
+
+  gap: 6px;
+}
+
+.cart-item-quantity input {
+  width: 58px;
+  height: 36px;
+
+  padding: 0 8px;
+
+  border: 1px solid #ccc;
+  border-radius: 5px;
+
+  text-align: center;
+}
+
+.cart-item-quantity button {
+  height: 36px;
+
+  padding: 0 9px;
+
+  border: 1px solid #ccc;
+  border-radius: 5px;
+
+  background: white;
+  color: #555;
+
+  font-size: 10px;
+  font-weight: 800;
+}
+
+.cart-item-quantity button:hover {
+  background: #eee;
+}
+
+.cart-item-total {
+  min-width: 80px;
+
+  text-align: right;
+
+  font-size: 15px;
+  font-weight: 900;
+}
+
+.cart-remove {
+  width: 28px;
+  height: 28px;
+
+  border: none;
+  background: transparent;
+
+  color: #999;
+
+  font-size: 24px;
+}
+
+.cart-remove:hover {
+  color: #a33;
+}
+
+.cart-summary {
+  position: sticky;
+  top: 25px;
+
+  padding: 25px;
+
+  background: white;
+
+  border: 1px solid #ddd;
+  border-radius: 9px;
+
+  box-shadow: 0 8px 25px rgba(0,0,0,.05);
+}
+
+.cart-summary h2 {
+  margin-top: 6px;
+
+  font-size: 23px;
+}
+
+.summary-line {
+  display: flex;
+  justify-content: space-between;
+
+  padding: 15px 0;
+
+  color: #777;
+
+  font-size: 13px;
+
+  border-bottom: 1px solid #eee;
+}
+
+.summary-line.total {
+  margin-bottom: 20px;
+
+  color: #171717;
+
+  font-size: 17px;
+  font-weight: 900;
+}
+
+
+/* =========================================================
+   WISHLIST
+   ========================================================= */
+
+.wishlist-page {
+  max-width: 1250px;
+
+  margin: 0 auto;
+
+  padding: 55px 30px 80px;
+}
+
+.page-header {
+  margin-bottom: 35px;
+}
+
+.page-header h1 {
+  margin-top: 7px;
+
+  font-size: 44px;
+  font-weight: 900;
+
+  letter-spacing: -1.5px;
+}
+
+.page-header p {
+  margin-top: 8px;
+
+  color: #777;
+
+  font-size: 14px;
+}
+
+.wishlist-grid {
+  display: grid;
+
+  grid-template-columns:
+        repeat(2, minmax(0, 1fr));
+
+  gap: 20px;
+}
+
+.wishlist-card {
+  display: grid;
+
+  grid-template-columns:
+        190px 1fr;
+
+  overflow: hidden;
+
+  background: white;
+
+  border: 1px solid #ddd;
+  border-radius: 9px;
+}
+
+.wishlist-cover {
+  aspect-ratio: 1 / 1;
+
+  overflow: hidden;
+
+  background: #ddd;
+}
+
+.wishlist-cover img {
+  width: 100%;
+  height: 100%;
+
+  display: block;
+
+  object-fit: cover;
+
+  transition: transform .35s ease;
+}
+
+.wishlist-card:hover .wishlist-cover img {
+  transform: scale(1.04);
+}
+
+.wishlist-info {
+  padding: 22px;
+}
+
+.wishlist-format {
+  color: #888;
+
+  font-size: 9px;
+  font-weight: 900;
+
+  text-transform: uppercase;
+  letter-spacing: 1px;
+}
+
+.wishlist-info h2 {
+  margin-top: 7px;
+
+  font-size: 20px;
+  font-weight: 900;
+}
+
+.wishlist-info h2 a:hover {
+  text-decoration: underline;
+}
+
+.wishlist-genre {
+  margin-top: 6px;
+
+  color: #777;
+
+  font-size: 12px;
+}
+
+.wishlist-price {
+  margin-top: 18px;
+
+  font-size: 22px;
+  font-weight: 900;
+}
+
+.stock {
+  display: inline-block;
+
+  margin-top: 7px;
+
+  font-size: 10px;
+  font-weight: 800;
+}
+
+.stock.available {
+  color: #27804d;
+}
+
+.stock.unavailable {
+  color: #a33;
+}
+
+.wishlist-actions {
+  display: flex;
+  flex-wrap: wrap;
+
+  gap: 8px;
+
+  margin-top: 20px;
+}
+
+.btn-remove {
+  min-height: 42px;
+
+  padding: 0 17px;
+
+  border: 1px solid #ccc;
+  border-radius: 6px;
+
+  background: white;
+  color: #777;
+
+  font-size: 12px;
+  font-weight: 800;
+}
+
+.btn-remove:hover {
+  border-color: #a33;
+  color: #a33;
+}
+
+
+/* =========================================================
+   SALE
+   ========================================================= */
+
+.sale-page {
+  max-width: 1380px;
+
+  margin: 0 auto;
+
+  padding: 55px 30px 80px;
+}
+
+.sale-header {
+  margin-bottom: 40px;
+}
+
+.sale-header h1 {
+  margin-top: 8px;
+
+  font-size: 48px;
+  font-weight: 900;
+
+  letter-spacing: -2px;
+}
+
+.sale-header p {
+  margin-top: 8px;
+
+  color: #777;
+}
+
+.sale-grid {
+  display: grid;
+
+  grid-template-columns:
+        repeat(4, minmax(0, 1fr));
+
+  gap: 24px;
+}
+
+.sale-card {
+  overflow: hidden;
+
+  background: white;
+
+  border: 1px solid #ddd;
+  border-radius: 10px;
+
+  transition:
+          transform .25s ease,
+          box-shadow .25s ease;
+}
+
+.sale-card:hover {
+  transform: translateY(-5px);
+
+  box-shadow:
+          0 18px 40px rgba(0,0,0,.10);
+}
+
+.sale-card-cover {
   position: relative;
-  min-height: 100%;
-}
-
-body {
-  margin-bottom: 60px;
-}
+
+  display: block;
+
+  aspect-ratio: 1 / 1;
+
+  overflow: hidden;
+
+  background: #ddd;
+}
+
+.sale-card-cover img {
+  width: 100%;
+  height: 100%;
+
+  object-fit: cover;
+
+  transition: transform .4s ease;
+}
+
+.sale-card:hover .sale-card-cover img {
+  transform: scale(1.04);
+}
+
+.sale-badge {
+  position: absolute;
+
+  top: 12px;
+  right: 12px;
+
+  padding: 7px 9px;
+
+  background: #171717;
+  color: white;
+
+  border-radius: 4px;
+
+  font-size: 10px;
+  font-weight: 900;
+}
+
+.sale-card-body {
+  padding: 20px;
+}
+
+.sale-card-body h2 {
+  margin-top: 7px;
+
+  font-size: 20px;
+  font-weight: 900;
+}
+
+.sale-card-body h2 a:hover {
+  text-decoration: underline;
+}
+
+.sale-price-row {
+  display: flex;
+  align-items: baseline;
+  gap: 9px;
+
+  margin-top: 18px;
+}
+
+.sale-old-price {
+  color: #999;
+
+  font-size: 13px;
+
+  text-decoration: line-through;
+}
+
+.sale-price {
+  font-size: 25px;
+  font-weight: 900;
+}
+
+.sale-actions {
+  display: grid;
+
+  gap: 8px;
+
+  margin-top: 20px;
+}
+
+
+/* =========================================================
+   TOP SELLERS
+   ========================================================= */
+
+.top-sellers-page {
+  max-width: 1380px;
+
+  margin: 0 auto;
+
+  padding: 55px 30px 80px;
+}
+
+.top-sellers-header {
+  margin-bottom: 40px;
+}
+
+.top-sellers-header h1 {
+  margin-top: 8px;
+
+  font-size: 48px;
+  font-weight: 900;
+
+  letter-spacing: -2px;
+}
+
+.top-sellers-header p {
+  margin-top: 8px;
+
+  color: #777;
+}
+
+
+/* =========================================================
+   HOME
+   ========================================================= */
+
+.home-page {
+  max-width: 1400px;
+
+  margin: 0 auto;
+
+  padding: 35px 30px 80px;
+}
+
+.home-hero {
+  min-height: 540px;
+
+  position: relative;
+
+  display: flex;
+  align-items: center;
+
+  padding: 75px;
+
+  overflow: hidden;
+
+  background: #111;
+  color: white;
+
+  border-radius: 16px;
+}
+
+.home-hero-content {
+  position: relative;
+  z-index: 2;
+
+  max-width: 680px;
+}
+
+.home-eyebrow {
+  color: #aaa;
+
+  font-size: 11px;
+  font-weight: 900;
+
+  letter-spacing: 3px;
+}
+
+.home-hero h1 {
+  margin-top: 16px;
+
+  font-size: clamp(48px, 6vw, 82px);
+
+  line-height: .93;
+
+  font-weight: 900;
+
+  letter-spacing: -4px;
+}
+
+.home-hero h1 span {
+  color: #777;
+}
+
+.home-hero p {
+  max-width: 540px;
+
+  margin-top: 25px;
+
+  color: #bbb;
+
+  font-size: 17px;
+  line-height: 1.7;
+}
+
+.home-hero-actions {
+  display: flex;
+  gap: 10px;
+
+  margin-top: 30px;
+}
+
+.home-button {
+  min-height: 46px;
+
+  display: inline-flex;
+  align-items: center;
+  justify-content: center;
+
+  padding: 0 21px;
+
+  border-radius: 6px;
+
+  font-size: 12px;
+  font-weight: 900;
+}
+
+.home-button.primary {
+  background: white;
+  color: #111;
+}
+
+.home-button.primary:hover {
+  background: #ddd;
+}
+
+.home-button.secondary {
+  border: 1px solid #555;
+  color: white;
+}
+
+.home-button.secondary:hover {
+  background: #292929;
+}
+
+.home-hero-mark {
+  position: absolute;
+
+  right: 5%;
+  bottom: -60px;
+
+  color: #1e1e1e;
+
+  font-size: 420px;
+  font-weight: 900;
+
+  line-height: 1;
+}
+
+.home-section {
+  margin-top: 70px;
+}
+
+.home-section-header {
+  margin-bottom: 25px;
+}
+
+.home-section-header h2 {
+  margin-top: 7px;
+
+  font-size: 32px;
+  font-weight: 900;
+}
+
+.home-feature-grid {
+  display: grid;
+
+  grid-template-columns:
+        repeat(3, 1fr);
+
+  gap: 18px;
+}
+
+.home-feature-card {
+  min-height: 220px;
+
+  padding: 27px;
+
+  background: white;
+
+  border: 1px solid #ddd;
+  border-radius: 10px;
+
+  transition:
+          transform .2s ease,
+          box-shadow .2s ease;
+}
+
+.home-feature-card:hover {
+  transform: translateY(-4px);
+
+  box-shadow:
+          0 15px 35px rgba(0,0,0,.08);
+}
+
+.home-feature-card > span {
+  color: #999;
+
+  font-size: 10px;
+  font-weight: 900;
+}
+
+.home-feature-card h3 {
+  margin-top: 35px;
+
+  font-size: 23px;
+  font-weight: 900;
+}
+
+.home-feature-card p {
+  margin-top: 8px;
+
+  color: #777;
+
+  font-size: 13px;
+}
+
+.home-feature-card strong {
+  display: block;
+
+  margin-top: 25px;
+
+  font-size: 12px;
+}
+
+.home-feature-card.sale-feature {
+  background: #171717;
+  color: white;
+}
+
+.home-feature-card.sale-feature p {
+  color: #aaa;
+}
+
+.home-collection {
+  margin-top: 70px;
+  padding: 40px;
+
+  display: flex;
+  justify-content: space-between;
+  gap: 40px;
+
+  background: #e9e9e7;
+
+  border-radius: 10px;
+}
+
+.home-collection h2 {
+  margin-top: 7px;
+
+  font-size: 32px;
+  font-weight: 900;
+}
+
+.home-collection p {
+  max-width: 450px;
+
+  color: #666;
+
+  line-height: 1.7;
+}
+
+
+/* =========================================================
+   PROFILE
+   ========================================================= */
+
+.profile-page {
+  max-width: 1100px;
+
+  margin: 0 auto;
+
+  padding: 55px 30px 80px;
+}
+
+.profile-header {
+  margin-bottom: 35px;
+}
+
+.profile-header h1 {
+  margin-top: 8px;
+
+  font-size: 44px;
+  font-weight: 900;
+
+  letter-spacing: -1.5px;
+}
+
+.profile-header p {
+  margin-top: 8px;
+
+  color: #777;
+}
+
+.profile-layout {
+  display: grid;
+
+  grid-template-columns:
+        280px 1fr;
+
+  gap: 25px;
+
+  align-items: start;
+}
+
+.profile-sidebar,
+.profile-card {
+  background: white;
+
+  border: 1px solid #ddd;
+  border-radius: 10px;
+}
+
+.profile-sidebar {
+  padding: 30px;
+
+  text-align: center;
+}
+
+.profile-avatar {
+  width: 80px;
+  height: 80px;
+
+  margin: 0 auto 18px;
+
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+  border-radius: 50%;
+
+  background: #171717;
+  color: white;
+
+  font-size: 32px;
+  font-weight: 900;
+}
+
+.profile-sidebar h2 {
+  font-size: 21px;
+}
+
+.profile-sidebar > p {
+  margin-top: 5px;
+
+  color: #777;
+
+  font-size: 12px;
+
+  word-break: break-word;
+}
+
+.profile-member,
+.profile-points {
+  margin-top: 28px;
+  padding-top: 20px;
+
+  border-top: 1px solid #eee;
+}
+
+.profile-member span,
+.profile-points span {
+  display: block;
+
+  color: #888;
+
+  font-size: 9px;
+  font-weight: 900;
+
+  letter-spacing: 1px;
+}
+
+.profile-member strong,
+.profile-points strong {
+  display: block;
+
+  margin-top: 6px;
+
+  font-size: 14px;
+}
+
+.profile-points strong {
+  font-size: 25px;
+}
+
+.profile-card {
+  padding: 30px;
+}
+
+.profile-card-header {
+  padding-bottom: 20px;
+
+  border-bottom: 1px solid #eee;
+}
+
+.profile-card-header h2 {
+  margin-top: 6px;
+
+  font-size: 24px;
+}
+
+.profile-form {
+  padding-top: 25px;
+}
+
+.profile-field {
+  margin-bottom: 20px;
+}
+
+.profile-field label {
+  display: block;
+
+  margin-bottom: 7px;
+
+  color: #555;
+
+  font-size: 10px;
+  font-weight: 900;
+
+  text-transform: uppercase;
+  letter-spacing: 1px;
+}
+
+.profile-field input,
+.profile-field textarea {
+  width: 100%;
+
+  padding: 12px 13px;
+
+  border: 1px solid #d4d4d4;
+  border-radius: 6px;
+
+  outline: none;
+
+  background: white;
+  color: #171717;
+
+  font-size: 13px;
+}
+
+.profile-field textarea {
+  resize: vertical;
+}
+
+.profile-field input:focus,
+.profile-field textarea:focus {
+  border-color: #777;
+}
+
+.profile-field input[readonly] {
+  background: #f3f3f3;
+  color: #777;
+}
+
+.profile-field small {
+  display: block;
+
+  margin-top: 5px;
+
+  color: #999;
+
+  font-size: 10px;
+}
+
+.field-error,
+.validation-summary {
+  color: #a33;
+
+  font-size: 11px;
+}
+
+.profile-form-actions {
+  display: flex;
+  gap: 8px;
+
+  margin-top: 25px;
+}
+
+.profile-alert {
+  margin-bottom: 20px;
+
+  padding: 14px 16px;
+
+  border-radius: 6px;
+
+  font-size: 12px;
+  font-weight: 700;
+}
+
+.profile-alert.success {
+  background: #e8f5ed;
+  color: #28734a;
+
+  border: 1px solid #c9e6d4;
+}
+
+
+/* =========================================================
+   FOOTER
+   ========================================================= */
+
+.site-footer {
+  margin-top: 80px;
+
+  background: #111;
+  color: #aaa;
+}
+
+.footer-container {
+  max-width: 1200px;
+
+  margin: 0 auto;
+
+  padding: 55px 30px;
+
+  display: grid;
+
+  grid-template-columns:
+        2fr 1fr 1fr 1fr;
+
+  gap: 50px;
+}
+
+.footer-logo {
+  color: white;
+
+  font-size: 20px;
+  font-weight: 900;
+
+  letter-spacing: 2px;
+}
+
+.footer-brand p {
+  max-width: 260px;
+
+  margin-top: 13px;
+
+  color: #777;
+
+  font-size: 13px;
+  line-height: 1.7;
+}
+
+.footer-column {
+  display: flex;
+  flex-direction: column;
+
+  gap: 10px;
+}
+
+.footer-column h4 {
+  margin-bottom: 8px;
+
+  color: white;
+
+  font-size: 11px;
+  font-weight: 900;
+
+  text-transform: uppercase;
+  letter-spacing: 1.3px;
+}
+
+.footer-column a {
+  width: fit-content;
+
+  color: #777;
+
+  font-size: 12px;
+}
+
+.footer-column a:hover {
+  color: white;
+}
+
+.footer-bottom {
+  max-width: 1200px;
+
+  margin: auto;
+  padding: 18px 30px;
+
+  border-top: 1px solid #292929;
+
+  display: flex;
+  justify-content: space-between;
+
+  color: #666;
+
+  font-size: 10px;
+}
+
+
+/* =========================================================
+   RESPONSIVE
+   ========================================================= */
+
+.mobile-menu-button {
+  display: none;
+}
+
+@media (max-width: 1200px) {
+
+  .navbar-container {
+    gap: 20px;
+  }
+
+  .nav-links {
+    gap: 15px;
+  }
+
+  .icon-label {
+    display: none;
+  }
+
+  .release-grid,
+  .sale-grid {
+    grid-template-columns:
+            repeat(3, minmax(0, 1fr));
+  }
+
+  .release-filters {
+    grid-template-columns:
+            2fr 1fr 1fr 1fr;
+  }
+
+  .filter-search {
+    grid-column: 1 / -1;
+  }
+
+  .filter-button {
+    grid-column: 1 / -1;
+  }
+}
+
+
+@media (max-width: 1000px) {
+
+  .release-grid,
+  .sale-grid {
+    grid-template-columns:
+            repeat(2, minmax(0, 1fr));
+  }
+
+  .wishlist-grid {
+    grid-template-columns: 1fr;
+  }
+
+  .release-hero {
+    grid-template-columns:
+            1fr 1fr;
+
+    gap: 30px;
+  }
+
+  .product-grid {
+    grid-template-columns:
+            repeat(2, minmax(0, 1fr));
+  }
+
+  .cart-layout {
+    grid-template-columns: 1fr;
+  }
+
+  .cart-summary {
+    position: static;
+  }
+
+  .profile-layout {
+    grid-template-columns: 1fr;
+  }
+
+  .profile-sidebar {
+    text-align: left;
+  }
+
+  .profile-avatar {
+    margin-left: 0;
+  }
+
+  .home-feature-grid {
+    grid-template-columns: 1fr 1fr;
+  }
+}
+
+
+@media (max-width: 950px) {
+
+  .navbar-container {
+    height: 70px;
+  }
+
+  .mobile-menu-button {
+    display: block;
+
+    margin-left: auto;
+
+    width: 42px;
+    height: 42px;
+
+    border: 1px solid #444;
+    border-radius: 6px;
+
+    background: #222;
+    color: white;
+
+    font-size: 21px;
+  }
+
+  .navbar-content {
+    display: none;
+
+    position: absolute;
+
+    top: 70px;
+    left: 0;
+    right: 0;
+
+    padding: 20px 25px 25px;
+
+    background: #111;
+
+    border-top: 1px solid #292929;
+
+    flex-direction: column;
+    align-items: stretch;
+
+    gap: 20px;
+  }
+
+  .navbar-content.mobile-open {
+    display: flex;
+  }
+
+  .nav-links {
+    flex-direction: column;
+    align-items: stretch;
+
+    gap: 0;
+  }
+
+  .nav-links li {
+    border-bottom: 1px solid #292929;
+  }
+
+  .nav-links a {
+    display: block;
+
+    padding: 13px 0;
+  }
+
+  .nav-links > li > a::after {
+    display: none;
+  }
+
+  .dropdown-menu {
+    position: static;
+
+    width: 100%;
+
+    display: none;
+
+    opacity: 1;
+    visibility: visible;
+
+    transform: none;
+
+    border: none;
+
+    box-shadow: none;
+
+    background: #181818;
+  }
+
+  .nav-dropdown:hover .dropdown-menu {
+    display: block;
+  }
+
+  .navbar-search {
+    width: 100%;
+    max-width: none;
+
+    margin: 0;
+  }
+
+  .navbar-actions {
+    width: 100%;
+
+    justify-content: flex-start;
+  }
+
+  .icon-label {
+    display: inline;
+  }
+
+  .auth-buttons {
+    margin-left: auto;
+  }
+}
+
+
+@media (max-width: 768px) {
+
+  .releases-page,
+  .release-details-page,
+  .cart-page,
+  .wishlist-page,
+  .sale-page,
+  .top-sellers-page,
+  .profile-page,
+  .home-page {
+    padding: 35px 18px 60px;
+  }
+
+  .releases-header,
+  .cart-header {
+    align-items: flex-start;
+
+    flex-direction: column;
+
+    gap: 18px;
+  }
+
+  .releases-header h1,
+  .cart-header h1,
+  .page-header h1,
+  .sale-header h1,
+  .top-sellers-header h1,
+  .profile-header h1 {
+    font-size: 36px;
+  }
+
+  .release-filters {
+    grid-template-columns: 1fr;
+  }
+
+  .filter-search,
+  .filter-button,
+  .clear-filter {
+    grid-column: auto;
+  }
+
+  .release-grid,
+  .sale-grid {
+    grid-template-columns: 1fr;
+  }
+
+  .release-hero {
+    grid-template-columns: 1fr;
+
+    gap: 30px;
+  }
+
+  .release-hero-cover {
+    max-width: 550px;
+
+    margin: 0 auto;
+  }
+
+  .release-hero-info h1 {
+    font-size: 43px;
+  }
+
+  .release-facts {
+    grid-template-columns:
+            1fr 1fr;
+  }
+
+  .product-grid {
+    grid-template-columns: 1fr;
+  }
+
+  .product-actions {
+    grid-template-columns: 1fr;
+  }
+
+  .track-row {
+    grid-template-columns:
+            35px 1fr;
+
+    padding: 14px;
+  }
+
+  .track-duration {
+    grid-column: 2;
+  }
+
+  .cart-item {
+    grid-template-columns:
+            70px 1fr 30px;
+
+    gap: 12px;
+  }
+
+  .cart-item-cover {
+    width: 70px;
+    height: 70px;
+  }
+
+  .cart-item-quantity,
+  .cart-item-total {
+    grid-column: 2;
+  }
+
+  .cart-item-total {
+    text-align: left;
+  }
+
+  .cart-remove {
+    grid-column: 3;
+    grid-row: 1;
+  }
+
+  .wishlist-grid {
+    grid-template-columns: 1fr;
+  }
+
+  .wishlist-card {
+    grid-template-columns:
+            120px 1fr;
+  }
+
+  .home-hero {
+    min-height: 500px;
+
+    padding: 45px 30px;
+  }
+
+  .home-hero-mark {
+    font-size: 250px;
+  }
+
+  .home-feature-grid {
+    grid-template-columns: 1fr;
+  }
+
+  .home-collection {
+    flex-direction: column;
+  }
+
+  .profile-sidebar {
+    text-align: center;
+  }
+
+  .profile-avatar {
+    margin-left: auto;
+  }
+
+  .footer-container {
+    grid-template-columns:
+            1fr 1fr;
+
+    gap: 35px;
+
+    padding: 40px 25px;
+  }
+
+  .footer-brand {
+    grid-column: 1 / -1;
+  }
+
+  .footer-bottom {
+    padding: 18px 25px;
+
+    flex-direction: column;
+
+    gap: 5px;
+  }
+}
+
+
+@media (max-width: 500px) {
+
+  .wishlist-card {
+    grid-template-columns: 1fr;
+  }
+
+  .wishlist-cover {
+    max-height: 300px;
+  }
+
+  .wishlist-actions {
+    flex-direction: column;
+  }
+
+  .wishlist-actions .store-button,
+  .wishlist-actions .btn-remove {
+    width: 100%;
+  }
+
+  .home-hero {
+    padding: 35px 22px;
+  }
+
+  .home-hero h1 {
+    font-size: 45px;
+  }
+
+  .home-hero-actions {
+    flex-direction: column;
+  }
+
+  .home-button {
+    width: 100%;
+  }
+
+  .profile-card {
+    padding: 20px;
+  }
+
+  .profile-form-actions {
+    flex-direction: column;
+  }
+
+  .profile-form-actions .store-button {
+    width: 100%;
+  }
+}
+
+/* =========================================================
+ ADMIN
+ ========================================================= */
+
+.admin-page {
+  max-width: 1250px;
+
+  margin: 0 auto;
+
+  padding: 55px 30px 80px;
+}
+
+
+/* =========================================================
+   ADMIN HEADER
+   ========================================================= */
+
+.admin-header {
+  display: flex;
+  align-items: flex-end;
+  justify-content: space-between;
+
+  gap: 30px;
+
+  margin-bottom: 35px;
+}
+
+.admin-eyebrow {
+  display: block;
+
+  margin-bottom: 7px;
+
+  color: #888;
+
+  font-size: 9px;
+  font-weight: 900;
+
+  letter-spacing: 1.7px;
+  text-transform: uppercase;
+}
+
+.admin-header h1 {
+  font-size: 44px;
+  font-weight: 900;
+
+  letter-spacing: -1.5px;
+}
+
+.admin-header p {
+  margin-top: 8px;
+
+  color: #777;
+
+  font-size: 14px;
+}
+
+.admin-back-link {
+  display: block;
+
+  margin-bottom: 22px;
+
+  color: #777;
+
+  font-size: 12px;
+  font-weight: 700;
+}
+
+.admin-back-link:hover {
+  color: #111;
+}
+
+
+/* =========================================================
+   ADMIN BUTTONS
+   ========================================================= */
+
+.admin-button {
+  min-height: 41px;
+
+  display: inline-flex;
+  align-items: center;
+  justify-content: center;
+
+  gap: 7px;
+
+  padding: 0 17px;
+
+  border-radius: 6px;
+
+  font-size: 12px;
+  font-weight: 800;
+
+  transition:
+          background .2s ease,
+          border-color .2s ease,
+          color .2s ease,
+          transform .2s ease;
+}
+
+.admin-button:hover {
+  transform: translateY(-1px);
+}
+
+.admin-button.primary {
+  border: 1px solid #171717;
+
+  background: #171717;
+  color: white;
+}
+
+.admin-button.primary:hover {
+  background: #333;
+}
+
+.admin-button.secondary {
+  border: 1px solid #d4d4d4;
+
+  background: white;
+  color: #333;
+}
+
+.admin-button.secondary:hover {
+  background: #eee;
+}
+
+.admin-button.small {
+  min-height: 34px;
+
+  padding: 0 13px;
+
+  font-size: 10px;
+}
+
+
+/* =========================================================
+   ALERT
+   ========================================================= */
+
+.admin-alert {
+  display: flex;
+  align-items: center;
+
+  gap: 9px;
+
+  margin-bottom: 25px;
+
+  padding: 14px 17px;
+
+  border-radius: 7px;
+
+  font-size: 12px;
+  font-weight: 700;
+}
+
+.admin-alert.success {
+  border: 1px solid #c9e6d3;
+
+  background: #ecf8f0;
+
+  color: #287348;
+}
+
+
+/* =========================================================
+   DASHBOARD STATS
+   ========================================================= */
+
+.admin-stat-grid {
+  display: grid;
+
+  grid-template-columns:
+        repeat(4, minmax(0, 1fr));
+
+  gap: 16px;
+
+  margin-bottom: 55px;
+}
+
+.admin-stat-card {
+  min-height: 150px;
+
+  padding: 22px;
+
+  background: white;
+
+  border: 1px solid #ddd;
+  border-radius: 9px;
+}
+
+.admin-stat-label {
+  display: block;
+
+  color: #888;
+
+  font-size: 9px;
+  font-weight: 900;
+
+  letter-spacing: 1.2px;
+}
+
+.admin-stat-card > strong {
+  display: block;
+
+  margin-top: 13px;
+
+  font-size: 34px;
+  font-weight: 900;
+}
+
+.admin-stat-card p {
+  margin-top: 7px;
+
+  color: #888;
+
+  font-size: 11px;
+  line-height: 1.5;
+}
+
+.admin-stat-card.warning {
+  border-top: 3px solid #c88a27;
+}
+
+.admin-stat-card.danger {
+  border-top: 3px solid #ad4545;
+}
+
+
+/* =========================================================
+   DASHBOARD ACTIONS
+   ========================================================= */
+
+.admin-section {
+  margin-top: 20px;
+}
+
+.admin-section-heading {
+  margin-bottom: 20px;
+
+  padding-bottom: 15px;
+
+  border-bottom: 1px solid #ddd;
+}
+
+.admin-section-heading h2 {
+  margin-top: 5px;
+
+  font-size: 27px;
+  font-weight: 900;
+}
+
+.admin-action-grid {
+  display: grid;
+
+  grid-template-columns:
+        repeat(2, minmax(0, 1fr));
+
+  gap: 16px;
+}
+
+.admin-action-card {
+  min-height: 170px;
+
+  display: grid;
+
+  grid-template-columns:
+        55px 1fr 25px;
+
+  align-items: center;
+
+  gap: 18px;
+
+  padding: 25px;
+
+  background: white;
+
+  border: 1px solid #ddd;
+  border-radius: 9px;
+
+  transition:
+          transform .2s ease,
+          box-shadow .2s ease;
+}
+
+.admin-action-card:hover {
+  transform: translateY(-3px);
+
+  box-shadow:
+          0 12px 30px rgba(0,0,0,.07);
+}
+
+.admin-action-icon {
+  width: 48px;
+  height: 48px;
+
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+  border-radius: 7px;
+
+  background: #171717;
+  color: white;
+
+  font-size: 21px;
+}
+
+.admin-action-card h3 {
+  font-size: 18px;
+  font-weight: 900;
+}
+
+.admin-action-card p {
+  margin-top: 6px;
+
+  color: #777;
+
+  font-size: 12px;
+  line-height: 1.5;
+}
+
+.admin-action-arrow {
+  color: #999;
+
+  font-size: 18px;
+}
+
+
+/* =========================================================
+   PRODUCT TABLE
+   ========================================================= */
+
+.admin-list-summary {
+  display: flex;
+
+  gap: 20px;
+
+  margin-bottom: 13px;
+
+  color: #777;
+
+  font-size: 11px;
+  font-weight: 700;
+}
+
+.admin-table-wrapper {
+  overflow-x: auto;
+
+  background: white;
+
+  border: 1px solid #ddd;
+  border-radius: 9px;
+}
+
+.admin-table {
+  width: 100%;
+
+  border-collapse: collapse;
+}
+
+.admin-table th {
+  padding: 14px 18px;
+
+  background: #fafafa;
+
+  border-bottom: 1px solid #ddd;
+
+  color: #777;
+
+  font-size: 9px;
+  font-weight: 900;
+
+  text-align: left;
+  text-transform: uppercase;
+  letter-spacing: 1px;
+}
+
+.admin-table td {
+  padding: 14px 18px;
+
+  border-bottom: 1px solid #eee;
+
+  font-size: 12px;
+
+  vertical-align: middle;
+}
+
+.admin-table tbody tr:last-child td {
+  border-bottom: none;
+}
+
+.admin-table tbody tr:hover {
+  background: #fcfcfc;
+}
+
+.admin-product-release {
+  display: flex;
+  align-items: center;
+
+  gap: 13px;
+}
+
+.admin-product-cover {
+  width: 48px;
+  height: 48px;
+
+  flex-shrink: 0;
+
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+  overflow: hidden;
+
+  border-radius: 4px;
+
+  background: #eee;
+}
+
+.admin-product-cover img {
+  width: 100%;
+  height: 100%;
+
+  object-fit: cover;
+}
+
+.admin-product-release strong {
+  display: block;
+
+  font-size: 12px;
+}
+
+.admin-product-release small {
+  display: block;
+
+  margin-top: 3px;
+
+  color: #999;
+
+  font-size: 9px;
+}
+
+.admin-format-badge {
+  display: inline-flex;
+
+  padding: 5px 8px;
+
+  border-radius: 4px;
+
+  background: #eee;
+
+  color: #555;
+
+  font-size: 9px;
+  font-weight: 900;
+}
+
+.admin-price {
+  font-weight: 800;
+}
+
+.admin-stock {
+  display: inline-flex;
+
+  padding: 5px 8px;
+
+  border-radius: 20px;
+
+  font-size: 9px;
+  font-weight: 800;
+}
+
+.admin-stock.success {
+  background: #e7f5ec;
+  color: #287148;
+}
+
+.admin-stock.warning {
+  background: #fbf1df;
+  color: #976317;
+}
+
+.admin-stock.danger {
+  background: #fae8e8;
+  color: #983b3b;
+}
+
+.admin-table-action {
+  text-align: right;
+}
+
+
+/* =========================================================
+   FORMS
+   ========================================================= */
+
+.admin-form-layout {
+  display: grid;
+
+  grid-template-columns:
+        minmax(0, 1fr)
+        300px;
+
+  gap: 22px;
+
+  align-items: start;
+}
+
+.admin-form-card,
+.admin-help-card,
+.admin-product-summary {
+  background: white;
+
+  border: 1px solid #ddd;
+  border-radius: 9px;
+}
+
+.admin-form-card {
+  padding: 30px;
+}
+
+.admin-form-card-header {
+  margin-bottom: 27px;
+
+  padding-bottom: 19px;
+
+  border-bottom: 1px solid #eee;
+}
+
+.admin-form-card-header h2 {
+  margin-top: 5px;
+
+  font-size: 23px;
+  font-weight: 900;
+}
+
+.admin-form-row {
+  display: grid;
+
+  grid-template-columns:
+        1fr 1fr;
+
+  gap: 16px;
+}
+
+.admin-form-field {
+  margin-bottom: 20px;
+}
+
+.admin-form-field label {
+  display: block;
+
+  margin-bottom: 7px;
+
+  color: #555;
+
+  font-size: 10px;
+  font-weight: 900;
+
+  text-transform: uppercase;
+  letter-spacing: .8px;
+}
+
+.admin-form-field input,
+.admin-form-field select,
+.admin-form-field textarea {
+  width: 100%;
+
+  padding: 11px 12px;
+
+  border: 1px solid #d4d4d4;
+  border-radius: 6px;
+
+  outline: none;
+
+  background: white;
+  color: #171717;
+
+  font-size: 12px;
+}
+
+.admin-form-field select,
+.admin-form-field input {
+  min-height: 42px;
+}
+
+.admin-form-field textarea {
+  resize: vertical;
+
+  line-height: 1.6;
+}
+
+.admin-form-field input:focus,
+.admin-form-field select:focus,
+.admin-form-field textarea:focus {
+  border-color: #777;
+}
+
+.admin-form-field small {
+  display: block;
+
+  margin-top: 6px;
+
+  color: #999;
+
+  font-size: 10px;
+  line-height: 1.5;
+}
+
+.admin-input-prefix,
+.admin-input-suffix {
+  display: flex;
+
+  overflow: hidden;
+
+  border: 1px solid #d4d4d4;
+  border-radius: 6px;
+}
+
+.admin-input-prefix:focus-within,
+.admin-input-suffix:focus-within {
+  border-color: #777;
+}
+
+.admin-input-prefix > span,
+.admin-input-suffix > span {
+  min-width: 42px;
+
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+  background: #f5f5f5;
+
+  color: #777;
+
+  font-size: 12px;
+  font-weight: 800;
+}
+
+.admin-input-prefix input,
+.admin-input-suffix input {
+  border: none;
+  border-radius: 0;
+}
+
+.admin-field-error,
+.admin-validation {
+  display: block;
+
+  margin-top: 5px;
+
+  color: #a33;
+
+  font-size: 10px;
+}
+
+.admin-validation {
+  margin-bottom: 18px;
+}
+
+.admin-form-actions {
+  display: flex;
+
+  gap: 8px;
+
+  margin-top: 28px;
+
+  padding-top: 22px;
+
+  border-top: 1px solid #eee;
+}
+
+
+/* =========================================================
+   HELP CARD
+   ========================================================= */
+
+.admin-help-card {
+  padding: 25px;
+}
+
+.admin-help-card h3 {
+  margin-top: 6px;
+  margin-bottom: 22px;
+
+  font-size: 18px;
+}
+
+.admin-help-item {
+  display: grid;
+
+  grid-template-columns:
+        30px 1fr;
+
+  gap: 11px;
+
+  padding: 15px 0;
+
+  border-top: 1px solid #eee;
+}
+
+.admin-help-item strong {
+  color: #999;
+
+  font-size: 10px;
+}
+
+.admin-help-item p {
+  color: #777;
+
+  font-size: 11px;
+  line-height: 1.6;
+}
+
+
+/* =========================================================
+   EDIT PRODUCT
+   ========================================================= */
+
+.admin-product-summary {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+
+  gap: 30px;
+
+  padding: 24px;
+
+  margin-bottom: 20px;
+}
+
+.admin-product-summary h2 {
+  margin-top: 5px;
+
+  font-size: 23px;
+}
+
+.admin-product-summary-meta {
+  display: flex;
+
+  gap: 35px;
+}
+
+.admin-product-summary-meta div {
+  text-align: right;
+}
+
+.admin-product-summary-meta span {
+  display: block;
+
+  color: #999;
+
+  font-size: 8px;
+  font-weight: 900;
+
+  letter-spacing: 1px;
+}
+
+.admin-product-summary-meta strong {
+  display: block;
+
+  margin-top: 5px;
+
+  font-size: 13px;
+}
+
+.admin-edit-card {
+  max-width: 900px;
+}
+
+.admin-modification-options {
+  display: grid;
+
+  grid-template-columns:
+        1fr 1fr;
+
+  gap: 10px;
+}
+
+.admin-modification-option {
+  display: flex !important;
+  align-items: flex-start;
+
+  gap: 10px;
+
+  padding: 15px;
+
+  border: 1px solid #ddd;
+  border-radius: 7px;
+
+  cursor: pointer;
+
+  text-transform: none !important;
+  letter-spacing: normal !important;
+}
+
+.admin-modification-option:hover {
+  border-color: #999;
+}
+
+.admin-modification-option input {
+  width: auto;
+
+  min-height: 0;
+
+  margin-top: 3px;
+}
+
+.admin-modification-option strong {
+  display: block;
+
+  color: #222;
+
+  font-size: 12px;
+}
+
+.admin-modification-option small {
+  margin-top: 4px;
+
+  color: #888;
+
+  font-size: 10px;
+}
+
+.admin-edit-section {
+  margin-top: 28px;
+
+  padding-top: 25px;
+
+  border-top: 1px solid #eee;
+}
+
+.admin-edit-section-heading {
+  margin-bottom: 22px;
+}
+
+.admin-edit-section-heading h3 {
+  margin-top: 5px;
+
+  font-size: 19px;
+}
+
+.admin-edit-section-heading p {
+  margin-top: 5px;
+
+  color: #777;
+
+  font-size: 11px;
+}
+
+.admin-discount-preview {
+  display: grid;
+
+  grid-template-columns:
+        1fr 1fr;
+
+  gap: 8px 20px;
+
+  padding: 18px;
+
+  background: #f7f7f7;
+
+  border-radius: 7px;
+}
+
+.admin-discount-preview span {
+  color: #888;
+
+  font-size: 8px;
+  font-weight: 900;
+
+  letter-spacing: 1px;
+}
+
+.admin-discount-preview strong {
+  font-size: 18px;
+}
+
+
+/* =========================================================
+   ADMIN RESPONSIVE
+   ========================================================= */
+
+@media (max-width: 1000px) {
+
+  .admin-stat-grid {
+    grid-template-columns:
+            repeat(2, 1fr);
+  }
+
+  .admin-form-layout {
+    grid-template-columns: 1fr;
+  }
+
+  .admin-help-card {
+    order: -1;
+  }
+
+}
+
+
+@media (max-width: 750px) {
+
+  .admin-page {
+    padding: 35px 18px 60px;
+  }
+
+  .admin-header {
+    flex-direction: column;
+    align-items: flex-start;
+  }
+
+  .admin-header h1 {
+    font-size: 35px;
+  }
+
+  .admin-stat-grid,
+  .admin-action-grid {
+    grid-template-columns: 1fr;
+  }
+
+  .admin-form-row,
+  .admin-modification-options {
+    grid-template-columns: 1fr;
+  }
+
+  .admin-product-summary {
+    align-items: flex-start;
+    flex-direction: column;
+  }
+
+  .admin-product-summary-meta {
+    width: 100%;
+
+    justify-content: space-between;
+  }
+
+  .admin-product-summary-meta div {
+    text-align: left;
+  }
+
+}
+
+
+@media (max-width: 500px) {
+
+  .admin-stat-grid {
+    grid-template-columns: 1fr;
+  }
+
+  .admin-form-card {
+    padding: 20px;
+  }
+
+  .admin-form-actions {
+    flex-direction: column;
+  }
+
+  .admin-form-actions .admin-button {
+    width: 100%;
+  }
+
+}
+/* =========================================================
+   ADMIN RELEASE CREATOR
+   ========================================================= */
+
+.release-create-section {
+  margin-bottom: 20px;
+}
+
+.admin-section-description {
+  margin-top: 7px;
+
+  color: #888;
+
+  font-size: 11px;
+  line-height: 1.6;
+}
+
+
+/* =========================================================
+   MULTI SELECT
+   ========================================================= */
+
+.admin-multi-select {
+  min-height: 130px !important;
+
+  padding: 7px !important;
+}
+
+.admin-multi-select option {
+  padding: 8px 9px;
+
+  border-radius: 4px;
+}
+
+
+/* =========================================================
+   COVER PREVIEW
+   ========================================================= */
+
+.admin-cover-preview {
+  margin-top: 25px;
+
+  padding-top: 22px;
+
+  border-top: 1px solid #eee;
+}
+
+.admin-cover-preview-image {
+  width: 150px;
+  height: 150px;
+
+  margin-top: 10px;
+
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+  overflow: hidden;
+
+  background:
+          linear-gradient(
+                  135deg,
+                  #222,
+                  #555
+          );
+
+  color: white;
+
+  border-radius: 7px;
+
+  font-size: 35px;
+}
+
+.admin-cover-preview-image img {
+  width: 100%;
+  height: 100%;
+
+  display: block;
+
+  object-fit: cover;
+}
+
+
+/* =========================================================
+   TRACK HEADER
+   ========================================================= */
+
+.track-header {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+
+  gap: 25px;
+}
+
+
+/* =========================================================
+   TRACK CARDS
+   ========================================================= */
+
+.admin-track-card {
+  position: relative;
+
+  display: grid;
+
+  grid-template-columns:
+        42px
+        minmax(0, 1fr)
+        35px;
+
+  gap: 15px;
+
+  margin-bottom: 12px;
+  padding: 20px;
+
+  background: #fafafa;
+
+  border: 1px solid #ddd;
+  border-radius: 8px;
+}
+
+.admin-track-number {
+  width: 36px;
+  height: 36px;
+
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+  background: #171717;
+  color: white;
+
+  border-radius: 50%;
+
+  font-size: 11px;
+  font-weight: 900;
+}
+
+.admin-track-content {
+  min-width: 0;
+}
+
+.admin-track-remove {
+  width: 32px;
+  height: 32px;
+
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+  border: 1px solid #ddd;
+  border-radius: 5px;
+
+  background: white;
+  color: #888;
+
+  font-size: 20px;
+}
+
+.admin-track-remove:hover {
+  border-color: #a44;
+
+  background: #fff5f5;
+  color: #a44;
+}
+
+
+/* =========================================================
+   RELEASE SUBMIT
+   ========================================================= */
+
+.admin-release-submit {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+
+  gap: 25px;
+
+  margin-top: 30px;
+  padding: 25px 30px;
+
+  background: #171717;
+  color: white;
+
+  border-radius: 9px;
+}
+
+.admin-release-submit p {
+  margin-top: 5px;
+
+  color: #aaa;
+
+  font-size: 11px;
+}
+
+.admin-release-submit .admin-eyebrow {
+  color: #888;
+}
+
+.admin-release-submit .release-actions {
+  margin: 0;
+  padding: 0;
+
+  border: none;
+}
+
+.admin-release-submit .admin-button.primary {
+  border-color: white;
+
+  background: white;
+  color: #171717;
+}
+
+.admin-release-submit .admin-button.primary:hover {
+  background: #ddd;
+}
+
+.admin-release-submit .admin-button.secondary {
+  border-color: #444;
+
+  background: transparent;
+  color: white;
+}
+
+.admin-release-submit .admin-button.secondary:hover {
+  background: #292929;
+}
+
+
+/* =========================================================
+   RELEASE CREATOR RESPONSIVE
+   ========================================================= */
+
+@media (max-width: 750px) {
+
+  .track-header {
+    align-items: flex-start;
+
+    flex-direction: column;
+  }
+
+  .admin-track-card {
+    grid-template-columns:
+            35px
+            1fr;
+  }
+
+  .admin-track-remove {
+    position: absolute;
+
+    top: 15px;
+    right: 15px;
+  }
+
+  .admin-release-submit {
+    align-items: flex-start;
+
+    flex-direction: column;
+  }
+
+  .admin-release-submit .release-actions {
+    width: 100%;
+  }
+
+}
Index: rnelRecordsMVC/KernelRecordsMVC.csproj
===================================================================
--- KernelRecordsMVC/KernelRecordsMVC.csproj	(revision 08aefc6f3b51f4bfcb7471a2fd319c064171b1c5)
+++ 	(revision )
@@ -1,79 +1,0 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
-
-    <PropertyGroup>
-        <TargetFramework>net8.0</TargetFramework>
-        <Nullable>enable</Nullable>
-        <ImplicitUsings>enable</ImplicitUsings>
-    </PropertyGroup>
-
-    <ItemGroup>
-      <_ContentIncludedByDefault Remove="Views\Home\Index.cshtml" />
-      <_ContentIncludedByDefault Remove="Views\Home\Privacy.cshtml" />
-      <_ContentIncludedByDefault Remove="Views\Shared\Error.cshtml" />
-      <_ContentIncludedByDefault Remove="Views\Shared\_Layout.cshtml" />
-      <_ContentIncludedByDefault Remove="Views\Shared\_ValidationScriptsPartial.cshtml" />
-      <_ContentIncludedByDefault Remove="Views\_ViewImports.cshtml" />
-      <_ContentIncludedByDefault Remove="Views\_ViewStart.cshtml" />
-      <_ContentIncludedByDefault Remove="wwwroot\css\site.css" />
-      <_ContentIncludedByDefault Remove="wwwroot\favicon.ico" />
-      <_ContentIncludedByDefault Remove="wwwroot\js\site.js" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.css" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.css.map" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.min.css" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.min.css.map" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.rtl.css" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.rtl.css.map" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.rtl.min.css" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.rtl.min.css.map" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.css" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.css.map" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.min.css" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.min.css.map" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.rtl.css" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.rtl.css.map" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.rtl.min.css" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.rtl.min.css.map" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-utilities.css" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-utilities.css.map" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-utilities.min.css" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-utilities.min.css.map" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-utilities.rtl.css" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-utilities.rtl.css.map" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-utilities.rtl.min.css" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-utilities.rtl.min.css.map" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.css" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.css.map" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.min.css" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.min.css.map" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.rtl.css" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.rtl.css.map" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.rtl.min.css" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.rtl.min.css.map" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.js" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.js.map" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.min.js" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.min.js.map" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.esm.js" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.esm.js.map" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.esm.min.js" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.esm.min.js.map" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.js" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.js.map" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.min.js" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.min.js.map" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\LICENSE" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation-unobtrusive\jquery.validate.unobtrusive.js" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation-unobtrusive\jquery.validate.unobtrusive.min.js" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation-unobtrusive\LICENSE.txt" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\additional-methods.js" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\additional-methods.min.js" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\jquery.validate.js" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\jquery.validate.min.js" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\LICENSE.md" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\jquery\dist\jquery.js" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\jquery\dist\jquery.min.js" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\jquery\dist\jquery.min.map" />
-      <_ContentIncludedByDefault Remove="wwwroot\lib\jquery\LICENSE.txt" />
-    </ItemGroup>
-
-</Project>
