Contenido
Estilos
Carats usa SASS con alcance para los estilos y promueve HTML semántico con el menor número de clases CSS.
base.sass
El archivo base.sass de src/client contiene los tokens de diseño globales y los resets de estilo. Todos los demás archivos SASS lo importan con @use y as * para que los tokens estén disponibles sin prefijo de espacio de nombres.
Crear base.sass
// Colors
$color-primary: #000000
$color-secondary: #ffffff
$color-background: #f5f5f5
$color-text: #333333
$color-text-light: #666666
// Spacing
$spacing-xs: 4px
$spacing-sm: 8px
$spacing-md: 16px
$spacing-lg: 24px
$spacing-xl: 32px
// Typography
$font-family-base: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif
$font-size-base: 16px
$font-size-sm: 14px
$font-size-lg: 18px
$font-size-xl: 24px
$font-weight-normal: 400
$font-weight-bold: 700
// Breakpoints
$breakpoint-sm: 576px
$breakpoint-md: 768px
$breakpoint-lg: 992px
$breakpoint-xl: 1200px
// Border radius
$border-radius: 4px
$border-radius-lg: 8px
// Box shadows
$box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1)
$box-shadow-lg: 0 4px 8px rgba(0, 0, 0, 0.15)
// Transitions
$transition-fast: 150ms ease
$transition-normal: 250ms ease
Tokens de diseño
Define colores, espaciado, tipografía, puntos de ruptura y otros tokens de diseño en el nivel superior de base.sass. No los anides.
Uso correcto
@use '../base.sass' as *
.my-component
color: $color-text
padding: $spacing-md
font-size: $font-size-base
Uso incorrecto
// Tokens must stay at the top level of base.sass
.my-component
$color-text: #333
.inner
color: $color-text
Un token definido dentro de una regla solo existe dentro de esa regla, así que cualquier otra hoja de estilos que lo necesite tiene que redefinirlo. Así es como una paleta se va desviando en silencio a lo largo de un proyecto.
HTML semántico
Prefiere elementos HTML semánticos con el menor uso de clases. Deja que la estructura del componente y los tokens de diseño se ocupen del estilo, y anida selectores en SASS en lugar de añadir clases utilitarias al marcado.
Componente de ejemplo
import './card.sass';
export default function Card(props: { title: string; children?: JSX.Element }) {
return (
<article class="card">
<header>
<h2>{props.title}</h2>
</header>
<section>
{props.children}
</section>
<footer>
<button>Action</button>
</footer>
</article>
);
}
SASS correspondiente
@use '../base.sass' as *
.card
background: $color-secondary
border-radius: $border-radius-lg
box-shadow: $box-shadow
padding: $spacing-md
margin-bottom: $spacing-md
header
margin-bottom: $spacing-sm
h2
font-size: $font-size-lg
font-weight: $font-weight-bold
section
margin-bottom: $spacing-md
footer
display: flex
justify-content: flex-end
button
background: $color-primary
color: $color-secondary
padding: $spacing-sm $spacing-md
border: none
border-radius: $border-radius
cursor: pointer
transition: background $transition-fast
&:hover
opacity: 0.9
Estilos adaptables
@use '../base.sass' as *
.container
max-width: $breakpoint-xl
margin: 0 auto
padding: $spacing-md
@media (max-width: $breakpoint-md)
padding: $spacing-sm
.grid
display: grid
grid-template-columns: repeat(3, 1fr)
gap: $spacing-md
@media (max-width: $breakpoint-lg)
grid-template-columns: repeat(2, 1fr)
@media (max-width: $breakpoint-sm)
grid-template-columns: 1fr
Buenas prácticas
Sigue estas buenas prácticas para mantener los estilos:
- Define los tokens en el nivel superior. Nunca anides tokens de diseño dentro de mixins o funciones.
- Prefiere HTML semántico. Deja que la estructura defina el estilo en lugar de añadir clases.
- Importa base.sass correctamente. Usa siempre @use 'relative/path/to/base.sass' as *.
- Mantén baja la especificidad. Evita selectores anidados profundamente.
- Usa variables para mantener la coherencia. Nunca codifiques colores, espaciados o tamaños directamente.