✨(front) add Loader component
This component will be used for various purpose.
This commit is contained in:
@@ -121,6 +121,32 @@ const config: Config = {
|
|||||||
'50%': { opacity: '0.65' },
|
'50%': { opacity: '0.65' },
|
||||||
'100%': { opacity: '1' },
|
'100%': { opacity: '1' },
|
||||||
},
|
},
|
||||||
|
rotate: {
|
||||||
|
'0%': {
|
||||||
|
transform: 'rotate(0deg)',
|
||||||
|
},
|
||||||
|
'100%': {
|
||||||
|
transform: 'rotate(360deg)',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
prixClipFix: {
|
||||||
|
'0%': {
|
||||||
|
clipPath: 'polygon(50% 50%, 0 0, 0 0, 0 0, 0 0, 0 0)',
|
||||||
|
},
|
||||||
|
'25%': {
|
||||||
|
clipPath: 'polygon(50% 50%, 0 0, 100% 0, 100% 0, 100% 0, 100% 0)',
|
||||||
|
},
|
||||||
|
'50%': {
|
||||||
|
clipPath:
|
||||||
|
'polygon(50% 50%, 0 0, 100% 0, 100% 100%, 100% 100%, 100% 100%)',
|
||||||
|
},
|
||||||
|
'75%': {
|
||||||
|
clipPath: 'polygon(50% 50%, 0 0, 100% 0, 100% 100%, 0 100%, 0 100%)',
|
||||||
|
},
|
||||||
|
'100%': {
|
||||||
|
clipPath: 'polygon(50% 50%, 0 0, 100% 0, 100% 100%, 0 100%, 0 0)',
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
tokens: defineTokens({
|
tokens: defineTokens({
|
||||||
/* we take a few things from the panda preset but for now we clear out some stuff.
|
/* we take a few things from the panda preset but for now we clear out some stuff.
|
||||||
|
|||||||
45
src/frontend/src/primitives/Loader.tsx
Normal file
45
src/frontend/src/primitives/Loader.tsx
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
import { cva } from '@/styled-system/css'
|
||||||
|
|
||||||
|
const loader = cva({
|
||||||
|
base: {
|
||||||
|
borderRadius: '50%',
|
||||||
|
position: 'relative',
|
||||||
|
animation: 'rotate 1s linear infinite',
|
||||||
|
'&:before, &:after': {
|
||||||
|
content: '""',
|
||||||
|
boxSizing: 'border-box',
|
||||||
|
position: 'absolute',
|
||||||
|
inset: '0',
|
||||||
|
borderRadius: '50%',
|
||||||
|
borderStyle: 'solid',
|
||||||
|
borderColor: 'white',
|
||||||
|
},
|
||||||
|
_before: {
|
||||||
|
animation: 'prixClipFix 2s linear infinite',
|
||||||
|
},
|
||||||
|
_after: {
|
||||||
|
borderColor: 'white',
|
||||||
|
animation:
|
||||||
|
'prixClipFix 2s linear infinite, rotate 0.5s linear infinite reverse',
|
||||||
|
inset: 6,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
variants: {
|
||||||
|
size: {
|
||||||
|
small: {
|
||||||
|
width: '24px',
|
||||||
|
height: '24px',
|
||||||
|
'&:before, &:after': {
|
||||||
|
borderWidth: '2px',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
defaultVariants: {
|
||||||
|
size: 'small',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
export const Loader = () => {
|
||||||
|
return <div className={loader()}></div>
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user