Communitygithub.com

Sistema de Design Multi-App

Consolide vários aplicativos ou protótipos em uma biblioteca de componentes compartilhada sem achatar suas aparências. Abrange desde encontrar componentes locais duplicados até armadilhas de tailwind-merge.

O que é Sistema de Design Multi-App?

Esta skill oferece uma abordagem prática para unificar múltiplos aplicativos ou protótipos sob uma única biblioteca de componentes compartilhada, preservando a identidade visual de cada um. Em vez de forçar todos os apps a usarem os mesmos estilos, ela propõe componentes “tokenizados”: cada aplicativo ou suíte define suas próprias medidas através de tokens de tema, enquanto o comportamento, marcação e estados permanecem no componente compartilhado. A skill orienta desde o inventário de componentes locais duplicados (botões, selects, modais, etc.) até a substituição controlada, mapeamento de variantes e decisões sobre o que manter específico de cada app. Também aborda armadilhas comuns do `cn()` com tailwind-merge, como tokens de espaçamento e tamanhos de texto não registrados que podem quebrar silenciosamente o tema. É útil ao consolidar suítes de apps que cresceram seus próprios componentes, ao retematizar uma família de produtos ou quando os componentes de um design system existente “não encaixam” em um segundo produto. O resultado é uma base de componentes única, porém flexível, que respeita as diferenças visuais entre aplicações.

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

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Muitos apps, um sistema

A falha comum: um kit é criado para o app A, os botões do app B são 4px mais altos e 2px mais arredondados, então o app B bifurca o botão "só desta vez". Cinco apps depois, há seis botões, oito selects e três modais, todos fazendo o mesmo trabalho.

Faça o componente compartilhado ser tokenizado: ele carrega comportamento, marcação e estados, e cada tema fornece as medidas. Em seguida, consolide app por app.

Componentes tokenizados

Leia cada medida que difere entre os apps a partir de um token de 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",

Então:

  • Uma suíte sobrescreve os tokens uma vez em seu tema, e cada app dentro dela obtém seu próprio controle sob medida.
  • Raio, preenchimentos e sombras já são tokens (rounded-field, bg-accent, --shadow-card).
  • Preenchimentos de pintura como cor mais uma classe decorativa, por exemplo bg-accent accent-fill. Um tema que só define a decoração (um brilho) nunca renderiza um botão transparente.

Veja references/button.tsx.

Passo de consolidação, por app

  1. Inventarie as cópias locais. Busque em cada app por export function (Btn|Button|IconBtn|Select|Field|Input|Modal|Dialog|Sheet|Badge|Empty|Pager|Toast|Stat|Status|Spinner). Conte os pontos de uso.

  2. Substitua e exclua onde o componente compartilhado corresponde após a tematização. Mapeie nomes de variantes explicitamente e escreva o mapeamento:

    Nome localVariante compartilhada
    primary, navyaccent
    secondaryoutline
    quiet, softsubtle
    danger (sólido)danger-solid
  3. Mantenha itens específicos do app como app-específicos:

    • widgets de domínio, gráficos e chrome do app;
    • controles cujo formato é a marca (slabs iOS, controles planos Carbon, CTAs de 48px em pílula);
    • controles com comportamento que o compartilhado não possui (checkbox tri-estado, chips removíveis, um item de reset "Qualquer", filtros multi-seleção).

    Um wrapper fino é aceitável quando adiciona uma única coisa. Anote o motivo em um comentário.

  4. Aposente <select>s nativos e selects baseados em menu por um único Select.

    • Radix Select reserva "" como "sem valor": use um sentinela como "all" e mapeie de volta.
    • Encaminhe aria-labelledby e aria-describedby.
    • Scripts de passo a passo que chamam selectOption() devem clicar no combobox e depois na opção.
  5. Verifique cada app em relação às suas próprias capturas de tela (veja visual-regression-pass). Diferenças reais geralmente são intencionais: tamanhos, brilho, escala ao pressionar.

Armadilhas do tailwind-merge (cn())

tailwind-merge só conhece a escala embutida do Tailwind. Tokens personalizados quebram de três maneiras silenciosas:

  • Tokens de espaçamento desconhecidos. cn("h-btn-md", "h-10") mantém ambos, porque não sabe que h-btn-md é uma altura, e a ordem da folha de estilo escolhe o vencedor. Um h-10 do chamador perdia para o token e um botão de 40px renderizava com 36px. Registre os tokens: extendTailwindMerge({ extend: { theme: { spacing: ["btn-sm","btn-md","field", …] } } }).
  • Tamanhos de texto desconhecidos. cn("text-meta", "text-ink") trata text-meta como cor e o descarta. Registre os tamanhos: theme: { text: ["meta","micro","label"] }.
  • Sombras e cores personalizadas. text-14 ao lado de text-t3, ou shadow-[var(--x)] arbitrária ao lado de uma sombra nomeada: o mesmo problema. Quando uma base de código tem uma escala personalizada fechada em todos os lugares, use clsx simples lá.

Veja references/cn.ts.

Foco e validação

  • Um estilo aria-invalid:ring-* supera focus-visible:ring-* e esconde o anel de foco em um campo inválido focado. Escreva aria-invalid:not-focus-visible:ring-….
  • Elementos <button> simples dentro de formulários os enviam. Se o Botão compartilhado não padrão type="button", todo ponto de uso convertido que não seja de envio deve defini-lo.

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.

Habilidades Relacionadas