Communitygithub.com

sistema-de-diseño-multiaplicación

Consolida varias aplicaciones o prototipos en una única biblioteca de componentes compartidos sin aplanar su apariencia. Cubre la búsqueda de componentes locales duplicados, la creación de componentes basados en tokens, el mapeo de variantes, la decisión de qué mantener específico de cada app, y las trampas de tailwind-merge que rompen tokens personalizados.

¿Qué es sistema-de-diseño-multiaplicación?

Esta habilidad está diseñada para equipos que gestionan múltiples aplicaciones o prototipos con sus propios conjuntos de componentes visualmente similares pero ligeramente diferentes, como botones, selects, modales, paginadores y toasts. En lugar de bifurcar componentes una y otra vez, propone un enfoque de componentes 'tokenizados': el componente compartido contiene la lógica, el marcado y los estados, mientras que cada aplicación o suite define sus propias medidas, radios, rellenos y sombras a través de tokens de tema. De esta manera, se mantiene la coherencia sin sacrificar la identidad visual de cada producto. Además, incluye un proceso de consolidación paso a paso: inventariar componentes duplicados, reemplazarlos por la versión compartida mapeando variantes, y mantener solo lo estrictamente específico de cada app. Por último, advierte sobre trampas silenciosas de `tailwind-merge` al usar tokens personalizados, como la confusión entre medidas, colores y tamaños de texto, y ofrece soluciones mediante `extendTailwindMerge`. Soporta plataformas basadas en Tailwind CSS, Radix UI y bibliotecas similares.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Adamparishspok/skills/tree/HEAD/skills/multi-app-design-system

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Muchas aplicaciones, un solo sistema

El fallo habitual: se construye un kit para la app A, los botones de la app B son 4px más altos y 2px más redondeados, así que B bifurca el botón "solo por esta vez". Cinco aplicaciones después, hay seis botones, ocho selects y tres modales, todos haciendo lo mismo.

Haz que el componente compartido sea basado en tokens: lleva comportamiento, marcado y estados, y cada tema proporciona sus medidas. Luego consolida aplicación por aplicación.

Componentes tokenizados

Lee cada medida que difiera entre aplicaciones de un token del tema:

@theme {
  --spacing-btn-sm: 1.75rem;  --spacing-btn-px-sm: 0.625rem;
  --spacing-btn-md: 2.25rem;  --spacing-btn-px-md: 0.875rem;
  --spacing-field: 2.125rem;  /* altura de input/select */
  --text-label: 0.8125rem;
}
md: "h-btn-md px-btn-px-md text-sm",
icon: "size-btn-md",

Luego:

  • Una suite sobrescribe los tokens una vez en su tema, y cada aplicación de la suite obtiene su propio control medido.
  • Los radios, rellenos y sombras ya son tokens (rounded-field, bg-accent, --shadow-card).
  • Los rellenos se aplican como color más una clase decorativa, por ejemplo bg-accent accent-fill. Un tema que solo define la decoración (un brillo) nunca renderiza un botón transparente.

Consulta references/button.tsx.

Pase de consolidación, por aplicación

  1. Inventario de copias locales. Busca en cada aplicación export function (Btn|Button|IconBtn|Select|Field|Input|Modal|Dialog|Sheet|Badge|Empty|Pager|Toast|Stat|Status|Spinner). Cuenta los usos.

  2. Reemplaza y elimina donde el componente compartido coincida después de aplicar el tema. Mapea explícitamente los nombres de las variantes y escribe el mapeo:

    Nombre localVariante compartida
    primary, navyaccent
    secondaryoutline
    quiet, softsubtle
    danger (sólido)danger-solid
  3. Mantén específico de la aplicación lo que sea específico:

    • widgets de dominio, gráficos y chrome de la aplicación;
    • controles cuya forma es la marca (losas de iOS, controles planos de Carbon, CTAs de píldora de 48px);
    • controles con comportamiento que el compartido no tiene (checkbox tri-estado, chips removibles, un elemento de reinicio "Cualquiera", filtros multiselección).

    Un envoltorio fino está bien cuando añade una sola cosa. Anota por qué en un comentario.

  4. Retira los <select> nativos y los selects basados en menú por un único Select.

    • Radix Select reserva "" como "sin valor": usa un centinela como "all" y mapealo de vuelta.
    • Reenvía aria-labelledby y aria-describedby.
    • Los scripts que llaman a selectOption() deben hacer clic en el combobox y luego en la opción.
  5. Verifica cada aplicación con sus propias capturas de pantalla (consulta visual-regression-pass). Las diferencias reales suelen ser intencionadas: tamaños, brillo, escala de presión.

Trampas de tailwind-merge (cn())

tailwind-merge solo conoce la escala nativa de Tailwind. Los tokens personalizados lo rompen de tres maneras silenciosas:

  • Tokens de espaciado desconocidos. cn("h-btn-md", "h-10") conserva ambos, porque no sabe que h-btn-md es una altura, y el orden de las hojas de estilo elige el ganador. Un h-10 de quien llama se perdió frente al token y un botón de 40px se renderizó a 36px. Registra los tokens: extendTailwindMerge({ extend: { theme: { spacing: ["btn-sm","btn-md","field", …] } } }).
  • Tamaños de texto desconocidos. cn("text-meta", "text-ink") trata text-meta como un color y lo descarta. Registra los tamaños: theme: { text: ["meta","micro","label"] }.
  • Sombras y colores personalizados. text-14 junto a text-t3, o shadow-[var(--x)] arbitrario junto a una sombra con nombre: el mismo problema. Cuando un código base tiene una escala personalizada cerrada en todas partes, usa clsx directamente allí.

Consulta references/cn.ts.

Enfoque y validación

  • Un estilo aria-invalid:ring-* prevalece sobre focus-visible:ring-* y oculta el anillo de enfoque en un campo enfocado e inválido. Escribe aria-invalid:not-focus-visible:ring-….
  • Los <button> simples dentro de formularios los envían. Si el Botón compartido no establece por defecto type="button", cada lugar de llamada convertido que no sea de envío debe configurarlo.

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

Adamparishspok/skills

Make a website, web app or online store ready for AI agents. Scan it with Cloudflare's Agent Readiness checks, decide which checks apply to this kind of site, ship the discovery files and headers in priority order, and add the AI-first basics the scanner does not score (server-rendered content, JSON-LD, llms.txt). Covers robots.txt AI rules, Content Signals, sitemap, Markdown for Agents (Accept text/markdown), Link headers, API catalog, OAuth discovery, auth.md, MCP server card, A2A agent card, agent skills index, WebMCP, and commerce protocols (ACP, UCP, AP2, MPP, x402). Use when making a site AI-ready, agent-ready or AI-first, or fixing an isitagentready.com or Cloudflare Agent Readiness report. Triggers on: AI ready, agent ready, AI-first, agent readiness, isitagentready, AI Crawl Control, Markdown for Agents, text/markdown, llms.txt, GPTBot, ClaudeBot, AI crawlers, Content-Signal, ai-train, api-catalog, .well-known, oauth-protected-resource, auth.md, MCP server card, agent card, agent skills, WebMCP, a...

Adamparishspok/skills

Install a complete, lean favicon set on any website or web app — the five files modern browsers, iOS and Android actually use, one block of head markup added once in the root layout, and a check that every file resolves. Covers finding the public folder per framework, generating the set from one SVG (or from a RealFaviconGenerator package), dark-mode SVG icons, maskable manifest icons, cache busting and verification. Use when adding, replacing or auditing a favicon, app icon, apple-touch-icon or web manifest. Triggers on: favicon, favicon.ico, favicon.svg, apple-touch-icon, site.webmanifest, manifest.json, app icon, PWA icon, maskable icon, tab icon, RealFaviconGenerator.

Adamparishspok/skills

Give an interface one shared tempo and a small vocabulary of hover and state micro-interactions: duration tiers (tap/pop/hover/card/layout) for CSS and Motion, swap hand-offs, rows whose highlight grows in, trailing arrows, chevron nudges, card lifts without translate, scroll-edge fades, and icon/label swaps for copy and toggle buttons. Use when animations feel inconsistent, durations are scattered magic numbers, hovers only change colour, or a product feels flat or unfinished. Triggers on: animation duration, transition timing, hover state, micro-interaction, polish, copy button feedback, menu icon to close, back arrow, card hover, scroll fade, motion tokens, Framer Motion durations.

Adamparishspok/skills

Build or migrate a UI's neutral palette (grounds, surfaces, lines, ink/text) as an OKLCH formula driven by a few inputs instead of dozens of hand-picked hex values, with light and dark themes, per-step ladder overrides, a fit script that reproduces existing colours, and a browser contrast audit. Use when creating a theme, adding dark mode, retinting a product, auditing text contrast, or consolidating several apps' palettes. Triggers on: palette, neutrals, grey ramp, dark mode, theme tokens, oklch, retint, hue, contrast audit, design tokens, Tailwind @theme colours.

Skills relacionados