Die BorderGlow-Karten in Values, Kontaktabschnitt und Über uns hatten dunkle Hintergründe fest verdrahtet, ihr Text nutzt aber Theme-Farben (Kontrast 1,07:1 im hellen Modus). BorderGlow kennt jetzt lightBackgroundColor und wählt die Kartenfarbe per CSS nach Theme (--card-bg-dark / --card-bg-light, html:not(.dark)), ohne Flackern beim Laden. Dunkel behält exakt die bisherigen Farben (hsl(0 0% 6%), #120F17, hsl(0 0% 4%)); hell nutzt hsl(0 0% 96%) mit sichtbarem Rand. Der Kantenschein wird im hellen Modus normal statt mit plus-lighter gemischt und in Violett gezeichnet, sonst wäre er auf Weiß unsichtbar. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
179 lines
6.9 KiB
CSS
179 lines
6.9 KiB
CSS
.border-glow-card {
|
|
--edge-proximity: 0;
|
|
--cursor-angle: 45deg;
|
|
--edge-sensitivity: 30;
|
|
--color-sensitivity: calc(var(--edge-sensitivity) + 20);
|
|
--border-radius: 28px;
|
|
--glow-padding: 40px;
|
|
--cone-spread: 25;
|
|
/* Kartenfarbe nach Theme: --card-bg-dark / --card-bg-light kommen aus BorderGlow.tsx */
|
|
--card-bg: var(--card-bg-dark, #000);
|
|
position: relative;
|
|
border-radius: var(--border-radius);
|
|
isolation: isolate;
|
|
transform: translate3d(0, 0, 0.01px);
|
|
display: grid;
|
|
border: 1px solid rgb(255 255 255 / 8%);
|
|
background: var(--card-bg, #000);
|
|
overflow: hidden;
|
|
-webkit-backface-visibility: hidden;
|
|
backface-visibility: hidden;
|
|
box-shadow:
|
|
rgba(0, 0, 0, 0.1) 0px 1px 2px,
|
|
rgba(0, 0, 0, 0.1) 0px 2px 4px,
|
|
rgba(0, 0, 0, 0.1) 0px 4px 8px,
|
|
rgba(0, 0, 0, 0.1) 0px 8px 16px,
|
|
rgba(0, 0, 0, 0.1) 0px 16px 32px,
|
|
rgba(0, 0, 0, 0.1) 0px 32px 64px;
|
|
}
|
|
|
|
/* Heller Modus: helle Kartenfarbe und ein sichtbarer Rand (weiß mit 8 % Deckkraft wäre auf Weiß unsichtbar) */
|
|
html:not(.dark) .border-glow-card {
|
|
--card-bg: var(--card-bg-light, var(--card-bg-dark, #000));
|
|
border-color: hsl(var(--border));
|
|
}
|
|
|
|
.border-glow-card::before,
|
|
.border-glow-card::after,
|
|
.border-glow-card > .edge-light {
|
|
content: "";
|
|
position: absolute;
|
|
inset: 0;
|
|
border-radius: inherit;
|
|
transition: opacity 0.25s ease-out;
|
|
z-index: -1;
|
|
pointer-events: none;
|
|
}
|
|
|
|
.border-glow-card:not(:hover):not(.sweep-active)::before,
|
|
.border-glow-card:not(:hover):not(.sweep-active)::after,
|
|
.border-glow-card:not(:hover):not(.sweep-active) > .edge-light {
|
|
opacity: 0 !important;
|
|
visibility: hidden;
|
|
transition: opacity 0.75s ease-in-out, visibility 0.75s ease-in-out;
|
|
}
|
|
|
|
/* colored mesh-gradient border */
|
|
.border-glow-card::before {
|
|
border: 1px solid transparent;
|
|
background:
|
|
linear-gradient(var(--card-bg, #120F17) 0 100%) padding-box,
|
|
linear-gradient(rgb(255 255 255 / 0%) 0% 100%) border-box,
|
|
var(--gradient-one, radial-gradient(at 80% 55%, hsla(268, 100%, 76%, 1) 0px, transparent 50%)) border-box,
|
|
var(--gradient-two, radial-gradient(at 69% 34%, hsla(349, 100%, 74%, 1) 0px, transparent 50%)) border-box,
|
|
var(--gradient-three, radial-gradient(at 8% 6%, hsla(136, 100%, 78%, 1) 0px, transparent 50%)) border-box,
|
|
var(--gradient-four, radial-gradient(at 41% 38%, hsla(192, 100%, 64%, 1) 0px, transparent 50%)) border-box,
|
|
var(--gradient-five, radial-gradient(at 86% 85%, hsla(186, 100%, 74%, 1) 0px, transparent 50%)) border-box,
|
|
var(--gradient-six, radial-gradient(at 82% 18%, hsla(52, 100%, 65%, 1) 0px, transparent 50%)) border-box,
|
|
var(--gradient-seven, radial-gradient(at 51% 4%, hsla(12, 100%, 72%, 1) 0px, transparent 50%)) border-box,
|
|
var(--gradient-base, linear-gradient(#c299ff 0 100%)) border-box;
|
|
opacity: calc(
|
|
(var(--edge-proximity) - var(--color-sensitivity)) /
|
|
(100 - var(--color-sensitivity))
|
|
);
|
|
mask-image: conic-gradient(
|
|
from var(--cursor-angle) at center,
|
|
black calc(var(--cone-spread) * 1%),
|
|
transparent calc((var(--cone-spread) + 15) * 1%),
|
|
transparent calc((100 - var(--cone-spread) - 15) * 1%),
|
|
black calc((100 - var(--cone-spread)) * 1%)
|
|
);
|
|
}
|
|
|
|
/* colored mesh-gradient background fill near edges */
|
|
.border-glow-card::after {
|
|
border: 1px solid transparent;
|
|
background:
|
|
var(--gradient-one, radial-gradient(at 80% 55%, hsla(268, 100%, 76%, 1) 0px, transparent 50%)) padding-box,
|
|
var(--gradient-two, radial-gradient(at 69% 34%, hsla(349, 100%, 74%, 1) 0px, transparent 50%)) padding-box,
|
|
var(--gradient-three, radial-gradient(at 8% 6%, hsla(136, 100%, 78%, 1) 0px, transparent 50%)) padding-box,
|
|
var(--gradient-four, radial-gradient(at 41% 38%, hsla(192, 100%, 64%, 1) 0px, transparent 50%)) padding-box,
|
|
var(--gradient-five, radial-gradient(at 86% 85%, hsla(186, 100%, 74%, 1) 0px, transparent 50%)) padding-box,
|
|
var(--gradient-six, radial-gradient(at 82% 18%, hsla(52, 100%, 65%, 1) 0px, transparent 50%)) padding-box,
|
|
var(--gradient-seven, radial-gradient(at 51% 4%, hsla(12, 100%, 72%, 1) 0px, transparent 50%)) padding-box,
|
|
var(--gradient-base, linear-gradient(#c299ff 0 100%)) padding-box;
|
|
mask-image:
|
|
linear-gradient(to bottom, black, black),
|
|
radial-gradient(ellipse at 50% 50%, black 40%, transparent 65%),
|
|
radial-gradient(ellipse at 66% 66%, black 5%, transparent 40%),
|
|
radial-gradient(ellipse at 33% 33%, black 5%, transparent 40%),
|
|
radial-gradient(ellipse at 66% 33%, black 5%, transparent 40%),
|
|
radial-gradient(ellipse at 33% 66%, black 5%, transparent 40%),
|
|
conic-gradient(
|
|
from var(--cursor-angle) at center,
|
|
transparent 5%,
|
|
black 15%,
|
|
black 85%,
|
|
transparent 95%
|
|
);
|
|
mask-composite: subtract, add, add, add, add, add;
|
|
opacity: calc(
|
|
var(--fill-opacity, 0.5) *
|
|
(var(--edge-proximity) - var(--color-sensitivity)) /
|
|
(100 - var(--color-sensitivity))
|
|
);
|
|
mix-blend-mode: soft-light;
|
|
}
|
|
|
|
/* outer glow layer */
|
|
.border-glow-card > .edge-light {
|
|
inset: 0;
|
|
pointer-events: none;
|
|
z-index: 1;
|
|
mask-image: conic-gradient(
|
|
from var(--cursor-angle) at center,
|
|
black 2.5%,
|
|
transparent 10%,
|
|
transparent 90%,
|
|
black 97.5%
|
|
);
|
|
opacity: calc(
|
|
(var(--edge-proximity) - var(--edge-sensitivity)) /
|
|
(100 - var(--edge-sensitivity))
|
|
);
|
|
mix-blend-mode: plus-lighter;
|
|
}
|
|
|
|
.border-glow-card > .edge-light::before {
|
|
content: "";
|
|
position: absolute;
|
|
inset: 0;
|
|
border-radius: inherit;
|
|
box-shadow:
|
|
inset 0 0 0 1px var(--glow-color, hsl(40deg 80% 80% / 100%)),
|
|
inset 0 0 1px 0 var(--glow-color-60, hsl(40deg 80% 80% / 60%)),
|
|
inset 0 0 3px 0 var(--glow-color-50, hsl(40deg 80% 80% / 50%)),
|
|
inset 0 0 6px 0 var(--glow-color-40, hsl(40deg 80% 80% / 40%)),
|
|
inset 0 0 15px 0 var(--glow-color-30, hsl(40deg 80% 80% / 30%)),
|
|
inset 0 0 25px 2px var(--glow-color-20, hsl(40deg 80% 80% / 20%)),
|
|
inset 0 0 50px 2px var(--glow-color-10, hsl(40deg 80% 80% / 10%)),
|
|
0 0 1px 0 var(--glow-color-60, hsl(40deg 80% 80% / 60%)),
|
|
0 0 3px 0 var(--glow-color-50, hsl(40deg 80% 80% / 50%)),
|
|
0 0 6px 0 var(--glow-color-40, hsl(40deg 80% 80% / 40%)),
|
|
0 0 15px 0 var(--glow-color-30, hsl(40deg 80% 80% / 30%)),
|
|
0 0 25px 2px var(--glow-color-20, hsl(40deg 80% 80% / 20%)),
|
|
0 0 50px 2px var(--glow-color-10, hsl(40deg 80% 80% / 10%));
|
|
}
|
|
|
|
/* Heller Modus: "plus-lighter" ginge auf einer hellen Karte im Weiß unter, und die blasse Glow-Farbe wäre kaum sichtbar.
|
|
Der Kantenschein wird deshalb normal gemischt und in einem kräftigeren Violett gezeichnet. */
|
|
html:not(.dark) .border-glow-card > .edge-light {
|
|
mix-blend-mode: normal;
|
|
}
|
|
|
|
html:not(.dark) .border-glow-card > .edge-light::before {
|
|
box-shadow:
|
|
inset 0 0 0 1px hsl(268deg 83% 62% / 70%),
|
|
inset 0 0 3px 0 hsl(268deg 83% 62% / 45%),
|
|
inset 0 0 12px 0 hsl(268deg 83% 62% / 30%),
|
|
inset 0 0 25px 2px hsl(268deg 83% 62% / 15%);
|
|
}
|
|
|
|
.border-glow-inner {
|
|
display: flex;
|
|
flex-direction: column;
|
|
position: relative;
|
|
overflow: auto;
|
|
z-index: 1;
|
|
}
|