Isaiah

BJORK Glyph morph

Component 9

About

Glyph morph is a production-ready text component from BJORK UI, packaged for shadcn registries.

Built with React and Tailwind. Copy the prompt and paste it into Claude Code, Cursor or Lovable: your agent adds BJORK Glyph morph to your project and fits it to your theme.

Code

How BJORK Glyph morph is used: the demo's code. The component's own source comes with a free account.

Usage.tsx

"use client";
import { ThemeProvider as BjorkDemoThemeProvider } from "next-themes";
import { useState } from "react";
import { GlyphMorph } from "@/components/ui/bjork-glyph-morph";

const wordSets = [
  { label: "shape", words: ["Shape", "Shift", "Form", "Flow"] },
  { label: "craft", words: ["Design", "Develop", "Deploy"] },
  { label: "states", words: ["solid", "liquid", "vapour"] },
  { label: "short", words: ["ink", "melt", "drip", "set"] },
] as const;

const speeds = [
  { label: "slow", interval: 2200, duration: 2400 },
  { label: "normal", interval: 1600, duration: 1500 },
  { label: "fast", interval: 900, duration: 900 },
] as const;
function SourceDemo(){
const isPreview = false;
const previewTheme = null;
const tone = previewTheme === "light" || previewTheme === "dark" ? previewTheme : undefined;
const progressParam = null;
const frozen = progressParam !== null && progressParam !== "" ? Number(progressParam) : isPreview ? 0 : undefined;
const setRaw = null;
const setParam = setRaw ? Number(setRaw) : -1;
const [setIndex, setSetIndex] = useState(0);
const [speed, setSpeed] = useState<(typeof speeds)[number]["label"]>("normal");
const [weight, setWeight] = useState<number>(640);
const activeSpeed = speeds.find((s) => s.label === speed) ?? speeds[1];
const words = wordSets[Number.isInteger(setParam) && wordSets[setParam] ? setParam : isPreview ? 0 : setIndex].words;
const reset = () => {
    setSetIndex(0);
    setSpeed("normal");
    setWeight(640);
  };
return <>

      <div className="flex w-[min(880px,calc(100vw-72px))] flex-col items-center gap-6">
        <GlyphMorph
          words={[...words]}
          interval={activeSpeed.interval}
          duration={activeSpeed.duration}
          fontWeight={isPreview ? 640 : weight}
          tone={tone}
          progress={frozen !== undefined && Number.isFinite(frozen) ? frozen : undefined}
          ariaLabel="Morphing word"
        />
      </div>
    
</>;
}
export default function BjorkRegistryPreview(){return <BjorkDemoThemeProvider attribute="class" defaultTheme="dark" enableSystem={false} storageKey="bjork-review-demo-theme"><div data-component-demo className="dark flex min-h-screen w-full items-center justify-center bg-[var(--bjork-bg)] p-8 text-[var(--bjork-text)]"><div className="w-full max-w-[850px]"><SourceDemo/></div></div></BjorkDemoThemeProvider>}

Dependencies

More by Isaiah

View all
  • Agent Plan

    Agent Plan

    2.2K
  • Video Scroll Hero

    Video Scroll Hero

    1.4K
  • Voice Powered Orb

    Voice Powered Orb

    1.3K
  • Reveal Text

    Reveal Text

    1.1K
  • Leads Data Table

    Leads Data Table

    935
  • Portfolio Gallery

    Portfolio Gallery

    923
  • Message Dock

    Message Dock

    833
  • Ruler Carousel

    Ruler Carousel

    617