@infonomic/uikit 6.3.1 → 6.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/loaders/@types/index.d.ts +2 -2
- package/dist/loaders/@types/index.d.ts.map +1 -1
- package/dist/loaders/ellipses.d.ts.map +1 -1
- package/dist/loaders/ellipses.js +10 -11
- package/dist/loaders/ellipses.module.css +79 -0
- package/dist/loaders/ellipses.module.js +14 -0
- package/dist/loaders/ellipses_module.css +73 -0
- package/dist/loaders/ring.d.ts +1 -1
- package/dist/loaders/ring.d.ts.map +1 -1
- package/dist/loaders/ring.js +11 -14
- package/dist/loaders/ring.module.css +55 -0
- package/dist/loaders/ring.module.js +8 -0
- package/dist/loaders/ring_module.css +49 -0
- package/dist/loaders/spinner.d.ts +1 -3
- package/dist/loaders/spinner.d.ts.map +1 -1
- package/dist/loaders/spinner.js +12 -9
- package/dist/loaders/spinner.module.css +106 -0
- package/dist/loaders/spinner.module.js +10 -0
- package/dist/loaders/spinner_module.css +99 -0
- package/dist/styles/styles.css +1 -1
- package/package.json +1 -1
- package/src/loaders/@types/index.ts +2 -2
- package/src/loaders/ellipses.module.css +79 -0
- package/src/loaders/ellipses.tsx +15 -8
- package/src/loaders/loaders.stories.tsx +117 -6
- package/src/loaders/ring.module.css +55 -0
- package/src/loaders/ring.tsx +23 -11
- package/src/loaders/spinner.module.css +106 -0
- package/src/loaders/spinner.tsx +32 -8
- package/src/styles/components/components.css +1 -1
- package/src/styles/components/loaders.css +3 -1
|
@@ -12,18 +12,18 @@ interface LoaderProps {
|
|
|
12
12
|
|
|
13
13
|
function Loader({ loader, label }: LoaderProps): React.JSX.Element {
|
|
14
14
|
return (
|
|
15
|
-
<div
|
|
15
|
+
<div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '0.5rem' }}>
|
|
16
16
|
{loader}
|
|
17
|
-
<span
|
|
17
|
+
<span style={{ fontSize: '0.875rem', color: 'var(--muted)' }}>{label}</span>
|
|
18
18
|
</div>
|
|
19
19
|
)
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
const LoaderDemo = (): React.JSX.Element => (
|
|
23
|
-
<div
|
|
23
|
+
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, 1fr)', gap: '1.25rem' }}>
|
|
24
24
|
<Loader loader={<LoaderRing size={48} />} label="Ring" />
|
|
25
25
|
<Loader loader={<LoaderEllipsis size={48} />} label="Ellipsis" />
|
|
26
|
-
<Loader loader={<LoaderSpinner />} label="Spinner" />
|
|
26
|
+
<Loader loader={<LoaderSpinner size={48} />} label="Spinner" />
|
|
27
27
|
</div>
|
|
28
28
|
)
|
|
29
29
|
|
|
@@ -35,10 +35,121 @@ export default {
|
|
|
35
35
|
|
|
36
36
|
export const Default = (): React.JSX.Element => {
|
|
37
37
|
return (
|
|
38
|
-
<div
|
|
39
|
-
<div
|
|
38
|
+
<div style={{ marginBottom: '1.5rem' }}>
|
|
39
|
+
<div style={{ maxWidth: 700 }}>
|
|
40
40
|
<LoaderDemo />
|
|
41
41
|
</div>
|
|
42
42
|
</div>
|
|
43
43
|
)
|
|
44
44
|
}
|
|
45
|
+
|
|
46
|
+
const sizes: (number | string)[] = [24, 36, 48, 64, 80]
|
|
47
|
+
|
|
48
|
+
export const Sizes = (): React.JSX.Element => {
|
|
49
|
+
return (
|
|
50
|
+
<div style={{ maxWidth: '800px', margin: '1.5rem auto' }}>
|
|
51
|
+
<div style={{ maxWidth: '800px', display: 'flex', flexDirection: 'column', gap: '2.5rem' }}>
|
|
52
|
+
<div>
|
|
53
|
+
<h3 style={{ marginBottom: '1rem', fontSize: '1.125rem', fontWeight: 600 }}>Ring</h3>
|
|
54
|
+
<div style={{ display: 'flex', alignItems: 'flex-end', gap: '2.5rem' }}>
|
|
55
|
+
{sizes.map((size) => (
|
|
56
|
+
<Loader key={String(size)} loader={<LoaderRing size={size} />} label={`${size}${typeof size === 'number' ? 'px' : ''}`} />
|
|
57
|
+
))}
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
<div>
|
|
61
|
+
<h3 style={{ marginBottom: '1rem', fontSize: '1.125rem', fontWeight: 600 }}>Ellipsis</h3>
|
|
62
|
+
<div style={{ display: 'flex', alignItems: 'flex-end', gap: '2.5rem' }}>
|
|
63
|
+
{sizes.map((size) => (
|
|
64
|
+
<Loader key={String(size)} loader={<LoaderEllipsis size={size} />} label={`${size}${typeof size === 'number' ? 'px' : ''}`} />
|
|
65
|
+
))}
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|
|
68
|
+
<div>
|
|
69
|
+
<h3 style={{ marginBottom: '1rem', fontSize: '1.125rem', fontWeight: 600 }}>Spinner</h3>
|
|
70
|
+
<div style={{ display: 'flex', alignItems: 'flex-end', gap: '2.5rem' }}>
|
|
71
|
+
{sizes.map((size) => (
|
|
72
|
+
<Loader key={String(size)} loader={<LoaderSpinner size={size} />} label={`${size}${typeof size === 'number' ? 'px' : ''}`} />
|
|
73
|
+
))}
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const colors = [
|
|
82
|
+
{ value: 'var(--theme-500)', label: 'Theme' },
|
|
83
|
+
{ value: '#e53e3e', label: '#e53e3e' },
|
|
84
|
+
{ value: '#38a169', label: '#38a169' },
|
|
85
|
+
{ value: '#3182ce', label: '#3182ce' },
|
|
86
|
+
{ value: '#d69e2e', label: '#d69e2e' },
|
|
87
|
+
]
|
|
88
|
+
|
|
89
|
+
export const Colors = (): React.JSX.Element => {
|
|
90
|
+
return (
|
|
91
|
+
<div style={{ maxWidth: '800px', margin: '1.5rem auto' }}>
|
|
92
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '2.5rem' }}>
|
|
93
|
+
<div>
|
|
94
|
+
<h3 style={{ marginBottom: '1rem', fontSize: '1.125rem', fontWeight: 600 }}>Ring</h3>
|
|
95
|
+
<div style={{ display: 'flex', alignItems: 'flex-end', gap: '2.5rem' }}>
|
|
96
|
+
{colors.map(({ value, label }) => (
|
|
97
|
+
<Loader key={label} loader={<LoaderRing size={48} color={value} />} label={label} />
|
|
98
|
+
))}
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
<div>
|
|
102
|
+
<h3 style={{ marginBottom: '1rem', fontSize: '1.125rem', fontWeight: 600 }}>Ellipsis</h3>
|
|
103
|
+
<div style={{ display: 'flex', alignItems: 'flex-end', gap: '2.5rem' }}>
|
|
104
|
+
{colors.map(({ value, label }) => (
|
|
105
|
+
<Loader key={label} loader={<LoaderEllipsis size={48} color={value} />} label={label} />
|
|
106
|
+
))}
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
<div>
|
|
110
|
+
<h3 style={{ marginBottom: '1rem', fontSize: '1.125rem', fontWeight: 600 }}>Spinner</h3>
|
|
111
|
+
<div style={{ display: 'flex', alignItems: 'flex-end', gap: '2.5rem' }}>
|
|
112
|
+
{colors.map(({ value, label }) => (
|
|
113
|
+
<Loader key={label} loader={<LoaderSpinner size={48} color={value} />} label={label} />
|
|
114
|
+
))}
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const stringSizes: (number | string)[] = ['1.5rem', '2rem', '3rem', '4rem']
|
|
123
|
+
|
|
124
|
+
export const StringSizes = (): React.JSX.Element => {
|
|
125
|
+
return (
|
|
126
|
+
<div style={{ maxWidth: '800px', margin: '1.5rem auto' }}>
|
|
127
|
+
<div style={{ maxWidth: '800px', display: 'flex', flexDirection: 'column', gap: '2.5rem' }}>
|
|
128
|
+
<div>
|
|
129
|
+
<h3 style={{ marginBottom: '1rem', fontSize: '1.125rem', fontWeight: 600 }}>Ring (rem units)</h3>
|
|
130
|
+
<div style={{ display: 'flex', alignItems: 'flex-end', gap: '2.5rem' }}>
|
|
131
|
+
{stringSizes.map((size) => (
|
|
132
|
+
<Loader key={String(size)} loader={<LoaderRing size={size} />} label={String(size)} />
|
|
133
|
+
))}
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
<div>
|
|
137
|
+
<h3 style={{ marginBottom: '1rem', fontSize: '1.125rem', fontWeight: 600 }}>Ellipsis (rem units)</h3>
|
|
138
|
+
<div style={{ display: 'flex', alignItems: 'flex-end', gap: '2.5rem' }}>
|
|
139
|
+
{stringSizes.map((size) => (
|
|
140
|
+
<Loader key={String(size)} loader={<LoaderEllipsis size={size} />} label={String(size)} />
|
|
141
|
+
))}
|
|
142
|
+
</div>
|
|
143
|
+
</div>
|
|
144
|
+
<div>
|
|
145
|
+
<h3 style={{ marginBottom: '1rem', fontSize: '1.125rem', fontWeight: 600 }}>Spinner (rem units)</h3>
|
|
146
|
+
<div style={{ display: 'flex', alignItems: 'flex-end', gap: '2.5rem' }}>
|
|
147
|
+
{stringSizes.map((size) => (
|
|
148
|
+
<Loader key={String(size)} loader={<LoaderSpinner size={size} />} label={String(size)} />
|
|
149
|
+
))}
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
154
|
+
)
|
|
155
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
@layer infonomic-base,
|
|
2
|
+
infonomic-functional,
|
|
3
|
+
infonomic-utilities,
|
|
4
|
+
infonomic-theme,
|
|
5
|
+
infonomic-typography,
|
|
6
|
+
infonomic-components;
|
|
7
|
+
|
|
8
|
+
@layer infonomic-components {
|
|
9
|
+
.loader-ring,
|
|
10
|
+
:global(.infonomic-loader-ring) {
|
|
11
|
+
--_size: var(--loader-ring-size, 60px);
|
|
12
|
+
--_color: var(--loader-ring-color, var(--loader-color, currentColor));
|
|
13
|
+
display: inline-block;
|
|
14
|
+
position: relative;
|
|
15
|
+
width: var(--_size);
|
|
16
|
+
height: var(--_size);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.loader-ring-arc,
|
|
20
|
+
:global(.infonomic-loader-ring-arc) {
|
|
21
|
+
box-sizing: border-box;
|
|
22
|
+
display: block;
|
|
23
|
+
position: absolute;
|
|
24
|
+
width: calc(var(--_size) * 0.8);
|
|
25
|
+
height: calc(var(--_size) * 0.8);
|
|
26
|
+
margin: calc(var(--_size) * 0.1);
|
|
27
|
+
border-width: calc(var(--_size) * 0.1);
|
|
28
|
+
border-radius: 50%;
|
|
29
|
+
animation: loader-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;
|
|
30
|
+
border-style: solid;
|
|
31
|
+
border-color: var(--_color) transparent transparent transparent;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.loader-ring-arc:nth-child(1) {
|
|
35
|
+
animation-delay: -0.45s;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.loader-ring-arc:nth-child(2) {
|
|
39
|
+
animation-delay: -0.3s;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.loader-ring-arc:nth-child(3) {
|
|
43
|
+
animation-delay: -0.15s;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@keyframes loader-ring {
|
|
47
|
+
0% {
|
|
48
|
+
transform: rotate(0deg);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
100% {
|
|
52
|
+
transform: rotate(360deg);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
package/src/loaders/ring.tsx
CHANGED
|
@@ -1,31 +1,43 @@
|
|
|
1
1
|
// https://github.com/JoshK2/react-spinners-css
|
|
2
2
|
import type React from 'react'
|
|
3
3
|
|
|
4
|
-
import
|
|
4
|
+
import cx from 'classnames'
|
|
5
5
|
|
|
6
6
|
import type { LoaderProps } from './@types/index.js'
|
|
7
|
+
import styles from './ring.module.css'
|
|
8
|
+
|
|
9
|
+
export function LoaderRing({
|
|
10
|
+
color,
|
|
11
|
+
size,
|
|
12
|
+
className,
|
|
13
|
+
style,
|
|
14
|
+
...rest
|
|
15
|
+
}: LoaderProps): React.JSX.Element {
|
|
16
|
+
const ringStyle: React.CSSProperties & Record<string, string | number | undefined> = {
|
|
17
|
+
...style,
|
|
18
|
+
}
|
|
19
|
+
if (size != null) {
|
|
20
|
+
ringStyle['--loader-ring-size'] = typeof size === 'number' ? `${size}px` : size
|
|
21
|
+
}
|
|
22
|
+
if (color) {
|
|
23
|
+
ringStyle['--loader-ring-color'] = color
|
|
24
|
+
}
|
|
7
25
|
|
|
8
|
-
export function LoaderRing({ color, size = 60, className, style }: LoaderProps): React.JSX.Element {
|
|
9
26
|
const circles = [...Array(4)].map((_, index) => {
|
|
10
27
|
return (
|
|
11
28
|
<div
|
|
12
29
|
// biome-ignore lint/suspicious/noArrayIndexKey: <explanation>
|
|
13
30
|
key={index}
|
|
14
|
-
|
|
15
|
-
borderColor: `${color || 'var(--loader-color)'} transparent transparent transparent`,
|
|
16
|
-
width: size * 0.8,
|
|
17
|
-
height: size * 0.8,
|
|
18
|
-
margin: size * 0.1,
|
|
19
|
-
borderWidth: size * 0.1,
|
|
20
|
-
}}
|
|
31
|
+
className={cx('infonomic-loader-ring-arc', styles['loader-ring-arc'])}
|
|
21
32
|
/>
|
|
22
33
|
)
|
|
23
34
|
})
|
|
24
35
|
|
|
25
36
|
return (
|
|
26
37
|
<div
|
|
27
|
-
className={
|
|
28
|
-
style={
|
|
38
|
+
className={cx('infonomic-loader-ring', styles['loader-ring'], className)}
|
|
39
|
+
style={ringStyle}
|
|
40
|
+
{...rest}
|
|
29
41
|
>
|
|
30
42
|
{circles}
|
|
31
43
|
</div>
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
@layer infonomic-base,
|
|
2
|
+
infonomic-functional,
|
|
3
|
+
infonomic-utilities,
|
|
4
|
+
infonomic-theme,
|
|
5
|
+
infonomic-typography,
|
|
6
|
+
infonomic-components;
|
|
7
|
+
|
|
8
|
+
@layer infonomic-components {
|
|
9
|
+
.loader-spinner,
|
|
10
|
+
:global(.infonomic-loader-spinner) {
|
|
11
|
+
--_size: var(--loader-spinner-size, 56px);
|
|
12
|
+
--_color: var(--loader-spinner-color, var(--loader-color, currentColor));
|
|
13
|
+
display: inline-block;
|
|
14
|
+
position: relative;
|
|
15
|
+
width: var(--_size);
|
|
16
|
+
height: var(--_size);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.loader-spinner-blade,
|
|
20
|
+
:global(.infonomic-loader-spinner-blade) {
|
|
21
|
+
transform-origin: calc(var(--_size) * 0.5) calc(var(--_size) * 0.5714);
|
|
22
|
+
animation: loader-spinner 1.2s linear infinite;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.loader-spinner-blade-inner,
|
|
26
|
+
:global(.infonomic-loader-spinner-blade-inner) {
|
|
27
|
+
display: block;
|
|
28
|
+
position: absolute;
|
|
29
|
+
top: 0;
|
|
30
|
+
left: calc(var(--_size) * 0.4464);
|
|
31
|
+
width: calc(var(--_size) * 0.0893);
|
|
32
|
+
height: calc(var(--_size) * 0.25);
|
|
33
|
+
border-radius: 20%;
|
|
34
|
+
background: var(--_color);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.loader-spinner-blade:nth-child(1) {
|
|
38
|
+
transform: rotate(0deg);
|
|
39
|
+
animation-delay: -1.1s;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.loader-spinner-blade:nth-child(2) {
|
|
43
|
+
transform: rotate(30deg);
|
|
44
|
+
animation-delay: -1s;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.loader-spinner-blade:nth-child(3) {
|
|
48
|
+
transform: rotate(60deg);
|
|
49
|
+
animation-delay: -0.9s;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.loader-spinner-blade:nth-child(4) {
|
|
53
|
+
transform: rotate(90deg);
|
|
54
|
+
animation-delay: -0.8s;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.loader-spinner-blade:nth-child(5) {
|
|
58
|
+
transform: rotate(120deg);
|
|
59
|
+
animation-delay: -0.7s;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.loader-spinner-blade:nth-child(6) {
|
|
63
|
+
transform: rotate(150deg);
|
|
64
|
+
animation-delay: -0.6s;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.loader-spinner-blade:nth-child(7) {
|
|
68
|
+
transform: rotate(180deg);
|
|
69
|
+
animation-delay: -0.5s;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.loader-spinner-blade:nth-child(8) {
|
|
73
|
+
transform: rotate(210deg);
|
|
74
|
+
animation-delay: -0.4s;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.loader-spinner-blade:nth-child(9) {
|
|
78
|
+
transform: rotate(240deg);
|
|
79
|
+
animation-delay: -0.3s;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.loader-spinner-blade:nth-child(10) {
|
|
83
|
+
transform: rotate(270deg);
|
|
84
|
+
animation-delay: -0.2s;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.loader-spinner-blade:nth-child(11) {
|
|
88
|
+
transform: rotate(300deg);
|
|
89
|
+
animation-delay: -0.1s;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.loader-spinner-blade:nth-child(12) {
|
|
93
|
+
transform: rotate(330deg);
|
|
94
|
+
animation-delay: 0s;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
@keyframes loader-spinner {
|
|
98
|
+
0% {
|
|
99
|
+
opacity: 1;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
100% {
|
|
103
|
+
opacity: 0;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
package/src/loaders/spinner.tsx
CHANGED
|
@@ -1,27 +1,51 @@
|
|
|
1
1
|
// https://github.com/JoshK2/react-spinners-css
|
|
2
2
|
import type React from 'react'
|
|
3
3
|
|
|
4
|
-
import
|
|
4
|
+
import cx from 'classnames'
|
|
5
5
|
|
|
6
6
|
import type { LoaderProps } from './@types/index.js'
|
|
7
|
+
import styles from './spinner.module.css'
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
export function LoaderSpinner({
|
|
10
|
+
color,
|
|
11
|
+
size,
|
|
12
|
+
className,
|
|
13
|
+
style,
|
|
14
|
+
...rest
|
|
15
|
+
}: LoaderProps): React.JSX.Element {
|
|
11
16
|
const circles = [...Array(12)].map((_, index) => {
|
|
12
17
|
return (
|
|
13
18
|
// biome-ignore lint/suspicious/noArrayIndexKey: <explanation>
|
|
14
|
-
<div
|
|
19
|
+
<div
|
|
20
|
+
key={index}
|
|
21
|
+
className={cx('infonomic-loader-spinner-blade', styles['loader-spinner-blade'])}
|
|
22
|
+
>
|
|
15
23
|
<div
|
|
16
|
-
className={
|
|
17
|
-
|
|
24
|
+
className={cx(
|
|
25
|
+
'infonomic-loader-spinner-blade-inner',
|
|
26
|
+
styles['loader-spinner-blade-inner'],
|
|
27
|
+
)}
|
|
18
28
|
/>
|
|
19
29
|
</div>
|
|
20
30
|
)
|
|
21
31
|
})
|
|
22
32
|
|
|
33
|
+
const spinnerStyle: React.CSSProperties & Record<string, string | number | undefined> = {
|
|
34
|
+
...style,
|
|
35
|
+
}
|
|
36
|
+
if (size != null) {
|
|
37
|
+
spinnerStyle['--loader-spinner-size'] = typeof size === 'number' ? `${size}px` : size
|
|
38
|
+
}
|
|
39
|
+
if (color) {
|
|
40
|
+
spinnerStyle['--loader-spinner-color'] = color
|
|
41
|
+
}
|
|
42
|
+
|
|
23
43
|
return (
|
|
24
|
-
<div
|
|
44
|
+
<div
|
|
45
|
+
className={cx('infonomic-loader-spinner', styles['loader-spinner'], className)}
|
|
46
|
+
style={spinnerStyle}
|
|
47
|
+
{...rest}
|
|
48
|
+
>
|
|
25
49
|
{circles}
|
|
26
50
|
</div>
|
|
27
51
|
)
|