● Zion Boggan
repos/Stepping App/apps/web/src/components/skeletons.tsx
zionboggan.com ↗
90 lines · tsx
History for this file →
1
function Bar({ className = "" }: { className?: string }) {
2
  return <span className={`skeleton block ${className}`} aria-hidden="true" />;
3
}
4
 
5
function SkeletonRows({ count = 4 }: { count?: number }) {
6
  return (
7
    <ul className="mt-10">
8
      {Array.from({ length: count }).map((_, i) => (
9
        <li
10
          key={i}
11
          className="flex items-center gap-5 border-b border-[var(--line)] py-6"
12
        >
13
          <Bar className="h-4 w-8" />
14
          <Bar className="h-7 flex-1 max-w-[60%]" />
15
          <Bar className="hidden h-4 w-24 sm:block" />
16
        </li>
17
      ))}
18
    </ul>
19
  );
20
}
21
 
22
export function CitySkeleton() {
23
  return (
24
    <main className="mx-auto w-full max-w-3xl px-5 py-16 sm:px-8">
25
      <span className="kicker text-ash">Loading the city</span>
26
      <Bar className="mt-10 h-4 w-48" />
27
      <Bar className="mt-4 h-16 w-3/4 sm:h-24" />
28
      <div className="mt-6 flex gap-6">
29
        <Bar className="h-4 w-32" />
30
        <Bar className="h-4 w-28" />
31
      </div>
32
      <div className="mt-16 border-t border-[var(--line)] pt-10">
33
        <Bar className="h-7 w-40" />
34
        <SkeletonRows count={4} />
35
      </div>
36
    </main>
37
  );
38
}
39
 
40
export function YardSkeleton() {
41
  return (
42
    <main className="mx-auto w-full max-w-4xl px-5 py-16 sm:px-8">
43
      <span className="kicker text-ash">Loading The Floor</span>
44
      <Bar className="mt-10 h-4 w-40" />
45
      <Bar className="mt-4 h-14 w-2/3 sm:h-20" />
46
      <div className="mt-14 grid gap-px sm:grid-cols-2">
47
        {Array.from({ length: 4 }).map((_, i) => (
48
          <div key={i} className="border-t border-[var(--line)] py-8">
49
            <Bar className="h-6 w-1/2" />
50
            <Bar className="mt-3 h-4 w-3/4" />
51
          </div>
52
        ))}
53
      </div>
54
    </main>
55
  );
56
}
57
 
58
export function EventSkeleton() {
59
  return (
60
    <main className="mx-auto w-full max-w-3xl px-5 py-16 sm:px-8">
61
      <span className="kicker text-ash">Loading the set</span>
62
      <Bar className="mt-10 h-4 w-40" />
63
      <Bar className="mt-4 h-16 w-3/4 sm:h-24" />
64
      <Bar className="mt-6 h-4 w-56" />
65
      <div className="mt-14 border-t border-[var(--line)] pt-10">
66
        <Bar className="h-5 w-2/3" />
67
        <Bar className="mt-4 h-5 w-1/2" />
68
        <Bar className="mt-4 h-5 w-3/5" />
69
      </div>
70
    </main>
71
  );
72
}
73
 
74
export function VideosSkeleton() {
75
  return (
76
    <main className="mx-auto w-full max-w-4xl px-5 py-16 sm:px-8">
77
      <span className="kicker text-ash">Loading the videos</span>
78
      <Bar className="mt-10 h-4 w-40" />
79
      <Bar className="mt-4 h-14 w-2/3 sm:h-20" />
80
      <div className="mt-14 grid gap-6 sm:grid-cols-2">
81
        {Array.from({ length: 4 }).map((_, i) => (
82
          <div key={i}>
83
            <Bar className="aspect-video w-full" />
84
            <Bar className="mt-3 h-5 w-3/4" />
85
          </div>
86
        ))}
87
      </div>
88
    </main>
89
  );
90
}