import React, { useState } from 'react' import { useTheme } from '@/shared/hooks/useTheme' import { Button } from '@/shared/components/ui/button' import { Badge } from '@/shared/components/ui/badge' import { Input } from '@/shared/components/ui/input' import { Label } from '@/shared/components/ui/label' import { Separator } from '@/shared/components/ui/separator' import { Progress } from '@/shared/components/ui/progress' import { Avatar, AvatarFallback, AvatarImage, AvatarGroup, AvatarGroupCount, } from '@/shared/components/ui/avatar' import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from '@/shared/components/ui/dialog' // ─── palette data — DA Charcoal ────────────────────────────────────────────── interface PaletteEntry { token: string cssVar: string dark: string light: string group: 'Invariants' | 'Dark default' | 'Light override' } const PALETTE: PaletteEntry[] = [ // Invariants { token: 'sidebar-bg', cssVar: '--color-sidebar-bg', dark: '#0C1528', light: '#0C1528', group: 'Invariants', }, { token: 'brand', cssVar: '--color-brand', dark: '#1B4FD8', light: '#1B4FD8', group: 'Invariants', }, { token: 'brand-hover', cssVar: '--color-brand-hover', dark: '#1744B8', light: '#1744B8', group: 'Invariants', }, { token: 'brand-active', cssVar: '--color-brand-active', dark: '#13379C', light: '#13379C', group: 'Invariants', }, { token: 'warning', cssVar: '--color-warning', dark: '#F59E0B', light: '#F59E0B', group: 'Invariants', }, { token: 'danger', cssVar: '--color-danger', dark: '#EF4444', light: '#EF4444', group: 'Invariants', }, // Dual-theme (valeurs différentes dark/light) { token: 'canvas', cssVar: '--color-canvas', dark: '#111111', light: '#F3F4F6', group: 'Dark default', }, { token: 'surface', cssVar: '--color-surface', dark: 'rgba(255,255,255,.035)', light: '#FFFFFF', group: 'Dark default', }, { token: 'surface-hover', cssVar: '--color-surface-hover', dark: 'rgba(255,255,255,.055)', light: '#F8F9FB', group: 'Dark default', }, { token: 'surface-solid', cssVar: '--color-surface-solid', dark: '#1E1E1E', light: '#FFFFFF', group: 'Dark default', }, { token: 'surface-raised', cssVar: '--color-surface-raised', dark: '#222222', light: '#FFFFFF', group: 'Dark default', }, { token: 'border', cssVar: '--color-border', dark: 'rgba(255,255,255,.06)', light: 'rgba(0,0,0,.07)', group: 'Dark default', }, { token: 'border-strong', cssVar: '--color-border-strong', dark: 'rgba(255,255,255,.12)', light: 'rgba(0,0,0,.14)', group: 'Dark default', }, { token: 'ink-primary', cssVar: '--color-ink-primary', dark: '#E5E5E5', light: '#0F0F1A', group: 'Dark default', }, { token: 'ink-secondary', cssVar: '--color-ink-secondary', dark: 'rgba(255,255,255,.55)', light: 'rgba(0,0,0,.55)', group: 'Dark default', }, { token: 'ink-tertiary', cssVar: '--color-ink-tertiary', dark: 'rgba(255,255,255,.3)', light: 'rgba(0,0,0,.3)', group: 'Dark default', }, { token: 'brand-soft', cssVar: '--color-brand-soft', dark: 'rgba(27,79,216,.1)', light: 'rgba(27,79,216,.06)', group: 'Dark default', }, { token: 'brand-text', cssVar: '--color-brand-text', dark: '#7DA4F0', light: '#1B4FD8', group: 'Dark default', }, { token: 'success', cssVar: '--color-success', dark: '#4ADE80', light: '#16A34A', group: 'Dark default', }, { token: 'success-soft', cssVar: '--color-success-soft', dark: 'rgba(74,222,128,.12)', light: 'rgba(22,163,74,.1)', group: 'Dark default', }, { token: 'warning-soft', cssVar: '--color-warning-soft', dark: 'rgba(245,158,11,.12)', light: 'rgba(245,158,11,.12)', group: 'Dark default', }, { token: 'danger-soft', cssVar: '--color-danger-soft', dark: 'rgba(239,68,68,.12)', light: 'rgba(239,68,68,.12)', group: 'Dark default', }, ] // ─── section wrapper ───────────────────────────────────────────────────────── function Section({ title, children }: { title: string; children: React.ReactNode }) { return (

{title}

{children}
) } // ─── main page ─────────────────────────────────────────────────────────────── export default function DesignSystemPage() { const { theme, setTheme } = useTheme() const [dialogOpen, setDialogOpen] = useState(false) return (
{/* ── header ── */}

Design System

Expria — DA Charcoal · dark-default + light override

{/* ── palette ── */}
{PALETTE.map(({ token, cssVar, light, dark }) => (

{token}

☾ {dark}

☀ {light}

))}
{/* ── typography ── */}

Display / 40px Bold

Heading 1 / 24px Semibold

Heading 2 / 20px Semibold

Heading 3 / 17px Medium

Body / 14px Regular — Plus Jakarta Sans

Small / 13px Regular — secondary copy

Caption / 11px Regular — labels, metadata

Mono / 11px — token names, code

{/* ── buttons ── */}
{/* ── badges ── */}
Default Secondary Outline Destructive
{/* ── inputs / forms ── */}

Content below separator

{/* ── avatar ── */}
HK sm
HK default
HK lg
{['AB', 'CD', 'EF'].map((initials) => ( {initials} ))} +5 group
{/* ── dialog ── */}
Example dialog This dialog uses DA Charcoal tokens — bg-surface-solid, border-border, text-ink-secondary. Toggle the theme to see it adapt.
) }