0.1.5 • Published 5 years ago

@sqymagma/magma-theme v0.1.5

Weekly downloads
2
License
ISC
Repository
-
Last release
5 years ago

Magma themes

Los themes se utilizan para ajustar y modificar componentes y elementos de la aplicación para que se ajusten a un estilo visual y estructural específico.

Con los themes de Magma se pueden personalizar fácilmente los elementos de un sistema: tipografía, breakpoints, colores, espaciados, etc. cambiando un conjunto de primitives y eliminando así la necesidad de modificar elementos y componentes de forma individual.

Índice

Theme Scheme

Colors

{
  color: {
    description: String,
    colors: {
      rolName: {
        value: String (Hex),
        opacity: String or Number
      },
      rolName: {
        type: "RGB",
        value: Array (length 3),
        opacity: String or Number
      },
      rolName: {
        type: "HSL",
        value: Array (length 3),
        opacity: String or Number
      },
    }
  }
}

Términos

TerminoDefiniciónEjemplo
ThemeUn set único de primitives con un valor específicoDefault
PrimitivesEl código identificador de un rol. Son universales y no pueden cambiar en cada themeinteractive01
RolesEl rol para el uso del primitive. Los roles pueden cambiar por cada themeFondo para botones

Categorías

Un theme de Magma tienen dos categorías en sus primitives: Magma primitives y Custom primitives

  • magma-primitives.js
  • custom-primitives.js

Magma Primitives

Las Magma primitives deben ajustarse al formato y estructura para que puedan ser procesadas correctamente utilizando la función parseTheme() de Magma.

Es posible que algunas entradas dependan de otras. Por ejemplo la entrada textStyles necesita que estén definidas tanto fontFamilies como mediaqueries ya que precisamente lo que textStyes define son los estilos de tipografía dependiendo de los breakpoints.

Las Magma primitives son:

  • colors
  • fontFamilies
  • textStyles
  • mediaqueries
  • gradients
  • shadows

Ejemplo de parseado de parseTheme() en Magma primitives

La entrada:

{
color: {
colors: {
text01: {
value: "#000000",
opacity: "1.0"
}
text02: {
value: "#000000,
opacity: "0.5"
}
}
}
}

```

Obtendrá esta salida:

```

{
colors: {
text01: "#000000",
text02: "rgba(0, 0, 0, 0.5)",
}
}

Custom primitives

Las Custom primitives son simples objetos javascript que no necesitan ser parseadas por parseTheme().

Añadir unas primitives para controlar el timming de nuestras animaciones css es tan fácil como escribir:

export default {
  timmings: {
    s: "0.1s",
    m: "0.5s",
    l: "1.0s"
  }
}

Accederíamos a estas primitives con ${props => props.theme.timming.s}.

Formato y estructura

Antes mencionámos que las Magma primitives tenían un formato y estructura. Ahora veremos en qué consisten.

Color

En la primitiva color construye la paleta de colores del sistema. Lo más importantes son las entradas de colores en formato objeto. Indicando e valor en formato hexadeciamal y la opacidad en un rango de 0 a 1. También podemos especificar el color directamente en formatos HSL o RGB añadiendo además la propiedad opacity.

Si la opacidad del color es 1 podemos omitir por completo la propiedad.

Ejemplos

// Color en formato HEX
export default {
  color: {
    colors: {
      interactive01: { value: "#ffffff" },
      ...
    }
  },
// Color en formato RGB + opacity
export default {
  color: {
    colors: {
      interactive01: {
        type: "RGB",
        value: ["32", "50", "250"],
        opacity: "0.5"
      },
      ...
    }
  },
// Color en formato HSL + Opacity
export default {
  color: {
    colors: {
      interactive01: {
        type: "HSL",
        value: ["0", "50%", "50%"],
        opacity: "0.5"
      },
      ...
    }
  },

Font family

Especifica las familias de tipografías. Están definidos las entradas primary, secondary y monospace. Si existiésen más debemos añadirlas siguiendo la nombenclatura: tertiary, quaternary, etc..

  fontFamily: {
    fontFamilies: {
      primary: "Gilroy",
      secondary: "Work Sans",
      monospace: "Space Mono"
    }
  }

Mediaqueries

Las primitives mediaqueries definen los breakpoints del sistema (utilizando la mentalidad mobile-first), tanto el naming como los tamaños de los breakpoints, mínimo o mínimo y máximo.

El primer breakpoint siempre debe tener el minWidth igualado a null.

export default {
  mediaquery: {
    mediaqueries: [
      {
        label: "default",
        minWidth: null
      },
      {
        label: "s",
        minWidth: "40em"
      },
      {
        label: "m",
        minWidth: "52em"
      },
      {
        label: "l",
        minWidth: "64em"
      }
    ]
  },

Text Styles

Estas primitives definen los estilos de textos responsive

  textStyle: {
    defaultStyles: {
      fontWeight: 400,
      lineHeight: 1.4,
      letterSpacing: "0px",
      fontSize: "10px"
    },
    textStyles: [
      {
        name: "mega",
        fontSize: "60px",
        letterSpacing: "0px",
        responsive: [
          {
            breakpoint: "m",
            fontStyle: "normal",
            fontSize: "80px"
          }
        ]
      }
    ]
  },

  gradient: {
    gradients: {
      gradient01: {
        direction: "to top",
        stops: [
          {
            color: "#443CF3",
            opacity: 1.0,
            position: "0%"
          },
          {
            color: "#425FF7",
            opacity: 1.0,
            position: "100%"
          }
        ]
      }
    }
  },

  shadow: {
    shadows: {
      big: {
        x: 0,
        y: 25,
        blur: 128,
        color: "#000000",
        opacity: 0.4
      }
    }
  }
}

Magma no provee ningún theme por defecto.

Importar un theme

Para utilizar un theme como mínimo debemos importar la función parseTheme() y un theme tanto con las primitives base como con las custom primitives (opcionales)

Podemos juntar en un solo archivo las primitives base y las custom para facilitar la importación

Podemos crear los archivos de un theme desde cero o utilizando magma-cli, lo que nos permite crear unos archivos que sirven de boilerplate: magma-cli newtheme default

import React from "react"
import { ThemeProvider } from "styled-component"
import { parseTheme } from "@secuoyas/magma-theme"
import theme from "./themes/default"
import customPrimitives from "./themes/default/custom.js"

const defaultTheme = {
  ...parseTheme(theme),
  ...customPrimitives
}

const App = () => (
  <ThemeProvider theme={defaultTheme}>
    <p>Hi Magma Theme</p>
  </ThemeProvider>
)

export default App

CSS Global

Probablemente queramos unos estilos globales para toda la aplicación. Como el font-family, resets, normalize, etc..

styled-components nos provee de una función para ello: createGlobalStyle que además de añadir estilos globales nos permite temificarlos con ThemeProvider. createGlobalStyle nos crea un componente de React el cual utilizaremos dentro de nuestro component-tree para aplicar el estilo global. Lo normal es que utilizemos este componente en el raíz de nuestra aplicación.

import React from "react"
import { ThemeProvider, createGlobalStyle } from "styled-component"
import { parseTheme } from "@secuoyas/magma-theme"
import theme from "./themes/default"
import customPrimitives from "./themes/default/custom.js"

const GlobalStyle = createGlobalStyle`
  body {
    font-family: "Gilroy";
    background-color = ${props => props.theme.colors.uiBackground};
  }
`

const defaultTheme = {
  ...parseTheme(theme),
  ...customPrimitives
}

const App = () => (
  <ThemeProvider theme={defaultTheme}>
    <React.Fragment>
      <GlobalStyle />
      <p>Hi Magma Theme</p>
    </React.Fragment>
  </ThemeProvider>
)

export default App

Color role guide

PrimitiveRole
interactive01Color primario de interacción.Color para botones primarios.
interactive02Color secundario de interacción.Color para botones secundarios.
interactive03Color de contraste 4.5:1 de interacción.Color para botones terciarios.
interactive04Color de contraste 3:1 de interacción.Elementos seleccionados.Elementos activos.Color para iconos acentuados.
text01Color de texto primario.Cuerpo de texto.Encabezados.
text02Color de texto secundario.Etiquetas de formularios.Texto de ayuda.
text03Color de texto terciario.
text04Color de texto placeholder.
textOnInteractive01Texto en interactivos 01
textOnInteractive02Texto en interactivos 02
textOnInteractive03Texto en interactivos 03
textOnInteractive04Texto en interactivos 04
ui-backgroundColor de fondo por defecto para página.
ui01Color de fondo primario para contenedoresColor de fondo secundario para página.
ui02Color de fondo secundario para contenedoresColor de fondo primario para página (probablemente igual que ui-background).
ui03Borde sutil.Color de fondo terciario.
ui04Borde contraste medio.Elemento de contraste 3:1.
ui05Borde alto contraste.Elemento de contraste 4.5:1.Elementos enfatizados
link01Color para link principal
link02Color para link secundario
link03Color para link terciario
support01Error
support02Warning
support03Information
support04Sucess
field01Color de fondo para inputs.
field02Color de fondo para inputs que estén sobre ui02.
inverse01Color inverso para textos.Color inverso para iconos.
inverse02Color de fondo alto contraste.Elementos de alto contraste.
disabled01Campos desactivados.Fondos desactivados (botones..)Bordes desactivados.
disabled02Elementos desactivados en disabled01.Etiquetas desactivadasTexto desactivado en disabled01.Iconos desactivados.
------
interactive01HoverHover para interactive01
interactive02HoverHover para interactive02
interactive03HoverHover para interactive03
interactive01ActiveActive para interactive01
interactive02ActiveActive para interactive02
interactive03ActiveActive para interactive03
interactive01FocusFocus para interactive01
interactive02FocusFocus para interactive02
interactive03FocusFocus para interactive03
link01HoverColor para Hover link principal
link02HoverColor para Hover link secundario
link03HoverColor para Hover link terciario
link01ActiveColor para Active link principal
link02ActiveColor para Active link secundario
link03ActiveColor para Active link terciario