Pixel Loader

Shape how the portfolio’s opening text arrives, then copy the exact setup.

Preview

Ali Tayyebi

Design Lead Manager, Meta Superintelligence Labs

I work on AI products, developer tools, and the systems around them.

Semantic text · no layout shift · reduced-motion safe

Implementation

Copy the current setup.

import type { CSSProperties, ElementType } from "react";

type StaggerBy = "sections" | "letters";
type Direction = "horizontal" | "vertical";
type Order = "natural" | "reverse" | "center";

type PixelTextProps = {
  as?: ElementType;
  text: string;
  index: number;
  total: number;
  letterOffset: number;
  totalLetters: number;
  duration?: number;
  sectionStagger?: number;
  letterStagger?: number;
  staggerBy?: StaggerBy;
  direction?: Direction;
  order?: Order;
  pixelSize?: number;
  steps?: number;
  colors?: [string, string, string];
};

const orderIndex = (index: number, total: number, order: Order) => {
  if (order === "reverse") return total - 1 - index;
  if (order === "center") return Math.abs(index - (total - 1) / 2);
  return index;
};

export function PixelText({
  as: Tag = "span",
  text,
  index,
  total,
  letterOffset,
  totalLetters,
  duration = 1500,
  sectionStagger = 260,
  letterStagger = 24,
  staggerBy = "sections",
  direction = "vertical",
  order = "natural",
  pixelSize = 8,
  steps = 7,
  colors = ["#f05a3c", "#2aafc1", "#b8e63a"],
}: PixelTextProps) {
  const makeStyle = (delay: number, colorOffset = 0) => ({
    "--delay": delay + "ms",
    "--duration": duration + "ms",
    "--steps": steps,
    "--coarse": Math.round(pixelSize * 1.75) + "px",
    "--medium": pixelSize + "px",
    "--fine": Math.max(2, Math.round(pixelSize * 0.5)) + "px",
    "--tone-a": colors[colorOffset % 3],
    "--tone-b": colors[(colorOffset + 1) % 3],
    "--tone-c": colors[(colorOffset + 2) % 3],
    "--enter-x": direction === "horizontal" ? "-2px" : "0px",
    "--enter-y": direction === "vertical" ? "-2px" : "0px",
    "--exit-x": direction === "horizontal" ? "1px" : "0px",
    "--exit-y": direction === "vertical" ? "1px" : "0px",
    "--clip-start": direction === "horizontal"
      ? "inset(0 100% 0 0)"
      : "inset(100% 0 0 0)",
    "--pixel-angle": direction === "horizontal" ? "45deg" : "135deg",
  } as CSSProperties);

  const layers = (character: string, delay: number, colorOffset: number) => (
    <span className="pixel-glyph" style={makeStyle(delay, colorOffset)}>
      <span className="pixel-base">{character}</span>
      <span aria-hidden="true" className="pixel-fx pixel-coarse">{character}</span>
      <span aria-hidden="true" className="pixel-fx pixel-medium">{character}</span>
      <span aria-hidden="true" className="pixel-fx pixel-fine">{character}</span>
    </span>
  );

  if (staggerBy === "letters") {
    let localIndex = 0;
    return (
      <Tag className="pixel-text pixel-text--letters" aria-label={text}>
        <span className="pixel-letters" aria-hidden="true">
          {text.split(/(\s+)/).map((token, tokenIndex) => {
            if (/^\s+$/.test(token)) return <span key={tokenIndex}>{token}</span>;
            return (
              <span className="pixel-word" key={tokenIndex}>
                {Array.from(token).map((character) => {
                  const globalIndex = letterOffset + localIndex++;
                  const delay = orderIndex(globalIndex, totalLetters, order) * letterStagger;
                  return <span key={globalIndex}>{layers(character, delay, globalIndex)}</span>;
                })}
              </span>
            );
          })}
        </span>
      </Tag>
    );
  }

  const delay = orderIndex(index, total, order) * sectionStagger;
  return (
    <Tag className="pixel-text" style={makeStyle(delay, index)}>
      <span className="pixel-base">{text}</span>
      <span aria-hidden="true" className="pixel-fx pixel-coarse">{text}</span>
      <span aria-hidden="true" className="pixel-fx pixel-medium">{text}</span>
      <span aria-hidden="true" className="pixel-fx pixel-fine">{text}</span>
    </Tag>
  );
}