Skip to content

Commit 8b0db63

Browse files
authored
fix(website): make CTA border visibly orbit (#39)
1 parent c0d7a20 commit 8b0db63

2 files changed

Lines changed: 122 additions & 50 deletions

File tree

website/theme/components/HomeLayout.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,14 @@ function ArrowIcon() {
674674
);
675675
}
676676

677+
function AnimatedButtonBorder() {
678+
return (
679+
<span aria-hidden="true" className="a3s-button-orbit">
680+
<span className="a3s-button-comet" />
681+
</span>
682+
);
683+
}
684+
677685
function GitHubIcon() {
678686
return (
679687
<svg aria-hidden="true" viewBox="0 0 24 24">
@@ -1270,6 +1278,7 @@ export function HomeLayout() {
12701278
className="a3s-button a3s-button--primary"
12711279
href={route('/guide/')}
12721280
>
1281+
<AnimatedButtonBorder />
12731282
{labels.docs}
12741283
<ArrowIcon />
12751284
</a>
@@ -1426,6 +1435,7 @@ export function HomeLayout() {
14261435
</div>
14271436
<div className="a3s-cta-actions">
14281437
<a className="a3s-button a3s-button--primary" href={route('/guide/')}>
1438+
<AnimatedButtonBorder />
14291439
{labels.ctaPrimary}
14301440
<ArrowIcon />
14311441
</a>

website/theme/index.css

Lines changed: 112 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -244,34 +244,15 @@ body {
244244
transform: translateY(-1px);
245245
}
246246

247-
@property --a3s-cta-angle {
248-
syntax: '<angle>';
249-
inherits: true;
250-
initial-value: 68deg;
251-
}
252-
253247
.a3s-button--primary {
254-
--a3s-cta-angle: 68deg;
255-
256248
position: relative;
257-
border: 2px solid transparent;
249+
overflow: visible;
250+
border: 2px solid #6335ff;
258251
border-radius: 10px;
259-
background:
260-
linear-gradient(180deg, #171a21, #101217) padding-box,
261-
conic-gradient(
262-
from var(--a3s-cta-angle),
263-
#582cff 0deg 220deg,
264-
#7b3fff 240deg,
265-
#38d3ff 262deg,
266-
#fbffff 292deg,
267-
#72dcff 316deg,
268-
#864aff 342deg,
269-
#582cff 360deg
270-
)
271-
border-box;
252+
background: linear-gradient(180deg, #171a21, #101217);
272253
color: #f7f8fb !important;
273254
box-shadow:
274-
0 0 0 1px rgba(117, 74, 255, 0.3),
255+
0 0 0 1px rgba(117, 74, 255, 0.26),
275256
0 10px 28px rgba(0, 0, 0, 0.28);
276257
isolation: isolate;
277258
}
@@ -280,18 +261,10 @@ body {
280261
position: absolute;
281262
z-index: -1;
282263
border-radius: 13px;
283-
background: conic-gradient(
284-
from var(--a3s-cta-angle),
285-
transparent 0deg 238deg,
286-
rgba(104, 219, 255, 0.22) 264deg,
287-
rgba(255, 255, 255, 0.76) 292deg,
288-
rgba(113, 65, 255, 0.22) 340deg,
289-
transparent 360deg
290-
);
264+
border: 2px solid rgba(101, 55, 255, 0.42);
291265
content: '';
292-
filter: blur(7px);
266+
filter: blur(6px);
293267
inset: -4px;
294-
opacity: 0.48;
295268
pointer-events: none;
296269
}
297270

@@ -307,26 +280,125 @@ body {
307280
}
308281

309282
.a3s-button--primary:hover {
310-
border-color: transparent;
283+
border-color: #6335ff;
311284
box-shadow:
312285
0 0 0 1px rgba(111, 76, 255, 0.38),
313286
0 0 22px rgba(99, 100, 255, 0.2),
314287
0 12px 32px rgba(0, 0, 0, 0.34);
315288
}
316289

317-
.a3s-button--primary:hover,
318-
.a3s-button--primary:focus-visible {
319-
animation: a3s-button-border-flow 1s linear infinite;
290+
.a3s-button-orbit {
291+
position: absolute;
292+
z-index: 2;
293+
overflow: visible;
294+
inset: -2px;
295+
pointer-events: none;
296+
}
297+
298+
.a3s-button-comet {
299+
position: absolute;
300+
top: 0;
301+
left: 50%;
302+
width: 30px;
303+
height: 3px;
304+
border-radius: 999px;
305+
background: linear-gradient(
306+
90deg,
307+
transparent 0%,
308+
rgba(112, 56, 255, 0.72) 18%,
309+
#45ddff 52%,
310+
#fff 80%,
311+
rgba(255, 255, 255, 0) 100%
312+
);
313+
box-shadow:
314+
0 0 4px rgba(69, 221, 255, 0.95),
315+
0 0 10px rgba(104, 72, 255, 0.72);
316+
transform: translate(-50%, -50%);
317+
transform-origin: center;
318+
will-change: top, left, transform;
319+
}
320+
321+
.a3s-button-comet::after {
322+
position: absolute;
323+
top: 0;
324+
right: 17%;
325+
width: 5px;
326+
height: 3px;
327+
border-radius: inherit;
328+
background: #fff;
329+
box-shadow: 0 0 5px #fff;
330+
content: '';
331+
}
332+
333+
.a3s-button--primary:hover .a3s-button-comet,
334+
.a3s-button--primary:focus-visible .a3s-button-comet {
335+
animation: a3s-button-comet-orbit 1.35s linear infinite;
320336
}
321337

322338
.a3s-button--primary:focus-visible {
323339
outline: 2px solid #d9e7ff;
324340
outline-offset: 4px;
325341
}
326342

327-
@keyframes a3s-button-border-flow {
328-
to {
329-
--a3s-cta-angle: 428deg;
343+
@keyframes a3s-button-comet-orbit {
344+
0% {
345+
top: 0;
346+
left: 50%;
347+
transform: translate(-50%, -50%) rotate(0deg);
348+
}
349+
350+
16% {
351+
top: 0;
352+
left: calc(100% - 11px);
353+
transform: translate(-50%, -50%) rotate(0deg);
354+
}
355+
356+
21% {
357+
top: 11px;
358+
left: 100%;
359+
transform: translate(-50%, -50%) rotate(90deg);
360+
}
361+
362+
31% {
363+
top: calc(100% - 11px);
364+
left: 100%;
365+
transform: translate(-50%, -50%) rotate(90deg);
366+
}
367+
368+
36% {
369+
top: 100%;
370+
left: calc(100% - 11px);
371+
transform: translate(-50%, -50%) rotate(180deg);
372+
}
373+
374+
66% {
375+
top: 100%;
376+
left: 11px;
377+
transform: translate(-50%, -50%) rotate(180deg);
378+
}
379+
380+
71% {
381+
top: calc(100% - 11px);
382+
left: 0;
383+
transform: translate(-50%, -50%) rotate(270deg);
384+
}
385+
386+
81% {
387+
top: 11px;
388+
left: 0;
389+
transform: translate(-50%, -50%) rotate(270deg);
390+
}
391+
392+
86% {
393+
top: 0;
394+
left: 11px;
395+
transform: translate(-50%, -50%) rotate(360deg);
396+
}
397+
398+
100% {
399+
top: 0;
400+
left: 50%;
401+
transform: translate(-50%, -50%) rotate(360deg);
330402
}
331403
}
332404

@@ -3306,11 +3378,6 @@ body {
33063378
}
33073379

33083380
@media (prefers-reduced-motion: reduce) {
3309-
.a3s-button--primary:hover::before,
3310-
.a3s-button--primary:focus-visible::before {
3311-
animation: none;
3312-
}
3313-
33143381
.a3s-tutorial-step::before,
33153382
.a3s-code-line,
33163383
.a3s-tutorial-layers button {
@@ -4735,11 +4802,6 @@ body {
47354802
}
47364803

47374804
@media (prefers-reduced-motion: reduce) {
4738-
.a3s-button--primary:hover,
4739-
.a3s-button--primary:focus-visible {
4740-
animation: none;
4741-
}
4742-
47434805
.a3s-runtime-model-slab,
47444806
.a3s-runtime-layer-control,
47454807
.a3s-runtime-flow-step,

0 commit comments

Comments
 (0)