Migrate to Mantine v8 and Design Changes (#961)

* mantine v8 migration

* various design changes and improvements
This commit is contained in:
Jeff 2025-06-24 00:04:36 -07:00 committed by GitHub
parent bea55d48a8
commit c1330d92b2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
473 changed files with 12469 additions and 11607 deletions

View file

@ -0,0 +1,93 @@
import type { ImgHTMLAttributes } from 'react';
import clsx from 'clsx';
import { Img } from 'react-image';
import styles from './image.module.css';
import { Icon } from '/@/shared/components/icon/icon';
import { Skeleton } from '/@/shared/components/skeleton/skeleton';
interface ImageContainerProps {
children: React.ReactNode;
className?: string;
}
interface ImageLoaderProps {
className?: string;
}
interface ImageProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, 'src'> {
containerClassName?: string;
includeLoader?: boolean;
includeUnloader?: boolean;
src: string | string[] | undefined;
thumbHash?: string;
}
interface ImageUnloaderProps {
className?: string;
}
export function Image({
className,
containerClassName,
includeLoader = true,
includeUnloader = true,
src,
}: ImageProps) {
if (src) {
return (
<Img
className={clsx(styles.image, className)}
container={(children) => (
<ImageContainer className={containerClassName}>{children}</ImageContainer>
)}
loader={
includeLoader ? (
<ImageContainer className={containerClassName}>
<ImageLoader className={className} />
</ImageContainer>
) : null
}
loading="eager"
src={src}
unloader={
includeUnloader ? (
<ImageContainer className={containerClassName}>
<ImageUnloader className={className} />
</ImageContainer>
) : null
}
/>
);
}
return <ImageUnloader />;
}
function ImageContainer({ children, className }: ImageContainerProps) {
return <div className={clsx(styles.imageContainer, className)}>{children}</div>;
}
function ImageLoader({ className }: ImageLoaderProps) {
return (
<div className={clsx(styles.loader, className)}>
<Skeleton
className={clsx(styles.skeleton, className)}
enableAnimation={true}
/>
</div>
);
}
function ImageUnloader({ className }: ImageUnloaderProps) {
return (
<div className={clsx(styles.unloader, className)}>
<Icon
icon="emptyImage"
size="xl"
/>
</div>
);
}