diff --git a/Dockerfile b/Dockerfile index 4950ca7..eee93c9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -34,8 +34,9 @@ RUN rm -rf /pretix/src/pretix/static.dist/CACHE && \ USER root -# 6. Vorkompilierte CSS-Dateien bereinigen & statische Theme-Assets bereitstellen -RUN find /pretix/src/pretix/static.dist -type f -name "*.css" -exec sed -i \ +# 6. Vorkompilierte CSS-Dateien bereinigen, Widget-JS prüfen & statische Theme-Assets bereitstellen +RUN python3 /tmp/pretix-falkenthal-theme/patch_templates.py && \ + find /pretix/src/pretix/static.dist -type f -name "*.css" -exec sed -i \ -e 's/#3b1c4a/#4f46e5/gI' \ -e 's/#5f2977/#4f46e5/gI' \ -e 's/#7f4a88/#475569/gI' \ diff --git a/patch_templates.py b/patch_templates.py index 32c998d..1f65414 100644 --- a/patch_templates.py +++ b/patch_templates.py @@ -1,3 +1,4 @@ +import glob import os import re import sys @@ -5,7 +6,7 @@ import sys THEME_REPO_URL = "https://git.falkenthal.me/falkenthal/pretix-falkenthal-theme" PLATFORM_IMPRINT_URL = "https://tickets.falkenthal.me/impressum" PLATFORM_PRIVACY_URL = "https://tickets.falkenthal.me/datenschutz" -ASSET_VERSION = "1.8.3" +ASSET_VERSION = "1.8.4" control_files = [ '/pretix/src/pretix/control/templates/pretixcontrol/base.html', @@ -137,5 +138,58 @@ for err_name in ['400.html', '403.html', '403_csrf.html', '404.html', '500.html' with open(err_path, 'w', encoding='utf-8') as f: f.write(ec) -print(f"Pretix templates patched and verified successfully (v{ASSET_VERSION}).") +# 4. Eingebettetes Pretix-Widget (widget.js / v1.*.js): +# Einheitliche Plattform-Pflichtangaben auch direkt unter dem Inline-Widget auf externen Veranstalter-Websites! +widget_platform_bar_js = r""" +;(function(){ + if (typeof document === 'undefined' || window.__falkenthalWidgetPatched) return; + window.__falkenthalWidgetPatched = true; + var BAR_HTML = 'Technischer Plattformbetrieb: FALKENTHAL' + + ' · Plattform-Impressum' + + ' · Plattform-Datenschutz' + + ' · Theme & Quellcode (AGPLv3)'; + function injectWidgetBar() { + var footers = document.querySelectorAll('.pretix-widget-attribution'); + for (var i = 0; i < footers.length; i++) { + var el = footers[i]; + if (!el.getAttribute('data-falkenthal-bar')) { + el.setAttribute('data-falkenthal-bar', '1'); + var bar = document.createElement('div'); + bar.className = 'pretix-widget-falkenthal-bar'; + bar.style.cssText = 'margin-top:6px;padding-top:6px;border-top:1px solid rgba(128,128,128,0.2);font-size:11px;line-height:1.5;text-align:center;opacity:0.85;'; + bar.innerHTML = BAR_HTML; + el.appendChild(bar); + } + } + } + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', injectWidgetBar); + } else { + injectWidgetBar(); + } + if (typeof MutationObserver !== 'undefined') { + var obs = new MutationObserver(function() { injectWidgetBar(); }); + var startObs = function() { + if (document.body) obs.observe(document.body, { childList: true, subtree: true }); + }; + if (document.body) startObs(); + else document.addEventListener('DOMContentLoaded', startObs); + } + setInterval(injectWidgetBar, 1500); +})(); +""" + +widget_js_candidates = ( + glob.glob('/pretix/src/pretix/presale/static/pretixpresale/js/widget/*.js') + + glob.glob('/pretix/src/pretix/static.dist/**/widget/*.js', recursive=True) +) +for wjs in widget_js_candidates: + if os.path.isfile(wjs): + with open(wjs, 'r', encoding='utf-8') as f: + wc = f.read() + if '__falkenthalWidgetPatched' not in wc: + with open(wjs, 'a', encoding='utf-8') as f: + f.write('\n' + widget_platform_bar_js) + +print(f"Pretix templates and widget assets patched and verified successfully (v{ASSET_VERSION}).") diff --git a/pretix_whitelabel/__init__.py b/pretix_whitelabel/__init__.py index ac01530..cdbff14 100644 --- a/pretix_whitelabel/__init__.py +++ b/pretix_whitelabel/__init__.py @@ -13,7 +13,7 @@ class WhiteLabelApp(AppConfig): "Custom Slate & Blue-Violet theme plugin for pretix control and presale UI." ) visible = False - version = "1.8.3" + version = "1.8.4" category = "CUSTOMIZATION" diff --git a/pretix_whitelabel/signals.py b/pretix_whitelabel/signals.py index 0f05113..7e63c5a 100644 --- a/pretix_whitelabel/signals.py +++ b/pretix_whitelabel/signals.py @@ -1,5 +1,5 @@ """ -Pretix signal receivers for pretix-falkenthal-theme (v1.8.3). +Pretix signal receivers for pretix-falkenthal-theme (v1.8.4). Hinweis zur Architektur: Die Plattform-Pflichtangaben (Plattform-Impressum, Plattform-Datenschutz sowie diff --git a/pretix_whitelabel/static/whitelabel/control.css b/pretix_whitelabel/static/whitelabel/control.css index cb1f7b9..f4a83a5 100644 --- a/pretix_whitelabel/static/whitelabel/control.css +++ b/pretix_whitelabel/static/whitelabel/control.css @@ -1,5 +1,5 @@ /* ========================================================================== - FALKENTHAL ADMIN BACKEND & LOGIN THEME (control.css - v1.8.3) + FALKENTHAL ADMIN BACKEND & LOGIN THEME (control.css - v1.8.4) ========================================================================== */ :root { @@ -63,7 +63,7 @@ nav.navbar-inverse { a.navbar-brand { font-size: 0 !important; color: transparent !important; - background-image: url('/static/whitelabel/logo.svg?v=1.8.3') !important; + background-image: url('/static/whitelabel/logo.svg?v=1.8.4') !important; background-repeat: no-repeat !important; background-position: 14px center !important; background-size: auto 34px !important; @@ -868,7 +868,7 @@ body:not(:has(#wrapper)):has(img.logo) > .container [class*="col-"] { body.falkenthal-auth-body .container img.logo, body:not(:has(#wrapper)):has(img.logo) .container img.logo, .form-signin img.logo { - content: url('/static/whitelabel/login-logo.svg?v=1.8.3') !important; + content: url('/static/whitelabel/login-logo.svg?v=1.8.4') !important; height: 115px !important; max-height: 115px !important; width: auto !important; diff --git a/pretix_whitelabel/static/whitelabel/presale.css b/pretix_whitelabel/static/whitelabel/presale.css index 638e02b..7407462 100644 --- a/pretix_whitelabel/static/whitelabel/presale.css +++ b/pretix_whitelabel/static/whitelabel/presale.css @@ -1,5 +1,5 @@ /* ========================================================================== - FALKENTHAL MODERN SHOP UI/UX UPGRADE (presale.css - v1.8.3) + FALKENTHAL MODERN SHOP UI/UX UPGRADE (presale.css - v1.8.4) Farb-, Geometrie- & Kontrastneutral: Respektiert 100 % der Veranstalter-Farben, Logos, Bootstrap-Input-Groups sowie helle UND dunkle Veranstalter-Hintergründe! ========================================================================== */ @@ -22,23 +22,27 @@ body { font-weight: 600; } -/* 2. BUTTONS, EINGABEFELDER & MENGENAUSWAHL (SICHERE RAHMEN & HOVER OHNE TRANSPARENZ) */ +/* 2. BUTTONS, EINGABEFELDER & MENGENAUSWAHL (ADAPTIVE RAHMEN FÜR LIGHT & DARK THEMES) */ .btn { border-radius: 6px; font-weight: 600; transition: background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease; } -/* Sekundäre Buttons & Mengenauswahl-Buttons ([-][+]) behalten beim Hover IMMER einen klaren Rahmen! */ +/* Sekundäre Buttons & Mengenauswahl-Buttons ([-][+]) behalten auf hellen UND dunklen + Veranstalter-Hintergründen beim Hover immer einen klaren, sichtbaren Rahmen! */ .btn-default { - border: 1px solid #ccc; + border: 1px solid rgba(128, 128, 128, 0.35); + border-color: color-mix(in srgb, currentColor 25%, transparent); } .btn-default:hover, .btn-default:focus, .btn-default:active { - border-color: #adadad !important; + border-color: rgba(128, 128, 128, 0.55) !important; + border-color: color-mix(in srgb, currentColor 42%, transparent) !important; background-color: rgba(128, 128, 128, 0.08); + background-color: color-mix(in srgb, currentColor 6%, transparent); } /* Standalone-Eingabefelder (außerhalb von .input-group) dezent abrunden */ @@ -96,7 +100,7 @@ body { } /* ========================================================================== - 6. FOOTER & PLATTFORM-RECHTSTEXTE (ADAPTIV FÜR HELLE & DUNKLE VERANSTALTER-SHOPS) + 6. FOOTER & PLATTFORM-RECHTSTEXTE (ADAPTIV IN SHOP & WIDGET-IFRAME) ========================================================================== */ footer { display: flex; @@ -169,13 +173,23 @@ footer nav ul li a { opacity: 0.55; } -/* Kompakter Modus für eingebettete Pretix-Widgets (iFrame) & Mobilgeräte */ +/* Garantierte Sichtbarkeit der Plattform-Pflichtangaben im eingebetteten Pretix-Widget (Checkout-iFrame) */ .is-iframe footer, -body.iframe footer { +body.iframe footer, +body[data-iframe] footer { + display: flex !important; + visibility: visible !important; margin-top: 20px; padding-bottom: 14px; } +.is-iframe .falkenthal-platform-bar, +body.iframe .falkenthal-platform-bar, +body[data-iframe] .falkenthal-platform-bar { + display: block !important; + visibility: visible !important; +} + @media (max-width: 767px) { .falkenthal-platform-bar { font-size: 11px; diff --git a/setup.py b/setup.py index cf2b277..ecd094d 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ with open("README.md", encoding="utf-8") as f: setup( name="pretix-falkenthal-theme", - version="1.8.3", + version="1.8.4", description="Modern Slate & Blue-Violet White-Label Theme Plugin for pretix", long_description=long_description, long_description_content_type="text/markdown",