Skip to content

Light Up Jiggly Texts ​

Like Jiggly Recursive Circles, with nested texts that light up in color. Type your own text.

js
const text = Inputs.text({label: "Text", value: "苏"});
js
const size = 640;
const random = d3.randomUniform(-25, 25);
const schemes = [
  "Viridis",
  "Inferno",
  "Magma",
  "Plasma",
  "Warm",
  "Cool",
  "Rainbow",
  "CubehelixDefault",
  "Blues",
  "Greens",
  "Oranges",
  "Purples",
  "Reds",
  "BuPu",
  "GnBu",
  "OrRd",
  "PuRd",
  "RdPu",
  "YlGnBu",
  "YlOrRd",
];
const sizes = d3.range(150, 4, -15);
const color = (scheme) => d3.scaleSequential([150, 0], d3[`interpolate${scheme}`]);

const svg = cm.svg`<svg ${{width: size, height: size, viewBox: [0, 0, size, size]}}>
  <g ${{data: sizes}}>
    <text ${{
      transform: `translate(${size / 2}, ${size / 2})`,
      text_anchor: "middle",
      dominant_baseline: "middle",
      font_size: (r) => (r * 2) / Math.sqrt(text.length || 1),
      font_weight: "bold",
      fill: "black",
      stroke: "black",
      stroke_width: 0.5,
    }}>${text}</text>
  </g>
</svg>`;

function jiggle() {
  const [dx, dy] = [random(), random()];
  const fill = color(schemes[d3.randomInt(schemes.length)()]);
  d3.select(svg)
    .selectAll("g")
    .data(sizes)
    .transition()
    .duration(1000)
    .delay((d, i) => i * 20)
    .ease(d3.easeElastic)
    .attr("transform", (d, i) => `translate(${i * dx}, ${i * dy})`)
    .select("text")
    .attr("fill", (r) => fill(r));
}

setTimeout(jiggle, 500);
setInterval(jiggle, 2000);

document.body.append(svg);