This component no longer exists. It was in PaceUI GSAP’s manifest when we first indexed it and is not there now — the registry served its inventory on 2026-08-06 and this item was not on it. The install command below will fail. It is kept here because a tutorial somewhere still tells people to run it.
Squash Text
paceui-gsap/squash-textRemovedComponent
Characters bounce and squash into place with playful, dynamic energy.
Live preview
live · rendered by the registry
Rendered by PaceUI GSAP on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://gsap.paceui.com/r/squash-text.jsonSource
1"use client";23import { ComponentProps, useId, useRef } from "react";45import { useGSAP } from "@gsap/react";6import gsap from "gsap";7import { CustomBounce } from "gsap/CustomBounce";8import { CustomEase } from "gsap/CustomEase";9import { SplitText } from "gsap/SplitText";1011// Ensure plugins are registered globally12if (typeof window !== "undefined") {13 gsap.registerPlugin(CustomEase, CustomBounce, SplitText);14}1516type SquashTextProps = {17 repeat?: boolean | number;18} & ComponentProps<"div">;1920export const SquashText = ({ repeat = true, children, ...props }: SquashTextProps) => {21 const wrapperRef = useRef<HTMLDivElement | null>(null);22 const bounceId = useId();2324 // We sanitize the IDs for GSAP ease names25 const bounceEase = `bounce${bounceId.replace(/:/g, "")}`;26 const squashEase = `squash${bounceId.replace(/:/g, "")}`;2728 useGSAP(29 () => {30 if (!wrapperRef.current) return;3132 // 1. Create the Custom Bounce33 CustomBounce.create(bounceEase, {34 strength: 0.6,35 squash: 1,36 squashID: squashEase,37 });3839 // 2. Initialize SplitText40 const split = new SplitText(wrapperRef.current, { type: "chars" });41 const chars = split.chars;4243 // 3. Create Timeline44 const tl = gsap.timeline({45 defaults: { duration: 1.5, stagger: { amount: 0.1, ease: "sine.in" } },46 repeat: repeat === true ? -1 : repeat === false ? 0 : repeat,47 });4849 tl.from(50 chars,51 {52 duration: 0.6,53 opacity: 0,54 ease: "power1.inOut",55 },56 0,57 )58 .from(59 chars,60 {61 y: -100,62 ease: bounceEase,63 },64 0,65 )66 .to(67 chars,68 {69 scaleX: 1.5,70 scaleY: 0.8,71 rotate: () => 15 - 30 * Math.random(),72 ease: squashEase,73 transformOrigin: "50% 100%",74 },75 0,76 );7778 // Cleanup: Revert the split text when component unmounts79 return () => {80 split.revert();81 };82// … truncated
What it pulls in
npm packages
