mirror of
https://gitlab.com/mbugroup/lti-web-client.git
synced 2026-05-20 13:32:00 +00:00
feat(FE): Add status indicator to Badge and use theme types
This commit is contained in:
+34
-14
@@ -3,29 +3,25 @@
|
|||||||
import { HTMLAttributes, ReactNode } from 'react';
|
import { HTMLAttributes, ReactNode } from 'react';
|
||||||
|
|
||||||
import { cn } from '@/lib/helper';
|
import { cn } from '@/lib/helper';
|
||||||
|
import type { Color, Variant, Size } from '@/types/theme';
|
||||||
|
|
||||||
export interface BadgeProps
|
export interface BadgeProps
|
||||||
extends Omit<HTMLAttributes<HTMLSpanElement>, 'className'> {
|
extends Omit<HTMLAttributes<HTMLSpanElement>, 'className'> {
|
||||||
children?: ReactNode;
|
children?: ReactNode;
|
||||||
className?: {
|
className?: {
|
||||||
badge?: string;
|
badge?: string;
|
||||||
|
status?: string;
|
||||||
};
|
};
|
||||||
variant?: 'default' | 'outline' | 'ghost' | 'soft' | 'dash';
|
statusIndicator?: boolean;
|
||||||
color?:
|
variant?: Variant;
|
||||||
| 'neutral'
|
color?: Color;
|
||||||
| 'primary'
|
size?: Size;
|
||||||
| 'secondary'
|
|
||||||
| 'accent'
|
|
||||||
| 'info'
|
|
||||||
| 'success'
|
|
||||||
| 'warning'
|
|
||||||
| 'error';
|
|
||||||
size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const Badge = ({
|
const Badge = ({
|
||||||
children,
|
children,
|
||||||
className,
|
className,
|
||||||
|
statusIndicator = false,
|
||||||
variant = 'default',
|
variant = 'default',
|
||||||
color,
|
color,
|
||||||
size = 'md',
|
size = 'md',
|
||||||
@@ -34,7 +30,7 @@ const Badge = ({
|
|||||||
const getBadgeClasses = () => {
|
const getBadgeClasses = () => {
|
||||||
const baseClasses = 'badge';
|
const baseClasses = 'badge';
|
||||||
|
|
||||||
const variantClasses = {
|
const variantClasses: Record<Variant, string> = {
|
||||||
default: '',
|
default: '',
|
||||||
outline: 'badge-outline',
|
outline: 'badge-outline',
|
||||||
ghost: 'badge-ghost',
|
ghost: 'badge-ghost',
|
||||||
@@ -42,7 +38,7 @@ const Badge = ({
|
|||||||
dash: 'badge-dash',
|
dash: 'badge-dash',
|
||||||
};
|
};
|
||||||
|
|
||||||
const colorClasses = {
|
const colorClasses: Record<Color, string> = {
|
||||||
neutral: 'badge-neutral',
|
neutral: 'badge-neutral',
|
||||||
primary: 'badge-primary',
|
primary: 'badge-primary',
|
||||||
secondary: 'badge-secondary',
|
secondary: 'badge-secondary',
|
||||||
@@ -51,9 +47,10 @@ const Badge = ({
|
|||||||
success: 'badge-success',
|
success: 'badge-success',
|
||||||
warning: 'badge-warning',
|
warning: 'badge-warning',
|
||||||
error: 'badge-error',
|
error: 'badge-error',
|
||||||
|
none: '',
|
||||||
};
|
};
|
||||||
|
|
||||||
const sizeClasses = {
|
const sizeClasses: Record<Size, string> = {
|
||||||
xs: 'badge-xs',
|
xs: 'badge-xs',
|
||||||
sm: 'badge-sm',
|
sm: 'badge-sm',
|
||||||
md: 'badge-md',
|
md: 'badge-md',
|
||||||
@@ -70,8 +67,31 @@ const Badge = ({
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const getStatusClasses = () => {
|
||||||
|
if (!statusIndicator) return '';
|
||||||
|
|
||||||
|
const statusIndicatorClasses: Record<Color, string> = {
|
||||||
|
neutral: 'bg-neutral',
|
||||||
|
primary: 'bg-primary',
|
||||||
|
secondary: 'bg-secondary',
|
||||||
|
accent: 'bg-accent',
|
||||||
|
info: 'bg-info',
|
||||||
|
success: 'bg-success',
|
||||||
|
warning: 'bg-warning',
|
||||||
|
error: 'bg-error',
|
||||||
|
none: '',
|
||||||
|
};
|
||||||
|
|
||||||
|
return cn(
|
||||||
|
'w-2.5 h-2.5 rounded-full',
|
||||||
|
color && statusIndicatorClasses[color],
|
||||||
|
className?.status
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<span className={getBadgeClasses()} {...props}>
|
<span className={getBadgeClasses()} {...props}>
|
||||||
|
{statusIndicator && <span className={getStatusClasses()} />}
|
||||||
{children}
|
{children}
|
||||||
</span>
|
</span>
|
||||||
);
|
);
|
||||||
|
|||||||
Vendored
+2
@@ -9,4 +9,6 @@ export type Color =
|
|||||||
| 'error'
|
| 'error'
|
||||||
| 'none';
|
| 'none';
|
||||||
|
|
||||||
|
export type Variant = 'default' | 'outline' | 'ghost' | 'soft' | 'dash';
|
||||||
|
|
||||||
export type Size = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
export type Size = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
||||||
|
|||||||
Reference in New Issue
Block a user