Componentes

Ejemplos interactivos en React, Vue, Preact, Svelte y Solid.js.

React GradientReact.tsx
Ángulo: 135°
background: linear-gradient(135deg, #2563eb, #7c3aed);
Ver código
import { useState } from "react";

export default function GradientReact() {
  const [colorA, setColorA] = useState("#2563eb");
  const [colorB, setColorB] = useState("#7c3aed");
  const [angle, setAngle]   = useState(135);

  const css = `background: linear-gradient(${angle}deg, ${colorA}, ${colorB});`;

  return (
    <>
      <div style={{ background: `linear-gradient(${angle}deg, ${colorA}, ${colorB})` }} />
      <input type="color" value={colorA} onChange={e => setColorA(e.target.value)} />
      <input type="color" value={colorB} onChange={e => setColorB(e.target.value)} />
      <input type="range" min={0} max={360} value={angle}
             onChange={e => setAngle(Number(e.target.value))} />
      <code>{css}</code>
    </>
  );
}
Vue CardFlipVue.vue

Haz clic

¿Qué es
Vue?

🃏

Framework progresivo para construir interfaces de usuario. Reactivo, componible y adoptable incrementalmente.

vue.js

Ver código
<template>
  <div class="scene" @click="flipped = !flipped">
    <div class="card" :class="{ 'is-flipped': flipped }">
      <div class="face front">¿Qué es Vue?</div>
      <div class="face back">Framework progresivo...</div>
    </div>
  </div>
</template>

<script setup>
import { ref } from "vue";
const flipped = ref(false);
</script>

<style scoped>
.card {
  transform-style: preserve-3d;
  transition: transform 0.55s cubic-bezier(.4,0,.2,1);
}
.card.is-flipped { transform: rotateY(180deg); }
.face { backface-visibility: hidden; }
.back { transform: rotateY(180deg); }
</style>
Preact PasswordPreact.preact.tsx
Introduce una contraseña
Ver código
import { useState } from "preact/hooks";

function getStrength(pwd: string) {
  let score = 0;
  if (pwd.length >= 8)           score++;
  if (pwd.length >= 12)          score++;
  if (/[A-Z]/.test(pwd))         score++;
  if (/[0-9]/.test(pwd))         score++;
  if (/[^A-Za-z0-9]/.test(pwd))  score++;
  return score;
}

export default function PasswordPreact() {
  const [pwd, setPwd] = useState("");
  const strength = getStrength(pwd);

  return (
    <>
      <input type="password" onInput={e => setPwd(e.target.value)} />
      {/* 5 barras de color que se llenan según score */}
      {[0,1,2,3,4].map(i => (
        <div style={{ background: i <= strength ? color : "#e5e7eb" }} />
      ))}
    </>
  );
}
Svelte SkillBarsSvelte.svelte
TypeScript 90%
Rust 62%
Go 75%
Python 85%
Svelte 78%
Ver código
<script>
  import { onMount } from "svelte";
  import { tweened } from "svelte/motion";
  import { cubicOut } from "svelte/easing";

  const skills = [
    { name: "TypeScript", pct: 90, color: "#3178c6" },
    { name: "Rust",       pct: 62, color: "#ce422b" },
    // ...
  ];

  const values = skills.map(() =>
    tweened(0, { duration: 900, easing: cubicOut })
  );

  onMount(() => {
    skills.forEach((s, i) => values[i].set(s.pct));
  });
</script>

{#each skills as skill, i}
  <div class="bar" style="width: {$values[i]}%" />
{/each}
Solid InvestmentSimulatorSolid.solid.tsx
Ver código
import { createMemo, createSignal } from "solid-js";

export default function InvestmentSimulatorSolid() {
  const [principal, setPrincipal] = createSignal(12000);
  const [monthly, setMonthly] = createSignal(450);
  const [rate, setRate] = createSignal(6.5);
  const [years, setYears] = createSignal(12);

  const projection = createMemo(() => {
    // calcula el crecimiento por año con interés compuesto
  });

  return (
    <>
      {/* sliders + resumen + barras por año */}
    </>
  );
}