Saltar al contenido
VEXA
Nuevov0.1.0 · 24 primitivos

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.json

Adueñate del código. Da forma al sistema.

components/vexa

Deployment

Production · vexa

Live
v0.1.024 components3 themes

Server-first by default

This card is a Server Component — no client JavaScript.

Renderizado en vivo — Server Components, cero JS en cliente.

Construido sobre los estándares que ya usas

Open Code

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.

components/vexa/button.tsxtsx
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.json
Por qué VEXA

Un 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.

Arquitectura

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.

button.tsx
card.tsx
field.tsx

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
use client

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.

Light
Obsidian
Graphite

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.

Flujo

El ciclo Open Code

Cuatro pasos llevan un primitivo del registry a código que posees.

  1. 01

    Encuéntralo

    Explora la galería o pide al servidor MCP que busque en el catálogo.

  2. 02

    Añádelo

    Ejecuta el comando de instalación, o copia el código en components/vexa.

  3. 03

    Posee​lo

    Los archivos son tuyos: edita el comportamiento en el código, no en una API de props.

  4. 04

    Aplica el tema

    Aplica estilos solo con tokens --vexa-* para que cada tema quede consistente.

En cifras

Superficie pequeña, rigor serio

24Primitivos accesibles
3Temas, un contrato
7Herramientas MCP para agentes
AABase WCAG 2.2
Principios de diseño

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

Empezar

Empieza a construir

Configura el registry una vez y añade tu primer primitivo accesible.