Animation

Border Glow

Cursor-tracked glowing border card. A cone of light follows the pointer along the perimeter, brightening as the cursor approaches an edge. Optional [animated] mode plays a one-shot sweep on mount.

Angular adaptation of an effect by David Haz / reactbits.dev.

Import

import { WrBorderGlow } from 'ngwr/border-glow';

Playground

Hover me

The border lights up where the cursor is.

<wr-border-glow
  [borderRadius]="28"
  [glowRadius]="40"
  [coneSpread]="25"
  [glowIntensity]="1"
  [animated]="false"
>
  …
</wr-border-glow>

Customize

Border Radius (px)
28 px
Glow Radius (px)
40 px
Cone Spread (%)
25 %
Glow Intensity
1.0
Animated
Glow Color

API

NameDescriptionTypeDefault
backgroundColorCard background fill. Unset, it uses the theme surface token.string | nullnull
borderRadiusCorner radius in pixels.number28
glowRadiusHalo extent in pixels — how far the outer glow reaches past the card edge.number40
glowIntensityHalo opacity multiplier (1 = full strength).number1
coneSpreadWidth of the lit cone as a percentage of the perimeter.number25
edgeSensitivityHow sharply the halo fades as the cursor leaves the edge. Lower = wider falloff.number30
fillOpacityStrength of the soft-light interior fill near edges (0..1).number0.5
glowColorHalo colour as "H S L" (HSL parts, no commas). Unset, the theme decides: a deep amber on light surfaces, pale amber on dark.string | nullnull
colorsMesh-gradient palette for the visible border slice. Unset, the theme decides: deep tones on light, pastels on dark.readonly string[] | nullnull
animatedPlay a one-shot perimeter sweep on mount, then fade out.booleanfalse

CSS variables

Custom properties ngwr/border-glow publishes. Each default below is declared on the component's own selector, so a :root override is shadowed by it — set them on that selector, on a wrapper you scope yourself, or inline on the element. Unlike the BEM class names, these are the supported way to restyle the component.

VariableDefaultDeclared on
--wr-border-glow-angle45deg.wr-border-glow
--wr-border-glow-colorhsl(40deg 90% 45% / 100%).wr-border-glow +1 variant override
--wr-border-glow-color-10hsl(40deg 90% 45% / 10%).wr-border-glow +1 variant override
--wr-border-glow-color-20hsl(40deg 90% 45% / 20%).wr-border-glow +1 variant override
--wr-border-glow-color-30hsl(40deg 90% 45% / 30%).wr-border-glow +1 variant override
--wr-border-glow-color-40hsl(40deg 90% 45% / 40%).wr-border-glow +1 variant override
--wr-border-glow-color-50hsl(40deg 90% 45% / 50%).wr-border-glow +1 variant override
--wr-border-glow-color-60hsl(40deg 90% 45% / 60%).wr-border-glow +1 variant override
--wr-border-glow-color-sensitivitycalc(var(--wr-border-glow-edge-sensitivity) + 20).wr-border-glow
--wr-border-glow-cone-spread25.wr-border-glow
--wr-border-glow-edge-proximity0.wr-border-glow
--wr-border-glow-edge-sensitivity30.wr-border-glow
--wr-border-glow-edge-shadowinset 0 0 0 1px var(--wr-border-glow-color), inset 0 0 1px 0 var(--wr-border-glow-color-60), inset 0 0 3px 0 var(--wr-border-glow-color-50), inset 0 0 6px 0 var(--wr-border-glow-color-40), inset 0 0 15px 0 var(--wr-border-glow-color-30), inset 0 0 25px 2px var(--wr-border-glow-color-20), inset 0 0 50px 2px var(--wr-border-glow-color-10), 0 0 1px 0 var(--wr-border-glow-color-60), 0 0 3px 0 var(--wr-border-glow-color-50), 0 0 6px 0 var(--wr-border-glow-color-40), 0 0 15px 0 var(--wr-border-glow-color-30), 0 0 25px 2px var(--wr-border-glow-color-20), 0 0 50px 2px var(--wr-border-glow-color-10) only under [data-theme='dark'] .wr-border-glow — unset elsewhere[data-theme='dark'] .wr-border-glow
--wr-border-glow-fill-blendsoft-light only under [data-theme='dark'] .wr-border-glow — unset elsewhere[data-theme='dark'] .wr-border-glow
--wr-border-glow-fill-scale1 only under [data-theme='dark'] .wr-border-glow — unset elsewhere[data-theme='dark'] .wr-border-glow
--wr-border-glow-gradient-baselinear-gradient(hsl(262deg 70% 50%) 0 100%).wr-border-glow +1 variant override
--wr-border-glow-gradient-fiveradial-gradient(at 86% 85%, hsl(186deg 90% 38%) 0px, transparent 50%).wr-border-glow +1 variant override
--wr-border-glow-gradient-fourradial-gradient(at 41% 38%, hsl(192deg 90% 40%) 0px, transparent 50%).wr-border-glow +1 variant override
--wr-border-glow-gradient-oneradial-gradient(at 80% 55%, hsl(268deg 80% 50%) 0px, transparent 50%).wr-border-glow +1 variant override
--wr-border-glow-gradient-sevenradial-gradient(at 51% 4%, hsl(12deg 90% 50%) 0px, transparent 50%).wr-border-glow +1 variant override
--wr-border-glow-gradient-sixradial-gradient(at 82% 18%, hsl(40deg 95% 45%) 0px, transparent 50%).wr-border-glow +1 variant override
--wr-border-glow-gradient-threeradial-gradient(at 8% 6%, hsl(136deg 70% 38%) 0px, transparent 50%).wr-border-glow +1 variant override
--wr-border-glow-gradient-tworadial-gradient(at 69% 34%, hsl(349deg 85% 52%) 0px, transparent 50%).wr-border-glow +1 variant override
--wr-border-glow-halo-blendplus-lighter only under [data-theme='dark'] .wr-border-glow — unset elsewhere[data-theme='dark'] .wr-border-glow
--wr-border-glow-outlinergb(255 255 255 / 15%) only under [data-theme='dark'] .wr-border-glow — unset elsewhere[data-theme='dark'] .wr-border-glow
--wr-border-glow-padding40px.wr-border-glow
--wr-border-glow-radius28px.wr-border-glow