Skip to content

Commit 7325003

Browse files
authored
Merge pull request #12561 from Turbo87/svelte-loading-spinner
svelte: Port `LoadingSpinner` component from Ember.js app
2 parents e99d83c + d4e3cbe commit 7325003

File tree

3 files changed

+77
-7
lines changed

3 files changed

+77
-7
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: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
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) var(--spinner-bg-color);
38+
animation: spinner 1.2s linear infinite;
39+
}
40+
}
41+
42+
@keyframes spinner {
43+
0% {
44+
transform: rotate(0deg);
45+
}
46+
100% {
47+
transform: rotate(360deg);
48+
}
49+
}
50+
</style>

svelte/src/lib/components/PageHeader.svelte

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import type { Snippet } from 'svelte';
33
import type { HTMLAttributes } from 'svelte/elements';
44
5-
// TODO: import LoadingSpinner from './LoadingSpinner.svelte';
5+
import LoadingSpinner from '$lib/components/LoadingSpinner.svelte';
66
77
interface Props extends HTMLAttributes<HTMLDivElement> {
88
title?: string;
@@ -24,8 +24,7 @@
2424
<small class="suffix">{suffix}</small>
2525
{/if}
2626
{#if showSpinner}
27-
<!-- TODO: <LoadingSpinner class="loading-spinner" data-test-spinner /> -->
28-
<span class="loading-spinner" data-test-spinner>Loading...</span>
27+
<LoadingSpinner style="margin-left: var(--space-2xs)" data-test-spinner />
2928
{/if}
3029
</h1>
3130
{/if}
@@ -49,8 +48,4 @@
4948
color: var(--main-color-light);
5049
padding-left: var(--space-2xs);
5150
}
52-
53-
.loading-spinner {
54-
margin: 0 var(--space-2xs);
55-
}
5651
</style>

0 commit comments

Comments
 (0)