Skip to content

Commit 4c5e52c

Browse files
committed
svelte: Port LoadingSpinner component from Ember
1 parent ef98364 commit 4c5e52c

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<script module>
2+
import { defineMeta } from '@storybook/addon-svelte-csf';
3+
4+
import LoadingSpinner from './LoadingSpinner.svelte';
5+
6+
const { Story } = defineMeta({
7+
title: 'LoadingSpinner',
8+
component: LoadingSpinner,
9+
tags: ['autodocs'],
10+
argTypes: {
11+
theme: {
12+
control: 'inline-radio',
13+
options: [undefined, 'light'],
14+
},
15+
},
16+
});
17+
</script>
18+
19+
<Story name="Default" />
20+
21+
<Story name="Light Theme" args={{ theme: 'light' }} />
22+
23+
<Story name="Custom Size" asChild>
24+
<LoadingSpinner style="--spinner-size: 32px;" />
25+
</Story>
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<script lang="ts">
2+
import type { HTMLAttributes } from 'svelte/elements';
3+
4+
interface Props extends HTMLAttributes<HTMLDivElement> {
5+
theme?: 'light';
6+
}
7+
8+
let { theme, class: className, ...restProps }: Props = $props();
9+
</script>
10+
11+
<div class={['spinner', theme, className]} {...restProps}>
12+
<span class="sr-only">Loading...</span>
13+
</div>
14+
15+
<style>
16+
.spinner {
17+
--spinner-color: currentcolor;
18+
--spinner-bg-color: var(--gray-border);
19+
--spinner-size: 16px;
20+
21+
display: inline-block;
22+
height: var(--spinner-size);
23+
width: var(--spinner-size);
24+
25+
&:global(.light) {
26+
--spinner-bg-color: rgba(0, 0, 0, 0.2);
27+
}
28+
29+
&::after {
30+
content: ' ';
31+
display: block;
32+
box-sizing: border-box;
33+
width: var(--spinner-size);
34+
height: var(--spinner-size);
35+
border-radius: 50%;
36+
border: calc(var(--spinner-size) / 5.5) solid var(--spinner-color);
37+
border-color: var(--spinner-bg-color) var(--spinner-bg-color) var(--spinner-color)
38+
var(--spinner-bg-color);
39+
animation: spinner 1.2s linear infinite;
40+
}
41+
}
42+
43+
@keyframes spinner {
44+
0% {
45+
transform: rotate(0deg);
46+
}
47+
100% {
48+
transform: rotate(360deg);
49+
}
50+
}
51+
</style>

0 commit comments

Comments
 (0)