Skip to content

Estilos y Tailwind CSS

Los colores nunca se hardcodean. Se definen como CSS variables en formato RGB (sin rgb() wrapper) y se mapean a clases Tailwind. Esto permite:

  • Theming dinámico por vertical
  • Usar con opacidad de Tailwind (bg-primary/50)
  • Cambiar toda la paleta modificando solo las variables
/* Inyectadas por ecom-components + el plugin initApp */
--c-primary: 0, 255, 168;
--c-primary-dark: ...;
--c-primary-light: ...;
--c-secondary: ...;
--c-graphite: ...;
--c-graphite-light: ...;
--c-graphite-lighter: ...;

En templates:

<div class="bg-primary text-white">Color primario de la vertical</div>
<div class="bg-primary/50">Primario con 50% opacidad</div>
<div class="border-secondary">Borde color secundario</div>
<div class="text-graphite">Texto oscuro principal</div>

colors: {
primary: 'rgb(var(--c-primary))',
'primary-dark': 'rgb(var(--c-primary-dark))',
secondary: 'rgb(var(--c-secondary))',
graphite: 'rgb(var(--c-graphite))',
}
fontSize: {
h1: ['clamp(2rem, 4vw, 3.5rem)', { lineHeight: '1.1' }],
h2: ['clamp(1.5rem, 3vw, 2.5rem)', { lineHeight: '1.2' }],
h3: ['clamp(1.25rem, 2.5vw, 2rem)', { lineHeight: '1.3' }],
p: ['clamp(0.875rem, 1.5vw, 1rem)', { lineHeight: '1.6' }],
}

Uso: class="text-h1", class="text-p". El tamaño se adapta al viewport automáticamente.

PrefijoMin-widthDispositivo
(base)0pxMóvil
sm:640pxMóvil grande
md:768pxTablet
lg:1024pxDesktop
xl:1280pxDesktop grande
2xl:1536pxPantalla ultra-wide

Siempre mobile-first: El estilo base es para móvil. Los prefijos agregan para pantallas más grandes:

<!-- Correcto -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
<!-- Incorrecto (desktop-first) -->
<div class="grid grid-cols-3 sm:grid-cols-1">

ReglaCorrectoIncorrecto
No colores hardcodeadosbg-primarybg-[#00ffa8]
No px en CSS custom@apply p-4padding: 16px
No !importantResolver especificidad!important
BEM en SCSS custom.card__header--active.card .header.active
Preferir Tailwindclass="flex gap-4"CSS custom para layout

Cuándo usar CSS custom vs Tailwind utilities

Section titled “Cuándo usar CSS custom vs Tailwind utilities”
SituaciónUsar
Layout, spacing, colors, typographyTailwind utilities en class=""
Animaciones complejas<style scoped> con @apply + @keyframes
Pseudo-elements (::before, ::after)<style scoped>
Media queries específicasTailwind breakpoints
Estados complejos (multiple conditions)<style scoped> con clases BEM

Cuando necesitas SCSS custom, sigue BEM (Block Element Modifier):

<style scoped lang="postcss">
/* Block */
.product-card {
@apply rounded-lg overflow-hidden shadow-md;
}
/* Element (parte del block) */
.product-card__header {
@apply p-4 bg-primary;
}
.product-card__body {
@apply p-6 space-y-2;
}
/* Modifier (variante) */
.product-card__header--featured {
@apply bg-secondary;
}
.product-card--compact {
@apply p-2;
}
</style>

Importados via app/config/css.ts → nuxt.config.ts:

ArchivoContenido
fonts.css@font-face declarations (Neulis y variantes)
variables.cssCSS custom properties del proyecto
reset.cssCSS reset/normalize base
vueTransitions.cssClases de animación para <Transition> de Vue
components.cssEstilos base compartidos entre componentes

Estos se cargan antes que Tailwind, por lo que Tailwind puede sobreescribirlos.


La librería ecom-components inyecta 9 variantes de la fuente Neulis:

  • Neulis (regular, medium, bold, etc.)
  • Neulis Alt (variante alternativa)

Se aplican via font-family en el CSS base. No necesitas configurar nada adicional — ya están disponibles.


<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6">
<AEMainCard v-for="item in items" :key="item.id" v-bind="item" />
</div>
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
<!-- Contenido con padding lateral responsive -->
</div>
<AENavbar class="hidden lg:block" />
<AEMobileNavbar class="block lg:hidden" />
<h1 class="text-h1">Se adapta solo con clamp()</h1>

Valida CSS automáticamente en pre-commit:

Terminal window
pnpm styles # Verificar errores
pnpm styles:fix # Auto-corregir

Qué valida: orden de propiedades, no !important, no px directos, naming BEM.