Desarrollo de Componentes
ⴵ Repositorio: Coffeeroasters
Del sitio documentado en el Figma, podemos decir de manera preliminar el siguiente orden de elementos visuales:
.
.
De manera genérica, podemos asumir que todo es un componente. Sin embargo, en desarrollo esa asunción es equivocada puesto que la diferencia entre un componente y una sección de nuestro sitio es la utilidad o interacción.
.
ℹ️ Definición
Un componente es una funcionalidad independiente, cuya función principal radica en la interactividad visual por interfaz de nuestros usuarios o audiencias finales.
.
Con ello en mente, tendríamos que un componente a partir de nuestro desarrollo serían:
- Menu navigation. Del cual. albergará un menú como navegación para asistir en dicha utilidad con el usuario.
- Button. Del cual, en este apartado será un CTA (Call-To-Action).
.
✨ Concepto clave
Un componente se puede replicar y utilizar según una jerarquía o composición.
.
Cabe aclarar que nuestro Hero, no es un componente puesto que es en sí mismo una sección narrativa de nuestro sitio y servirá para disponer ciertos titulares según sea la intención del producto web.
.
Creación de Tema con Tailwind
⬢ Commit - feat: ✨added initial template components
⬢ Commit - feat: ✨added initial styles components
.
✨ Concepto clave
Una herramienta se nombra con su contexto para denotar tecnologías, en su lugar simplemente mencionarlas, es decir, Tailwind CSS se refiere que dicha herramienta es para estilos de CSS; así como ReactJS.
.
Para trabajar con componentes en Tailwind, tenemos 3 opciones para desarrollarlos: locales, utilidades en línea o en plugins. Cada método presentará o armonizará con alguna regla que se acuerde durante desarrollo.
.
En mi caso, presento a los desarrollo de estilos en local cuando el componente no presenta una variación o jerarquía de estilos, segú nuestro sistema de diseño.
.
Por ejemplo:
.
.
De aquí,mencionamos que, por BEM, tendríamos un componente con 1 modificador, por lo que:
button sería nuestro diseño base o por default
button--disabled sería nuestro modificador dado por atributo disabled
.
En el caso del hover, no se suele desarrollar como un modificador sino como un adicionable a nuestro componente base y seguido por sus diferentes variaciones.
.
./src/components/Button.astro
---
const { text = 'Click me' } = Astro.props
---
<button>
<span>{text}</span>
</button>
<style>
button {
@apply min-w-[161px] max-w-[196px];
@apply py-1 px-2;
@apply font-fraunces text-body-large font-bold text-white;
@apply rounded-lg bg-jade-500 hover:bg-jade-600;
}
</style>
.
.
Al hablar de componentes por composición, tenemos nuestro Menu Navigation, el cual estará conformado por Items Navigation, los cuales serán cruciales para la navegación del sitio.
.
De aquí mencionamos, que por BEM, tendríamos un componente que contiene a otro componente. Sin embargo, no presenta una complejidad para manterlo en separado de este mismo, es decir, no posee un estado.
.
✨ Concepto clave
Un estado es una característica independizada por los componentes web, dichos estados poseen vínculos dependientes según sea la regla de negocio o de diseño que se le requiera.
.
./src/components/MenuNavigation.astro
<nav class='menu-navigation'>
<a class='menu-navigation__item--active' href='#'>Home</a>
<a class='menu-navigation__item' href='#'>About us</a>
<a class='menu-navigation__item' href='#'>Create your plan</a>
</nav>
Para su orden futura en nuestro tema de diseño, nuestros componentes tendrán sus estilos como componentes para emplear la herramienta PostCSS de Tailwind.
.
./src/styles/components/header.cjs
const plugin = require('tailwindcss/plugin')
module.exports = plugin(function ({ addComponents }) {
addComponents({
'.menu-navigation': {
'@apply flex gap-2': {},
'&__item': {
'@apply py-0.5 px-0.25': {},
'@apply text-gray hover:text-dark-blue': {},
'@apply hover:border-jade-500 hover:border-b-2 hover:border-solid':
{},
'&--active': {
'@apply py-0.5 px-0.25': {},
'@apply border-jade-500 border-b-2 border-solid': {},
},
},
},
})
})
Finalmente, nuestro Hero, como se mencionó, será una sección que poseerá un CTA como Button. Significando en una jerarquía con BEM, de la siguiente forma:
---
import Default from '@layouts/default.astro'
import MenuNavigation from '@components/MenuNavigation.astro'
import Button from '@components/Button.astro'
---
<Default>
<header>
<img src='/images/logo.svg' alt='Coffeeroasters Logo' />
<MenuNavigation />
</header>
<main>
<section class='hero bg-image-hero'>
<h1 class='hero__title'>Great coffee made simple.</h2>
<p class='hero__description'>Start your mornings with the world's best coffees. Try our expertly curated artisan coffees from our best roasters delivered directly to your door, at your schedule.</p>
<Button text='Create your plan' />
</section>
</main>
</Default>
.
ⴵ Repositorio: Coffeeroasters
⬢ Commit - feat: ✨added initial template components
⬢ Commit - feat: ✨added initial styles components