-
+
Mylder
@@ -61,7 +61,7 @@ export function DashboardNav({ user }: { user: SupabaseUser }) {
{user.user_metadata?.full_name && (
{user.user_metadata.full_name}
)}
-
{user.email}
+
{user.email}
diff --git a/src/components/ui/badge.tsx b/src/components/ui/badge.tsx
index fd3a406..1dc0e7a 100644
--- a/src/components/ui/badge.tsx
+++ b/src/components/ui/badge.tsx
@@ -11,10 +11,26 @@ const badgeVariants = cva(
variant: {
default:
"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
+ brand:
+ "border-transparent bg-brand text-brand-foreground [a&]:hover:bg-brand/90",
+ "brand-outline":
+ "border-brand/30 bg-brand/10 text-brand [a&]:hover:bg-brand/20",
secondary:
"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
destructive:
"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
+ success:
+ "border-transparent bg-success text-success-foreground [a&]:hover:bg-success/90",
+ "success-outline":
+ "border-success/30 bg-success/10 text-success [a&]:hover:bg-success/20",
+ warning:
+ "border-transparent bg-warning text-warning-foreground [a&]:hover:bg-warning/90",
+ "warning-outline":
+ "border-warning/30 bg-warning/10 text-warning [a&]:hover:bg-warning/20",
+ info:
+ "border-transparent bg-info text-info-foreground [a&]:hover:bg-info/90",
+ "info-outline":
+ "border-info/30 bg-info/10 text-info [a&]:hover:bg-info/20",
outline:
"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
},
diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx
index 21409a0..e708360 100644
--- a/src/components/ui/button.tsx
+++ b/src/components/ui/button.tsx
@@ -10,15 +10,24 @@ const buttonVariants = cva(
variants: {
variant: {
default: "bg-primary text-primary-foreground hover:bg-primary/90",
+ brand:
+ "bg-brand text-brand-foreground hover:bg-brand/90 shadow-brand hover:shadow-brand-lg transition-shadow",
destructive:
"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
+ success:
+ "bg-success text-success-foreground hover:bg-success/90",
outline:
"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
+ "outline-brand":
+ "border-brand/30 bg-brand/5 text-brand hover:bg-brand/10 hover:border-brand/50",
secondary:
"bg-secondary text-secondary-foreground hover:bg-secondary/80",
ghost:
"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
+ "ghost-brand":
+ "text-brand hover:bg-brand/10 hover:text-brand",
link: "text-primary underline-offset-4 hover:underline",
+ "link-brand": "text-brand underline-offset-4 hover:underline",
},
size: {
default: "h-9 px-4 py-2 has-[>svg]:px-3",
diff --git a/src/styles/design-system.md b/src/styles/design-system.md
new file mode 100644
index 0000000..3ad7963
--- /dev/null
+++ b/src/styles/design-system.md
@@ -0,0 +1,546 @@
+# Mylder Brand Design System
+
+## Brand Identity
+
+**Tagline**: Intelligent Automation, Human Touch
+
+**Personality**: Professional, Approachable, Innovative, Trustworthy
+
+**Aesthetic**: Refined Tech-Forward Minimalism with Warm Energy
+
+---
+
+## Color System (OKLCH)
+
+### Philosophy
+Using OKLCH color space for perceptually uniform colors. Warm stone neutrals replace cold grays to feel more human/approachable for an AI platform. Amber accent represents energy and intelligence.
+
+### Primary Palette
+
+#### Brand Colors
+```css
+/* Amber - Primary Brand Accent */
+--brand: oklch(0.75 0.16 75); /* Vibrant amber */
+--brand-hover: oklch(0.70 0.18 75); /* Darker on hover */
+--brand-muted: oklch(0.85 0.08 75); /* Soft amber for backgrounds */
+--brand-foreground: oklch(0.20 0.02 75); /* Dark text on brand */
+
+/* Stone - Warm Neutrals (replaces zinc/gray) */
+--stone-50: oklch(0.985 0.002 75); /* Near white, warm */
+--stone-100: oklch(0.965 0.004 75); /* Subtle warm */
+--stone-200: oklch(0.925 0.006 75); /* Light warm */
+--stone-300: oklch(0.87 0.008 75); /* Medium-light */
+--stone-400: oklch(0.70 0.01 75); /* Medium */
+--stone-500: oklch(0.55 0.012 75); /* Medium-dark */
+--stone-600: oklch(0.45 0.014 75); /* Dark */
+--stone-700: oklch(0.35 0.012 75); /* Darker */
+--stone-800: oklch(0.25 0.01 75); /* Very dark */
+--stone-900: oklch(0.18 0.008 75); /* Near black, warm */
+--stone-950: oklch(0.12 0.006 75); /* Deepest */
+```
+
+### Semantic Colors
+
+#### Light Mode
+```css
+:root {
+ /* Backgrounds */
+ --background: oklch(0.99 0.002 75); /* Warm white */
+ --background-subtle: oklch(0.975 0.004 75); /* Subtle warmth */
+ --foreground: oklch(0.15 0.01 75); /* Warm black */
+
+ /* Cards & Surfaces */
+ --card: oklch(1 0 0); /* Pure white cards */
+ --card-foreground: oklch(0.15 0.01 75);
+ --popover: oklch(1 0 0);
+ --popover-foreground: oklch(0.15 0.01 75);
+
+ /* Primary (Dark buttons/CTAs) */
+ --primary: oklch(0.20 0.01 75);
+ --primary-foreground: oklch(0.98 0.002 75);
+
+ /* Secondary (Light buttons) */
+ --secondary: oklch(0.955 0.006 75);
+ --secondary-foreground: oklch(0.25 0.01 75);
+
+ /* Muted (Disabled, hints) */
+ --muted: oklch(0.955 0.006 75);
+ --muted-foreground: oklch(0.50 0.01 75);
+
+ /* Accent (Amber brand) */
+ --accent: oklch(0.92 0.06 75);
+ --accent-foreground: oklch(0.25 0.02 75);
+
+ /* Brand (Primary amber) */
+ --brand: oklch(0.75 0.16 75);
+ --brand-foreground: oklch(0.20 0.02 75);
+
+ /* Destructive */
+ --destructive: oklch(0.55 0.22 25);
+ --destructive-foreground: oklch(0.98 0 0);
+
+ /* Success */
+ --success: oklch(0.65 0.18 145);
+ --success-foreground: oklch(0.98 0 0);
+
+ /* Warning */
+ --warning: oklch(0.80 0.15 85);
+ --warning-foreground: oklch(0.25 0.02 85);
+
+ /* Info */
+ --info: oklch(0.65 0.15 240);
+ --info-foreground: oklch(0.98 0 0);
+
+ /* Borders & Inputs */
+ --border: oklch(0.90 0.006 75);
+ --input: oklch(0.90 0.006 75);
+ --ring: oklch(0.75 0.16 75); /* Amber focus ring */
+}
+```
+
+#### Dark Mode
+```css
+.dark {
+ /* Backgrounds */
+ --background: oklch(0.14 0.008 75); /* Warm dark */
+ --background-subtle: oklch(0.18 0.01 75);
+ --foreground: oklch(0.96 0.004 75); /* Warm white */
+
+ /* Cards & Surfaces */
+ --card: oklch(0.20 0.01 75);
+ --card-foreground: oklch(0.96 0.004 75);
+ --popover: oklch(0.20 0.01 75);
+ --popover-foreground: oklch(0.96 0.004 75);
+
+ /* Primary (Light buttons on dark) */
+ --primary: oklch(0.94 0.004 75);
+ --primary-foreground: oklch(0.18 0.01 75);
+
+ /* Secondary */
+ --secondary: oklch(0.26 0.012 75);
+ --secondary-foreground: oklch(0.94 0.004 75);
+
+ /* Muted */
+ --muted: oklch(0.26 0.012 75);
+ --muted-foreground: oklch(0.65 0.01 75);
+
+ /* Accent (Amber, slightly brighter for dark) */
+ --accent: oklch(0.30 0.04 75);
+ --accent-foreground: oklch(0.94 0.004 75);
+
+ /* Brand (Amber, adjusted for dark) */
+ --brand: oklch(0.78 0.15 75);
+ --brand-foreground: oklch(0.15 0.02 75);
+
+ /* Destructive */
+ --destructive: oklch(0.65 0.20 22);
+ --destructive-foreground: oklch(0.98 0 0);
+
+ /* Success */
+ --success: oklch(0.70 0.16 145);
+ --success-foreground: oklch(0.15 0 0);
+
+ /* Warning */
+ --warning: oklch(0.82 0.14 85);
+ --warning-foreground: oklch(0.20 0.02 85);
+
+ /* Info */
+ --info: oklch(0.70 0.14 240);
+ --info-foreground: oklch(0.15 0 0);
+
+ /* Borders & Inputs */
+ --border: oklch(1 0 0 / 12%);
+ --input: oklch(1 0 0 / 15%);
+ --ring: oklch(0.78 0.15 75);
+}
+```
+
+### Chart Colors (Data Visualization)
+```css
+/* Light mode - vibrant, distinguishable */
+--chart-1: oklch(0.75 0.16 75); /* Amber (brand) */
+--chart-2: oklch(0.60 0.15 200); /* Teal */
+--chart-3: oklch(0.65 0.18 280); /* Purple */
+--chart-4: oklch(0.70 0.16 145); /* Green */
+--chart-5: oklch(0.65 0.20 25); /* Coral */
+
+/* Dark mode - adjusted for contrast */
+--chart-1: oklch(0.78 0.15 75);
+--chart-2: oklch(0.68 0.14 200);
+--chart-3: oklch(0.72 0.16 280);
+--chart-4: oklch(0.75 0.15 145);
+--chart-5: oklch(0.72 0.18 25);
+```
+
+---
+
+## Typography
+
+### Font Stack
+```css
+/* Primary - Display & Headings */
+--font-display: 'Plus Jakarta Sans', system-ui, sans-serif;
+
+/* Body - Reading & UI */
+--font-body: 'Plus Jakarta Sans', system-ui, sans-serif;
+
+/* Mono - Code & Technical */
+--font-mono: 'JetBrains Mono', 'Fira Code', monospace;
+```
+
+### Type Scale (Fluid)
+```css
+/* Using clamp() for fluid typography */
+--text-xs: clamp(0.75rem, 0.7rem + 0.25vw, 0.8rem); /* 12-13px */
+--text-sm: clamp(0.8125rem, 0.77rem + 0.21vw, 0.875rem); /* 13-14px */
+--text-base: clamp(0.9375rem, 0.9rem + 0.19vw, 1rem); /* 15-16px */
+--text-lg: clamp(1.0625rem, 1rem + 0.31vw, 1.125rem); /* 17-18px */
+--text-xl: clamp(1.1875rem, 1.1rem + 0.44vw, 1.25rem); /* 19-20px */
+--text-2xl: clamp(1.375rem, 1.25rem + 0.63vw, 1.5rem); /* 22-24px */
+--text-3xl: clamp(1.625rem, 1.45rem + 0.88vw, 1.875rem); /* 26-30px */
+--text-4xl: clamp(2rem, 1.75rem + 1.25vw, 2.25rem); /* 32-36px */
+--text-5xl: clamp(2.5rem, 2.1rem + 2vw, 3rem); /* 40-48px */
+--text-6xl: clamp(3rem, 2.5rem + 2.5vw, 3.75rem); /* 48-60px */
+```
+
+### Line Heights
+```css
+--leading-none: 1;
+--leading-tight: 1.25;
+--leading-snug: 1.375;
+--leading-normal: 1.5;
+--leading-relaxed: 1.625;
+--leading-loose: 2;
+```
+
+### Font Weights
+```css
+--font-light: 300;
+--font-normal: 400;
+--font-medium: 500;
+--font-semibold: 600;
+--font-bold: 700;
+--font-extrabold: 800;
+```
+
+### Letter Spacing
+```css
+--tracking-tighter: -0.05em;
+--tracking-tight: -0.025em;
+--tracking-normal: 0;
+--tracking-wide: 0.025em;
+--tracking-wider: 0.05em;
+--tracking-widest: 0.1em;
+```
+
+---
+
+## Spacing & Layout
+
+### Spacing Scale
+```css
+/* Base unit: 4px */
+--space-0: 0;
+--space-px: 1px;
+--space-0.5: 0.125rem; /* 2px */
+--space-1: 0.25rem; /* 4px */
+--space-1.5: 0.375rem; /* 6px */
+--space-2: 0.5rem; /* 8px */
+--space-2.5: 0.625rem; /* 10px */
+--space-3: 0.75rem; /* 12px */
+--space-3.5: 0.875rem; /* 14px */
+--space-4: 1rem; /* 16px */
+--space-5: 1.25rem; /* 20px */
+--space-6: 1.5rem; /* 24px */
+--space-7: 1.75rem; /* 28px */
+--space-8: 2rem; /* 32px */
+--space-9: 2.25rem; /* 36px */
+--space-10: 2.5rem; /* 40px */
+--space-12: 3rem; /* 48px */
+--space-14: 3.5rem; /* 56px */
+--space-16: 4rem; /* 64px */
+--space-20: 5rem; /* 80px */
+--space-24: 6rem; /* 96px */
+--space-28: 7rem; /* 112px */
+--space-32: 8rem; /* 128px */
+```
+
+### Container Widths
+```css
+--container-xs: 20rem; /* 320px */
+--container-sm: 24rem; /* 384px */
+--container-md: 28rem; /* 448px */
+--container-lg: 32rem; /* 512px */
+--container-xl: 36rem; /* 576px */
+--container-2xl: 42rem; /* 672px */
+--container-3xl: 48rem; /* 768px */
+--container-4xl: 56rem; /* 896px */
+--container-5xl: 64rem; /* 1024px */
+--container-6xl: 72rem; /* 1152px */
+--container-7xl: 80rem; /* 1280px */
+--container-full: 100%;
+```
+
+### Breakpoints
+```css
+--screen-sm: 640px;
+--screen-md: 768px;
+--screen-lg: 1024px;
+--screen-xl: 1280px;
+--screen-2xl: 1536px;
+```
+
+---
+
+## Border Radius
+
+```css
+--radius-none: 0;
+--radius-sm: 0.25rem; /* 4px - subtle */
+--radius-md: 0.5rem; /* 8px - default */
+--radius-lg: 0.75rem; /* 12px - cards */
+--radius-xl: 1rem; /* 16px - modals */
+--radius-2xl: 1.5rem; /* 24px - large surfaces */
+--radius-3xl: 2rem; /* 32px - hero elements */
+--radius-full: 9999px; /* Pills, avatars */
+```
+
+---
+
+## Shadows
+
+### Light Mode
+```css
+--shadow-xs: 0 1px 2px oklch(0 0 0 / 0.04);
+--shadow-sm: 0 1px 3px oklch(0 0 0 / 0.06), 0 1px 2px oklch(0 0 0 / 0.04);
+--shadow-md: 0 4px 6px -1px oklch(0 0 0 / 0.06), 0 2px 4px -1px oklch(0 0 0 / 0.04);
+--shadow-lg: 0 10px 15px -3px oklch(0 0 0 / 0.06), 0 4px 6px -2px oklch(0 0 0 / 0.03);
+--shadow-xl: 0 20px 25px -5px oklch(0 0 0 / 0.08), 0 10px 10px -5px oklch(0 0 0 / 0.03);
+--shadow-2xl: 0 25px 50px -12px oklch(0 0 0 / 0.15);
+
+/* Brand glow (for CTAs) */
+--shadow-brand: 0 0 0 1px oklch(0.75 0.16 75 / 0.1),
+ 0 4px 16px oklch(0.75 0.16 75 / 0.15);
+--shadow-brand-lg: 0 0 0 1px oklch(0.75 0.16 75 / 0.15),
+ 0 8px 32px oklch(0.75 0.16 75 / 0.2);
+```
+
+### Dark Mode
+```css
+--shadow-xs: 0 1px 2px oklch(0 0 0 / 0.2);
+--shadow-sm: 0 1px 3px oklch(0 0 0 / 0.3), 0 1px 2px oklch(0 0 0 / 0.2);
+--shadow-md: 0 4px 6px -1px oklch(0 0 0 / 0.3), 0 2px 4px -1px oklch(0 0 0 / 0.2);
+--shadow-lg: 0 10px 15px -3px oklch(0 0 0 / 0.3), 0 4px 6px -2px oklch(0 0 0 / 0.2);
+--shadow-xl: 0 20px 25px -5px oklch(0 0 0 / 0.35), 0 10px 10px -5px oklch(0 0 0 / 0.2);
+--shadow-2xl: 0 25px 50px -12px oklch(0 0 0 / 0.5);
+
+/* Brand glow (brighter for dark) */
+--shadow-brand: 0 0 0 1px oklch(0.78 0.15 75 / 0.2),
+ 0 4px 16px oklch(0.78 0.15 75 / 0.2);
+--shadow-brand-lg: 0 0 0 1px oklch(0.78 0.15 75 / 0.25),
+ 0 8px 32px oklch(0.78 0.15 75 / 0.25);
+```
+
+---
+
+## Motion & Animation
+
+### Durations
+```css
+--duration-instant: 0ms;
+--duration-fast: 100ms;
+--duration-normal: 200ms;
+--duration-slow: 300ms;
+--duration-slower: 500ms;
+--duration-slowest: 700ms;
+```
+
+### Easings
+```css
+--ease-linear: linear;
+--ease-in: cubic-bezier(0.4, 0, 1, 1);
+--ease-out: cubic-bezier(0, 0, 0.2, 1);
+--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
+--ease-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);
+--ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
+```
+
+### Common Animations
+```css
+/* Fade */
+@keyframes fade-in {
+ from { opacity: 0; }
+ to { opacity: 1; }
+}
+
+/* Slide up */
+@keyframes slide-up {
+ from {
+ opacity: 0;
+ transform: translateY(8px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+/* Scale */
+@keyframes scale-in {
+ from {
+ opacity: 0;
+ transform: scale(0.95);
+ }
+ to {
+ opacity: 1;
+ transform: scale(1);
+ }
+}
+
+/* Pulse (for loading states) */
+@keyframes pulse {
+ 0%, 100% { opacity: 1; }
+ 50% { opacity: 0.5; }
+}
+
+/* Shimmer (skeleton loading) */
+@keyframes shimmer {
+ 0% { background-position: -200% 0; }
+ 100% { background-position: 200% 0; }
+}
+```
+
+---
+
+## Component Patterns
+
+### Button Variants
+```tsx
+// Primary (brand amber)
+
+
+// Default (dark)
+
+
+// Secondary (light)
+
+
+// Ghost (transparent)
+
+
+// Outline (bordered)
+
+
+// Destructive (red)
+
+```
+
+### Card Styles
+```tsx
+// Default card
+
+
+// Elevated card (more prominent)
+
+
+// Interactive card
+
+
+// Brand accent card
+
+```
+
+### Input Styles
+```tsx
+// Default input
+
+
+// With icon
+
+
+
+
+```
+
+---
+
+## Gradients
+
+### Brand Gradients
+```css
+/* Subtle background */
+--gradient-brand-subtle: linear-gradient(135deg,
+ oklch(0.75 0.16 75 / 0.05) 0%,
+ oklch(0.75 0.16 75 / 0.1) 100%);
+
+/* Hero gradient */
+--gradient-brand-hero: linear-gradient(135deg,
+ oklch(0.75 0.16 75) 0%,
+ oklch(0.70 0.18 65) 100%);
+
+/* Text gradient */
+--gradient-brand-text: linear-gradient(90deg,
+ oklch(0.70 0.18 75) 0%,
+ oklch(0.65 0.16 85) 100%);
+```
+
+### Background Gradients
+```css
+/* Warm fade (light mode) */
+--gradient-warm: linear-gradient(180deg,
+ oklch(0.99 0.002 75) 0%,
+ oklch(0.975 0.006 75) 100%);
+
+/* Dark gradient */
+--gradient-dark: linear-gradient(180deg,
+ oklch(0.14 0.008 75) 0%,
+ oklch(0.10 0.006 75) 100%);
+```
+
+---
+
+## Iconography
+
+### Icon Library
+- Primary: **Lucide React** (consistent with shadcn/ui)
+- Size scale: 16px, 20px, 24px, 32px
+- Stroke width: 1.5px (default), 2px (bold)
+
+### Icon Colors
+```css
+/* Default */
+.icon { color: var(--foreground); }
+
+/* Muted */
+.icon-muted { color: var(--muted-foreground); }
+
+/* Brand */
+.icon-brand { color: var(--brand); }
+
+/* On interactive elements */
+.btn:hover .icon { color: var(--brand); }
+```
+
+---
+
+## Usage Guidelines
+
+### Do
+- Use warm stone colors for neutrals
+- Use amber brand color for primary CTAs and accents
+- Maintain consistent spacing (multiples of 4px)
+- Use subtle shadows and transitions
+- Ensure 4.5:1 contrast ratio for text
+
+### Don't
+- Mix cold grays with warm neutrals
+- Overuse the brand amber color
+- Use pure black (#000) or white (#fff)
+- Add excessive shadows or effects
+- Forget dark mode support
+
+---
+
+## Implementation
+
+See `globals.css` for the complete CSS implementation with all variables defined.