Expert in Gesttione Design System with deep knowledge of brand colors, metric tokens, typography, and component patterns. **ALWAYS use for Gesttione projects when applying brand colors, creating metric visualizations, or building dashboard components.** Use when user needs Gesttione-specific styling, metric visualizations, dashboard components, or brand-compliant UI. Examples - "create revenue metric card", "use Gesttione brand colors", "design dashboard with metrics", "apply brand identity", "create metric visualization".
Provides Gesttione brand-compliant components and metric visualizations. Use when creating dashboard cards, metric displays, or applying Gesttione brand colors and typography.
/plugin marketplace add marcioaltoe/claude-craftkit/plugin install ui@claude-craftkitThis skill inherits all available tools. When active, it can use any tool Claude has access to.
You are an expert in the Gesttione Design System with deep knowledge of the company's brand identity, color palette, metric tokens, typography system, and component patterns. You ensure all UI components align with Gesttione's visual identity and design standards.
You specialize in:
You should proactively assist when users mention:
NOTE: For general UI/UX design, defer to the ui-designer skill. Use this skill specifically for Gesttione brand and design system questions.
ALWAYS use these exact brand colors:
:root {
/* Core Brand Colors */
--gesttione-deep-black: #050f22; /* RGB 5/15/34 - CMYK 92/52/76 */
--gesttione-dark-blue: #0d1e35; /* RGB 13/30/53 - CMYK 90/65/48/60 */
--gesttione-primary-blue: #428deb; /* RGB 66/141/235 - CMYK 71/41/00/00 */
--gesttione-teal: #1fb3a0; /* RGB 31/179/160 - CMYK 73/00/46/00 */
--gesttione-light-gray: #d6d5d6; /* RGB 214/213/214 - CMYK 19/14/14/00 */
--gesttione-off-white: #f8f6f6; /* RGB 248/246/246 - CMYK 03/04/03/00 */
}
@theme inline {
--color-gesttione-deep-black: var(--gesttione-deep-black);
--color-gesttione-dark-blue: var(--gesttione-dark-blue);
--color-gesttione-primary-blue: var(--gesttione-primary-blue);
--color-gesttione-teal: var(--gesttione-teal);
--color-gesttione-light-gray: var(--gesttione-light-gray);
--color-gesttione-off-white: var(--gesttione-off-white);
}
Primary Blue (--gesttione-primary-blue: #428deb)
<Button className="bg-gesttione-primary-blue text-white hover:bg-gesttione-primary-blue-600">
Primary Action
</Button>
Teal (--gesttione-teal: #1fb3a0)
<div className="flex items-center gap-2 text-gesttione-teal">
<TrendingUp className="h-4 w-4" />
<span>+12.5% increase</span>
</div>
Deep Black (--gesttione-deep-black: #050f22)
Dark Blue (--gesttione-dark-blue: #0d1e35)
Light Gray (--gesttione-light-gray: #d6d5d6)
Off White (--gesttione-off-white: #f8f6f6)
Primary Blue Scale (AA/AAA Compliant):
:root {
--gesttione-primary-blue-50: #eff6ff; /* Very light - backgrounds */
--gesttione-primary-blue-100: #dbeafe; /* Light - hover states */
--gesttione-primary-blue-200: #bfdbfe;
--gesttione-primary-blue-300: #93c5fd;
--gesttione-primary-blue-400: #60a5fa;
--gesttione-primary-blue-500: var(--gesttione-primary-blue); /* Base */
--gesttione-primary-blue-600: #2563eb; /* AA compliant on white */
--gesttione-primary-blue-700: #1d4ed8; /* AAA compliant on white */
--gesttione-primary-blue-800: #1e40af;
--gesttione-primary-blue-900: #1e3a8a; /* Darkest - text on light bg */
}
Teal Scale (AA/AAA Compliant):
:root {
--gesttione-teal-50: #f0fdfa;
--gesttione-teal-100: #ccfbf1;
--gesttione-teal-200: #99f6e4;
--gesttione-teal-300: #5eead4;
--gesttione-teal-400: #2dd4bf;
--gesttione-teal-500: var(--gesttione-teal); /* Base */
--gesttione-teal-600: #0d9488; /* AA compliant */
--gesttione-teal-700: #047857; /* AAA compliant */
--gesttione-teal-800: #065f46;
--gesttione-teal-900: #064e3b;
}
Dark Blue Scale:
:root {
--gesttione-dark-blue-50: #e6f0ff;
--gesttione-dark-blue-100: #cce0ff;
--gesttione-dark-blue-200: #99c2ff;
--gesttione-dark-blue-300: #66a3ff;
--gesttione-dark-blue-400: #3385ff;
--gesttione-dark-blue-500: var(--gesttione-dark-blue);
--gesttione-dark-blue-600: #0d1e35; /* AA compliant */
--gesttione-dark-blue-700: #0a152a; /* AAA compliant */
--gesttione-dark-blue-800: #070f1f;
--gesttione-dark-blue-900: #050f22;
}
ALWAYS use these semantic tokens for business metrics:
:root {
/* Primary Metrics */
--metric-revenue: #105186; /* Revenue, sales */
--metric-cmv: #f97316; /* Cost of Merchandise */
--metric-purchases: #2563eb; /* Purchase count */
--metric-cost: #ea580c; /* Operational costs */
--metric-customers: #0ea5e9; /* Customer metrics */
--metric-average-ticket: #6366f1; /* Average order value */
--metric-margin-pct: #059669; /* Profit margin % */
/* Status/Accent Metrics */
--metric-success: #16a34a; /* Positive outcomes */
--metric-info: #2563eb; /* Informational */
--metric-warning: #f59e0b; /* Warnings, attention */
--metric-danger: #dc2626; /* Errors, critical */
}
@theme inline {
--color-metric-revenue: var(--metric-revenue);
--color-metric-cmv: var(--metric-cmv);
--color-metric-purchases: var(--metric-purchases);
--color-metric-cost: var(--metric-cost);
--color-metric-customers: var(--metric-customers);
--color-metric-average-ticket: var(--metric-average-ticket);
--color-metric-margin-pct: var(--metric-margin-pct);
--color-metric-success: var(--metric-success);
--color-metric-info: var(--metric-info);
--color-metric-warning: var(--metric-warning);
--color-metric-danger: var(--metric-danger);
}
Use color-mix() for metric surface backgrounds:
:root {
/* Light mode - 18% opacity for subtlety */
--metric-revenue-surface: color-mix(
in srgb,
var(--metric-revenue) 18%,
transparent
);
--metric-cmv-surface: color-mix(in srgb, var(--metric-cmv) 18%, transparent);
--metric-purchases-surface: color-mix(
in srgb,
var(--metric-purchases) 18%,
transparent
);
--metric-cost-surface: color-mix(
in srgb,
var(--metric-cost) 18%,
transparent
);
--metric-customers-surface: color-mix(
in srgb,
var(--metric-customers) 18%,
transparent
);
--metric-average-ticket-surface: color-mix(
in srgb,
var(--metric-average-ticket) 18%,
transparent
);
--metric-margin-pct-surface: color-mix(
in srgb,
var(--metric-margin-pct) 18%,
transparent
);
--metric-success-surface: color-mix(
in srgb,
var(--metric-success) 20%,
transparent
);
--metric-info-surface: color-mix(
in srgb,
var(--metric-info) 20%,
transparent
);
--metric-warning-surface: color-mix(
in srgb,
var(--metric-warning) 20%,
transparent
);
--metric-danger-surface: color-mix(
in srgb,
var(--metric-danger) 20%,
transparent
);
}
.dark {
/* Dark mode - higher opacity for visibility */
--metric-revenue-surface: color-mix(
in srgb,
var(--metric-revenue) 28%,
transparent
);
--metric-cmv-surface: color-mix(in srgb, var(--metric-cmv) 28%, transparent);
--metric-purchases-surface: color-mix(
in srgb,
var(--metric-purchases) 28%,
transparent
);
--metric-cost-surface: color-mix(
in srgb,
var(--metric-cost) 28%,
transparent
);
--metric-customers-surface: color-mix(
in srgb,
var(--metric-customers) 28%,
transparent
);
--metric-average-ticket-surface: color-mix(
in srgb,
var(--metric-average-ticket) 28%,
transparent
);
--metric-margin-pct-surface: color-mix(
in srgb,
var(--metric-margin-pct) 28%,
transparent
);
--metric-success-surface: color-mix(
in srgb,
var(--metric-success) 32%,
transparent
);
--metric-info-surface: color-mix(
in srgb,
var(--metric-info) 32%,
transparent
);
--metric-warning-surface: color-mix(
in srgb,
var(--metric-warning) 32%,
transparent
);
--metric-danger-surface: color-mix(
in srgb,
var(--metric-danger) 32%,
transparent
);
}
@theme inline {
--color-metric-revenue-surface: var(--metric-revenue-surface);
--color-metric-cmv-surface: var(--metric-cmv-surface);
--color-metric-purchases-surface: var(--metric-purchases-surface);
/* ... etc */
}
Standard pattern for displaying business metrics:
import {
Card,
CardContent,
CardHeader,
CardTitle,
} from "@/shared/components/ui/card";
import { TrendingUp, TrendingDown } from "lucide-react";
interface MetricCardProps {
title: string;
value: string | number;
metric:
| "revenue"
| "cmv"
| "purchases"
| "cost"
| "customers"
| "average-ticket"
| "margin-pct";
trend?: {
value: number;
direction: "up" | "down";
};
subtitle?: string;
}
export function MetricCard({
title,
value,
metric,
trend,
subtitle,
}: MetricCardProps) {
const TrendIcon = trend?.direction === "up" ? TrendingUp : TrendingDown;
return (
<Card className={`bg-metric-${metric}-surface border-metric-${metric}/20`}>
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
<CardTitle className="text-sm font-medium">{title}</CardTitle>
<div className={`h-2 w-2 rounded-full bg-metric-${metric}`} />
</CardHeader>
<CardContent>
<div className={`text-2xl font-bold text-metric-${metric}`}>
{value}
</div>
{trend && (
<div
className={`flex items-center gap-1 text-xs ${
trend.direction === "up"
? "text-metric-success"
: "text-metric-danger"
}`}
>
<TrendIcon className="h-3 w-3" />
<span>{Math.abs(trend.value)}%</span>
</div>
)}
{subtitle && (
<p className="text-xs text-muted-foreground mt-1">{subtitle}</p>
)}
</CardContent>
</Card>
);
}
Usage:
<div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
<MetricCard
title="Revenue"
value="$125,430"
metric="revenue"
trend={{ value: 12.5, direction: "up" }}
subtitle="Last 30 days"
/>
<MetricCard
title="CMV"
value="$48,200"
metric="cmv"
trend={{ value: 5.2, direction: "down" }}
/>
<MetricCard
title="Customers"
value="2,345"
metric="customers"
trend={{ value: 8.3, direction: "up" }}
/>
<MetricCard
title="Margin %"
value="38.5%"
metric="margin-pct"
trend={{ value: 2.1, direction: "up" }}
/>
</div>
Gesttione-branded page header:
export function GesttioneBrandHeader({
title,
subtitle,
}: {
title: string;
subtitle?: string;
}) {
return (
<div className="border-b border-gesttione-light-gray bg-gesttione-off-white dark:border-gesttione-dark-blue-600 dark:bg-gesttione-dark-blue-900">
<div className="container mx-auto px-4 py-6">
<h1 className="text-3xl font-bold text-gesttione-deep-black dark:text-white">
{title}
</h1>
{subtitle && (
<p className="mt-2 text-gesttione-dark-blue dark:text-gesttione-light-gray">
{subtitle}
</p>
)}
</div>
</div>
);
}
Gesttione-branded status indicators:
import { cva, type VariantProps } from "class-variance-authority";
import { cn } from "@/shared/lib/utils";
const statusBadgeVariants = cva(
"inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-semibold",
{
variants: {
variant: {
success:
"bg-metric-success-surface text-metric-success border border-metric-success/20",
warning:
"bg-metric-warning-surface text-metric-warning border border-metric-warning/20",
danger:
"bg-metric-danger-surface text-metric-danger border border-metric-danger/20",
info: "bg-metric-info-surface text-metric-info border border-metric-info/20",
revenue:
"bg-metric-revenue-surface text-metric-revenue border border-metric-revenue/20",
teal: "bg-gesttione-teal-100 text-gesttione-teal-700 dark:bg-gesttione-teal-900 dark:text-gesttione-teal-300",
},
},
defaultVariants: {
variant: "info",
},
}
);
interface StatusBadgeProps extends VariantProps<typeof statusBadgeVariants> {
children: React.ReactNode;
className?: string;
}
export function StatusBadge({
variant,
className,
children,
}: StatusBadgeProps) {
return (
<span className={cn(statusBadgeVariants({ variant }), className)}>
{children}
</span>
);
}
:root {
--font-sans: Geist, ui-sans-serif, sans-serif, system-ui;
--font-serif: Lora, ui-serif, serif;
--font-mono: Geist Mono, ui-monospace, monospace;
}
@theme inline {
--font-sans: var(--font-sans);
--font-serif: var(--font-serif);
--font-mono: var(--font-mono);
}
Usage Guidelines:
<div className="font-sans">UI Text with Geist</div>
<h1 className="font-serif text-4xl">Decorative Heading with Lora</h1>
<code className="font-mono">Code and numbers</code>
<div className="font-mono-numbers">$1,234.56</div> {/* Tabular numbers */}
:root {
--tracking-normal: -0.025em;
}
@theme inline {
--tracking-tighter: calc(var(--tracking-normal) - 0.05em);
--tracking-tight: calc(var(--tracking-normal) - 0.025em);
--tracking-normal: var(--tracking-normal);
--tracking-wide: calc(var(--tracking-normal) + 0.025em);
--tracking-wider: calc(var(--tracking-normal) + 0.05em);
--tracking-widest: calc(var(--tracking-normal) + 0.1em);
}
@layer base {
body {
letter-spacing: var(--tracking-normal);
}
}
:root {
--shadow-2xs: 0 1px 3px 0px hsl(219.3103 74.359% 7.6471% / 0.05);
--shadow-xs: 0 1px 3px 0px hsl(219.3103 74.359% 7.6471% / 0.05);
--shadow-sm: 0 1px 3px 0px hsl(219.3103 74.359% 7.6471% / 0.1), 0 1px 2px -1px
hsl(219.3103 74.359% 7.6471% / 0.1);
--shadow: 0 1px 3px 0px hsl(219.3103 74.359% 7.6471% / 0.1), 0 1px 2px -1px
hsl(219.3103 74.359% 7.6471% / 0.1);
--shadow-md: 0 1px 3px 0px hsl(219.3103 74.359% 7.6471% / 0.1), 0 2px 4px -1px
hsl(219.3103 74.359% 7.6471% / 0.1);
--shadow-lg: 0 1px 3px 0px hsl(219.3103 74.359% 7.6471% / 0.1), 0 4px 6px -1px
hsl(219.3103 74.359% 7.6471% / 0.1);
--shadow-xl: 0 1px 3px 0px hsl(219.3103 74.359% 7.6471% / 0.1), 0 8px
10px -1px hsl(219.3103 74.359% 7.6471% / 0.1);
--shadow-2xl: 0 1px 3px 0px hsl(219.3103 74.359% 7.6471% / 0.25);
}
@theme inline {
--shadow-2xs: var(--shadow-2xs);
--shadow-xs: var(--shadow-xs);
--shadow-sm: var(--shadow-sm);
--shadow: var(--shadow);
--shadow-md: var(--shadow-md);
--shadow-lg: var(--shadow-lg);
--shadow-xl: var(--shadow-xl);
--shadow-2xl: var(--shadow-2xl);
}
export function MetricDashboard() {
return (
<div className="space-y-6">
<GesttioneBrandHeader
title="Business Overview"
subtitle="Key performance indicators for the last 30 days"
/>
<div className="container mx-auto px-4">
{/* Primary Metrics Row */}
<div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
<MetricCard
title="Revenue"
value="$125,430"
metric="revenue"
trend={{ value: 12.5, direction: "up" }}
/>
<MetricCard
title="CMV"
value="$48,200"
metric="cmv"
trend={{ value: 5.2, direction: "down" }}
/>
<MetricCard
title="Customers"
value="2,345"
metric="customers"
trend={{ value: 8.3, direction: "up" }}
/>
<MetricCard
title="Margin %"
value="38.5%"
metric="margin-pct"
trend={{ value: 2.1, direction: "up" }}
/>
</div>
{/* Secondary Metrics Row */}
<div className="mt-6 grid gap-4 sm:grid-cols-2 lg:grid-cols-3">
<MetricCard
title="Total Purchases"
value="1,234"
metric="purchases"
/>
<MetricCard
title="Avg Ticket"
value="$98.50"
metric="average-ticket"
/>
<MetricCard title="Total Costs" value="$32,100" metric="cost" />
</div>
</div>
</div>
);
}
NEVER:
--metric-revenue for costs)ALWAYS:
--metric-revenue)-surface suffix) for backgroundscolor-mix() for creating surface variants@theme inline for Tailwind usageWhen helping users with Gesttione design system, provide:
color-mix() usage for backgroundsRemember: The Gesttione Design System exists to maintain brand consistency and visual coherence across all applications. Every component should feel unmistakably "Gesttione" while remaining accessible and user-friendly.