|
34 | 34 | position: relative; |
35 | 35 | width: clamp(224px, 30vw, 324px); |
36 | 36 | aspect-ratio: 460 / 539; |
37 | | - border-radius: 30px; |
38 | | - overflow: hidden; |
39 | | - background: #c2c3c8; |
40 | | - border: 1px solid var(--border-2); |
41 | | - box-shadow: 0 40px 90px -34px var(--accent-glow), var(--shadow-md); |
42 | 37 | } |
| 38 | +/* The source clip has a grey backdrop baked in, so boxing it always reads as a |
| 39 | + pasted square. Instead we feather the media's edges to transparent — Vee melts |
| 40 | + into the page, no frame, no seam, matches any background. */ |
43 | 41 | .hero-mascot-stage img, |
44 | 42 | .hero-mascot-stage video { |
45 | 43 | width: 100%; |
46 | 44 | height: 100%; |
47 | 45 | object-fit: cover; |
48 | 46 | display: block; |
| 47 | + -webkit-mask-image: radial-gradient( |
| 48 | + ellipse 68% 76% at 50% 44%, |
| 49 | + #000 44%, |
| 50 | + rgba(0, 0, 0, 0.5) 68%, |
| 51 | + transparent 90% |
| 52 | + ); |
| 53 | + mask-image: radial-gradient( |
| 54 | + ellipse 68% 76% at 50% 44%, |
| 55 | + #000 44%, |
| 56 | + rgba(0, 0, 0, 0.5) 68%, |
| 57 | + transparent 90% |
| 58 | + ); |
49 | 59 | } |
50 | | -/* Soft inner ring + an accent wash from below so the port feels lit, not pasted. */ |
| 60 | +/* A soft accent pool beneath Vee so the feathered portrait reads as placed, not |
| 61 | + floating. Sits behind the media, unaffected by the mask above. */ |
51 | 62 | .hero-mascot-stage::after { |
52 | 63 | content: ''; |
53 | 64 | position: absolute; |
54 | | - inset: 0; |
55 | | - border-radius: inherit; |
56 | | - pointer-events: none; |
57 | | - box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.35), |
58 | | - inset 0 -56px 60px -34px var(--accent-glow); |
59 | | -} |
60 | | -/* Lens sheen — a soft specular glint drifts across the glass, like light |
61 | | - catching a lens. No hard scan-line. Slow, with a long calm pause between |
62 | | - passes. Reduced-motion: nothing moves. */ |
63 | | -.hero-mascot-stage::before { |
64 | | - content: ''; |
65 | | - position: absolute; |
66 | | - inset: -30%; |
67 | | - z-index: 2; |
68 | | - pointer-events: none; |
69 | | - opacity: 0; |
70 | | - background: linear-gradient( |
71 | | - 100deg, |
72 | | - transparent 41%, |
73 | | - rgba(226, 246, 255, 0.1) 47%, |
74 | | - rgba(240, 251, 255, 0.34) 50%, |
75 | | - rgba(226, 246, 255, 0.1) 53%, |
76 | | - transparent 59% |
| 65 | + left: 50%; |
| 66 | + bottom: 7%; |
| 67 | + width: 56%; |
| 68 | + height: 11%; |
| 69 | + transform: translateX(-50%); |
| 70 | + border-radius: 50%; |
| 71 | + background: radial-gradient( |
| 72 | + ellipse at center, |
| 73 | + var(--accent-glow, rgba(37, 99, 235, 0.28)) 0%, |
| 74 | + transparent 72% |
77 | 75 | ); |
78 | | - mix-blend-mode: screen; |
79 | | - transform: translateX(-58%); |
80 | | -} |
81 | | -@media (prefers-reduced-motion: no-preference) { |
82 | | - .hero-mascot-stage::before { |
83 | | - animation: lensSheen 7s var(--ease-out) infinite; |
84 | | - } |
85 | | -} |
86 | | -@keyframes lensSheen { |
87 | | - 0% { |
88 | | - transform: translateX(-58%); |
89 | | - opacity: 0; |
90 | | - } |
91 | | - 6% { |
92 | | - opacity: 1; |
93 | | - } |
94 | | - 19% { |
95 | | - opacity: 1; |
96 | | - } |
97 | | - 27%, |
98 | | - 100% { |
99 | | - transform: translateX(58%); |
100 | | - opacity: 0; |
101 | | - } |
| 76 | + filter: blur(9px); |
| 77 | + pointer-events: none; |
| 78 | + z-index: -1; |
102 | 79 | } |
103 | 80 | .hero-say { |
104 | 81 | font-size: 0.9rem; |
|
0 commit comments