💅🏼 De CSS a SASS
Tags: css, sass
Published: 2020-10-28 11:56:56

## 🚠 ¿Qué es SASS?
Es un lenguaje de hoja de estilos que se compila a CSS. Permite el uso de variables, *mixin* y funciones, entre otros. La clave de SASS es que permite **hojas de estilo más organizadas y fácilmente reutilizables tanto en un proyecto como entre varios**.

## 🧪 Configurando SASS en un entorno de prueba
La configuración de SASS no prodría ser más simple. Para un entorno de testeo, sólo tendremos que instalar el paquete de node SASS

``` bash
npm install -g sass
```
crear un archivo con la extensión `.scss` (para utilizar la nueva sintaxis) y poner el compilador de SASS en modo 'vigilante' para que compile el archivo `.scss` siempre que se detecten cambios en el fichero.
> SASS tiene dos sintaxis. La que utiliza la extensión `.scss` es un superset de CSS, por lo que todo lo escrito en css normal es válido. Es la más popular por su cercanía a css. La otra sintaxis es la de los ficheros `.sass`, conocida como la *sintaxis identada*. Es prácticamente idéntica a scss execpto porque se emplea identación para definir la estructura de la hoja, al contrario de scss que utiliza llaves y puntos y comas. 

Lo siguiente será comprobar esto: introduciendo código sass básico y viendo su equivalencia en css

```scss
//test.scss
$font-stack: Roboto, sans-serif;
$font-size: 24rem;
$primary-color: #333;

body {
    font: $font-size $font-stack;
    color: $primary-color;
}
```

```css
/* test.css */
body {
  font: 24rem Roboto, sans-serif;
  color: #333;
}
```

Se puede apreciar como efectivamente, las variables son compiladas y sustituidas en el css. Esto puede ser muy útil para utilizar colores predefinidos y ser constantes en el diseño de una página entera.

## 🥝 Nesting

El anidado de `sass` nos permite imitar la estructura visual de un fichero `html`, haciendo el  código más intuitivo y fácil de interpretar.

```scss
//test.scss

body {
    margin: 0;
    .container {
        padding: 20%;
    }
    .footer {
        height: 20%;
    }
}
```
> El equivalente a este fragmento de código en `css` es fácil de intuir: cada elemento hijo de la clase deberá ser combinado con su padre en cada selector en `css`

```css
/* test.css */

body {
  margin: 0;
}
body .container {
  padding: 20%;
}
body .footer {
  height: 20%;
}
```

## 🪓 Parciales y módulos

Existe la opción de crear ficheros que contengan fragmentos de código scss que será importado por otros ficheros durante la compilación. Para utilizar esta función sólo tenemos que crear un fichero y nombrarlo con una `_` al principio. De esta manera el compilador lo detectará como un parcial y permitirá su importación como módulo. El uso de los módulos es sencillo: se utilizan como si fueran objetos con propiedades, donde las propiedades son las variables. Las definiciones de clases se concatenan a las definiciones del fichero importador.

```scss
// _partial.css

$font-stack: Roboto, sans-serif;
$font-size: 24rem;
$primary-color: #333;

body {
    font: $font-size $font-stack;
    color: $primary-color;
}
```
```scss
// test.css

@use 'partial';

.clase {
    background-color: partial.$primary-color;
    color: white;
}
```
```css
/* test.css */

body {
  font: 24rem Roboto, sans-serif;
  color: #333;
}

.clase {
  background-color: #333;
  color: white;
}
```

## 🧰 Mixins

Los *mixins* facilitan la escritura de algunas declaraciones que en `css` son muy tediosas de escribir. Permiten declaraciones de css reusables con la opción de pasar valores para mayor flexibilidad

```scss
// test.scss

@mixin transform($property) {
    -webkit-transform: $property;
    -ms-transform: $property;
    transform: $property;
}

.clase {
    @include transform(rotate(30deg));
    color: white;
}
```

```css
/* test.css */

.clase {
  -webkit-transform: rotate(30deg);
  -ms-transform: rotate(30deg);
  transform: rotate(30deg);
  color: white;
}
```

## 🧬 Extensión/Herencia

Esta es una de las utilidades más potentes de `sass`, ya que permite compartir un conjunto de propiedades `CSS` entre varios selectores. Esto resulta en código mucho más limpio y dota al `css` de la capacidad de ser refactorizado.

```scss
// test.scss

%message-shared {
    border: 1px solid #ccc;
    padding: 10px;
    color: #333;
}

.message {
    @extend %message-shared;
}

.success {
    @extend %message-shared;
    border-color: green;
}

.error {
    @extend %message-shared;
    border-color: red;
}

.warning {
    @extend %message-shared;
    border-color: yellow;
}
```

```css
/* test.css */

.warning, .error, .success, .message {
  border: 1px solid #ccc;
  padding: 10px;
  color: #333;
}

.success {
  border-color: green;
}

.error {
  border-color: red;
}

.warning {
  border-color: yellow;
}
```

## :triangular_ruler: Operadores

Realizar operaciones matemáticas en `sass` es extremadamente sencillo

```scss
//test.scss

.container {
  width: 100%;
}

article[role="main"] {
  float: left;
  width: 600px / 960px * 100%;
}
```

```css
/* test.css */

.container {
  width: 100%;
}

article[role=main] {
  float: left;
  width: 62.5%;
}
```