summaryrefslogtreecommitdiffhomepage
path: root/packages/desktop/src/components/spinner.tsx
blob: 5fc4cda6400f9037e910a9a6d1b945e395a782ed (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import { ComponentProps, For } from "solid-js"

export function Spinner(props: { class?: string; classList?: ComponentProps<"div">["classList"] }) {
  const squares = Array.from({ length: 16 }, (_, i) => ({
    id: i,
    x: (i % 4) * 4,
    y: Math.floor(i / 4) * 4,
    delay: Math.random() * 3,
    duration: 2 + Math.random() * 2,
  }))

  return (
    <svg
      viewBox="0 0 15 15"
      classList={{
        "size-4": true,
        ...(props.classList ?? {}),
        [props.class ?? ""]: !!props.class,
      }}
      fill="currentColor"
    >
      <For each={squares}>
        {(square) => (
          <rect
            x={square.x}
            y={square.y}
            width="3"
            height="3"
            rx="1"
            style={{
              animation: `pulse-opacity ${square.duration}s ease-in-out infinite`,
              "animation-delay": `${square.delay}s`,
            }}
          />
        )}
      </For>
    </svg>
  )
}