diff --git a/modules/admin/AdminController.php b/modules/admin/AdminController.php index 67e68fa..42b01f6 100644 --- a/modules/admin/AdminController.php +++ b/modules/admin/AdminController.php @@ -341,6 +341,7 @@ class AdminController 'seo_robots_index' => Settings::get('seo_robots_index', '1'), 'seo_robots_follow' => Settings::get('seo_robots_follow', '1'), 'seo_og_image' => Settings::get('seo_og_image', ''), + 'site_custom_css' => Settings::get('site_custom_css', ''), 'redirects' => $redirects, 'permission_definitions' => Permissions::definitions(), 'permission_matrix' => Permissions::matrix(), @@ -363,6 +364,20 @@ class AdminController 'source' => 'Releases plugin', 'enabled' => Plugins::isEnabled('releases'), ], + [ + 'tag' => '[latest-releases]', + 'description' => 'Home-friendly alias of releases grid.', + 'example' => '[latest-releases limit="8"]', + 'source' => 'Releases plugin', + 'enabled' => Plugins::isEnabled('releases'), + ], + [ + 'tag' => '[new-artists]', + 'description' => 'Outputs the latest active artists grid.', + 'example' => '[new-artists limit="6"]', + 'source' => 'Artists plugin', + 'enabled' => Plugins::isEnabled('artists'), + ], [ 'tag' => '[sale-chart]', 'description' => 'Outputs a best-sellers chart.', @@ -370,6 +385,20 @@ class AdminController 'source' => 'Store plugin', 'enabled' => Plugins::isEnabled('store'), ], + [ + 'tag' => '[top-sellers]', + 'description' => 'Alias for sale chart block.', + 'example' => '[top-sellers type="tracks" window="weekly" limit="10"]', + 'source' => 'Store plugin', + 'enabled' => Plugins::isEnabled('store'), + ], + [ + 'tag' => '[hero]', + 'description' => 'Home hero block with CTA buttons.', + 'example' => '[hero title="Latest Drops" subtitle="Fresh releases weekly" cta_text="Browse Releases" cta_url="/releases"]', + 'source' => 'Pages module', + 'enabled' => true, + ], [ 'tag' => '[login-link]', 'description' => 'Renders an account login link.', @@ -469,7 +498,11 @@ class AdminController $allowedTags = [ 'releases', + 'latest-releases', + 'new-artists', 'sale-chart', + 'top-sellers', + 'hero', 'login-link', 'account-link', 'cart-link', @@ -506,11 +539,25 @@ class AdminController . '.ac-shortcode-release-meta{padding:10px;display:grid;gap:4px;}' . '.ac-shortcode-release-title{font-size:18px;line-height:1.2;font-weight:600;}' . '.ac-shortcode-release-artist,.ac-shortcode-release-date{color:#9aa0b2;font-size:12px;}' + . '.ac-shortcode-artists-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;}' + . '.ac-shortcode-artist-card{text-decoration:none;color:inherit;border:1px solid rgba(255,255,255,.1);background:rgba(15,18,24,.6);border-radius:14px;overflow:hidden;display:grid;}' + . '.ac-shortcode-artist-avatar{aspect-ratio:1/1;background:rgba(255,255,255,.03);display:grid;place-items:center;overflow:hidden;}' + . '.ac-shortcode-artist-avatar img{width:100%;height:100%;object-fit:cover;display:block;}' + . '.ac-shortcode-artist-meta{padding:10px;display:grid;gap:4px;}' + . '.ac-shortcode-artist-name{font-size:18px;line-height:1.2;font-weight:600;}' + . '.ac-shortcode-artist-country{color:#9aa0b2;font-size:12px;}' . '.ac-shortcode-sale-list{list-style:none;margin:0;padding:0;display:grid;gap:8px;}' . '.ac-shortcode-sale-item{border:1px solid rgba(255,255,255,0.1);background:rgba(15,18,24,0.6);border-radius:10px;padding:10px 12px;display:grid;grid-template-columns:auto 1fr auto;gap:10px;align-items:center;}' . '.ac-shortcode-sale-rank{font-family:"IBM Plex Mono",monospace;font-size:11px;color:#9aa0b2;letter-spacing:.15em;}' . '.ac-shortcode-sale-title{font-size:14px;line-height:1.3;}' . '.ac-shortcode-sale-meta{font-size:12px;color:#9aa0b2;white-space:nowrap;}' + . '.ac-shortcode-hero{border:1px solid rgba(255,255,255,.14);border-radius:18px;padding:18px;background:linear-gradient(135deg,rgba(255,255,255,.05),rgba(255,255,255,.01));display:grid;gap:10px;}' + . '.ac-shortcode-hero-eyebrow{font-size:10px;letter-spacing:.24em;text-transform:uppercase;color:#9aa0b2;font-family:"IBM Plex Mono",monospace;}' + . '.ac-shortcode-hero-title{font-size:32px;line-height:1.05;font-weight:700;}' + . '.ac-shortcode-hero-subtitle{font-size:15px;color:#d1d7e7;max-width:72ch;}' + . '.ac-shortcode-hero-actions{display:flex;gap:8px;flex-wrap:wrap;}' + . '.ac-shortcode-hero-btn{display:inline-flex;align-items:center;justify-content:center;height:38px;padding:0 14px;border-radius:999px;border:1px solid rgba(255,255,255,.16);background:rgba(255,255,255,.05);color:#f5f7ff;text-decoration:none;font-size:11px;letter-spacing:.16em;text-transform:uppercase;font-family:"IBM Plex Mono",monospace;}' + . '.ac-shortcode-hero-btn.primary{border-color:rgba(57,244,179,.6);background:rgba(57,244,179,.16);color:#9ff8d8;}' . '.ac-shortcode-link{display:inline-flex;align-items:center;gap:8px;padding:10px 14px;border-radius:12px;border:1px solid rgba(255,255,255,.15);background:rgba(15,18,24,.6);color:#f5f7ff;text-decoration:none;font-size:13px;letter-spacing:.08em;text-transform:uppercase;}' . '.ac-shortcode-link:hover{border-color:rgba(57,244,179,.6);color:#9ff8d8;}' . '.ac-shortcode-newsletter-form{display:grid;gap:10px;border:1px solid rgba(255,255,255,.15);border-radius:14px;background:rgba(15,18,24,.6);padding:14px;}' @@ -587,6 +634,7 @@ class AdminController $seoRobotsIndex = isset($_POST['seo_robots_index']) ? '1' : '0'; $seoRobotsFollow = isset($_POST['seo_robots_follow']) ? '1' : '0'; $seoOgImage = trim((string)($_POST['seo_og_image'] ?? '')); + $siteCustomCss = trim((string)($_POST['site_custom_css'] ?? '')); Settings::set('footer_text', $footer); $footerLinks = $this->parseFooterLinks($footerLinksJson); @@ -629,10 +677,11 @@ class AdminController Settings::set('seo_robots_index', $seoRobotsIndex); Settings::set('seo_robots_follow', $seoRobotsFollow); Settings::set('seo_og_image', $seoOgImage); + Settings::set('site_custom_css', $siteCustomCss); Audit::log('settings.save', [ 'updated_keys' => [ 'footer_text', 'footer_links_json', 'site_header_*', 'fontawesome_*', - 'site_maintenance_*', 'smtp_*', 'mailchimp_*', 'seo_*', + 'site_maintenance_*', 'smtp_*', 'mailchimp_*', 'seo_*', 'site_custom_css', ], ]); return new Response('', 302, ['Location' => '/admin/settings']); diff --git a/modules/admin/views/settings.php b/modules/admin/views/settings.php index 87bc9b2..c588064 100644 --- a/modules/admin/views/settings.php +++ b/modules/admin/views/settings.php @@ -21,6 +21,7 @@ ob_start(); + @@ -236,6 +237,17 @@ ob_start(); + +