trx-cli 0.1.9

A Modern Cross-Platform Package Manager TUI
"use client";

import { useEffect, useRef, useState } from "react";
import { insetDisc, insetWell } from "@/app/landing-material";
import { C } from "./tokens";
import { MX } from "./matrix-tokens";
import { CopyIconButton } from "./CopyIconButton";

export function Step({ num, title, code }: { num: string; title: string; code: string }) {
  const [copied, setCopied] = useState(false);
  const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);

  useEffect(() => () => { if (timerRef.current) clearTimeout(timerRef.current); }, []);

  const handleCopy = async () => {
    if (timerRef.current) { clearTimeout(timerRef.current); timerRef.current = null; }
    try {
      await navigator.clipboard.writeText(code);
      setCopied(true);
      timerRef.current = setTimeout(() => { setCopied(false); timerRef.current = null; }, 1500);
    } catch {
      setCopied(false);
    }
  };

  return (
    <div>
      <div className="mb-5 flex items-center gap-3">
        <div className={insetDisc("flex h-8 w-8 shrink-0 items-center justify-center font-mono text-xs font-semibold")} style={{ color: MX.emeraldText }}>
          {num}
        </div>
        <h3
          className="min-w-0 flex-1 leading-snug tracking-tight [font-family:var(--font-geist-sans)]"
          style={{ color: C.text, fontSize: "15px", fontWeight: "600", margin: 0, letterSpacing: "-0.015em" }}
        >
          {title}
        </h3>
      </div>
      <div className={insetWell("flex items-center gap-2 rounded-md py-0.5 pl-3.5 pr-2 font-mono text-[12px] text-[#878787]")}>
        <div className="min-w-0 flex-1 break-words leading-none">
          <span style={{ color: MX.emeraldText, userSelect: "none" }}>$ </span>
          {code}
        </div>
        <CopyIconButton compact copied={copied} onCopy={handleCopy} idleLabel={`Copy command: ${title}`} />
      </div>
    </div>
  );
}