Comece por aqui
Copie os arquivos CSS, importe no CSS principal do seu projeto e valide o primeiro botão Sinapse.
Tutorial · ~5 min
O caminho mais curto para o Sinapse rodar
Esta página prioriza a cópia manual porque é o caminho mais rápido para testar o Design System em um produto real. Versionamento e distribuição por pacote entram depois, quando o projeto precisar controlar atualização e distribuição.
- 01 Pré-requisito: Tailwind v4
- 02 Copiar CSS Sinapse
- 03 Importar no CSS principal
- 04 Validar — primeiro botão
- 05 Escolher a stack do projeto
1 · Pré-requisito
Tailwind v4 configurado
O Sinapse depende de Tailwind v4 — os mapeamentos @theme inline e os utilitários @utility
são recursos da v4. Se o seu projeto ainda não usa Tailwind v4, siga o guia oficial do Tailwind para a sua stack antes de continuar.
2 · Copiar os arquivos .css
Copie e cole os 3 arquivos CSS no seu projeto
Sem pacote, sem registry, sem arquivo extra. Crie a pasta src/assets/styles/sinapse/ (ou equivalente) no seu projeto e
copie o conteúdo dos 3 blocos abaixo em arquivos com os mesmos nomes.
Estrutura final no seu projeto
estrutura sugerida
src/
└── assets/
└── styles/
└── sinapse/
├── tokens.css ← cole o conteúdo da aba tokens.css
├── components.css ← cole o conteúdo da aba components.css
└── index.css ← cole o conteúdo da aba index.css Copie os 3 CSS. Esta etapa não baixa fonte, ícone, npm ou arquivo binário — só o contrato visual necessário para validar o primeiro botão.
Paleta OKLCH (coral, azul, neutros e feedback), tokens semânticos (--brand, --primary, --background, etc.), modo escuro e utilitários Tailwind (text-brand, bg-primary, text-foreground).
tokens.css
/* ==========================================================================
0. DARK VARIANT — Tailwind v4
--------------------------------------------------------------------------
Registra `.dark` como seletor pro variant `dark:` do Tailwind v4
(default seria prefers-color-scheme). Necessário pra permitir toggle
manual via classe .dark no <html>.
========================================================================== */
@custom-variant dark (&:where(.dark, .dark *));
/* ==========================================================================
1. PRIMITIVE TOKENS
--------------------------------------------------------------------------
Paleta crua. Espelha a tabela "1. Color" do Figma do DS ITpS.
Primitives agora sao state-aware: `:root` resolve light mode e `.dark`
resolve dark mode para o mesmo nome publico de token.
NÃO usar diretamente em componentes — sempre via semantic tokens.
========================================================================== */
:root {
/* --- Base scale (azul neutro) --- */
--itps-base-0: #FFFFFF;
--itps-base-50: #F9FAFB;
--itps-base-100: #EDF0F2;
--itps-base-200: #C4CCD4;
--itps-base-300: #A6B2BE;
--itps-base-400: #8999A9;
--itps-base-500: #6C7F93;
--itps-base-600: #5F7081; /* accessible-min */
--itps-base-700: #394C60;
--itps-base-800: #243242;
--itps-base-900: #0C1E31;
--itps-base-950: #030F1C;
/* --- Primary / feedback danger (coral) --- */
--itps-primary-50: #FDF7F7;
--itps-primary-100: #FBEFEE;
--itps-primary-200: #FBDCDB;
--itps-primary-300: #F8C6C4;
--itps-primary-400: #F7BEBB;
--itps-primary-500: #F5B0AD;
--itps-primary-600: #F39F9B;
--itps-primary-700: #F0857F;
--itps-primary-800: #EE736D;
--itps-primary-900: #EB5E57; /* default */
--itps-primary-950: #D3242D;
/* --- Secondary (azul institucional) --- */
--itps-secondary-25: #FBFCFD;
--itps-secondary-50: #F8FAFC;
--itps-secondary-100: #E6EDF4;
--itps-secondary-200: #D8E3EE;
--itps-secondary-300: #BAD0E6;
--itps-secondary-400: #88B1DD;
--itps-secondary-500: #6C9FD5;
--itps-secondary-600: #4D8ACC;
--itps-secondary-700: #397DC6;
--itps-secondary-800: #326EAF;
--itps-secondary-900: #1961AC; /* default */
--itps-secondary-950: #14508F;
/* --- Terciary (neutro esverdeado) ---
Escala parcial: 50, 100, 300, 500. Steps faltantes serão adicionados sob demanda. */
--itps-terciary-50: #F6F8F8;
--itps-terciary-100: #DFE7E7;
--itps-terciary-300: #D3DFDD;
--itps-terciary-500: #C4CECA;
/* --- Feedback / alert (amarelo) ---
Namespace da designer: feedback/alert/<step>. Steps especiais formalizados:
- 950 (min-graphics): mínimo p/ ícone/linha sobre branco passar WCAG
- 1000 (min-text): mínimo p/ TEXTO sobre branco passar WCAG */
--itps-alert-100: #FEFAF1;
--itps-alert-200: #FBF1D5;
--itps-alert-600: #F7E0A1;
--itps-alert-800: #F4D37C;
--itps-alert-900: #F0C653;
--itps-alert-950: #B78E1D; /* min-graphics */
--itps-alert-1000: #986F00; /* min-text */
/* --- Feedback: success (verde) --- */
--itps-success-100: #F4FBF8;
--itps-success-200: #D1F0E3;
--itps-success-600: #79D2AF;
--itps-success-800: #09AA69;
--itps-success-900: #00804D;
--itps-success-950: #00804D;
/* Destructive: coral (--itps-primary-*) é single source of truth para danger/feedback. */
}
.dark {
/* --- Base scale (azul neutro) --- */
--itps-base-0: #030F1C;
--itps-base-50: #0C1E31;
--itps-base-100: #243242;
--itps-base-200: #394C60;
--itps-base-300: #5F7081;
--itps-base-400: #6C7F93;
--itps-base-500: #8999A9;
--itps-base-600: #A6B2BE;
--itps-base-700: #C4CCD4;
--itps-base-800: #EDF0F2;
--itps-base-900: #F9FAFB;
--itps-base-950: #FFFFFF;
/* --- Primary / feedback danger (coral) --- */
--itps-primary-50: #2D131F;
--itps-primary-100: #311F28;
--itps-primary-200: #32232C;
--itps-primary-300: #4A323A;
--itps-primary-400: #63494F;
--itps-primary-500: #7C6064;
--itps-primary-600: #95787B;
--itps-primary-700: #AE8F92;
--itps-primary-800: #C9B3B5;
--itps-primary-900: #FF4C43;
--itps-primary-950: #D3242D;
/* --- Secondary (azul institucional) --- */
--itps-secondary-25: #021427;
--itps-secondary-50: #051F3B;
--itps-secondary-100: #0A2643;
--itps-secondary-200: #0E3762;
--itps-secondary-300: #1D4672;
--itps-secondary-400: #2D5886;
--itps-secondary-500: #406996;
--itps-secondary-600: #678AAD;
--itps-secondary-700: #8DA3BA;
--itps-secondary-800: #B1C1D1;
--itps-secondary-900: #4797EB;
--itps-secondary-950: #1961AC;
/* --- Terciary (neutro esverdeado) --- */
--itps-terciary-50: #16222D;
--itps-terciary-100: #18242F;
--itps-terciary-300: #31393F;
--itps-terciary-500: #55595E;
/* --- Feedback / alert (amarelo) --- */
--itps-alert-100: #302C14;
--itps-alert-200: #39351C;
--itps-alert-600: #917D3D;
--itps-alert-800: #C3AC69;
--itps-alert-900: #F0C653;
--itps-alert-950: #F0C653;
--itps-alert-1000: #F0C653;
/* --- Feedback: success (verde) --- */
--itps-success-100: #022626;
--itps-success-200: #023C2F;
--itps-success-600: #076C4A;
--itps-success-800: #61AB92;
--itps-success-900: #089B61;
--itps-success-950: #09AA69;
}
/* ==========================================================================
2. SEMANTIC TOKENS — shadcn-vue
--------------------------------------------------------------------------
Tokens que os componentes shadcn esperam.
Cada um aponta pra um primitive da camada 1.
Trocando o valor aqui, o look-and-feel do app inteiro muda.
========================================================================== */
:root {
/* === ARQUITETURA ===
Camada 1: Primitives (--itps-*) — paleta crua do Figma, state-aware.
Camada 2: Semantic shadcn (--background, --foreground, --primary, --destructive, etc) — CANONICAL.
Componentes consomem APENAS camada 2 via utility (bg-background, text-foreground, etc).
DARK MODE: primitives trocam valor dentro de .dark; semânticos só recebem
overrides quando o par acessível precisa de outro step. */
/* --- Surfaces & containers (canonical shadcn) --- */
--background: var(--itps-base-0); /* base/background/default-1 */
--foreground: var(--itps-base-950); /* base/text/default */
--card: var(--itps-base-50); /* base/background/default-2 */
--card-foreground: var(--itps-base-950);
--popover: var(--itps-base-0);
--popover-foreground: var(--itps-base-950);
--muted: var(--itps-base-100); /* base/background/surface */
--muted-foreground: var(--itps-base-800); /* base/text/subtle */
/* --- Brand and action semantics --- */
/* Brand (coral institucional)
Use para identidade visual Sinapse/ITpS: acentos, links editoriais,
títulos de cards e detalhes de marca. */
--brand: var(--itps-primary-900);
--brand-foreground: var(--itps-base-0);
/* Primary (azul institucional)
shadcn usa primary para a acao principal. Coral fica reservado para
brand/destructive/danger para nao confundir CTA compatível com marca visual. */
--primary: var(--itps-secondary-900);
--primary-foreground: var(--itps-base-0);
/* Secondary (azul institucional — tinted surface) */
--secondary: var(--itps-secondary-50);
--secondary-foreground: var(--itps-secondary-900);
/* Accent (terciary tinted surface) */
--accent: var(--itps-terciary-100);
--accent-foreground: var(--itps-base-950);
/* Destructive (= feedback/danger = coral) */
--destructive: var(--itps-primary-900);
--destructive-foreground: var(--itps-base-950);
/* --- Borders & inputs --- */
--border: var(--itps-base-100);
--input: var(--itps-base-200);
--ring: var(--itps-secondary-900);
/* --- Feedback semantic (extensão shadcn — não-padrão mas comum) --- */
/* Danger alias (= destructive) */
--danger: var(--itps-primary-900);
--danger-foreground: var(--itps-base-950);
/* Success (estado de sucesso) */
--success: var(--itps-success-900);
--success-foreground: var(--itps-base-0);
/* Warning (atenção, não-crítico)
fg=base-950 sobre alert-900 (#F0C653) = 12.42:1 AAA.
alert-1000 é mustard escuro pra texto sobre branco — falha sobre alert-900. */
--warning: var(--itps-alert-900);
--warning-foreground: var(--itps-base-950);
/* Info (mensagens informativas) */
--info: var(--itps-secondary-900);
--info-foreground: var(--itps-base-0);
/* --- shadcn sidebar semantic aliases ---
Usados pelo componente Sidebar do shadcn/ui e ports compatíveis. */
--sidebar: var(--background);
--sidebar-foreground: var(--foreground);
--sidebar-primary: var(--primary);
--sidebar-primary-foreground: var(--primary-foreground);
--sidebar-accent: var(--accent);
--sidebar-accent-foreground: var(--accent-foreground);
--sidebar-border: var(--border);
--sidebar-ring: var(--ring);
/* --- Radius ---
Escala Tailwind v4 default + 3 tokens semânticos por uso.
- card (12px) = containers, cards, panels
- form (999px) = buttons em formato pill
- circle (999px) = avatares, badges circulares, dots */
--radius: 0.5rem; /* shadcn alias — 8px */
--rounded-card: 0.75rem; /* 12px */
--rounded-form: 9999px; /* pill */
--rounded-circle: 9999px; /* circle / pill */
/* --- Charts (5 slots pra séries categóricas — vírus, regiões, períodos) ---
Paleta inicial mapeada pra primitives. Refinar quando dashboards forem implementados. */
--chart-1: var(--itps-secondary-900); /* azul */
--chart-2: var(--itps-success-800); /* verde */
--chart-3: var(--itps-alert-900); /* amarelo */
--chart-4: var(--itps-primary-900); /* coral */
--chart-5: var(--itps-secondary-500); /* azul claro */
/* --- Effects (shadows + blur) ---
Sombras tintadas azul institucional (secondary/opacity/950-10%).
Hierarquia: medium=cards, large=overlays, extra-large=pop-ups.
2-layer composition (sharp close + soft distant). */
--shadow-medium:
0 1px 2px 0 rgb(20 80 143 / 0.10),
0 4px 6px -1px rgb(20 80 143 / 0.10);
--shadow-large:
0 4px 6px -4px rgb(20 80 143 / 0.10),
0 10px 15px -3px rgb(20 80 143 / 0.10);
--shadow-extra-large:
0 8px 10px -6px rgb(20 80 143 / 0.10),
0 20px 25px -5px rgb(20 80 143 / 0.10);
--blur-small: 4px;
/* --- 2k. Typography (font-family) ---
Open Sans remains the preferred DS family when self-hosted or installed
locally. The docs runtime does not fetch remote font CSS; it falls back to
the system stack when Open Sans is unavailable. Aliases font-heading/font-body
deixam porta aberta pra dual-font futuro sem refactor de componentes.
DECISÃO: Tailwind defaults canonical para text-*, tracking-*, etc.
Escala documentada em /estilos/tipografia mas NÃO sobrescreve Tailwind
globalmente — preserva a11y (rem) e evita
redimensionamento automático mobile que quebraria componentes não previstos. */
--font-sans: 'Open Sans', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
--font-heading: var(--font-sans);
--font-body: var(--font-sans);
--font-mono: ui-monospace, SFMono-Regular, 'JetBrains Mono', 'Roboto Mono', Menlo, Consolas, monospace;
}
/* ==========================================================================
2z. DARK MODE
--------------------------------------------------------------------------
Estratégia: primitives ja foram redefinidos para o modo dark acima.
Aqui ficam apenas overrides semânticos onde o mesmo step nao preserva
contraste ou onde o Figma aponta outro step para o alias.
========================================================================== */
.dark {
color-scheme: dark;
--primary-foreground: var(--itps-base-0);
--secondary: var(--itps-secondary-25);
--destructive-foreground: var(--itps-base-0);
--danger-foreground: var(--itps-base-0);
--warning-foreground: var(--itps-base-0);
/* Figma secondary/opacity/950-10% em dark = #1961AC1A. */
--shadow-medium:
0 1px 2px 0 rgb(25 97 172 / 0.10),
0 4px 6px -1px rgb(25 97 172 / 0.10);
--shadow-large:
0 4px 6px -4px rgb(25 97 172 / 0.10),
0 10px 15px -3px rgb(25 97 172 / 0.10);
--shadow-extra-large:
0 8px 10px -6px rgb(25 97 172 / 0.10),
0 20px 25px -5px rgb(25 97 172 / 0.10);
}
/* ==========================================================================
3. THEME MAPPING — Tailwind v4 @theme inline
--------------------------------------------------------------------------
Expõe os semantic tokens como utilitários: bg-primary, text-foreground, etc.
`inline` é importante: sem ele, perde o suporte a opacity modifiers
(ex: bg-primary/50).
========================================================================== */
@theme inline {
/* Surfaces */
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-card: var(--card);
--color-card-foreground: var(--card-foreground);
--color-popover: var(--popover);
--color-popover-foreground: var(--popover-foreground);
/* Brand and shadcn-compatible action colors */
--color-brand: var(--brand);
--color-brand-foreground: var(--brand-foreground);
--color-primary: var(--primary);
--color-primary-foreground: var(--primary-foreground);
--color-secondary: var(--secondary);
--color-secondary-foreground: var(--secondary-foreground);
/* Neutral helpers */
--color-muted: var(--muted);
--color-muted-foreground: var(--muted-foreground);
--color-accent: var(--accent);
--color-accent-foreground: var(--accent-foreground);
/* Semantic states */
--color-destructive: var(--destructive);
--color-destructive-foreground: var(--destructive-foreground);
--color-danger: var(--danger);
--color-danger-foreground: var(--danger-foreground);
--color-success: var(--success);
--color-success-foreground: var(--success-foreground);
--color-warning: var(--warning);
--color-warning-foreground: var(--warning-foreground);
--color-info: var(--info);
--color-info-foreground: var(--info-foreground);
/* shadcn Sidebar */
--color-sidebar: var(--sidebar);
--color-sidebar-foreground: var(--sidebar-foreground);
--color-sidebar-primary: var(--sidebar-primary);
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
--color-sidebar-accent: var(--sidebar-accent);
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-ring: var(--sidebar-ring);
/* Borders / inputs */
--color-border: var(--border);
--color-input: var(--input);
--color-ring: var(--ring);
/* State-aware semantic tokens são expostos via @utility blocks abaixo
(property-scoped — bg-disabled e border-disabled podem ter valores distintos). */
/* Charts */
--color-chart-1: var(--chart-1);
--color-chart-2: var(--chart-2);
--color-chart-3: var(--chart-3);
--color-chart-4: var(--chart-4);
--color-chart-5: var(--chart-5);
/* Radius - shadcn-vue espera essas variantes calculadas a partir de --radius */
--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 4px);
/* --- Brand scales (escalas completas como utilitários) ---
Permite bg-primary-50, text-secondary-300, hover:bg-primary-100 etc.
Dark mode futuro: redefinir os primitives `--itps-*` em .dark — utilitários
se adaptam automaticamente sem tocar em nenhuma classe. */
--color-base-0: var(--itps-base-0);
--color-base-50: var(--itps-base-50);
--color-base-100: var(--itps-base-100);
--color-base-200: var(--itps-base-200);
--color-base-300: var(--itps-base-300);
--color-base-400: var(--itps-base-400);
--color-base-500: var(--itps-base-500);
--color-base-600: var(--itps-base-600);
--color-base-700: var(--itps-base-700);
--color-base-800: var(--itps-base-800);
--color-base-900: var(--itps-base-900);
--color-base-950: var(--itps-base-950);
--color-primary-50: var(--itps-primary-50);
--color-primary-100: var(--itps-primary-100);
--color-primary-200: var(--itps-primary-200);
--color-primary-300: var(--itps-primary-300);
--color-primary-400: var(--itps-primary-400);
--color-primary-500: var(--itps-primary-500);
--color-primary-600: var(--itps-primary-600);
--color-primary-700: var(--itps-primary-700);
--color-primary-800: var(--itps-primary-800);
--color-primary-900: var(--itps-primary-900);
--color-primary-950: var(--itps-primary-950);
--color-secondary-25: var(--itps-secondary-25);
--color-secondary-50: var(--itps-secondary-50);
--color-secondary-100: var(--itps-secondary-100);
--color-secondary-200: var(--itps-secondary-200);
--color-secondary-300: var(--itps-secondary-300);
--color-secondary-400: var(--itps-secondary-400);
--color-secondary-500: var(--itps-secondary-500);
--color-secondary-600: var(--itps-secondary-600);
--color-secondary-700: var(--itps-secondary-700);
--color-secondary-800: var(--itps-secondary-800);
--color-secondary-900: var(--itps-secondary-900);
--color-secondary-950: var(--itps-secondary-950);
--color-terciary-50: var(--itps-terciary-50);
--color-terciary-100: var(--itps-terciary-100);
--color-terciary-300: var(--itps-terciary-300);
--color-terciary-500: var(--itps-terciary-500);
--color-alert-100: var(--itps-alert-100);
--color-alert-200: var(--itps-alert-200);
--color-alert-600: var(--itps-alert-600);
--color-alert-800: var(--itps-alert-800);
--color-alert-900: var(--itps-alert-900);
--color-alert-950: var(--itps-alert-950);
--color-alert-1000: var(--itps-alert-1000);
--color-success-100: var(--itps-success-100);
--color-success-200: var(--itps-success-200);
--color-success-600: var(--itps-success-600);
--color-success-800: var(--itps-success-800);
--color-success-900: var(--itps-success-900);
--color-success-950: var(--itps-success-950);
/* --- Typography (font-family) ---
Expõe font-sans/font-heading/font-body como utilitários Tailwind.
`font-mono` mantido p/ blocos de código.
Sizes/tracking permanecem Tailwind defaults — não sobrescrevemos aqui. */
--font-sans: var(--font-sans);
--font-heading: var(--font-heading);
--font-body: var(--font-body);
--font-mono: var(--font-mono);
}
/* ==========================================================================
4. UTILITIES — radius, shadows, blur, typography
--------------------------------------------------------------------------
Utilities customizadas que não são geradas automaticamente por @theme.
========================================================================== */
/* --- RADIUS semantic group ---
Use no lugar de rounded-* arbitrário. Cada role tem propósito explícito. */
@utility rounded-card { border-radius: var(--rounded-card); }
@utility rounded-form { border-radius: var(--rounded-form); }
@utility rounded-circle { border-radius: var(--rounded-circle); }
/* --- EFFECTS (sombras + blur) ---
Sombras tintadas azul institucional (#14508F com 10% alpha).
Hierarquia: medium=cards, large=overlays, extra-large=pop-ups. */
@utility shadow-medium { box-shadow: var(--shadow-medium); }
@utility shadow-large { box-shadow: var(--shadow-large); }
@utility shadow-extra-large { box-shadow: var(--shadow-extra-large); }
/* Aliases por use-case */
@utility shadow-card { box-shadow: var(--shadow-medium); }
@utility shadow-overlay { box-shadow: var(--shadow-large); }
@utility shadow-popup { box-shadow: var(--shadow-extra-large); }
@utility backdrop-blur-small { backdrop-filter: blur(var(--blur-small)); }
/* --- TYPOGRAPHY: italic combos + body/heading shortcuts ---
Designer nomeia presets compostos: italic-semibold (italic+600), italic-bold (italic+700).
Reproduz como @utility pra evitar repetir `italic font-semibold` em componentes. */
@utility italic-semibold {
font-style: italic;
font-weight: 600;
}
@utility italic-bold {
font-style: italic;
font-weight: 700;
}
Classes prontas .itps-btn, .itps-card, .itps-chip, .itps-input, .itps-callout — atalhos usados pelos exemplos do /componentes.
components.css
/* ==========================================================================
Sinapse styles — Component classes
--------------------------------------------------------------------------
Framework-agnostic. Each app (Astro / Vue / React / Nuxt) writes a thin
markup wrapper that just applies these classes — zero JS variant engine,
zero runtime, zero per-framework lib to publish.
Naming: BEM-ish with `itps-` prefix to avoid collisions.
.itps-btn ← base
.itps-btn--primary ← variant
.itps-btn--sm ← size
.itps-btn:disabled ← disabled state
Implementation: Tailwind v4 `@layer components` so consumers can still
override with utilities at the call site.
Tokens used (CANONICAL Layer 3 — shadcn aliases):
bg-background, bg-card, bg-muted, bg-popover, bg-accent
text-foreground, text-muted-foreground, text-card-foreground
bg-primary, text-primary-foreground
bg-secondary, text-secondary-foreground
bg-destructive, text-destructive-foreground
border-border, border-input, ring-ring
Feedback semantic utilities:
bg-success, text-success-foreground, bg-warning, text-warning-foreground, etc
========================================================================== */
@layer components {
/* --- Button -------------------------------------------------------------- */
/* Sizes alinham com form-height tokens do DS:
sm = 40px, md = 48px (default), lg = 56px.
Figma define gap default=20px, small/large=8px. */
.itps-btn {
@apply inline-flex cursor-pointer items-center justify-center gap-5 select-none whitespace-nowrap
h-12 px-5
rounded-form
text-base font-semibold leading-normal
transition-colors duration-150
focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-ring
disabled:cursor-not-allowed;
}
.itps-btn[aria-busy="true"] {
padding-left: 1rem;
}
.itps-btn[aria-busy="true"] > .ti-loader-2 {
display: inline-flex;
inline-size: 1.5rem;
align-items: center;
justify-content: center;
}
/* Primary — spec Figma "action / button / primary":
default = surface secondary + outline coral + texto azul institucional + ícones coral,
hover = primary/background/inverse + primary/text/inverse,
disabled/loading = base/background-disabled + base/border-disabled + base/text-disabled. */
.itps-btn--primary {
@apply bg-secondary text-info
border border-brand
hover:bg-brand hover:text-brand-foreground hover:border-brand
active:bg-brand active:text-brand-foreground active:border-brand
disabled:bg-card disabled:text-base-300 disabled:border-border
disabled:hover:bg-card disabled:hover:text-base-300 disabled:hover:border-border;
}
.itps-btn--primary > .ti { color: var(--brand); }
.itps-btn--primary:hover:not(:disabled):not([aria-disabled="true"]) > .ti { color: var(--brand-foreground); }
.itps-btn--primary:active:not(:disabled):not([aria-disabled="true"]) > .ti { color: var(--brand-foreground); }
.itps-btn--primary[aria-disabled="true"],
.itps-btn--primary[aria-disabled="true"]:hover {
border-color: var(--border);
background-color: var(--card);
color: var(--itps-base-300);
}
.itps-btn--primary:disabled > .ti,
.itps-btn--primary[aria-disabled="true"] > .ti { color: var(--itps-base-300); }
/* Outline — variante contornada transparente para menor peso visual. */
.itps-btn--outline {
@apply bg-transparent text-info
border border-brand
hover:bg-brand hover:text-brand-foreground hover:border-brand
active:bg-brand active:text-brand-foreground active:border-brand
disabled:bg-card disabled:text-base-300 disabled:border-border
disabled:hover:bg-card disabled:hover:text-base-300 disabled:hover:border-border;
}
.itps-btn--outline > .ti { color: var(--brand); }
.itps-btn--outline:hover:not(:disabled):not([aria-disabled="true"]) > .ti { color: var(--brand-foreground); }
.itps-btn--outline:active:not(:disabled):not([aria-disabled="true"]) > .ti { color: var(--brand-foreground); }
.itps-btn--outline[aria-disabled="true"],
.itps-btn--outline[aria-disabled="true"]:hover {
border-color: var(--border);
background-color: var(--card);
color: var(--itps-base-300);
}
.itps-btn--outline:disabled > .ti,
.itps-btn--outline[aria-disabled="true"] > .ti { color: var(--itps-base-300); }
.itps-btn--secondary {
@apply bg-secondary text-secondary-foreground
hover:bg-secondary-200
active:bg-secondary-300
disabled:bg-muted disabled:text-muted-foreground;
}
.itps-btn--ghost {
@apply bg-transparent text-foreground
hover:bg-accent
active:bg-muted
disabled:text-muted-foreground disabled:hover:bg-transparent;
}
.itps-btn--sm { @apply h-10 gap-2 px-4 text-sm; }
.itps-btn--lg { @apply h-14 gap-2 px-6 text-xl; }
.itps-btn--sm[aria-busy="true"] { padding-left: 0.875rem; }
.itps-btn--lg[aria-busy="true"] { padding-left: 1.25rem; }
.itps-btn--icon { @apply w-12 px-0; }
.itps-btn--icon.itps-btn--sm { @apply w-10; }
.itps-btn--icon.itps-btn--lg { @apply w-14; }
/* --- Card ---------------------------------------------------------------- */
.itps-card {
@apply rounded-card border border-border bg-card text-card-foreground p-6;
}
.itps-card--flat {
@apply border-transparent bg-background p-0 shadow-none;
}
.itps-card--elevated {
@apply border-transparent shadow-card;
}
/* --- Feature Card ------------------------------------------------------- */
.itps-feature-card {
@apply flex min-w-0 flex-col gap-3 overflow-hidden rounded-card
bg-secondary p-6 text-foreground transition-colors duration-150
md:p-7;
}
a.itps-feature-card,
.itps-feature-card[href] {
@apply hover:bg-secondary-200
focus-visible:outline-none focus-visible:ring-2
focus-visible:ring-ring focus-visible:ring-offset-2;
}
.itps-feature-card__header {
@apply flex min-w-0 items-start justify-between gap-4;
}
.itps-feature-card__title {
@apply min-w-0 break-words font-sans text-xl font-medium leading-tight
text-brand md:text-2xl;
}
.itps-feature-card__icon {
@apply mt-1 shrink-0 leading-none text-foreground/70 transition-colors;
}
.itps-feature-card:hover .itps-feature-card__icon {
@apply text-foreground;
}
.itps-feature-card__description {
@apply max-w-[52ch] break-words font-sans text-sm leading-relaxed
text-foreground/80 md:text-base;
}
/* --- Wavy Divider ------------------------------------------------------- */
.itps-wavy-divider {
@apply my-16 w-full text-secondary-300;
line-height: 0;
}
.itps-wavy-divider > svg {
display: block;
width: 100%;
}
/* --- Footer ------------------------------------------------------------- */
.itps-footer {
@apply mx-auto w-full max-w-6xl px-6 pb-8 pt-16 md:px-12;
}
.itps-footer__grid {
@apply grid grid-cols-1 gap-10 md:flex md:items-start md:justify-between md:gap-16;
}
.itps-footer__summary {
@apply md:max-w-md;
}
.itps-footer__description {
@apply font-sans text-sm leading-relaxed text-muted-foreground;
}
.itps-footer__column-title {
@apply mb-4 font-sans text-sm font-medium text-foreground;
}
.itps-footer .itps-footer__list {
@apply m-0 list-none space-y-2 p-0;
}
.itps-footer__link {
@apply font-sans text-sm text-muted-foreground transition-colors
hover:text-foreground hover:underline
focus-visible:outline-none focus-visible:ring-2
focus-visible:ring-ring focus-visible:ring-offset-2;
}
.itps-footer__text {
@apply font-sans text-sm text-muted-foreground;
}
.itps-footer__legal {
@apply mt-12 flex flex-col gap-4 border-t border-border pt-6
md:flex-row md:items-center md:justify-between;
}
.itps-footer__legal-text {
@apply font-sans text-sm text-muted-foreground;
}
.itps-footer .itps-footer__legal-links {
@apply m-0 flex shrink-0 list-none flex-wrap gap-x-6 gap-y-2 p-0
md:justify-end;
}
.itps-footer .itps-footer__list > li,
.itps-footer .itps-footer__legal-links > li {
@apply m-0 list-none p-0;
}
/* --- Avatar ------------------------------------------------------------- */
.itps-avatar {
--itps-avatar-size: 3.5rem;
--itps-avatar-icon-size: 1.5rem;
--itps-avatar-initials-size: 1rem;
@apply relative inline-flex shrink-0 items-center justify-center overflow-hidden
bg-secondary text-brand;
width: var(--itps-avatar-size);
height: var(--itps-avatar-size);
}
.itps-avatar--user {
@apply rounded-circle;
}
.itps-avatar--company,
.itps-avatar--system {
border-radius: var(--rounded-card);
}
.itps-avatar--system {
@apply border border-secondary bg-background text-secondary-foreground;
}
.itps-avatar--sm {
--itps-avatar-size: 2rem;
--itps-avatar-icon-size: 0.875rem;
--itps-avatar-initials-size: 0.75rem;
}
.itps-avatar--md {
--itps-avatar-size: 2.5rem;
--itps-avatar-icon-size: 1rem;
--itps-avatar-initials-size: 0.875rem;
}
.itps-avatar--lg {
--itps-avatar-size: 5rem;
--itps-avatar-icon-size: 2rem;
--itps-avatar-initials-size: 1.5rem;
}
.itps-avatar__image {
@apply absolute inset-0 h-full w-full object-cover;
border-radius: inherit;
}
.itps-avatar__initials {
@apply font-sans font-semibold leading-none;
font-size: var(--itps-avatar-initials-size);
}
.itps-avatar__icon {
@apply leading-none;
font-size: var(--itps-avatar-icon-size);
}
/* --- Field (form row) ---------------------------------------------------- */
.itps-field {
@apply flex flex-col gap-1;
}
.itps-field__label {
@apply flex items-baseline gap-1 pl-4
font-sans text-xs leading-tight text-foreground;
}
.itps-field__required {
@apply text-brand leading-none;
}
.itps-field__tooltip {
@apply inline-flex h-4 w-4 shrink-0 items-center justify-center
rounded-circle bg-secondary/5 text-[10px] font-semibold leading-none text-secondary-foreground;
}
.itps-field__hint {
@apply px-5 text-sm text-muted-foreground;
}
.itps-field__error {
@apply flex items-center gap-1 px-5 text-sm text-destructive;
}
/* --- Input --------------------------------------------------------------- */
.itps-input {
@apply w-full h-10 px-3
rounded-form
border border-input bg-background
text-sm text-foreground
placeholder:text-muted-foreground
transition-colors
focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring
disabled:cursor-not-allowed disabled:bg-muted disabled:opacity-60;
}
.itps-input--error {
@apply border-destructive focus-visible:ring-destructive;
}
/* --- TextField ---------------------------------------------------------- */
.itps-textfield {
@apply inline-flex h-12 w-full items-center gap-1 rounded-form border
bg-background px-4 transition-colors duration-150;
border-color: var(--border);
}
.itps-textfield:hover:not(.is-disabled):not(.is-invalid) {
@apply bg-muted;
}
.itps-textfield:focus-within:not(.is-disabled):not(.is-invalid) {
@apply border-secondary-900 bg-background;
}
.itps-textfield.is-disabled {
@apply cursor-not-allowed border-border bg-muted;
}
.itps-textfield.is-invalid {
@apply border-destructive focus-within:border-destructive;
}
.itps-textfield--sm {
@apply h-10 px-3.5;
}
.itps-textfield--lg {
@apply h-14 gap-2 px-4;
}
.itps-textfield__input {
@apply min-w-0 flex-1 bg-transparent outline-none
font-sans text-base leading-normal
text-foreground placeholder:text-muted-foreground
disabled:cursor-not-allowed disabled:text-muted-foreground
disabled:placeholder:text-muted-foreground/50;
}
.itps-textfield--sm .itps-textfield__input {
@apply text-sm;
}
.itps-textfield__icon {
@apply shrink-0 leading-none text-secondary-foreground;
}
.itps-textfield__icon--danger {
@apply text-destructive;
}
.itps-textfield.is-disabled .itps-textfield__icon {
@apply text-muted-foreground/50;
}
/* --- Search ------------------------------------------------------------- */
.itps-search {
@apply inline-flex h-12 w-full items-center gap-3 rounded-form border
border-input bg-background px-6 transition-colors duration-150;
}
.itps-search:hover {
border-color: var(--secondary);
}
.itps-search:focus-within {
border-color: var(--itps-secondary-900);
}
.itps-search--sm {
@apply h-10 gap-2 px-4;
}
.itps-search--lg {
@apply h-14 gap-3 px-6;
}
.itps-search--floating {
@apply shadow-large;
}
.itps-search__icon {
@apply shrink-0 leading-none text-secondary-700 transition-colors duration-150;
}
.itps-search:hover .itps-search__icon,
.itps-search:focus-within .itps-search__icon {
@apply text-secondary-foreground;
}
.itps-search__label {
@apply shrink-0 font-sans text-sm font-semibold leading-tight
text-muted-foreground transition-colors duration-150;
}
.itps-search:hover .itps-search__label,
.itps-search:focus-within .itps-search__label {
@apply text-secondary-foreground;
}
.itps-search:has(.itps-search__input:not(:placeholder-shown)) .itps-search__label {
@apply text-muted-foreground;
}
.itps-search__input {
@apply min-w-0 flex-1 bg-transparent font-sans text-base leading-normal
text-secondary-foreground outline-none placeholder:text-secondary-700;
}
.itps-search--sm .itps-search__input {
@apply text-sm;
}
.itps-search__input::-webkit-search-cancel-button {
display: none;
}
.itps-search__clear {
@apply shrink-0 cursor-pointer border-0 bg-transparent p-0 leading-none
text-secondary-700 opacity-0 transition-colors duration-150;
pointer-events: none;
}
.itps-search__clear:hover {
@apply text-secondary-foreground;
}
.itps-search:has(.itps-search__input:not(:placeholder-shown)) .itps-search__clear {
@apply opacity-100;
pointer-events: auto;
}
/* --- Select ------------------------------------------------------------- */
.itps-select {
@apply relative w-full;
}
.itps-select__trigger {
@apply inline-flex h-12 w-full cursor-pointer items-center gap-1 rounded-form border
border-input bg-background px-4 font-sans text-base leading-normal
transition-colors duration-150;
}
.itps-select__trigger:hover:not(:disabled):not([aria-invalid="true"]) {
border-color: var(--secondary);
@apply bg-muted;
}
.itps-select__trigger:focus-visible:not(:disabled),
.itps-select__trigger[aria-expanded="true"]:not(:disabled) {
border-color: var(--itps-secondary-900);
@apply bg-background outline-none;
}
.itps-select__trigger[aria-invalid="true"]:not(:disabled) {
@apply border-destructive;
}
.itps-select__trigger:disabled {
@apply cursor-not-allowed border-border bg-muted;
}
.itps-select--sm .itps-select__trigger {
@apply h-10 px-3.5 text-sm;
}
.itps-select--lg .itps-select__trigger {
@apply h-14 gap-2 px-4;
}
.itps-select__icon,
.itps-select__chevron,
.itps-select__invalid-icon {
@apply shrink-0 leading-none transition-colors duration-150;
}
.itps-select__icon,
.itps-select__chevron {
@apply text-secondary-foreground;
}
.itps-select__invalid-icon {
@apply text-destructive;
}
.itps-select__trigger:disabled .itps-select__icon,
.itps-select__trigger:disabled .itps-select__chevron {
@apply text-muted-foreground/50;
}
.itps-select[data-state="open"] .itps-select__chevron {
transform: rotate(180deg);
}
.itps-select__value {
@apply min-w-0 flex-1 truncate pl-1 text-left text-foreground;
}
.itps-select__value[data-placeholder="true"] {
@apply text-muted-foreground;
}
.itps-select__trigger:disabled .itps-select__value {
@apply text-muted-foreground;
}
.itps-select__trigger:disabled .itps-select__value[data-placeholder="true"] {
@apply text-muted-foreground/50;
}
.itps-select__input {
@apply hidden;
}
.itps-select__panel {
@apply absolute left-0 right-0 top-full z-50 mt-2 flex-col gap-0
max-h-64 overflow-y-auto rounded-2xl border border-border
bg-background p-1 shadow-large outline-none;
display: none;
}
.itps-select[data-state="open"] .itps-select__panel {
display: flex;
}
.itps-select__option {
@apply flex cursor-pointer items-center rounded-xl px-5 py-3 outline-none
transition-colors duration-100
hover:bg-muted focus-visible:bg-muted;
}
.itps-select__option[aria-selected="true"] {
@apply bg-secondary;
}
.itps-select__option[aria-selected="true"]:hover,
.itps-select__option[aria-selected="true"]:focus-visible {
@apply bg-secondary/80;
}
.itps-select__option-content {
@apply flex min-w-0 flex-1 flex-col gap-1 text-left;
}
.itps-select__option-label {
@apply truncate text-sm font-semibold leading-normal text-foreground;
}
.itps-select__option[aria-selected="true"] .itps-select__option-label {
@apply text-secondary-foreground;
}
.itps-select__option-description {
@apply truncate text-xs leading-normal text-muted-foreground;
}
/* --- Checkbox ----------------------------------------------------------- */
.itps-checkbox {
@apply inline-flex cursor-pointer select-none items-center gap-2;
}
.itps-checkbox:has(.itps-checkbox__input:disabled) {
@apply cursor-not-allowed;
}
.itps-checkbox__input {
@apply sr-only;
}
.itps-checkbox__box {
@apply inline-flex h-6 w-6 shrink-0 items-center justify-center
rounded-sm border border-input bg-background
transition-colors duration-150;
}
.itps-checkbox:hover .itps-checkbox__box {
border-color: var(--secondary);
@apply bg-muted;
}
.itps-checkbox__input:focus-visible + .itps-checkbox__box {
@apply outline-2 outline-offset-2 outline-ring;
}
.itps-checkbox__input:checked + .itps-checkbox__box {
@apply border-secondary-900 bg-secondary-950;
}
.itps-checkbox__input:disabled + .itps-checkbox__box {
@apply border-border bg-muted;
}
.itps-checkbox.is-invalid .itps-checkbox__box,
.itps-checkbox__input[aria-invalid="true"] + .itps-checkbox__box {
@apply border-destructive;
}
.itps-checkbox.is-invalid:hover .itps-checkbox__box,
.itps-checkbox:has(.itps-checkbox__input[aria-invalid="true"]):hover .itps-checkbox__box {
@apply border-destructive bg-background;
}
.itps-checkbox__check {
@apply leading-none text-white opacity-0 transition-opacity duration-150;
}
.itps-checkbox__input:checked + .itps-checkbox__box .itps-checkbox__check {
@apply opacity-100;
}
.itps-checkbox__input:disabled + .itps-checkbox__box .itps-checkbox__check,
.itps-checkbox__input:checked:disabled + .itps-checkbox__box .itps-checkbox__check {
@apply text-muted-foreground/50;
}
.itps-checkbox__label {
@apply font-sans text-base leading-normal text-muted-foreground
transition-colors duration-150;
}
.itps-checkbox:has(.itps-checkbox__input:checked) .itps-checkbox__label {
@apply text-secondary-foreground;
}
.itps-checkbox:has(.itps-checkbox__input:disabled) .itps-checkbox__label {
@apply text-muted-foreground/50;
}
.itps-checkbox:has(.itps-checkbox__input:checked:disabled) .itps-checkbox__label {
@apply text-muted-foreground;
}
.itps-checkbox-group {
@apply flex flex-col gap-2;
}
.itps-checkbox-group__legend {
@apply mb-1 font-sans text-sm font-medium text-foreground;
}
/* --- Switch ------------------------------------------------------------- */
.itps-switch {
@apply inline-flex cursor-pointer select-none items-center gap-2;
}
.itps-switch:has(.itps-switch__input:disabled) {
@apply cursor-not-allowed;
}
.itps-switch__control {
@apply relative inline-block h-6 w-12 shrink-0;
}
.itps-switch__input {
@apply absolute inset-0 z-10 h-full w-full cursor-pointer appearance-none opacity-0
disabled:cursor-not-allowed;
}
.itps-switch__track {
@apply pointer-events-none absolute inset-0 rounded-form border-2
border-secondary-100 bg-background transition-colors duration-150;
}
.itps-switch:hover .itps-switch__track {
@apply bg-muted;
}
.itps-switch__input:focus-visible + .itps-switch__track {
@apply outline-2 outline-offset-2 outline-ring;
}
.itps-switch__input:checked + .itps-switch__track {
@apply border-secondary-900 bg-secondary-900;
}
.itps-switch:hover .itps-switch__input:checked + .itps-switch__track {
@apply bg-secondary-900;
}
.itps-switch__input:disabled + .itps-switch__track {
@apply border-border bg-muted;
}
.itps-switch__input:checked:disabled + .itps-switch__track {
@apply border-base-200 bg-base-200;
}
.itps-switch__thumb {
@apply pointer-events-none absolute left-0.75 top-0.75 h-4.5 w-4.5
rounded-circle bg-secondary-500 transition-all duration-150;
}
.itps-switch__input:checked ~ .itps-switch__thumb {
@apply translate-x-6 bg-background;
}
.itps-switch__input:disabled ~ .itps-switch__thumb {
@apply bg-base-300;
}
.itps-switch__input:checked:disabled ~ .itps-switch__thumb {
@apply bg-background;
}
.itps-switch__label {
@apply font-sans text-base leading-normal text-muted-foreground
transition-colors duration-150;
}
.itps-switch:has(.itps-switch__input:checked) .itps-switch__label {
@apply text-secondary-foreground;
}
.itps-switch:has(.itps-switch__input:disabled) .itps-switch__label {
@apply text-muted-foreground/50;
}
.itps-switch:has(.itps-switch__input:checked:disabled) .itps-switch__label {
@apply text-muted-foreground;
}
/* --- Nav Icon ----------------------------------------------------------- */
.itps-nav-icon {
@apply inline-flex shrink-0 items-center justify-center;
width: 18px;
height: 18px;
font-size: 18px;
line-height: 1;
color: currentColor;
fill: currentColor;
}
.itps-nav-icon--sm {
width: 16px;
height: 16px;
font-size: 16px;
}
.itps-nav-icon--lg {
width: 24px;
height: 24px;
font-size: 24px;
}
.itps-nav-icon--xl {
width: 32px;
height: 32px;
font-size: 32px;
}
/* --- Pagination --------------------------------------------------------- */
.itps-pagination {
@apply inline-flex items-center gap-2;
}
.itps-pagination__button {
@apply inline-flex h-8 w-8 items-center justify-center
rounded-full bg-transparent
text-foreground
transition-colors duration-150
hover:bg-secondary hover:text-brand
focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring
disabled:cursor-not-allowed disabled:bg-muted disabled:text-muted-foreground disabled:opacity-50
disabled:hover:bg-muted disabled:hover:text-muted-foreground;
}
.itps-pagination__button--boundary {
@apply border border-border bg-secondary text-secondary-foreground hover:bg-muted hover:text-brand;
}
.itps-pagination__input {
@apply h-8 w-12 rounded-full
border border-input bg-background
px-2 text-center text-sm leading-none text-foreground
transition-colors
focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring
disabled:cursor-not-allowed disabled:bg-muted disabled:opacity-60;
appearance: textfield;
}
.itps-pagination__input::-webkit-inner-spin-button,
.itps-pagination__input::-webkit-outer-spin-button {
appearance: none;
}
.itps-pagination__label {
@apply text-sm leading-none text-muted-foreground;
}
/* --- Breadcrumb --------------------------------------------------------- */
.itps-breadcrumb {
@apply min-w-0 max-w-full;
}
.itps-breadcrumb__list {
@apply flex flex-wrap items-center gap-1 text-xs text-muted-foreground;
}
.itps-breadcrumb__item {
@apply inline-flex min-w-0 items-center;
}
.itps-breadcrumb__link,
.itps-breadcrumb__page {
@apply inline-flex h-6 min-w-0 items-center gap-1.5 rounded-xs
px-2 font-sans text-xs leading-none;
}
.itps-breadcrumb__link {
@apply text-muted-foreground
transition-colors duration-150
hover:bg-secondary hover:text-brand
focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring;
}
.itps-breadcrumb__page {
@apply font-semibold text-muted-foreground;
}
.itps-breadcrumb__ellipsis {
@apply inline-flex h-6 min-w-6 cursor-pointer items-center justify-center rounded-xs
border-0 bg-transparent px-2 font-sans text-xs leading-none text-muted-foreground
transition-colors duration-150
hover:bg-secondary hover:text-brand
focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring;
}
.itps-breadcrumb__separator {
@apply inline-flex h-6 w-4 shrink-0 items-center justify-center text-muted-foreground/50;
}
/* --- Tabs --------------------------------------------------------------- */
.itps-tabs {
@apply flex min-w-0 max-w-full flex-col;
}
.itps-tabs__list {
@apply flex min-w-0 items-end gap-1 overflow-x-auto overflow-y-hidden pl-2;
box-shadow: inset 0 -1px 0 var(--border);
scrollbar-width: none;
}
.itps-tabs__list::-webkit-scrollbar {
display: none;
}
.itps-tabs__trigger {
@apply relative -mb-px inline-flex h-9 shrink-0 cursor-pointer items-center gap-2
whitespace-nowrap rounded-t-xl border border-b-0 border-transparent
bg-transparent px-4 font-sans text-xs font-medium leading-none
text-muted-foreground transition-colors duration-150
hover:text-brand
focus-visible:z-10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring;
}
.itps-tabs__trigger[aria-selected="true"] {
@apply z-10 border-border bg-background text-brand;
}
.itps-tabs__trigger[aria-selected="true"]::after {
content: "";
position: absolute;
right: 0;
bottom: 0;
left: 0;
height: 1px;
background: var(--background);
}
.itps-tabs__panel {
@apply p-4 text-sm text-foreground
focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring;
}
/* --- Tag ---------------------------------------------------------------- */
.itps-tag {
--itps-tag-icon-size: 1rem;
@apply inline-flex h-8 shrink-0 items-center gap-2 whitespace-nowrap rounded-form
border border-secondary bg-secondary px-4 font-sans text-sm font-semibold
leading-normal text-secondary-foreground;
}
.itps-tag--default {
@apply border-secondary bg-secondary text-secondary-foreground;
}
.itps-tag--success {
@apply border-success bg-success/15 text-success;
}
.itps-tag--alert {
@apply border-warning bg-warning text-foreground;
}
.itps-tag--danger {
@apply border-destructive bg-destructive text-background;
}
.itps-tag--disabled {
@apply border-border bg-muted text-muted-foreground;
}
.itps-tag--xs {
--itps-tag-icon-size: 0.75rem;
@apply h-6 gap-1.5 px-3 text-xs;
}
.itps-tag--sm {
--itps-tag-icon-size: 1rem;
@apply h-8 gap-2 px-4 text-sm;
}
.itps-tag--md {
--itps-tag-icon-size: 1.25rem;
@apply h-10 gap-2 px-5 text-base;
}
.itps-tag--lg {
--itps-tag-icon-size: 1.25rem;
@apply h-12 gap-2 px-6 text-xl;
}
.itps-tag__icon {
@apply leading-none;
font-size: var(--itps-tag-icon-size);
}
/* --- Chip --------------------------------------------------------------- */
.itps-chip {
@apply inline-flex h-8 shrink-0 cursor-pointer select-none items-center justify-center
gap-2 whitespace-nowrap rounded-form border border-transparent bg-secondary px-4
font-sans text-xs font-semibold leading-none text-secondary-foreground
transition-colors duration-150
hover:bg-secondary-200
focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2;
}
.itps-chip[aria-pressed="true"],
.itps-chip.is-selected {
@apply border-primary-200 bg-primary-100 text-brand hover:bg-primary-200;
}
.itps-chip:disabled,
.itps-chip[aria-disabled="true"],
.itps-chip.is-disabled {
@apply cursor-not-allowed border-border bg-muted text-muted-foreground
hover:bg-muted;
}
.itps-chip__icon,
.itps-chip__dismiss {
@apply shrink-0 leading-none;
}
.itps-chip__label {
@apply min-w-0 truncate;
}
.itps-chip__separator {
@apply h-4 w-px bg-primary-200;
}
.itps-chip__severity {
@apply inline-flex items-center gap-1 font-normal;
}
.itps-chip__severity--positive {
@apply text-success;
}
.itps-chip__severity--negative {
@apply text-destructive;
}
.itps-chip__severity--neutral {
@apply text-secondary-foreground;
}
.itps-chip__trend {
@apply leading-none;
}
/* Legacy aliases kept for existing non-component pages until they migrate to Tag. */
.itps-chip--primary { @apply bg-primary-100 text-brand; }
.itps-chip--success { @apply bg-success/15 text-success; }
.itps-chip--warning { @apply bg-warning/20 text-warning-foreground; }
.itps-chip--danger { @apply bg-destructive/15 text-destructive; }
/* --- Data Overlay ------------------------------------------------------- */
.itps-data-overlay {
@apply relative inline-flex w-80 max-w-full flex-col rounded-xl border
border-secondary bg-background shadow-large;
}
.itps-data-overlay__header {
@apply flex items-center justify-between gap-3 rounded-t-xl bg-secondary px-4 py-3;
}
.itps-data-overlay__heading {
@apply flex min-w-0 flex-col gap-1;
}
.itps-data-overlay__title {
@apply truncate font-sans text-xl font-semibold leading-tight text-foreground;
}
.itps-data-overlay__description {
@apply truncate font-sans text-sm leading-normal text-secondary-700;
}
.itps-data-overlay__current {
@apply flex items-baseline justify-between bg-secondary px-4 py-3;
}
.itps-data-overlay__label {
@apply font-sans text-sm font-semibold leading-normal text-muted-foreground;
}
.itps-data-overlay__value {
@apply inline-flex items-center gap-2;
}
.itps-data-overlay__trend {
@apply leading-none text-secondary-foreground;
}
.itps-data-overlay__number {
@apply font-sans text-xl font-semibold leading-normal text-secondary-foreground;
}
.itps-data-overlay__body {
@apply px-4 py-5;
}
.itps-data-overlay__pin {
@apply absolute -bottom-[11px] left-1/2 h-[22px] w-[22px] -translate-x-1/2
rotate-45 rounded-br-[2px] border-b border-r border-secondary bg-background;
}
.itps-data-overlay--alert {
@apply border-warning;
}
.itps-data-overlay--alert .itps-data-overlay__header,
.itps-data-overlay--alert .itps-data-overlay__current {
@apply bg-warning/15;
}
.itps-data-overlay--alert .itps-data-overlay__description {
@apply text-muted-foreground;
}
.itps-data-overlay--alert .itps-data-overlay__trend,
.itps-data-overlay--alert .itps-data-overlay__number {
@apply text-warning;
}
.itps-data-overlay--alert .itps-data-overlay__pin {
@apply border-warning;
}
.itps-data-overlay--danger {
@apply border-destructive;
}
.itps-data-overlay--danger .itps-data-overlay__header,
.itps-data-overlay--danger .itps-data-overlay__current {
@apply bg-destructive/15;
}
.itps-data-overlay--danger .itps-data-overlay__description {
@apply text-muted-foreground;
}
.itps-data-overlay--danger .itps-data-overlay__trend,
.itps-data-overlay--danger .itps-data-overlay__number {
@apply text-destructive;
}
.itps-data-overlay--danger .itps-data-overlay__pin {
@apply border-destructive;
}
/* --- Risk Classification ------------------------------------------------ */
.itps-risk-classification {
@apply flex w-full max-w-3xl flex-col gap-6 rounded-card border border-border
bg-background p-6 shadow-medium md:flex-row md:items-stretch md:gap-8;
}
.itps-risk-classification__summary {
@apply flex w-full flex-col gap-4 md:w-72 md:shrink-0;
}
.itps-risk-classification__copy {
@apply flex flex-col gap-3;
}
.itps-risk-classification__metric {
@apply whitespace-nowrap font-sans text-4xl font-semibold leading-tight
text-secondary-foreground;
}
.itps-risk-classification__body {
@apply font-sans text-sm leading-normal text-foreground;
}
.itps-risk-classification__divider {
@apply h-px w-full bg-border md:h-auto md:w-px md:self-stretch;
}
.itps-risk-classification__analysis {
@apply flex-1 font-sans text-sm leading-normal text-muted-foreground;
}
.itps-risk-classification--success .itps-risk-classification__metric {
@apply text-success;
}
.itps-risk-classification--alert .itps-risk-classification__metric {
@apply text-warning;
}
.itps-risk-classification--danger .itps-risk-classification__metric {
@apply text-destructive;
}
/* --- Link ---------------------------------------------------------------- */
.itps-link {
@apply inline-flex items-center gap-1
px-0.5 py-px
font-sans text-sm font-semibold leading-normal whitespace-nowrap
border-b border-transparent
text-secondary-foreground
transition-colors duration-150
hover:text-brand hover:border-brand
focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:rounded-sm;
}
.itps-link--xs { @apply text-xs; }
.itps-link--sm { @apply text-sm; }
.itps-link--lg { @apply gap-2 text-xl; }
.itps-link.is-disabled,
.itps-link[aria-disabled="true"] {
@apply cursor-not-allowed text-muted-foreground/50 hover:text-muted-foreground/50 hover:border-transparent;
}
/* --- Callout ------------------------------------------------------------- */
.itps-callout {
@apply flex w-full items-start gap-3 rounded-card border border-border
bg-card p-4 text-card-foreground;
}
.itps-callout--sm {
@apply items-center px-3 py-2;
}
.itps-callout--md,
.itps-callout--lg {
@apply p-4;
}
.itps-callout--lg {
@apply flex-wrap sm:flex-nowrap;
}
.itps-callout--info,
.itps-callout--default {
@apply border-info/30 bg-info/10 text-foreground;
}
.itps-callout--success {
@apply border-success/30 bg-success/10 text-foreground;
}
.itps-callout--alert,
.itps-callout--warning {
@apply border-warning/30 bg-warning/15 text-foreground;
}
.itps-callout--danger {
@apply border-destructive/30 bg-destructive/10 text-foreground;
}
.itps-callout__icon {
@apply mt-0.5 inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-circle;
}
.itps-callout--sm .itps-callout__icon {
@apply mt-0 h-6 w-6;
}
.itps-callout--info .itps-callout__icon,
.itps-callout--default .itps-callout__icon {
@apply border border-secondary bg-background text-secondary-foreground;
}
.itps-callout--success .itps-callout__icon {
@apply bg-success text-success-foreground;
}
.itps-callout--alert .itps-callout__icon,
.itps-callout--warning .itps-callout__icon {
@apply bg-warning text-warning-foreground;
}
.itps-callout--danger .itps-callout__icon {
@apply bg-destructive text-destructive-foreground;
}
.itps-callout__content {
@apply flex min-w-0 flex-1 flex-col gap-2;
}
.itps-callout--sm .itps-callout__content {
@apply flex-row items-center justify-between gap-2;
}
.itps-callout--lg .itps-callout__content {
@apply sm:flex-row sm:items-start sm:justify-between sm:gap-6;
}
.itps-callout__body {
@apply flex min-w-0 flex-1 flex-col gap-1;
}
.itps-callout__title {
@apply font-sans text-sm font-semibold leading-tight text-foreground;
}
.itps-callout--sm .itps-callout__title {
@apply truncate text-xs;
}
.itps-callout--lg .itps-callout__title {
@apply text-base;
}
.itps-callout--info .itps-callout__title,
.itps-callout--default .itps-callout__title {
@apply text-secondary-foreground;
}
.itps-callout--success .itps-callout__title {
@apply text-success;
}
.itps-callout--alert .itps-callout__title,
.itps-callout--warning .itps-callout__title {
@apply text-warning;
}
.itps-callout--danger .itps-callout__title {
@apply text-destructive;
}
.itps-callout__description {
@apply font-sans text-xs leading-normal text-foreground;
}
.itps-callout--lg .itps-callout__description {
@apply text-sm;
}
.itps-callout__action {
@apply inline-flex shrink-0 items-center gap-1 self-start px-0.5 font-sans text-xs font-semibold
leading-normal text-secondary-foreground hover:underline
focus-visible:rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring;
}
.itps-callout--lg .itps-callout__action {
@apply text-sm;
}
/* --- Banner ------------------------------------------------------------- */
.itps-banner {
@apply flex min-h-12 w-full flex-wrap items-start gap-3
px-4 py-2 text-foreground sm:flex-nowrap sm:items-center sm:px-6 lg:px-20;
}
.itps-banner--info {
@apply bg-secondary text-secondary-foreground;
}
.itps-banner--success {
@apply bg-success text-success-foreground;
}
.itps-banner--alert {
@apply bg-warning text-warning-foreground;
}
.itps-banner--error {
@apply bg-destructive text-destructive-foreground;
}
.itps-banner__icon {
@apply inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-circle;
}
.itps-banner--info .itps-banner__icon {
@apply border border-secondary bg-secondary text-secondary-foreground;
}
.itps-banner--success .itps-banner__icon {
@apply bg-success text-success-foreground;
}
.itps-banner--alert .itps-banner__icon {
@apply bg-warning text-warning-foreground;
}
.itps-banner--error .itps-banner__icon {
@apply bg-destructive text-destructive-foreground;
}
.itps-banner__content {
@apply flex min-w-0 flex-1 flex-col gap-y-0.5
font-sans text-sm leading-normal sm:flex-row sm:flex-wrap sm:items-center sm:gap-x-2;
}
.itps-banner__title {
@apply shrink-0 font-semibold;
}
.itps-banner__text {
@apply min-w-0 flex-1;
}
.itps-banner__action {
@apply inline-flex shrink-0 basis-full items-center gap-1 px-0.5 pl-11
font-sans text-sm font-semibold leading-normal hover:underline
focus-visible:rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring
sm:basis-auto sm:pl-0;
}
/* --- Toast -------------------------------------------------------------- */
.itps-toast {
@apply flex w-full max-w-[480px] items-start gap-3 rounded-card
border border-border bg-popover p-4 text-popover-foreground shadow-large;
}
.itps-toast__icon {
@apply mt-0.5 inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-circle;
}
.itps-toast--info .itps-toast__icon {
@apply border border-secondary bg-secondary text-secondary-foreground;
}
.itps-toast--success .itps-toast__icon {
@apply bg-success text-success-foreground;
}
.itps-toast--alert .itps-toast__icon {
@apply bg-warning text-warning-foreground;
}
.itps-toast--error .itps-toast__icon {
@apply bg-destructive text-destructive-foreground;
}
.itps-toast--loading .itps-toast__icon {
@apply border border-secondary bg-secondary text-secondary-foreground;
}
.itps-toast__spinner {
@apply inline-block h-3.5 w-3.5 animate-spin rounded-circle border-2 border-current border-t-transparent;
}
.itps-toast__content {
@apply flex min-w-0 flex-1 flex-col gap-1;
}
.itps-toast__title {
@apply font-sans text-base font-semibold leading-tight text-foreground;
}
.itps-toast__description {
@apply font-sans text-sm leading-normal text-muted-foreground;
}
.itps-toast__actions {
@apply mt-1 flex flex-wrap items-center gap-x-4 gap-y-1;
}
.itps-toast__action {
@apply cursor-pointer border-0 bg-transparent px-0.5 font-sans text-xs font-semibold leading-normal
text-secondary-foreground hover:underline
focus-visible:rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring;
}
.itps-toast__close {
@apply -m-1 inline-flex h-8 w-8 shrink-0 cursor-pointer items-center justify-center
rounded-circle border-0 bg-transparent text-muted-foreground transition-colors
hover:bg-muted hover:text-foreground
focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring;
}
/* --- Tooltip ------------------------------------------------------------ */
.itps-tooltip {
@apply relative inline-flex;
}
.itps-tooltip__trigger {
@apply inline-flex h-6 w-6 shrink-0 cursor-help items-center justify-center
rounded-circle border border-secondary/20 bg-secondary/5
font-sans text-sm font-semibold leading-none text-secondary-foreground
transition-colors duration-150
hover:bg-secondary/10
focus-visible:bg-secondary/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring;
}
.itps-tooltip--sm .itps-tooltip__trigger {
@apply h-4 w-4 text-[10px];
}
.itps-tooltip__content {
@apply pointer-events-none absolute left-0 z-50 flex translate-x-0
flex-col items-start justify-center gap-2 rounded-card
bg-secondary-900 p-4 text-left text-background opacity-0 shadow-medium
transition-opacity duration-150
sm:left-1/2 sm:-translate-x-1/2;
width: min(249px, calc(100vw - 2rem));
}
.itps-tooltip--sm .itps-tooltip__content {
@apply px-4 py-3;
width: min(249px, calc(100vw - 2rem));
}
.itps-tooltip--top .itps-tooltip__content {
@apply bottom-full mb-2;
}
.itps-tooltip--bottom .itps-tooltip__content {
@apply top-full mt-2;
}
.itps-tooltip:hover .itps-tooltip__content,
.itps-tooltip:focus-within .itps-tooltip__content {
@apply opacity-100;
}
.itps-tooltip__title {
@apply w-full font-sans text-base font-semibold leading-tight text-background;
}
.itps-tooltip__text {
@apply w-full font-sans text-xs leading-normal text-background;
}
/* --- Modal -------------------------------------------------------------- */
.itps-modal {
@apply fixed inset-0 m-auto w-[800px] max-w-[calc(100vw-2rem)]
max-h-[calc(100dvh-2rem)] overflow-hidden rounded-card
border border-secondary bg-background p-0 text-foreground shadow-large;
}
.itps-modal__header {
@apply flex items-start gap-4 border-b border-secondary bg-secondary p-6;
}
.itps-modal__heading {
@apply flex min-w-0 flex-1 items-start gap-4;
}
.itps-modal__icon {
@apply inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-circle
border border-secondary bg-background text-secondary-foreground;
}
.itps-modal--alert .itps-modal__icon {
@apply border-transparent bg-warning text-warning-foreground;
}
.itps-modal--error .itps-modal__icon {
@apply border-transparent bg-destructive text-destructive-foreground;
}
.itps-modal__copy {
@apply flex min-w-0 flex-1 flex-col gap-2;
}
.itps-modal__title {
@apply font-sans text-xl font-semibold leading-tight text-foreground;
}
.itps-modal__description {
@apply font-sans text-sm leading-normal text-muted-foreground;
}
.itps-modal__close {
@apply -m-1 inline-flex h-8 w-8 shrink-0 cursor-pointer items-center justify-center
rounded-circle border-0 bg-transparent text-muted-foreground transition-colors
hover:bg-muted hover:text-foreground
focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring;
}
.itps-modal__body {
@apply max-h-[calc(100dvh-16rem)] overflow-y-auto p-6;
}
.itps-modal__footer {
@apply flex flex-col-reverse gap-3 border-t border-secondary bg-secondary p-6
sm:flex-row sm:items-center sm:justify-between sm:gap-4;
}
.itps-modal__footer-actions {
@apply flex flex-col gap-2 sm:flex-row sm:items-center;
}
.itps-modal::backdrop {
@apply bg-secondary-950/40 backdrop-blur-sm;
}
.itps-modal[open] {
animation: itps-modal-fade-in 0.15s ease-out;
}
/* --- Side Panel --------------------------------------------------------- */
.itps-side-panel {
@apply fixed inset-0 z-50 text-foreground;
display: none;
}
.itps-side-panel[data-state="open"] {
@apply block;
}
.itps-side-panel__backdrop {
@apply absolute inset-0 bg-secondary-950/40 backdrop-blur-sm;
}
.itps-side-panel__surface {
@apply absolute right-0 top-0 flex h-dvh max-w-[calc(100vw-2rem)] flex-col
border-l border-secondary bg-background shadow-large;
width: min(var(--itps-side-panel-width, 628px), calc(100vw - 2rem));
}
.itps-side-panel__header {
@apply flex flex-col border-b border-secondary bg-secondary;
}
.itps-side-panel__header-main {
@apply flex items-start gap-4 p-6;
}
.itps-side-panel__copy {
@apply flex min-w-0 flex-1 flex-col gap-2;
}
.itps-side-panel__title {
@apply truncate font-sans text-2xl font-semibold leading-tight text-foreground;
}
.itps-side-panel__description {
@apply font-sans text-sm leading-normal text-muted-foreground;
}
.itps-side-panel__meta {
@apply flex flex-wrap items-center gap-3 font-sans text-sm leading-normal text-muted-foreground;
}
.itps-side-panel__meta-item {
@apply inline-flex min-w-0 items-center gap-2;
}
.itps-side-panel__meta-separator {
@apply hidden h-3 w-px bg-border sm:block;
}
.itps-side-panel__actions {
@apply flex shrink-0 items-center gap-2;
}
.itps-side-panel__action,
.itps-side-panel__close {
@apply inline-flex h-10 w-10 shrink-0 cursor-pointer items-center justify-center
rounded-circle transition-colors
focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring;
}
.itps-side-panel__action {
@apply border border-secondary bg-secondary text-secondary-foreground hover:bg-muted;
}
.itps-side-panel__close {
@apply border border-transparent bg-transparent text-muted-foreground
hover:bg-muted hover:text-foreground;
}
.itps-side-panel__tabs {
@apply -mb-px flex items-end gap-1 overflow-x-auto px-2;
}
.itps-side-panel__tab {
@apply inline-flex h-10 shrink-0 cursor-pointer items-center gap-2
border border-transparent px-4 py-2 font-sans text-xs font-normal leading-normal
text-secondary-700 transition-colors
hover:text-secondary-foreground
focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring;
border-top-left-radius: var(--rounded-card);
border-top-right-radius: var(--rounded-card);
}
.itps-side-panel__tab[aria-selected="true"] {
@apply border-secondary bg-background font-semibold text-brand hover:text-brand;
border-bottom-color: var(--background);
}
.itps-side-panel__body {
@apply flex-1 overflow-y-auto p-6;
}
.itps-side-panel[data-state="open"] .itps-side-panel__surface {
animation: itps-side-panel-slide-in 0.2s ease-out;
}
.itps-side-panel[data-state="open"] .itps-side-panel__backdrop {
animation: itps-side-panel-fade-in 0.2s ease-out;
}
}
@keyframes itps-modal-fade-in {
from {
opacity: 0;
transform: translateY(-8px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes itps-side-panel-slide-in {
from {
opacity: 0;
transform: translateX(20px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
@keyframes itps-side-panel-fade-in {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@media (min-width: 640px) {
.itps-tooltip__content {
width: 294px;
}
.itps-tooltip--sm .itps-tooltip__content {
width: 249px;
}
}
/* Tabler Icons define `.ti` outside Tailwind layers; pagination icon sizing
stays unlayered too so copied markup renders compact without inline styles. */
.itps-pagination__button > .ti {
font-size: 16px;
line-height: 1;
}
.itps-breadcrumb__link > .ti,
.itps-breadcrumb__page > .ti,
.itps-breadcrumb__ellipsis > .ti,
.itps-breadcrumb__separator > .ti {
font-size: 16px;
line-height: 1;
}
.itps-tabs__trigger > .ti {
font-size: 16px;
line-height: 1;
}
.itps-tag__icon.ti {
font-size: var(--itps-tag-icon-size);
line-height: 1;
}
.itps-callout__icon.ti,
.itps-callout__icon > .ti,
.itps-callout__action > .ti {
font-size: 16px;
line-height: 1;
}
.itps-callout--sm .itps-callout__icon.ti,
.itps-callout--sm .itps-callout__icon > .ti {
font-size: 12px;
}
.itps-field__error > .ti {
font-size: 12px;
line-height: 1;
}
.itps-textfield__icon.ti {
font-size: 20px;
line-height: 1;
}
.itps-textfield--sm .itps-textfield__icon.ti {
font-size: 16px;
}
.itps-textfield--lg .itps-textfield__icon.ti {
font-size: 24px;
}
.itps-search__icon.ti {
font-size: 20px;
line-height: 1;
}
.itps-search--sm .itps-search__icon.ti {
font-size: 16px;
}
.itps-search--lg .itps-search__icon.ti {
font-size: 24px;
}
.itps-search__clear.ti {
font-size: 16px;
line-height: 1;
}
.itps-search--lg .itps-search__clear.ti {
font-size: 20px;
}
.itps-banner__icon.ti,
.itps-banner__icon > .ti,
.itps-banner__action > .ti {
font-size: 16px;
line-height: 1;
}
.itps-toast__icon.ti,
.itps-toast__icon > .ti,
.itps-toast__close > .ti {
font-size: 16px;
line-height: 1;
}
.itps-tooltip__trigger > .ti {
font-size: 16px;
line-height: 1;
}
.itps-tooltip--sm .itps-tooltip__trigger > .ti {
font-size: 12px;
}
.itps-modal__icon > .ti,
.itps-modal__close > .ti {
font-size: 20px;
line-height: 1;
}
.itps-modal__icon > .ti {
font-size: 16px;
}
.itps-side-panel__meta .ti,
.itps-side-panel__action > .ti,
.itps-side-panel__close > .ti,
.itps-side-panel__tab > .ti {
font-size: 16px;
line-height: 1;
}
.itps-select__icon.ti,
.itps-select__chevron.ti,
.itps-select__invalid-icon.ti {
font-size: 20px;
line-height: 1;
}
.itps-select--sm .itps-select__icon.ti,
.itps-select--sm .itps-select__chevron.ti,
.itps-select--sm .itps-select__invalid-icon.ti {
font-size: 16px;
}
.itps-select--lg .itps-select__icon.ti,
.itps-select--lg .itps-select__chevron.ti,
.itps-select--lg .itps-select__invalid-icon.ti {
font-size: 24px;
}
.itps-checkbox__check.ti {
font-size: 16px;
line-height: 1;
}
.itps-nav-icon.ti {
font-size: 18px;
line-height: 1;
}
.itps-nav-icon.itps-nav-icon--sm.ti {
font-size: 16px;
}
.itps-nav-icon.itps-nav-icon--lg.ti {
font-size: 24px;
}
.itps-nav-icon.itps-nav-icon--xl.ti {
font-size: 32px;
}
.itps-chip__icon.ti,
.itps-chip__dismiss.ti {
font-size: 16px;
line-height: 1;
}
.itps-chip__trend.ti {
font-size: 12px;
line-height: 1;
}
.itps-data-overlay__trend.ti {
font-size: 20px;
line-height: 1;
}
.itps-feature-card__icon.ti {
font-size: 22px;
line-height: 1;
} Arquivo curto que importa os 2 CSS acima. É ele que você vai importar no CSS principal do projeto.
index.css
@import "./tokens.css";
@import "./components.css"; 3 · Importar
Importe o Sinapse no CSS principal
No CSS principal do projeto, mantenha o Tailwind primeiro e o Sinapse depois. O caminho abaixo considera a estrutura sugerida no passo 2; ajuste apenas o caminho relativo se o seu arquivo principal estiver em outra pasta.
CSS principal do projeto
@import "tailwindcss";
@import "./assets/styles/sinapse/index.css"; Caminho relativo
O @import do Sinapse usa caminho relativo ao arquivo CSS que está importando.
Se o seu CSS principal estiver em outra pasta, ajuste ./ ou ../. Nos guias por stack, abaixo, mostramos o caminho exato para cada tecnologia.
4 · Validar
Primeiro botão — coral Sinapse
Cole este HTML em qualquer página ou componente. Se aparecer um botão coral com bordas arredondadas, a cópia dos arquivos e a ordem das importações funcionaram.
validar-botoes-sinapse.html
<button type="button" class="itps-btn itps-btn--outline">
<i class="ti ti-plus" aria-hidden="true"></i>
Adicionar
</button>
<button type="button" class="itps-btn itps-btn--outline">
Avançar
<i class="ti ti-arrow-right" aria-hidden="true"></i>
</button>
<button type="button" class="itps-btn itps-btn--outline">
<i class="ti ti-download" aria-hidden="true"></i>
Baixar relatório
<i class="ti ti-external-link" aria-hidden="true"></i>
</button>
Sem cor coral? Verifique: (1) a ordem do @import — Tailwind antes do Sinapse, (2) o caminho do arquivo CSS principal, (3) Tailwind v4 instalado, não v3.
5 · Stack
Escolha a stack do projeto
Depois que o botão coral aparecer, siga o guia da sua stack. Cada guia mostra o arquivo CSS correto, o ponto de importação e o primeiro componente para validar.
React
Projeto com Vite, Tailwind v4, CSS Sinapse, shadcn e primeiro botão.
Next.js
App Router, globals.css, CSS Sinapse, shadcn e primeiro botão.
Vue 3
Projeto com Vite, Tailwind v4, CSS Sinapse, shadcn-vue e primeiro botão.
Nuxt 4
Nuxt, Tailwind v4, CSS Sinapse, shadcn-nuxt e primeiro botão.
Astro
Astro, Tailwind v4, CSS Sinapse e primeiro componente.
HTML
HTML, Tailwind v4, CSS Sinapse e classes itps.