Skip to content

Commit 80bdbaa

Browse files
authored
Merge branch 'main' into main
2 parents 5f615b6 + 8b8eff4 commit 80bdbaa

12 files changed

Lines changed: 35 additions & 20 deletions

app/components/AppFooter.vue

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,12 @@ onMounted(() => {
137137
z-index: 40;
138138
/* Hidden by default (translated off-screen) */
139139
transform: translateY(100%);
140-
transition: transform 0.3s ease-out;
140+
}
141+
142+
@media (prefers-reduced-motion: no-preference) {
143+
.footer-scroll-state {
144+
transition: transform 0.3s ease-out;
145+
}
141146
}
142147
143148
/* Show footer when user can scroll up (meaning they've scrolled down) */

app/components/LoadingSpinner.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ const { t } = useI18n()
99

1010
<template>
1111
<div aria-busy="true" class="flex items-center gap-3 text-fg-muted font-mono text-sm py-8">
12-
<span class="w-4 h-4 border-2 border-fg-subtle border-t-fg rounded-full animate-spin" />
12+
<span
13+
class="w-4 h-4 border-2 border-fg-subtle border-t-fg rounded-full motion-safe:animate-spin"
14+
/>
1315
{{ text ?? t('common.loading') }}
1416
</div>
1517
</template>

app/components/OrgMembersPanel.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ watch(lastExecutionTime, () => {
309309
>
310310
<span
311311
class="i-carbon-renew block w-4 h-4"
312-
:class="{ 'animate-spin': isLoading || isLoadingTeams }"
312+
:class="{ 'motion-safe:animate-spin': isLoading || isLoadingTeams }"
313313
aria-hidden="true"
314314
/>
315315
</button>

app/components/OrgTeamsPanel.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ watch(lastExecutionTime, () => {
331331
<!-- Loading state -->
332332
<div v-if="isLoadingTeams && teams.length === 0" class="p-8 text-center">
333333
<span
334-
class="i-carbon-rotate-180 block w-5 h-5 text-fg-muted animate-spin mx-auto"
334+
class="i-carbon-rotate-180 block w-5 h-5 text-fg-muted motion-safe:animate-spin mx-auto"
335335
aria-hidden="true"
336336
/>
337337
<p class="font-mono text-sm text-fg-muted mt-2">{{ $t('org.teams.loading') }}</p>
@@ -390,7 +390,7 @@ watch(lastExecutionTime, () => {
390390
</span>
391391
<span
392392
v-if="isLoadingUsers[teamName]"
393-
class="i-carbon-rotate-180 w-3 h-3 text-fg-muted animate-spin"
393+
class="i-carbon-rotate-180 w-3 h-3 text-fg-muted motion-safe:animate-spin"
394394
aria-hidden="true"
395395
/>
396396
</button>

app/components/PackageAccessControls.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ watch(
164164
>
165165
<span
166166
class="i-carbon-renew block w-3.5 h-3.5"
167-
:class="{ 'animate-spin': isLoadingCollaborators }"
167+
:class="{ 'motion-safe:animate-spin': isLoadingCollaborators }"
168168
aria-hidden="true"
169169
/>
170170
</button>

app/components/PackageList.vue

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ defineExpose({
111111
:show-publisher="showPublisher"
112112
:selected="index === (selectedIndex ?? -1)"
113113
:index="index"
114-
class="animate-fade-in animate-fill-both"
114+
class="motion-safe:animate-fade-in motion-safe:animate-fill-both"
115115
:style="{ animationDelay: `${Math.min(index * 0.02, 0.3)}s` }"
116116
@focus="emit('select', $event)"
117117
/>
@@ -122,7 +122,9 @@ defineExpose({
122122
<!-- Loading indicator -->
123123
<div v-if="isLoading" class="py-4 flex items-center justify-center">
124124
<div class="flex items-center gap-3 text-fg-muted font-mono text-sm">
125-
<span class="w-4 h-4 border-2 border-fg-subtle border-t-fg rounded-full animate-spin" />
125+
<span
126+
class="w-4 h-4 border-2 border-fg-subtle border-t-fg rounded-full motion-safe:animate-spin"
127+
/>
126128
{{ $t('common.loading_more') }}
127129
</div>
128130
</div>

app/components/PackageSkeleton.vue

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@ const { t } = useI18n()
33
</script>
44

55
<template>
6-
<article aria-busy="true" :aria-label="t('package.skeleton.loading')" class="animate-fade-in">
6+
<article
7+
aria-busy="true"
8+
:aria-label="t('package.skeleton.loading')"
9+
class="motion-safe:animate-fade-in"
10+
>
711
<!-- Package header - matches header in [...name].vue -->
812
<header class="mb-8 pb-8 border-b border-border">
913
<div class="flex flex-col sm:flex-row sm:items-start sm:justify-between gap-4 mb-4">

app/components/PackageVersions.vue

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,8 @@ function getTagVersions(tag: string): VersionDisplay[] {
317317
>
318318
<span
319319
v-if="loadingTags.has(row.tag)"
320-
class="i-carbon-rotate-180 w-3 h-3 animate-spin"
320+
class="i-carbon-rotate-180 w-3 h-3 motion-safe:animate-spin"
321+
data-testid="loading-spinner"
321322
aria-hidden="true"
322323
/>
323324
<span
@@ -457,7 +458,8 @@ function getTagVersions(tag: string): VersionDisplay[] {
457458
>
458459
<span
459460
v-if="otherVersionsLoading"
460-
class="i-carbon-rotate-180 w-3 h-3 animate-spin"
461+
class="i-carbon-rotate-180 w-3 h-3 motion-safe:animate-spin"
462+
data-testid="loading-spinner"
461463
aria-hidden="true"
462464
/>
463465
<span

app/pages/[...package].vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ defineOgImageComponent('Package', {
401401
<main class="container py-8 sm:py-12 overflow-hidden w-full">
402402
<PackageSkeleton v-if="status === 'pending'" />
403403

404-
<article v-else-if="status === 'success' && pkg" class="animate-fade-in min-w-0">
404+
<article v-else-if="status === 'success' && pkg" class="motion-safe:animate-fade-in min-w-0">
405405
<!-- Package header -->
406406
<header class="mb-8 pb-8 border-b border-border">
407407
<div class="mb-4">
@@ -627,7 +627,7 @@ defineOgImageComponent('Package', {
627627
class="inline-flex items-center gap-1 text-fg-subtle"
628628
>
629629
<span
630-
class="i-carbon-circle-dash w-3 h-3 animate-spin motion-reduce:animate-none"
630+
class="i-carbon-circle-dash w-3 h-3 motion-safe:animate-spin"
631631
aria-hidden="true"
632632
/>
633633
</span>

app/pages/index.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,21 @@ defineOgImageComponent('Default')
2525
<header class="flex-1 flex flex-col items-center justify-center text-center py-20">
2626
<!-- Animated title -->
2727
<h1
28-
class="font-mono text-5xl sm:text-7xl md:text-8xl font-medium tracking-tight mb-4 animate-fade-in animate-fill-both"
28+
class="font-mono text-5xl sm:text-7xl md:text-8xl font-medium tracking-tight mb-4 motion-safe:animate-fade-in motion-safe:animate-fill-both"
2929
>
3030
<span class="text-accent"><span class="-tracking-0.2em">.</span>/</span>npmx
3131
</h1>
3232

3333
<p
34-
class="text-fg-muted text-lg sm:text-xl max-w-md mb-12 animate-slide-up animate-fill-both"
34+
class="text-fg-muted text-lg sm:text-xl max-w-md mb-12 motion-safe:animate-slide-up motion-safe:animate-fill-both"
3535
style="animation-delay: 0.1s"
3636
>
3737
{{ $t('tagline') }}
3838
</p>
3939

4040
<!-- Search form with micro-interactions -->
4141
<search
42-
class="w-full max-w-xl animate-slide-up animate-fill-both"
42+
class="w-full max-w-xl motion-safe:animate-slide-up motion-safe:animate-fill-both"
4343
style="animation-delay: 0.2s"
4444
>
4545
<form role="search" class="relative" @submit.prevent="handleSearch">
@@ -90,7 +90,7 @@ defineOgImageComponent('Default')
9090
<!-- Popular packages -->
9191
<nav
9292
:aria-label="$t('nav.popular_packages')"
93-
class="pb-20 text-center animate-fade-in animate-fill-both"
93+
class="pb-20 text-center motion-safe:animate-fade-in motion-safe:animate-fill-both"
9494
style="animation-delay: 0.3s"
9595
>
9696
<ul class="flex flex-wrap items-center justify-center gap-x-6 gap-y-3 list-none m-0 p-0">

0 commit comments

Comments
 (0)