Herramientas & Workflow

Saber HTML, CSS y JavaScript es la base, pero trabajar eficientemente requiere las herramientas correctas. Un buen setup de desarrollo te ahorra horas de trabajo repetitivo, te ayuda a escribir código más limpio, te permite depurar problemas rápidamente y te da un flujo de trabajo fluido donde podés enfocarte en lo que importa: construir cosas. Esta sección cubre las herramientas esenciales que usan los desarrolladores frontend profesionales, desde el editor de código hasta las DevTools del navegador, pasando por formateo automático, abreviaciones de código y plataformas de deploy.

VS Code

Visual Studio Code es el editor de código más usado del mundo (según encuestas de Stack Overflow, lo usan más del 70% de los desarrolladores). Es gratuito, de código abierto, ligero y extremadamente extensible gracias a su ecosistema de extensiones. Desarrollado por Microsoft, funciona en Windows, macOS y Linux, y tiene soporte nativo para JavaScript, TypeScript, HTML y CSS con autocompletado IntelliSense, coloreo de sintaxis y depuración integrada. A diferencia de un IDE pesado, VS Code arranca en segundos y consume pocos recursos, pero con las extensiones adecuadas puede competir con cualquier IDE completo.

Extensiones esenciales para frontend

El verdadero poder de VS Code está en sus extensiones. Estas son las que todo desarrollador web debería tener instaladas desde el dí uno, porque transforman el editor de un simple bloc de notas con sintaxis highlight en un entorno de desarrollo completo con autocompletado inteligente, formateo automático, atajos de productividad y herramientas de depuración integradas.

Extensiones recomendadas
| Extensión              | Qué hace                                                          | Imprescindible |
|--------------------------|----------------------------------------------------------------------|----------------|
| Prettier                 | Formatea tu código automáticamente al guardar                   | Si             |
| ESLint                   | Detecta errores y malas prácticas en JS/TS                      | Si             |
| Live Server              | Servidor local con reload automático                           | Si             |
| Auto Rename Tag          | Renombra la etiqueta de cierre al editar la de apertura              | Si             |
| HTML CSS Support         | Autocompletado de clases CSS en HTML                                 | Si             |
| Path Intellisense        | Autocompletado de rutas de archivos                                  | Si             |
| Error Lens               | Muestra errores inline directamente en el editor                    | No, pero genial|
| CSS Peek                 | Ctrl+click en una clase HTML para ir al CSS                          | No             |
| GitLens                  | Info de Git inline (quien cambió qué, cuándo)                   | No             |
| Thunder Client           | Cliente HTTP tipo Postman, dentro de VS Code                         | No             |
| Indent Rainbow           | Colorea la indentación para ver bloques visuales                | No             |
| Material Icon Theme      | Iconos bonitos para archivos y carpetas                              | No             |

Settings recomendados (settings.json)

La configuración por defecto de VS Code funciona, pero personalizarla marca una diferencia enorme en tu productividad diaria. Estas settings activan el formateo al guardar, configuran el tamaño de tabulación, eliminan espacios en blanco innecesarios y ajustan el comportamiento del editor para que se sienta natural. Para abrir el settings.json, usá Ctrl+Shift+P (o Cmd+Shift+P en Mac) y escribí "Open User Settings (JSON)".

JSON
{
    // Formatear al guardar (usa Prettier si está instalado)
    "editor.formatOnSave": true,
    "editor.defaultFormatter": "esbenp.prettier-vscode",

    // Tamaño de tabulación
    "editor.tabSize": 4,
    "editor.insertSpaces": true,

    // Eliminar espacios en blanco al final de cada línea al guardar
    "files.trimTrailingWhitespace": true,
    "files.insertFinalNewline": true,

    // Word wrap para no scrollear horizontalmente
    "editor.wordWrap": "on",

    // Minimap (el mapa lateral) - a gusto personal
    "editor.minimap.enabled": false,

    // Font y tamaño
    "editor.fontSize": 15,
    "editor.fontFamily": "'JetBrains Mono', 'Fira Code', 'Cascadia Code', monospace",
    "editor.fontLigatures": true,

    // Bracket pair colorization (colorea pares de llaves/parentesis)
    "editor.bracketPairColorization.enabled": true,
    "editor.guides.bracketPairs": "active",

    // Mostrar errores y warnings inline
    "editor.inlineErrors.enabled": true,

    // Emmet expand abbreviation en archivos que no son HTML
    "emmet.includeLanguages": {
        "javascript": "javascriptreact"
    },

    // Excluir carpetas del file explorer para no polucionar
    "files.exclude": {
        "**/.git": true,
        "**/node_modules": true,
        "**/.DS_Store": true
    }
}

Atajos de teclado esenciales

Los atajos de teclado son lo que separa a alguien que "usa" VS Code de alguien que "vuela" en VS Code. Memorizar estos atajos te permite moverte por el código, editar múltiples líneas, buscar y reemplazar, y gestionar archivos sin tocar el mouse. Al principio cuesta recordarlos, pero después de una semana usándolos se vuelven reflejo y no podés volver atrás.

Atajos
| Acción                           | Windows/Linux            | macOS                   |
|-----------------------------------|-------------------------|-------------------------|
| Command Palette                   | Ctrl+Shift+P            | Cmd+Shift+P             |
| Abrir archivo rápido              | Ctrl+P                  | Cmd+P                   |
| Búsqueda en archivos              | Ctrl+Shift+F            | Cmd+Shift+F             |
| Terminal integrada                 | Ctrl+`                  | Cmd+`                   |
| Split editor (lado a lado)        | Ctrl+\                  | Cmd+\                   |
| Mover línea arriba/abajo         | Alt+Up/Down             | Option+Up/Down          |
| Duplicar línea                    | Shift+Alt+Down          | Shift+Option+Down       |
| Seleccionar siguiente ocurrencia   | Ctrl+D                  | Cmd+D                   |
| Seleccionar todas las ocurrencias  | Ctrl+Shift+L            | Cmd+Shift+L             |
| Ir a definición                  | F12 / Ctrl+Click        | F12 / Cmd+Click         |
| Renombrar símbolo                 | F2                      | F2                      |
| Toggle comment                    | Ctrl+/                  | Cmd+/                   |
| Toggle block comment              | Shift+Alt+A             | Shift+Option+A          |
| Formatear documento               | Shift+Alt+F             | Shift+Option+F          |
| Multi-cursor (click en línea)    | Alt+Click               | Option+Click            |
| Cerrar pestaña                   | Ctrl+W                  | Cmd+W                   |

Tip: fuentes con ligaduras

Si usás una fuente con soporte de ligaduras (como Fira Code, JetBrains Mono o Cascadia Code) y activás "editor.fontLigatures": true, caracteres como => se muestran como una flecha, !== se muestra como , y ... como puntos horizontales. Es un detalle visual pequeño pero hace que leer código sea más agradable. Estas fuentes son gratuitas y se pueden instalar en tu sistema operativo.

Live Server

Live Server es una extensión de VS Code que crea un servidor de desarrollo local con recarga automática (hot reload). Cuando guardás un archivo HTML, CSS o JS, el navegador se actualiza instantáneamente para reflejar los cambios, sin que tengas que recargar manualmente. Esto parece un detalle menor, pero cuando estás iterando sobre el diseño de un componente o ajustando un estilo, guardar y ver el cambio en menos de un segundo cambia por completo tu flujo de trabajo. Ya no hay que alternar entre el editor y el navegador presionando F5 o Ctrl+R: simplemente guardás (Ctrl+S) y el cambio aparece mágicamente.

Para usarlo, instalá la extensión "Live Server" de Ritwick Dey, hacé click derecho en tu archivo HTML y elegí "Open with Live Server". Se abrirá tu navegador en http://127.0.0.1:5500 con tu página. A partir de ahí, cada vez que guardes cualquier archivo del proyecto, el navegador se recarga automáticamente. También soporta detección de cambios en archivos CSS inyectándolos sin recarga completa (lo que preserva el estado de la página, como valores de formularios o posición de scroll).

JSON — Configuración de Live Server (opcional)
// En settings.json o .vscode/settings.json
{
    // Puerto personalizado (default es 5500)
    "liveServer.settings.port": 8080,

    // No abrir el navegador automáticamente
    "liveServer.settings.openBrowser": false,

    // Recargar solo CSS inyectándolo (sin recarga completa)
    "liveServer.settings.NoBrowser": false,

    // Ignorar archivos/carpetas para el watch
    "liveServer.settings.ignoreFiles": [
        ".vscode/**",
        "node_modules/**"
    ],

    // Usar HTTPS en lugar de HTTP
    "liveServer.settings.https": {
        "enable": false,
        "cert": "/ruta/a/cert.pem",
        "key": "/ruta/a/key.pem"
    }
}

Alternativa: la extensión "Live Preview" de Microsoft

Microsoft lanzó una extensión oficial llamada Live Preview que hace lo mismo que Live Server pero integrada nativamente en VS Code (incluso muestra el preview dentro del editor en un panel lateral). Si usás VS Code reciente, probála desde la pestaña de extensiones. Funciona igual: click derecho en el HTML y "Show Preview".

Chrome DevTools

Las DevTools (Herramientas de Desarrollo) son el swiss army knife del desarrollador web. Viene integrada en Chrome, Edge, Firefox y Safari, y te permite inspeccionar y modificar el HTML y CSS de cualquier página en tiempo real, depurar JavaScript paso a paso, analizar el rendimiento de carga, monitorear peticiones de red, y mucho más. Es la herramienta que más vas a usar después de tu editor de código, y dominarla te ahorra incontables horas de frustración. Se abre con F12 o Ctrl+Shift+I (o Cmd+Option+I en Mac).

Panel Elements

El panel Elements es tu arma principal para trabajar con HTML y CSS. Muestra el árbol DOM completo de la página, y podés hacer click en cualquier elemento para ver sus estilos computados, modificarlos en vivo, agregar o quitar clases, y ver cómo afecta al layout. Los cambios que hacés acá son temporales (se pierden al recargar), pero son perfectos para experimentar antes de escribir el código definitivo en tu editor. Podés incluso editar el HTML directamente haciendo doble click en un elemento, y usar el botón "+" para crear nuevos nodos.

Features del panel Elements
| Feature                         | Cómo usarla                              |
|---------------------------------|---------------------------------------------|
| Inspeccionar elemento           | Click derecho → Inspeccionar (o Ctrl+Shift+C) |
| Editar HTML in-situ             | Doble click en el elemento en el árbol DOM   |
| Editar atributos                | Doble click en un atributo                   |
| Toggle clases                   | Icono .cls para agregar/quitar clases        |
| Editar estilos en vivo          | Panel Styles a la derecha                     |
| Forzar estados (:hover, etc)   | :hov para simular pseudo-classes             |
| Box Model visual                | Diagrama visual de margin/border/padding      |
| Computed styles                 | Ver el valor final computado de cada prop    |
| Layout / Grid                   | Inspeccionar grids y flexbox visualmente     |
| Copy element                    | Click derecho → Copy → Copy element  |
| Capture node screenshot         | Click derecho → Capture node screenshot |

Panel Console

La Console es donde ves todos los console.log(), errores, warnings y mensajes del navegador. Pero no es solo un visor de logs: es un REPL (Read-Eval-Print Loop) donde podés ejecutar código JavaScript arbitrario en el contexto de la página actual. Esto es increíblemente útil para probar rápidamente una función, seleccionar elementos con document.querySelector(), o inspeccionar el valor de una variable sin modificar tu código fuente. Además, soporta autocompletado con Tab, y podés referenciar el último resultado con $_.

JavaScript — Trucos en la consola
// === Ejecutar en la consola del navegador ===

// Seleccionar y explorar elementos
const header = document.querySelector("header");
header.classList;           // ver clases
header.getBoundingClientRect(); // ver posición y tamaño

// Medir performance de una operación
console.time("render");
// ... operación que querés medir ...
console.timeEnd("render"); // "render: 12.345ms"

// Log con estilo (colores, fuente grande, etc)
console.log("%cWebForge", "font-size: 24px; color: #58a6ff; font-weight: bold");
console.log("%cError crítico!", "color: #ff6b6b; font-weight: bold");

// $0 y $$ : referenciar elementos seleccionados
// $0 = el elemento actualmente seleccionado en Elements
$0.style.color = "red";    // cambia el color del elemento seleccionado
$$("p");                   // querySelectorAll abreviado

// copy() : copiar al portapapeles
copy($0.outerHTML);        // copia el HTML del elemento seleccionado

// monitor() : log automático cuando una función es llamada
monitor(document.addEventListener);

// table() : mostrar arrays/objetos como tabla
table([{ nombre: "Ana", edad: 28 }, { nombre: "Carlos", edad: 32 }]);

Panel Network

El panel Network muestra todas las peticiones HTTP que hace la página: archivos HTML, CSS, JS, imágenes, fuentes, llamadas a APIs (fetch/XHR), y más. Para cada petición podés ver la URL, el método (GET/POST), el código de estado (200, 404, 500), el tamaño de la respuesta, y el tiempo que tardó. Esto es fundamental para detectar archivos que no cargan, APIs que fallan, imágenes pesadas, y cuellos de botella en la carga. Podés filtrar por tipo de recurso (solo XHR, solo imágenes), activar el throttling para simular conexiones lentas (3G, 4G, offline), y ver el waterfall visual de cómo se cargan los recursos en paralelo o en bloque.

Panel Sources & Debugger

El panel Sources es donde depurás JavaScript paso a paso. Podés poner breakpoints (puntos de interrupción) haciendo click en los números de línea del código, y la ejecución se pausará en ese punto para que inspecciones el valor de las variables, el call stack, y ejecutes código línea por línea. También soporta conditional breakpoints (se pausan solo si se cumple una condición), logpoints (agregan un log sin pausar), y watch expressions (expresiones que monitoreás en tiempo real). Es la herramienta que usás cuando algo "no funciona" y necesitás entender exactamente qué está pasando.

DevTips: la consola también entiende XPATH y selectores CSS

En el panel Elements, podés presionar Ctrl+F y buscar con selectores CSS (por ejemplo .card > h3) o con XPath (por ejemplo //div[@class="card"]/h3). Esto es mucho más potente que buscar texto plano, porque te permite encontrar elementos por su estructura, no solo por su contenido.

Prettier

Prettier es un formateador de código opinativo (opinionated formatter). Esto significa que no le pedís cómo quieras formatear el código: él ya tiene reglas predefinidas y las aplica. La filosofía es simple: en lugar de discutir con tu equipo sobre si usar tabs o espacios, si poner la llave en la misma línea o en la siguiente, o cuánto indentar, Prettier toma todas esas decisiones por vos. Con "editor.formatOnSave": true en VS Code, cada vez que guardás un archivo se formatea automáticamente. Si trabajás en equipo, todos tienen el mismo formato sin esfuerzo. Soporta HTML, CSS, JS/TS, JSON, Markdown, YAML y más.

JSON — .prettierrc (configuración)
{
    "semi": true,
    "singleQuote": true,
    "tabWidth": 4,
    "useTabs": false,
    "trailingComma": "es5",
    "printWidth": 100,
    "bracketSpacing": true,
    "arrowParens": "always",
    "htmlWhitespaceSensitivity": "css",
    "endOfLine": "lf"
}

Estas son las opciones que probablemente vas a querer ajustar. "semi": true agrega punto y coma al final de cada statement. "singleQuote": true usa comillas simples en JS (más común en la comunidad). "tabWidth": 4 coincide con la convención de 4 espacios de este proyecto. "trailingComma": "es5" agrega comas al final en arrays y objetos donde sea seguro (evita conflictos en Git cuando se agrega un elemento nuevo). "printWidth": 100 es el límite de caracteres por línea antes de que Prettier haga wrap automático. El resto de las opciones se pueden dejar en sus valores por defecto, que ya son excelentes.

Prettier vs ESLint: no son lo mismo

Prettier se ocupa del formato (espacios, comillas, punto y coma, saltos de línea). ESLint se ocupa de la calidad del código (variables no usadas, errores lógicos, malas prácticas). No compiten: se complementan. En proyectos profesionales se usan los dos juntos. Prettier formatea, ESLint revisa. La extensión de VS Code "ESLint" se puede configurar para que corrija automáticamente los problemas al guardar, junto con Prettier.

Emmet

Emmet es un sistema de abreviaciones que viene integrado en VS Code (y en la mayoría de editores modernos). Te permite escribir HTML y CSS con abreviaturas cortas que se expanden a código completo con solo presionar Tab o Enter. Lo que normalmente te llevaría 20 líneas de HTML tipeándolo a mano, con Emmet lo escribís en una sola línea y se expande instantáneamente. Una vez que te acostumbrás, no podés volver a escribir HTML sin Emmet: es como pasar de caminar a andar en bicicleta.

Abreviaciones HTML esenciales

HTML


!                               <!DOCTYPE html><html lang="en"><head>...</head><body></body></html>

div                             <div></div>
div#app                         <div id="app"></div>
div.card                        <div class="card"></div>
div.card.active                 <div class="card active"></div>

p>span                          <p><span></span></p>
ul>li*3                         <ul><li></li><li></li><li></li></ul>
nav>ul>li*5>a                   <nav><ul><li><a href=""></a></li>...x5</ul></nav>

div+article+aside               <div></div>  <article></article>  <aside></aside>

div.header+div.main+div.footer  3 divs hermanos con esas clases

div>p*2>span                    <div><p><span></span></p><p><span></span></p></div>

div>(header>h1)+section*2        div con header>h1 y 2 sections adentro


a{Click aquí}               <a href="">Click aquí</a>
button.btn{Enviar}[type=submit]  <button class="btn" type="submit">Enviar</button>
img[src="foto.jpg"][alt="paisaje"]  <img src="foto.jpg" alt="paisaje">


ul>li.item${Texto $}*3        <ul>
                                  <li class="item1">Texto 1</li>
                                  <li class="item2">Texto 2</li>
                                  <li class="item3">Texto 3</li>
                                </ul>


lorem                           Genera 30 palabras de texto placeholder
lorem5                          Genera 5 palabras
lorem*3                         Genera 3 párrafos

Abreviaciones CSS esenciales

CSS
/* Escribe esto:     Se expande a esto: */

df               display: flex;
dfc              display: flex; align-items: center; justify-content: center;
fdc              display: flex; flex-direction: column;
dg               display: grid;
dib              display: inline-block;
dn               display: none;

p10              padding: 10px;
p20              padding: 20px;
pt10             padding-top: 10px;
px20             padding-left: 20px; padding-right: 20px;
py10             padding-top: 10px; padding-bottom: 10px;
m0               margin: 0;
ma               margin: auto;
mt10             margin-top: 10px;
mx-auto          margin-left: auto; margin-right: auto;

w100             width: 100px;
w100p            width: 100%;
h100vh           height: 100vh;
mw100            max-width: 100px;
mnh              min-height: 0;

bgc              background-color: #fff;
bg               background: #000;
bg-img           background-image: url();

c                color: #000;
c:red            color: red;
opa50            opacity: 0.5;

fs20             font-size: 20px;
fw700            font-weight: 700;
fsti             font-style: italic;
ttc              text-transform: capitalize;
tac              text-align: center;
tal              text-align: left;
tdn              text-decoration: none;

brad             border-radius: 5px;
brad50p          border-radius: 50%;
bd1              border: 1px solid #000;
bdn              border: none;

posr             position: relative;
posa             position: absolute;
posf             position: fixed;
poss             position: sticky;
t0               top: 0;
l0               left: 0;
r0               right: 0;
b0               bottom: 0;
zi10             z-index: 10;

ovh              overflow: hidden;
ovs              overflow: scroll;
ova              overflow: auto;

curp             cursor: pointer;
usn              user-select: none;
trf              transform: translateX(-50%);

!important       !important (se agrega al final de cualquier propiedad)
bdi+bdn          border: 1px solid #000; border: none; (valores fuzz)

Las abreviaciones CSS de Emmet usan un sistema de prefijos cortos derivados de las iniciales de la propiedad. df = display flex, p = padding, m = margin, bg = background, c = color, fs = font-size, fw = font-weight. Los números se interpretan como píxeles (p10 = 10px), y si agregás una "p" se convierte en porcentaje (w100p = width: 100%). Con - se generan valores negativos. No necesitás memorizarlas todas: empezá con las que más usás (display, flex, padding, margin, color, font-size) y las demás se van aprendiendo naturalmente.

Git: Editor + GUI

Ya cubrimos Git en detalle en la sección dedicada, pero aquí vamos a enfocarnos en las herramientas visuales para usar Git sin salir de tu flujo de trabajo. VS Code tiene integración Git nativa muy potente que cubre el 90% de lo que necesitás en el día a día: ver cambios, hacer stage/unstage, commitear, ver el historial, crear ramas y resolver conflictos básicos. Todo desde la sidebar con una interfaz visual que muestra los archivos modificados en verde/rojo con un diff inline. Para quienes prefieren una interfaz gráfica más completa, existen opciones dedicadas como GitHub Desktop y GitKraken.

Comparativa de herramientas Git
| Herramienta       | Tipo        | Ventajas                                    | Ideal para          |
|-------------------|-------------|---------------------------------------------|---------------------|
| VS Code Git       | Integrada   | Ya la tenés, zero setup, diff visual        | 90% de los días     |
| GitHub Desktop    | App gratis  | Interfaz limpia, ideal para principiantes    | Open source, PRs     |
| GitLens (ext.)    | Extensión  | Blame inline, historial por línea           | Revisar cambios      |
| GitKraken         | App freemium| Grafo de branches visual, merge drag&drop   | Proyectos complejos  |
| Tower             | App de pago | Potente, well designed                      | Teams profesionales  |
| Terminal (CLI)    | Nativa      | Poder total, scripts, automático          | Todo                 |

La recomendación: usá VS Code Git como tu herramienta principal.
Agregá GitLens para ver quién cambió qué.
Y cuando necesites algo más visual (merge conflicts, rebase), GitHub Desktop.

No evites la terminal para siempre

Las GUIs son geniales para el día a día, pero hay operaciones que son más rápidas y potentes en la terminal: git rebase -i, git stash, git cherry-pick, y scripts de automatización. Lo ideal es ser cómodo con ambos mundos: GUI para lo visual y rápido, terminal para lo avanzado y repetitivo.

Compatibilidad de Navegadores

No todos los navegadores implementan las mismas funcionalidades al mismo tiempo. Una propiedad CSS que funciona perfectamente en Chrome puede no estar disponible en Safari, o una API de JavaScript puede tener un comportamiento ligeramente diferente en Firefox. Como desarrollador web, necesitás saber qué podés usar con seguridad y qué necesita un fallback o una alternativa. Para eso existen herramientas de referencia que te permiten verificar la compatibilidad de cualquier feature en segundos.

Can I Use (caniuse.com)

Can I Use es el sitio de referencia para verificar compatibilidad de features web. Ingresás una propiedad CSS, una API de JavaScript o una feature de HTML, y te muestra una tabla con el soporte en cada versión de cada navegador (Chrome, Firefox, Safari, Edge, Opera, iOS Safari, Android Browser). Los porcentajes de soporte global te dan una idea rápida de si es seguro usar esa feature. La regla general es: si tiene más del 95% de soporte global, podés usarla tranquilamente. Si está entre 85% y 95%, evaluá si tus usuarios usan los navegadores sin soporte. Si está por debajo del 85%, probablemente necesites un fallback o no usarla.

MDN Web Docs (developer.mozilla.org)

MDN Web Docs es la documentación oficial y más completa sobre desarrollo web. Mantenida por Mozilla, cubre HTML, CSS, JavaScript, Web APIs, y más, con explicaciones detalladas, ejemplos interactivos, y tablas de compatibilidad. Cada página de una propiedad o método tiene una sección "Browser compatibility" que muestra el soporte exacto por versión de navegador, incluyendo notas sobre peculiaridades o bugs conocidos. Es tu primera parada cuando necesitás entender cómo funciona algo o verificar su compatibilidad. Si tenés una duda sobre cualquier API o propiedad, MDN tiene la respuesta.

Estrategias de compatibilidad

CSS — Feature queries y fallbacks
/* === Estrategia 1: Fallback simple === */
/* El navegador usa la última que entiende */
.card {
    display: block;           /* fallback para navegadores viejos */
    display: flex;            /* navegadores modernos sobreescriben */
}

/* === Estrategia 2: @supports (feature query) === */
/* Aplica estilos solo si el navegador soporta la feature */
.container {
    display: block;
}

@supports (display: grid) {
    .container {
        display: grid;
        grid-template-columns: repeat(3, 1fr);
        gap: 1rem;
    }
}

@supports not (display: grid) {
    .container {
        display: flex;
        flex-wrap: wrap;
    }
    .container > * {
        flex: 1 1 300px;
        margin: 0.5rem;
    }
}

/* === Estrategia 3: Progressive enhancement con clamp() === */
/* Si clamp() no funciona, el navegador ignora la línea */
h1 {
    font-size: 16px;          /* fallback mínimo */
    font-size: clamp(1.5rem, 4vw, 3rem);  /* fluido en navegadores modernos */
}

/* === Estrategia 4: Prefijos vendor (hoy casi innecesarios) === */
.element {
    -webkit-transition: all 0.3s ease;
    transition: all 0.3s ease;
}
JavaScript — Detección de features
// === Detectar si una API existe antes de usarla ===

// IntersectionObserver (animaciones on-scroll)
if ("IntersectionObserver" in window) {
    // El navegador soporta IntersectionObserver
    const observer = new IntersectionObserver(callback);
    observer.observe(elemento);
} else {
    // Fallback: mostrar todo directamente sin animación
    elemento.classList.add("visible");
}

// localStorage
if (typeof localStorage !== "undefined") {
    localStorage.setItem("clave", "valor");
}

// fetch API
if (window.fetch) {
    fetch("/api/datos").then(r => r.json());
} else {
    // Fallback con XMLHttpRequest (muy raro hoy en día)
    const xhr = new XMLHttpRequest();
    xhr.open("GET", "/api/datos");
    xhr.onload = () => JSON.parse(xhr.responseText);
    xhr.send();
}

// Optional chaining (?.) - esto es de sintaxis, no se puede detectar
// con if. Para esto se usa Babel o se evita la sintaxis si
// necesitás soportar navegadores muy viejos.

// CSS.supports() - detectar soporte CSS desde JavaScript
if (CSS.supports("display", "grid")) {
    console.log("Este navegador soporta CSS Grid");
}

if (CSS.supports("color: oklch(0.7 0.15 200)")) {
    console.log("Este navegador soporta OKLCH colors");
}

¿Navegadores viejos en 2026?

Hoy en día, el soporte de features modernas (CSS Grid, Flexbox, ES6+, fetch, IntersectionObserver, Custom Properties) es superior al 95% global. A menos que tengas un requisito específico de soportar navegadores muy viejos (como IE11 en empresas), podés usar features modernas con confianza. La regla práctica es: verificá en Can I Use, y si es >95%, usálo directamente con un fallback simple.

Deploy: Publicar tu Sitio

Llegó el momento de mostrar tu trabajo al mundo. Desplegar (hacer deploy) significa subir tu código a un servidor para que sea accesible desde internet. Para sitios estáticos (HTML, CSS, JS sin backend) como los que venís construyendo en este proyecto, existen varias plataformas gratuitas que hacen el deploy automático: conectás tu repo de GitHub y cada vez que hacés push, la plataforma reconstruye y publica tu sitio. No necesitás configurar servidores, instalar nada ni saber de infraestructura: solo conectás y listo.

GitHub Pages

GitHub Pages es la opción más natural si ya tenés tu código en GitHub. Es gratuito, soporta dominios custom, y se configura en menos de 5 minutos desde la sección "Pages" de tu repo. Soporta sitios estáticos (HTML/CSS/JS) y también Jekyll (un generador de sitios estáticos en Ruby). El deploy se puede hacer desde la rama main (todo el repo) o desde una rama gh-pages (solo el sitio). Para proyectos como WebForge, donde el sitio está en la raíz del repo, se configura apuntando a la rama main y carpeta / (root). Cada push a main dispara el deploy automático, y tu sitio queda en https://tusuario.github.io/tu-repo/.

Comparativa de plataformas de deploy
| Plataforma      | Gratuito | Deploy auto | Custom domain | SSL | Build |
|-----------------|----------|-------------|---------------|-----|-------|
| GitHub Pages    | Si       | Si (push)   | Si            | Si  | No    |
| Netlify         | Si       | Si (push)   | Si            | Si  | Si    |
| Vercel          | Si       | Si (push)   | Si            | Si  | Si    |
| Cloudflare Pages| Si       | Si (push)   | Si            | Si  | Si    |
| GitLab Pages    | Si       | Si (push)   | Si            | Si  | Si    |
| Surge.sh        | Si       | CLI         | Si            | Si  | No    |

Para sitios estáticos puros (como WebForge), cualquier plataforma funciona.
GitHub Pages es el más simple si ya usás GitHub.
Netlify y Vercel agregan: redirects, headers custom, form handling, split testing.
Cloudflare Pages es el más rápido (CDN global de Cloudflare).

Flujo de deploy típico

Bash
# === Flujo básico de trabajo con deploy automático ===

# 1. Hacés cambios en tu código local
# 2. Probás localmente con Live Server
# 3. Agregás los cambios a Git
git add .

# 4. Commiteás con un mensaje descriptivo
git commit -m "feat: agregar sección de herramientas y workflow"

# 5. Subís a GitHub
git push origin main

# 6. La plataforma detecta el push y hace deploy automático
#    Tu sitio se actualiza en 1-3 minutos

# === Ver el estado del deploy en GitHub Pages ===
# Ir a: Settings → Pages → ver el indicator "Your site is live"

# === Si usás Netlify CLI ===
# npm install -g netlify-cli
# netlify deploy --prod --dir=.

# === Si usás Vercel CLI ===
# npm install -g vercel
# vercel --prod

Dominios custom y HTTPS

Todas las plataformas mencionadas soportan conectar un dominio propio (por ejemplo, mi-sitio.com) en lugar de usar el subdominio por defecto de la plataforma. El proceso general es: (1) comprás el dominio en un registrador como Namecheap, Google Domains o Porkbun, (2) configurás un registro DNS CNAME apuntando a la plataforma, (3) en la configuración de la plataforma agregás tu dominio custom. El certificado SSL (HTTPS) se genera automáticamente y gratis mediante Let's Encrypt en todas las plataformas. Tu sitio queda accesible tanto con https://mi-sitio.com como con https://www.mi-sitio.com sin que tengas que configurar nada extra de seguridad.

GitHub Pages: tip sobre rutas relativas

Si tu sitio está en https://usuario.github.io/mi-repo/ (con subdirectorio), todos los links internos, imágenes y CSS deben usar rutas relativas (sin / al inicio) o el prefijo /mi-repo/. Este proyecto (WebForge) está en /WebForge/, así que todos los href y src usan ../ para navegar correctamente desde sections/ y cheatsheets/.

Workflow Recomendado

Con todo lo que cubrimos en esta sección, tu flujo de trabajo ideal para desarrollar sitios web se ve así. No es la única forma de trabajar, pero es una que funciona bien, es escalable, y te prepara para trabajar en equipo o en proyectos más grandes. Lo importante es que sea consistente: siempre usá el mismo flujo para que se vuelva automático y no tengas que pensar en "qué hago ahora" mientras trabajás.

Workflow completo
1. PLANIFICAR
   └─ Definir qué vas a construir (sección, componente, feature)
   └─ Revisar el PRD o la issue correspondiente
   └─ Pensar la estructura HTML antes de escribir código

2. DESARROLLAR
   └─ Abrir el proyecto en VS Code
   └─ Crear rama de trabajo: git checkout -b feat/nombre-seccion
   └─ Abrir Live Server para preview en tiempo real
   └─ Escribir HTML con Emmet (abreviaciones rápidas)
   └─ Estilar con CSS (variables, mobile-first)
   └─ Agregar interactividad con JavaScript
   └─ Prettier formatea al guardar automáticamente

3. PROBAR
   └─ Probar en el navegador con Live Server
   └─ Revisar responsivo: DevTools → Toggle device toolbar (Ctrl+Shift+M)
   └─ Verificar que no haya errores en la Console
   └─ Revisar Network para ver que todo cargue correctamente
   └─ Probar en Chrome y Firefox al menos

4. VERSIONAR
   └─ git add . (o archivos específicos)
   └─ git commit -m "feat: descripción del cambio"
   └─ git push origin feat/nombre-seccion

5. DEPLOYAR
   └─ Merge a main (via PR en GitHub o local)
   └─ Push a main → deploy automático
   └─ Verificar el sitio en producción
   └─ Revisar con Lighthouse (auditoría de performance/SEO)

La regla de los commits pequeños

Hacé commits pequeños y frecuentes en lugar de un commit gigante al final del día. Cada commit debería representar un cambio lógico: "agregar sección X", "corregir bug en Y", "mejorar estilos de Z". Esto hace que sea fácil revertir un cambio específico si algo se rompe, y el historial de Git cuenta una historia clara de cómo fue evolucionando el proyecto.