Skip to content

Commit d4eb265

Browse files
✨ Enhance navigation components with reduced motion support and add new indicator component
1 parent 244dff8 commit d4eb265

File tree

7 files changed

+160
-77
lines changed

7 files changed

+160
-77
lines changed

resources/js/app.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import {
3232
stagger,
3333
cubicBezier,
3434
} from 'motion'
35+
import.meta.glob(['../images/**', '../svg/**'])
3536

3637
// Swiper
3738
Swiper.use([Navigation, Pagination])
@@ -43,9 +44,6 @@ window.rive = rive
4344
// AutoAnimate
4445
window.autoAnimate = autoAnimate
4546

46-
// Asset loading
47-
import.meta.glob(['../images/**', '../svg/**'])
48-
4947
// GSAP
5048
gsap.registerPlugin(ScrollTrigger)
5149
window.ScrollTrigger = ScrollTrigger
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<svg
2+
{{ $attributes }}
3+
xmlns="http://www.w3.org/2000/svg"
4+
viewBox="0 0 200 200"
5+
fill="none"
6+
>
7+
<mask
8+
id="mask0_2_12"
9+
style="mask-type: luminance"
10+
maskUnits="userSpaceOnUse"
11+
x="0"
12+
y="0"
13+
width="200"
14+
height="200"
15+
>
16+
<path
17+
d="M200 0H0V200H200V0Z"
18+
fill="white"
19+
/>
20+
</mask>
21+
<g mask="url(#mask0_2_12)">
22+
<path
23+
fill-rule="evenodd"
24+
clip-rule="evenodd"
25+
d="M100.387 91.8532C96.2415 40.435 53.2 0 0.71429 0C0.71429 52.2424 40.7753 95.1281 91.8532 99.6128C40.435 103.758 2.29422e-06 146.8 0 199.286C52.2424 199.286 95.1281 159.225 99.6128 108.147C103.758 159.565 146.8 200 199.286 200C199.286 147.758 159.225 104.872 108.147 100.387C159.565 96.2416 200 53.2 200 0.714286C147.758 0.714283 104.872 40.7753 100.387 91.8532ZM99.9975 100.002L100.002 100.003L100.003 99.9975C100.001 99.9975 99.9975 99.9975 99.9975 99.9975V100.002Z"
26+
fill="url(#paint0_linear_2_12)"
27+
/>
28+
</g>
29+
<defs>
30+
<linearGradient
31+
id="paint0_linear_2_12"
32+
x1="177"
33+
y1="-1.10731e-05"
34+
x2="39.5"
35+
y2="152.5"
36+
gradientUnits="userSpaceOnUse"
37+
>
38+
<stop stop-color="#E7E9FF" />
39+
<stop
40+
offset="1"
41+
stop-color="#B0B9FF"
42+
/>
43+
</linearGradient>
44+
</defs>
45+
</svg>

resources/views/components/nav.blade.php

Lines changed: 76 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,29 @@
11
<nav
2-
x-data
32
x-ref="nav"
43
x-init="
54
() => {
65
if (reducedMotion) return
7-
const navTimeline = gsap
8-
.timeline({
9-
paused: true,
10-
})
11-
.fromTo(
12-
$refs.nav.querySelectorAll('.gsap-fadein'),
13-
{
14-
autoAlpha: 0,
15-
y: -10,
16-
},
17-
{
18-
autoAlpha: 1,
19-
y: 0,
20-
duration: 0.5,
21-
stagger: 0.05,
22-
},
23-
)
246
25-
if ($refs.nav.querySelectorAll('.gsap-popout').length) {
26-
navTimeline.fromTo(
27-
$refs.nav.querySelectorAll('.gsap-popout'),
7+
motion.inView($el, (element) => {
8+
motion.animate(
9+
$refAll('navItem'),
2810
{
29-
autoAlpha: 0,
30-
y: -30,
31-
rotate: 360,
11+
y: [-10, 0],
12+
opacity: [0, 1],
3213
},
3314
{
34-
autoAlpha: 1,
35-
y: 0,
36-
rotate: -45,
37-
duration: 0.6,
38-
ease: 'back.out(1.5)',
15+
duration: 0.7,
16+
ease: motion.circOut,
17+
delay: motion.stagger(0.05),
3918
},
40-
'<0.2',
4119
)
42-
}
43-
44-
navTimeline.play()
20+
})
4521
}
4622
"
47-
class="relative mx-auto flex max-w-8xl items-center justify-between overflow-x-clip px-8 py-10 sm:overflow-x-visible"
23+
class="relative mx-auto flex max-w-8xl items-center justify-between overflow-x-clip px-8 pb-12 pt-5 sm:overflow-x-visible"
4824
>
4925
{{-- Mobile Menu Button --}}
5026
<button
51-
x-data
5227
aria-controls="main-menu"
5328
aria-haspopup="true"
5429
x-on:click.prevent="$store.sidebar.isOpen = ! $store.sidebar.isOpen"
@@ -79,86 +54,113 @@ class="transition duration-300 hover:scale-110 lg:hidden"
7954
@endif
8055

8156
{{-- Nav Links --}}
82-
<div class="flex items-center justify-end gap-8 font-semibold sm:gap-14">
57+
<div class="flex items-center justify-end gap-8 text-sm">
58+
<a
59+
href="{{ route('home') }}"
60+
@class([
61+
'group relative hidden text-evening transition duration-300 hover:opacity-100 motion-reduce:transition-none lg:block',
62+
'opacity-80' => ! request()->routeIs('home*'),
63+
'font-semibold' => request()->routeIs('home*'),
64+
])
65+
>
66+
<div
67+
x-ref="navItem"
68+
:class="{'opacity-0': !reducedMotion}"
69+
>
70+
Home
71+
</div>
72+
73+
@if (request()->routeIs('home*'))
74+
<x-nav.indicator />
75+
@endif
76+
</a>
77+
8378
<a
8479
href="{{ route('docs') }}"
8580
@class([
86-
'hidden transition duration-300 hover:opacity-100 focus:text-butter motion-reduce:transition-none lg:block',
81+
'hidden transition duration-300 hover:opacity-100 motion-reduce:transition-none lg:block',
8782
'text-evening opacity-80' => ! request()->routeIs('docs*'),
8883
'text-butter' => request()->routeIs('docs*'),
8984
])
9085
>
91-
<div class="gsap-fadein">Documentation</div>
86+
<div
87+
x-ref="navItem"
88+
:class="{'opacity-0': !reducedMotion}"
89+
>
90+
Documentation
91+
</div>
9292
</a>
9393

9494
<a
9595
href="{{ route('plugins') }}"
9696
@class([
97-
'group/nav-link relative hidden text-evening transition duration-300 hover:opacity-100 focus:text-butter motion-reduce:transition-none lg:block',
97+
'group relative hidden text-evening transition duration-300 hover:opacity-100 motion-reduce:transition-none lg:block',
9898
'opacity-80' => ! request()->routeIs('plugins*'),
99-
'font-bold' => request()->routeIs('plugins*'),
99+
'font-semibold' => request()->routeIs('plugins*'),
100100
])
101101
>
102-
<div class="gsap-fadein">Plugins</div>
102+
<div
103+
x-ref="navItem"
104+
:class="{'opacity-0': !reducedMotion}"
105+
>
106+
Plugins
107+
</div>
103108

104109
@if (request()->routeIs('plugins*'))
105-
<div
106-
class="gsap-popout absolute -bottom-4 right-1/2 translate-x-1/2"
107-
>
108-
<div
109-
class="h-2 w-2 bg-butter transition duration-300 group-hover/nav-link:rotate-90 group-hover/nav-link:bg-purple-400 motion-reduce:transition-none"
110-
></div>
111-
</div>
110+
<x-nav.indicator />
112111
@endif
113112
</a>
114113

115114
<a
116115
href="{{ route('articles') }}"
117116
@class([
118-
'group/nav-link relative hidden text-evening transition duration-300 hover:opacity-100 focus:text-butter motion-reduce:transition-none lg:block',
117+
'group relative hidden text-evening transition duration-300 hover:opacity-100 motion-reduce:transition-none lg:block',
119118
'opacity-80' => ! request()->routeIs('articles*'),
120-
'font-bold' => request()->routeIs('articles*'),
119+
'font-semibold' => request()->routeIs('articles*'),
121120
])
122121
>
123-
<div class="gsap-fadein">Content</div>
122+
<div
123+
x-ref="navItem"
124+
:class="{'opacity-0': !reducedMotion}"
125+
>
126+
Content
127+
</div>
124128

125129
@if (request()->routeIs('articles*'))
126-
<div
127-
class="gsap-popout absolute -bottom-4 right-1/2 translate-x-1/2"
128-
>
129-
<div
130-
class="h-2 w-2 bg-butter transition duration-300 group-hover/nav-link:rotate-90 group-hover/nav-link:bg-purple-400 motion-reduce:transition-none"
131-
></div>
132-
</div>
130+
<x-nav.indicator />
133131
@endif
134132
</a>
135133

136134
<a
137135
href="{{ route('consulting') }}"
138136
@class([
139-
'group/nav-link relative hidden text-evening transition duration-300 hover:opacity-100 focus:text-butter motion-reduce:transition-none lg:block',
137+
'group relative hidden text-evening transition duration-300 hover:opacity-100 motion-reduce:transition-none lg:block',
140138
'opacity-80' => ! request()->routeIs('consulting*'),
141-
'font-bold' => request()->routeIs('consulting*'),
139+
'font-semibold' => request()->routeIs('consulting*'),
142140
])
143141
>
144-
<div class="gsap-fadein">Consulting</div>
142+
<div
143+
x-ref="navItem"
144+
:class="{'opacity-0': !reducedMotion}"
145+
>
146+
Consulting
147+
</div>
145148

146149
@if (request()->routeIs('consulting*'))
147-
<div
148-
class="gsap-popout absolute -bottom-4 right-1/2 translate-x-1/2"
149-
>
150-
<div
151-
class="h-2 w-2 bg-butter transition duration-300 group-hover/nav-link:rotate-90 group-hover/nav-link:bg-purple-400 motion-reduce:transition-none"
152-
></div>
153-
</div>
150+
<x-nav.indicator />
154151
@endif
155152
</a>
156153

157154
<a
158155
href="https://shop.filamentphp.com"
159-
class="group/nav-link relative hidden text-evening opacity-80 transition duration-300 hover:opacity-100 focus:text-butter motion-reduce:transition-none lg:block"
156+
class="group relative hidden text-evening opacity-80 transition duration-300 hover:opacity-100 motion-reduce:transition-none lg:block"
160157
>
161-
<div class="gsap-fadein">Shop</div>
158+
<div
159+
x-ref="navItem"
160+
:class="{'opacity-0': !reducedMotion}"
161+
>
162+
Shop
163+
</div>
162164
</a>
163165

164166
{{-- Github --}}
@@ -169,7 +171,10 @@ class="group/nav-link relative hidden text-evening opacity-80 transition duratio
169171
target="_blank"
170172
class="peer text-evening opacity-80 transition delay-75 duration-300 group-hover/github:opacity-100 motion-reduce:transition-none"
171173
>
172-
<div class="gsap-fadein">
174+
<div
175+
x-ref="navItem"
176+
:class="{'opacity-0': !reducedMotion}"
177+
>
173178
<svg
174179
fill="currentColor"
175180
viewBox="0 0 29 29"

resources/views/components/nav/christmas-logo.blade.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
<a
2+
x-ref="navItem"
23
href="/"
3-
class="group/filament gsap-fadein relative"
4+
class="group/filament relative"
5+
:class="{'opacity-0': !reducedMotion}"
46
>
57
<div class="text-black">
68
<svg

resources/views/components/nav/halloween-logo.blade.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
<a
2+
x-ref="navItem"
23
href="/"
3-
class="group/filament gsap-fadein relative"
4+
class="group/filament relative"
5+
:class="{'opacity-0': !reducedMotion}"
46
>
57
<div class="text-black">
68
<svg
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<div class="absolute -bottom-4 right-1/2 translate-x-1/2">
2+
<div
3+
x-init="
4+
() => {
5+
motion.inView($el, (element) => {
6+
motion.animate(
7+
$el,
8+
{
9+
opacity: [0, 1],
10+
y: [-30, 0],
11+
rotate: [-360, 0],
12+
scale: [0.5, 1],
13+
},
14+
{
15+
duration: 0.7,
16+
ease: motion.circOut,
17+
delay: 0.05,
18+
},
19+
)
20+
})
21+
}
22+
"
23+
:class="{'opacity-0': !reducedMotion}"
24+
>
25+
<x-icons.nexus-flower
26+
class="size-[10px] transition duration-300 group-hover:rotate-90 motion-reduce:transition-none"
27+
/>
28+
</div>
29+
</div>

resources/views/components/nav/logo.blade.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
<a
2+
x-ref="navItem"
23
href="/"
3-
class="group/filament gsap-fadein relative"
4+
class="group/filament relative"
5+
:class="{'opacity-0': !reducedMotion}"
46
>
57
<div class="text-black">
68
<svg

0 commit comments

Comments
 (0)