diff --git a/hifi-src/src/assets/textures/road-glow.webp b/hifi-src/src/assets/textures/road-glow.webp new file mode 100644 index 0000000..e35cf79 Binary files /dev/null and b/hifi-src/src/assets/textures/road-glow.webp differ diff --git a/hifi-src/src/pages/public/ModelPage.jsx b/hifi-src/src/pages/public/ModelPage.jsx index 749e25c..96cacfb 100644 --- a/hifi-src/src/pages/public/ModelPage.jsx +++ b/hifi-src/src/pages/public/ModelPage.jsx @@ -11,6 +11,7 @@ import { useSiteSettings } from '../../context/SiteSettingsContext.jsx'; import textureGraphite from '../../assets/textures/metal-graphite.webp'; import textureDeepBlue from '../../assets/textures/metal-deep-blue.webp'; import textureWarmBronze from '../../assets/textures/metal-warm-bronze.webp'; +import roadGlowTexture from '../../assets/textures/road-glow.webp'; // Eine generierte, gebuerstete Metall-Oberflaechenstruktur je Theme (statt Fotos pro // Paket, die es fuer echte Kundenpakete nicht gibt) - wird per "overlay"-Blendmodus mit @@ -172,10 +173,29 @@ export default function ModelPage() { // gleicher Helligkeit wie der Hintergrund landen und unsichtbar werden koennte. const mutedColor = `rgb(${hslToRgb(0, 0, contrastingL(38)).join(', ')})`; const glowAlpha = (0.1 + tierT * 0.3).toFixed(2); - // Der "Lichtweg" im Kartenhintergrund faengt bei der Einstiegsstufe kaum sichtbar an - // und wird zur teuersten Stufe hin kraeftiger/leuchtender - genau wie der Rahmen-Glow. - const roadOpacity = 0.14 + tierT * 0.22; - const roadGlowOpacity = 0.15 + tierT * 0.55; + // Der "Lichtweg" im Kartenhintergrund ist ein generiertes, fotografisches Glow-Motiv + // (weisser Lichtstreif auf Schwarz) statt einer duennen Vektorlinie - per CSS-Maske + // wird die weisse Kurve zur Alphamaske fuer die jeweilige Akzentfarbe, sodass das + // Motiv bei JEDER Preisstufe/JEDEM Theme automatisch in der richtigen Farbe leuchtet. + // Schon die Einstiegsstufe bleibt sichtbar praesent statt fast unsichtbar - die + // Preis-Staffelung zeigt sich in der Intensitaet, nicht im "Ob ueberhaupt sichtbar". + const roadOpacity = (0.55 + tierT * 0.45).toFixed(2); + const roadGlowOpacity = (0.2 + tierT * 0.45).toFixed(2); + const roadMaskStyle = { + backgroundColor: `rgb(${accentRgb.join(', ')})`, + WebkitMaskImage: `url(${roadGlowTexture})`, + maskImage: `url(${roadGlowTexture})`, + // WebP-Dateien bringen einen (durchgehend deckenden) Alphakanal mit - ohne explizites + // "luminance" bevorzugt CSS per Default den Alphakanal statt der Helligkeit, wodurch + // die Maske komplett deckend (= volle Flaeche statt duenner Kurve) gerendert wuerde. + maskMode: 'luminance', + WebkitMaskSize: 'cover', + maskSize: 'cover', + WebkitMaskPosition: 'center', + maskPosition: 'center', + WebkitMaskRepeat: 'no-repeat', + maskRepeat: 'no-repeat', + }; // Die Metall-Textur wird als eigene Ebene mit eigener Deckkraft gefahren (statt fest // per background-blend-mode verschmolzen) - bei der hellen Einstiegsstufe bleibt sie // kaum sichtbar, damit die Karte wirklich hell/weiss bleibt statt durch die dunkle @@ -194,6 +214,7 @@ export default function ModelPage() { priceColor: `rgb(${priceRgb.join(', ')})`, roadOpacity, roadGlowOpacity, + roadMaskStyle, textureStyle: { backgroundImage: `url(${cardTexture})`, backgroundSize: '480px 480px', @@ -256,11 +277,22 @@ export default function ModelPage() {

{t('modelPage.tiersHeading')(packages.length)}

{t('modelPage.tiersSubheading')}

+ + {/* Eigener, deutlich breiterer Rahmen fuer die Kartenreihe im Scroll-Band-Modus: + die restliche Seite haelt sich an die normale Lesebreite (max-w-6xl), aber + die Kacheln sollen auf breiten Bildschirmen wirklich die volle Breite nutzen + koennen, statt unnoetig frueh in den Scroll-Modus zu wechseln. */} +
@@ -269,10 +301,10 @@ export default function ModelPage() { style, priceColor, mutedColor, - accentColor, glowLineStyle, roadOpacity, roadGlowOpacity, + roadMaskStyle, textureStyle, isDarkCard, } = styleOf(pkg); @@ -283,36 +315,25 @@ export default function ModelPage() { style={style} className={ isStripLayout - ? 'relative flex w-[190px] shrink-0 snap-start flex-col overflow-hidden rounded-xl border p-6 sm:w-[210px]' + ? 'relative flex grow shrink basis-[190px] min-w-[190px] max-w-[240px] snap-start flex-col overflow-hidden rounded-xl border p-6 sm:basis-[210px] sm:p-7' : 'relative flex flex-col overflow-hidden rounded-xl border p-8' } > - {/* Abstrakter "Lichtweg" im Hintergrund - je teurer die Stufe, desto praesenter/leuchtender. - Fixe Aspect-Ratio + "slice" statt "none", damit Strich/Kurve bei jeder Kartenhoehe - gleichmaessig aussieht statt verzerrt gestreckt zu werden. */} - + /> +