-
+
{item.name}
-
+
{item.value}%
@@ -67,8 +65,8 @@ const CustomTooltip = ({ active, payload }: any) => {
export function RadialChart({
percentage,
- color = "var(--chart-success-color)",
- backgroundColor = CHART_COLORS.tooltipBackground,
+ color = "var(--bg-pass-primary)",
+ backgroundColor = "var(--bg-neutral-tertiary)",
height = 250,
innerRadius = 60,
outerRadius = 100,
@@ -154,24 +152,18 @@ export function RadialChart({
const y = centerY - middleRadius * Math.sin(currentAngleRad);
return (
-
+
);
})}
{percentage}%
diff --git a/ui/components/graphs/shared/constants.ts b/ui/components/graphs/shared/constants.ts
index 4aadd4aac0..22fc946ff3 100644
--- a/ui/components/graphs/shared/constants.ts
+++ b/ui/components/graphs/shared/constants.ts
@@ -1,10 +1,9 @@
export const SEVERITY_COLORS = {
- Informational: "var(--chart-info)",
- Info: "var(--chart-info)",
- Low: "var(--chart-warning)",
- Medium: "var(--chart-warning-emphasis)",
- High: "var(--chart-danger)",
- Critical: "var(--chart-danger-emphasis)",
+ Informational: "var(--bg-data-info)",
+ Low: "var(--bg-data-low)",
+ Medium: "var(--bg-data-medium)",
+ High: "var(--bg-data-high)",
+ Critical: "var(--bg-data-critical)",
} as const;
export const PROVIDER_COLORS = {
diff --git a/ui/components/shadcn/card/base-card/base-card.tsx b/ui/components/shadcn/card/base-card/base-card.tsx
deleted file mode 100644
index 946e0cc184..0000000000
--- a/ui/components/shadcn/card/base-card/base-card.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import { cva, type VariantProps } from "class-variance-authority";
-
-import { cn } from "@/lib/utils";
-
-import { Card } from "../card";
-
-const baseCardVariants = cva("", {
- variants: {
- variant: {
- default:
- "border-slate-200 bg-white dark:border-zinc-900 dark:bg-stone-950",
- },
- },
- defaultVariants: {
- variant: "default",
- },
-});
-
-interface BaseCardProps
- extends React.ComponentProps,
- VariantProps {}
-
-const BaseCard = ({ className, variant, ...props }: BaseCardProps) => {
- return (
-
- );
-};
-
-export { BaseCard };
diff --git a/ui/components/shadcn/card/card.tsx b/ui/components/shadcn/card/card.tsx
index 62f4c66865..d57ddf0eb7 100644
--- a/ui/components/shadcn/card/card.tsx
+++ b/ui/components/shadcn/card/card.tsx
@@ -1,3 +1,5 @@
+import { cva, type VariantProps } from "class-variance-authority";
+
import { cn } from "@/lib/utils";
export const CardVariant = {
@@ -10,14 +12,44 @@ export const CardVariant = {
export type CardVariant = (typeof CardVariant)[keyof typeof CardVariant];
-function Card({ className, ...props }: React.ComponentProps<"div">) {
+const cardVariants = cva("flex flex-col gap-6 rounded-xl border", {
+ variants: {
+ variant: {
+ default: "",
+ base: "border-border-neutral-secondary bg-bg-neutral-secondary px-[18px] pt-3 pb-4",
+ inner:
+ "rounded-[12px] backdrop-blur-[46px] border-border-neutral-tertiary bg-bg-neutral-tertiary",
+ },
+ padding: {
+ default: "",
+ sm: "px-3 py-2",
+ md: "px-4 py-3",
+ lg: "px-5 py-4",
+ none: "p-0",
+ },
+ },
+ compoundVariants: [
+ {
+ variant: "inner",
+ padding: "default",
+ className: "px-4 py-3", // md padding by default for inner
+ },
+ ],
+ defaultVariants: {
+ variant: "default",
+ padding: "default",
+ },
+});
+
+interface CardProps
+ extends React.ComponentProps<"div">,
+ VariantProps {}
+
+function Card({ className, variant, padding, ...props }: CardProps) {
return (
);
@@ -28,7 +60,7 @@ function CardHeader({ className, ...props }: React.ComponentProps<"div">) {
) {
return (
);
@@ -96,4 +125,6 @@ export {
CardFooter,
CardHeader,
CardTitle,
+ cardVariants,
};
+export type { CardProps };
diff --git a/ui/components/shadcn/card/resource-stats-card/resource-stats-card-container.tsx b/ui/components/shadcn/card/resource-stats-card/resource-stats-card-container.tsx
deleted file mode 100644
index de27d052ed..0000000000
--- a/ui/components/shadcn/card/resource-stats-card/resource-stats-card-container.tsx
+++ /dev/null
@@ -1,55 +0,0 @@
-import { cva, type VariantProps } from "class-variance-authority";
-
-import { cn } from "@/lib/utils";
-
-const containerVariants = cva(
- [
- "flex",
- "rounded-[12px]",
- "border",
- "backdrop-blur-[46px]",
- "border-slate-300",
- "bg-[#F8FAFC80]",
- "dark:border-[rgba(38,38,38,0.70)]",
- "dark:bg-[rgba(23,23,23,0.50)]",
- ],
- {
- variants: {
- padding: {
- sm: "px-3 py-2",
- md: "px-[19px] py-[9px]",
- lg: "px-6 py-3",
- none: "p-0",
- },
- },
- defaultVariants: {
- padding: "md",
- },
- },
-);
-
-export interface ResourceStatsCardContainerProps
- extends React.HTMLAttributes
,
- VariantProps {
- ref?: React.Ref;
-}
-
-export const ResourceStatsCardContainer = ({
- className,
- children,
- padding,
- ref,
- ...props
-}: ResourceStatsCardContainerProps) => {
- return (
-
- {children}
-
- );
-};
-
-ResourceStatsCardContainer.displayName = "ResourceStatsCardContainer";
diff --git a/ui/components/shadcn/card/resource-stats-card/resource-stats-card-content.tsx b/ui/components/shadcn/card/resource-stats-card/resource-stats-card-content.tsx
index e338c5e7b1..be3080143d 100644
--- a/ui/components/shadcn/card/resource-stats-card/resource-stats-card-content.tsx
+++ b/ui/components/shadcn/card/resource-stats-card/resource-stats-card-content.tsx
@@ -11,11 +11,11 @@ export interface StatItem {
}
const variantColors = {
- default: "#868994",
- fail: "#f54280",
- pass: "#4ade80",
- warning: "#fbbf24",
- info: "#60a5fa",
+ default: "var(--bg-neutral-tertiary)",
+ fail: "var(--bg-fail-primary)",
+ pass: "var(--bg-pass-primary)",
+ warning: "var(--bg-warning-primary)",
+ info: "var(--bg-data-info)",
} as const;
type BadgeVariant = keyof typeof variantColors;
@@ -26,8 +26,8 @@ const badgeVariants = cva(
variants: {
variant: {
[CardVariant.default]: "bg-slate-100 dark:bg-[#535359]",
- [CardVariant.fail]: "bg-red-100 dark:bg-[#432232]",
- [CardVariant.pass]: "bg-green-100 dark:bg-[#204237]",
+ [CardVariant.fail]: "bg-bg-fail-secondary",
+ [CardVariant.pass]: "bg-bg-pass-secondary",
[CardVariant.warning]: "bg-amber-100 dark:bg-[#3d3520]",
[CardVariant.info]: "bg-blue-100 dark:bg-[#1e3a5f]",
},
@@ -58,7 +58,7 @@ const badgeIconVariants = cva("", {
});
const labelTextVariants = cva(
- "leading-6 font-semibold text-slate-900 dark:text-zinc-300 whitespace-nowrap",
+ "leading-6 font-semibold text-text-neutral-secondary whitespace-nowrap",
{
variants: {
size: {
@@ -73,7 +73,7 @@ const labelTextVariants = cva(
},
);
-const statIconVariants = cva("text-slate-600 dark:text-zinc-300", {
+const statIconVariants = cva("text-text-neutral-secondary", {
variants: {
size: {
sm: "h-2.5 w-2.5",
@@ -87,7 +87,7 @@ const statIconVariants = cva("text-slate-600 dark:text-zinc-300", {
});
const statLabelVariants = cva(
- "leading-5 font-medium text-slate-700 dark:text-zinc-300",
+ "leading-5 font-medium text-text-neutral-secondary",
{
variants: {
size: {
diff --git a/ui/components/shadcn/card/resource-stats-card/resource-stats-card-divider.tsx b/ui/components/shadcn/card/resource-stats-card/resource-stats-card-divider.tsx
deleted file mode 100644
index 3ec8d57ee4..0000000000
--- a/ui/components/shadcn/card/resource-stats-card/resource-stats-card-divider.tsx
+++ /dev/null
@@ -1,59 +0,0 @@
-import { cva, type VariantProps } from "class-variance-authority";
-
-import { cn } from "@/lib/utils";
-
-const dividerVariants = cva("flex items-center justify-center", {
- variants: {
- spacing: {
- sm: "px-2",
- md: "px-[23px]",
- lg: "px-8",
- },
- orientation: {
- vertical: "h-full",
- horizontal: "w-full",
- },
- },
- defaultVariants: {
- spacing: "md",
- orientation: "vertical",
- },
-});
-
-const lineVariants = cva("bg-[rgba(39,39,42,1)]", {
- variants: {
- orientation: {
- vertical: "h-full w-px",
- horizontal: "w-full h-px",
- },
- },
- defaultVariants: {
- orientation: "vertical",
- },
-});
-
-export interface ResourceStatsCardDividerProps
- extends React.HTMLAttributes,
- VariantProps {
- ref?: React.Ref;
-}
-
-export const ResourceStatsCardDivider = ({
- className,
- spacing,
- orientation,
- ref,
- ...props
-}: ResourceStatsCardDividerProps) => {
- return (
-
- );
-};
-
-ResourceStatsCardDivider.displayName = "ResourceStatsCardDivider";
diff --git a/ui/components/shadcn/card/resource-stats-card/resource-stats-card-header.tsx b/ui/components/shadcn/card/resource-stats-card/resource-stats-card-header.tsx
index 2a4068e998..c324376a04 100644
--- a/ui/components/shadcn/card/resource-stats-card/resource-stats-card-header.tsx
+++ b/ui/components/shadcn/card/resource-stats-card/resource-stats-card-header.tsx
@@ -16,7 +16,7 @@ const headerVariants = cva("flex w-full items-center gap-1", {
},
});
-const iconVariants = cva("text-zinc-300 dark:text-zinc-300", {
+const iconVariants = cva("text-text-neutral-secondary", {
variants: {
size: {
sm: "h-3.5 w-3.5",
@@ -30,7 +30,7 @@ const iconVariants = cva("text-zinc-300 dark:text-zinc-300", {
});
const titleVariants = cva(
- "leading-7 font-semibold text-zinc-300 dark:text-zinc-300",
+ "leading-7 font-semibold text-text-neutral-secondary",
{
variants: {
size: {
@@ -45,21 +45,18 @@ const titleVariants = cva(
},
);
-const countVariants = cva(
- "leading-4 font-normal text-zinc-300 dark:text-zinc-300",
- {
- variants: {
- size: {
- sm: "text-[9px]",
- md: "text-[10px]",
- lg: "text-xs",
- },
- },
- defaultVariants: {
- size: "md",
+const countVariants = cva("leading-4 font-normal text-text-neutral-secondary", {
+ variants: {
+ size: {
+ sm: "text-[9px]",
+ md: "text-[10px]",
+ lg: "text-xs",
},
},
-);
+ defaultVariants: {
+ size: "md",
+ },
+});
export interface ResourceStatsCardHeaderProps
extends React.HTMLAttributes,
diff --git a/ui/components/shadcn/card/resource-stats-card/resource-stats-card.tsx b/ui/components/shadcn/card/resource-stats-card/resource-stats-card.tsx
index 99d3e7867d..bb42f4bfff 100644
--- a/ui/components/shadcn/card/resource-stats-card/resource-stats-card.tsx
+++ b/ui/components/shadcn/card/resource-stats-card/resource-stats-card.tsx
@@ -3,17 +3,12 @@ import { LucideIcon } from "lucide-react";
import { cn } from "@/lib/utils";
-import { CardVariant } from "../card";
-import { ResourceStatsCardContainer } from "./resource-stats-card-container";
+import { Card, CardVariant } from "../card";
import type { StatItem } from "./resource-stats-card-content";
import { ResourceStatsCardContent } from "./resource-stats-card-content";
import { ResourceStatsCardHeader } from "./resource-stats-card-header";
export type { StatItem };
-
-// Todo: when the design system is ready, we must use the colors from the design system (semantic colors)
-// Variant styles using CVA for type safety and consistency
-// Colors are exact HEX values from Figma design system
const cardVariants = cva("", {
variants: {
variant: {
@@ -109,7 +104,7 @@ export const ResourceStatsCard = ({
{header && }
{emptyState ? (
@@ -131,15 +126,16 @@ export const ResourceStatsCard = ({
// Otherwise, render with container
return (
-
{header && }
{emptyState ? (
@@ -155,7 +151,7 @@ export const ResourceStatsCard = ({
/>
)
)}
-
+
);
};
diff --git a/ui/components/shadcn/index.ts b/ui/components/shadcn/index.ts
index 4bb244fb95..8991f1e34d 100644
--- a/ui/components/shadcn/index.ts
+++ b/ui/components/shadcn/index.ts
@@ -1,14 +1,12 @@
export * from "./badge/badge";
export * from "./button/button";
-export * from "./card/base-card/base-card";
export * from "./card/card";
export * from "./card/resource-stats-card/resource-stats-card";
-export * from "./card/resource-stats-card/resource-stats-card-container";
export * from "./card/resource-stats-card/resource-stats-card-content";
-export * from "./card/resource-stats-card/resource-stats-card-divider";
export * from "./card/resource-stats-card/resource-stats-card-header";
export * from "./dropdown/dropdown";
export * from "./select/select";
export * from "./separator/separator";
+export * from "./skeleton/skeleton";
export * from "./tabs/generic-tabs";
export * from "./tabs/tabs";
diff --git a/ui/components/shadcn/skeleton/skeleton.tsx b/ui/components/shadcn/skeleton/skeleton.tsx
new file mode 100644
index 0000000000..34971c0554
--- /dev/null
+++ b/ui/components/shadcn/skeleton/skeleton.tsx
@@ -0,0 +1,16 @@
+import { cn } from "@/lib/utils";
+
+function Skeleton({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+export { Skeleton };
diff --git a/ui/styles/globals.css b/ui/styles/globals.css
index 50272c81a4..d6dfe3ee05 100644
--- a/ui/styles/globals.css
+++ b/ui/styles/globals.css
@@ -6,11 +6,11 @@
/* ===== LIGHT THEME (ROOT) ===== */
:root {
/* ===== LEGACY VARIABLES (CHART COLORS) ===== */
- --chart-info: #3C8DFF;
- --chart-warning: #FDFBD4;
- --chart-warning-emphasis: #FEC94D;
- --chart-danger: #F77852;
- --chart-danger-emphasis: #FF006A;
+ --chart-info: #3c8dff;
+ --chart-warning: #fdfbd4;
+ --chart-warning-emphasis: #fec94d;
+ --chart-danger: #f77852;
+ --chart-danger-emphasis: #ff006a;
--chart-success-color: #16a34a;
--chart-fail: #dc2626;
--chart-radar-primary: #9d174d;
@@ -69,36 +69,40 @@
/* Text Colors */
--text-neutral-primary: var(--color-slate-950);
- --text-neutral-secondary: var(--color-zinc-700);
+ --text-neutral-secondary: var(--color-zinc-800);
--text-neutral-tertiary: var(--color-zinc-500);
--text-error-primary: var(--color-red-600);
/* Background Colors */
- --bg-neutral-primary: #FDFDFD;
+ --bg-neutral-primary: #fdfdfd;
--bg-neutral-secondary: var(--color-white);
- --bg-neutral-tertiary: #FBFDFD;
+ --bg-neutral-tertiary: #fbfdfd;
--bg-tag-primary: var(--color-slate-50);
--bg-pass-primary: var(--color-emerald-400);
--bg-pass-secondary: var(--color-emerald-50);
+ --bg-warning-primary: var(--color-orange-500);
--bg-fail-primary: var(--color-rose-500);
--bg-fail-secondary: var(--color-rose-50);
/* Severity Colors */
- --bg-data-critical: #FF006A;
- --bg-data-high: #F77852;
- --bg-data-medium: #FDD34F;
- --bg-data-low: #F5F3CE;
- --bg-data-info: #3C8DFF;
+ --bg-data-critical: #ff006a;
+ --bg-data-high: #f77852;
+ --bg-data-medium: #fdd34f;
+ --bg-data-low: #f5f3ce;
+ --bg-data-info: #3c8dff;
+
+ /* Chart Dots */
+ --chart-dots: var(--color-neutral-200);
}
/* ===== DARK THEME ===== */
.dark {
/* ===== LEGACY VARIABLES (CHART COLORS) ===== */
- --chart-info: #3C8DFF;
- --chart-warning: #FDFBD4;
- --chart-warning-emphasis: #FEC94D;
- --chart-danger: #F77852;
- --chart-danger-emphasis: #FF006A;
+ --chart-info: #3c8dff;
+ --chart-warning: #fdfbd4;
+ --chart-warning-emphasis: #fec94d;
+ --chart-danger: #f77852;
+ --chart-danger-emphasis: #ff006a;
--chart-success-color: #86da26;
--chart-fail: #db2b49;
--chart-radar-primary: #b51c80;
@@ -157,26 +161,30 @@
/* Text Colors */
--text-neutral-primary: var(--color-zinc-100);
- --text-neutral-secondary: var(--color-zinc-400);
+ --text-neutral-secondary: var(--color-zinc-300);
--text-neutral-tertiary: var(--color-zinc-500);
--text-error-primary: var(--color-rose-300);
/* Background Colors */
--bg-neutral-primary: var(--color-zinc-950);
- --bg-neutral-secondary: var(--color-slate-950);
+ --bg-neutral-secondary: var(--color-stone-950);
--bg-neutral-tertiary: #121110;
--bg-tag-primary: var(--color-slate-950);
+ --bg-warning-primary: var(--color-orange-400);
--bg-pass-primary: var(--color-green-400);
--bg-pass-secondary: var(--color-emerald-900);
--bg-fail-primary: var(--color-rose-500);
--bg-fail-secondary: #432232;
/* Severity Colors */
- --bg-data-critical: #FF006A;
- --bg-data-high: #F77852;
- --bg-data-medium: #FEC94D;
- --bg-data-low: #FDFBD4;
- --bg-data-info: #3C8DFF;
+ --bg-data-critical: #ff006a;
+ --bg-data-high: #f77852;
+ --bg-data-medium: #fec94d;
+ --bg-data-low: #fdfbd4;
+ --bg-data-info: #3c8dff;
+
+ /* Chart Dots */
+ --chart-dots: var(--text-neutral-primary);
}
/* ===== TAILWIND THEME MAPPINGS ===== */
@@ -248,6 +256,7 @@
--color-bg-tag: var(--bg-tag-primary);
--color-bg-pass: var(--bg-pass-primary);
--color-bg-pass-secondary: var(--bg-pass-secondary);
+ --color-bg-warning: var(--bg-warning-primary);
--color-bg-fail: var(--bg-fail-primary);
--color-bg-fail-secondary: var(--bg-fail-secondary);
}
@@ -357,4 +366,4 @@
body {
@apply bg-background text-foreground;
}
-}
\ No newline at end of file
+}