Interfaces, con ingeniería.
VEXA es la Valfiguer Experience Architecture — un sistema de interfaz Open Code. No instalas una librería de componentes en runtime; copias el código fuente accesible dentro de tu producto y lo posees, con estilos basados por completo en tokens semánticos.
npx shadcn@latest add https://vexa.valfiguer.com/r/button.jsonAdueñate del código. Da forma al sistema.
Deployment
Production · vexa
Server-first by default
Renderizado en vivo — Server Components, cero JS en cliente.
Construido sobre los estándares que ya usas
El código que instalas es el código que posees
Sin caja negra, sin API envoltorio. Elige un primitivo y lee el archivo exacto que llega a components/vexa — el mismo código que sirve el registry.
import type * as React from "react";
import { Slot } from "@radix-ui/react-slot";
import { cva, type VariantProps } from "class-variance-authority";
import { cn } from "@/lib/utils";
export const buttonVariants = cva(
[
"inline-flex select-none items-center justify-center gap-2 whitespace-nowrap",
"rounded-vexa-md text-sm font-medium",
"transition-[color,background-color,border-color,box-shadow]",
"duration-[var(--vexa-duration-fast)] ease-[var(--vexa-ease-standard)]",
"outline-none focus-visible:ring-2 focus-visible:ring-vexa-ring",
"focus-visible:ring-offset-2 focus-visible:ring-offset-vexa-background",
"disabled:pointer-events-none disabled:opacity-50",
"aria-[busy=true]:pointer-events-none aria-[busy=true]:cursor-progress",
"[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
],
{
variants: {
variant: {
primary:
"bg-vexa-primary text-vexa-primary-foreground hover:bg-vexa-primary/90 active:bg-vexa-primary/95",
secondary:
"border border-vexa-border bg-vexa-secondary text-vexa-secondary-foreground hover:bg-vexa-accent active:bg-vexa-accent",
outline:
"border border-vexa-input bg-transparent text-vexa-foreground hover:bg-vexa-accent hover:text-vexa-accent-foreground active:bg-vexa-accent",
ghost:
"bg-transparent text-vexa-foreground hover:bg-vexa-accent hover:text-vexa-accent-foreground active:bg-vexa-accent",
danger:
"bg-vexa-danger text-vexa-danger-foreground hover:bg-vexa-danger/90 active:bg-vexa-danger/95",
link: "bg-transparent text-vexa-focus underline-offset-4 hover:underline focus-visible:ring-offset-0",
},
size: {
sm: "h-8 px-3 text-xs",
md: "h-10 px-4",
lg: "h-12 px-6 text-base",
},
},
defaultVariants: {
variant: "primary",
size: "md",
},
},
);
export interface ButtonProps
extends React.ComponentProps<"button">, VariantProps<typeof buttonVariants> {
/**
* Render the button's styles onto its single child element instead of a
* native `<button>` (e.g. to style a link). The child owns its own
* semantics; ensure it remains keyboard-operable.
*/
asChild?: boolean;
}
/**
* Button — triggers an action or submits a form.
*
* RSC-safe: contains no state or effects, so it renders on the server. Attach
* `onClick` from a Client Component when interactivity is required. Refs are
* accepted as a regular prop (React 19).
*/
export function Button({
className,
variant,
size,
asChild = false,
type,
...props
}: ButtonProps) {
const Comp = asChild ? Slot : "button";
return (
<Comp
data-slot="button"
className={cn(buttonVariants({ variant, size }), className)}
type={asChild ? undefined : (type ?? "button")}
{...props}
/>
);
}
Instala este archivo
npx shadcn@latest add https://vexa.valfiguer.com/r/button.jsonUn sistema, no una dependencia
Todo lo que entrega VEXA es legible, editable y tuyo — desde el contrato de tokens hasta el último anillo de foco.
Open Code
Instalas el código fuente, no una caja negra. Léelo, cámbialo, elimínalo — la interfaz pertenece a tu repositorio.
Server-first (RSC)
Los primitivos se renderizan como Server Components por defecto. El límite 'use client' vive solo en la hoja interactiva más pequeña.
Tres temas, un contrato
Light, Obsidian y Graphite salen de un único conjunto de tokens HSL semánticos. Cambia con un solo atributo data.
Accesible por arquitectura
WCAG 2.2 AA está integrado en los primitivos, ejemplos y tests — modelos de teclado, foco y contraste, nunca añadidos al final.
Nativo para IA
Un servidor MCP y una Design Skill exponen el catálogo, los tokens y las reglas para que los agentes ensamblen UI de VEXA correctamente.
Registry compatible con shadcn
Los items siguen el esquema del registry de shadcn, así que instalas con las herramientas que ya conoces o copias el código a mano.
Pensado para cómo construyes de verdad
Las mismas tres ideas recorren cada primitivo — propiedad del código, renderizado server-first y un único contrato de tokens.
Copia el código, posee el sistema
Cada primitivo se instala como un archivo en components/vexa — el mismo código que sirve el registry. Edita el comportamiento donde vive, no en una API de props enorme.
Server-first, cliente en la hoja
Los primitivos se renderizan como Server Components. La interactividad se aísla en la hoja 'use client' más pequeña, así las páginas siguen rápidas y en streaming.
Un contrato de tokens, tres temas
Light, Obsidian y Graphite salen de un único conjunto de tokens HSL semánticos. Cambia todo el sistema con un solo atributo data.
El ciclo Open Code
Cuatro pasos llevan un primitivo del registry a código que posees.
- 01
Encuéntralo
Explora la galería o pide al servidor MCP que busque en el catálogo.
- 02
Añádelo
Ejecuta el comando de instalación, o copia el código en components/vexa.
- 03
Poseelo
Los archivos son tuyos: edita el comportamiento en el código, no en una API de props.
- 04
Aplica el tema
Aplica estilos solo con tokens --vexa-* para que cada tema quede consistente.
Superficie pequeña, rigor serio
Las reglas que responde todo el sistema
VEXA aún no tiene clientes a los que citar — así que aquí están las reglas de carga contra las que se construye cada primitivo.
Instala el código, no una dependencia. Copias el código accesible del componente en tu repositorio y lo posees por completo — léelo, cámbialo, elimínalo.
Open Code
Renderiza en el servidor por defecto. El límite 'use client' vive en la hoja interactiva más pequeña, nunca en una página o sección entera.
Límites RSC
Nunca escribas un color a mano. Cada decisión visual se resuelve con un token semántico --vexa-*, así un contrato impulsa los tres temas.
Contrato de tokens
El significado nunca depende solo del color. El estado también lo llevan icono, texto, borde y forma — validado contra WCAG 2.2 AA.
Accesibilidad
Cada estado aplicable recibe un tratamiento visible: hover, focus-visible, activo, deshabilitado, inválido, ocupado y solo lectura.
API de componentes
El catálogo nunca está hardcodeado. El servidor MCP lee el propio código de VEXA en tiempo de petición, así los agentes siempre ven lo que se entrega.
Nativo para IA
Empieza a construir
Configura el registry una vez y añade tu primer primitivo accesible.