Remotion LabRemotion Lab
返回模板庫

用一段 Prompt 規劃產品規格

Prompt 輸入動畫:在終端機輸入五行需求(Landing Page、後台、Email 登入、Lemon Squeezy 金流、規格文件),箭頭指向右側四張功能卡片,底部產出產品設計規格文件。

AI開發Claude Code產品規格Prompt
提示詞(可直接修改內容)
import React from "react";
import {
  AbsoluteFill,
  useCurrentFrame,
  useVideoConfig,
  interpolate,
  spring,
} from "remotion";

export const PROMPT-SPEC-207-DURATION-FRAMES = 240;

const FEATURES = [
  { label: "Landing Page", zh: "前台頁面", color: "#4DA3FF" },
  { label: "Dashboard", zh: "後台介面", color: "#10B981" },
  { label: "Email Login", zh: "信箱登入", color: "#A78BFA" },
  { label: "Lemon Squeezy", zh: "金流串接", color: "#F59E0B" },
];

export const Scene207-PromptSpec: React.FC = () => {
  const frame = useCurrentFrame();
  const { fps } = useVideoConfig();

  const fadeIn = interpolate(frame, [0, 8], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
  const fadeOut = interpolate(frame, [220, 240], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
  const masterOpacity = Math.min(fadeIn, fadeOut);

  const titleSpring = spring({ frame: Math.max(0, frame - 5), fps, config: { damping: 14, stiffness: 90 } });
  const termSpring = spring({ frame: Math.max(0, frame - 15), fps, config: { damping: 12, stiffness: 80 } });
  const typeProg = interpolate(frame, [25, 80], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
  const arrowProg = interpolate(frame, [85, 110], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
  const featureSprings = FEATURES.map((_, i) =>
    spring({ frame: Math.max(0, frame - 105 - i * 15), fps, config: { damping: 12, stiffness: 80 } })
  );
  const specSpring = spring({ frame: Math.max(0, frame - 175), fps, config: { damping: 10, stiffness: 80 } });

  const LINES = [
    "做一個點子驗證工具",
    "Landing Page + 後台",
    "Email 登入功能",
    "金流串 Lemon Squeezy",
    "規劃產品設計規格",
  ];

  return (
    <AbsoluteFill
      style={{
        background: "linear-gradient(135deg, #0A0E14 0%, #111825 100%)",
        display: "flex",
        flexDirection: "column",
        alignItems: "center",
        justifyContent: "center",
        opacity: masterOpacity,
        fontFamily: "'Noto Sans TC', 'Inter', sans-serif",
      }}
    >
      <div style={{ opacity: titleSpring, transform: `translateY(${(1 - titleSpring) * 20}px)`, fontSize: 72, fontWeight: 800, color: "#FFFFFF", textAlign: "center", marginBottom: 12, lineHeight: 1.4 }}>
        用一段 <span style={{ color: "#A78BFA" }}>Prompt</span> 規劃產品規格
      </div>
      <div style={{ opacity: titleSpring * 0.4, fontSize: 36, color: "rgba(255,255,255,0.4)", fontFamily: "'Inter', sans-serif", fontStyle: "italic", marginBottom: 45 }}>
        One prompt to plan the entire product spec
      </div>

      <svg width={1980} height={825} viewBox="0 0 1320 550">
        {/* Terminal */}
        <g transform="translate(340, 35)" opacity={termSpring}>
          <g transform={`scale(${termSpring})`}>
            <rect x={-265} y={0} width={530} height={325} rx={18} fill="rgba(167,139,250,0.04)" stroke="#A78BFA" strokeWidth={3} />
            <rect x={-265} y={0} width={530} height={38} rx={18} fill="rgba(167,139,250,0.08)" />
            <rect x={-265} y={22} width={530} height={16} fill="rgba(167,139,250,0.08)" />
            <circle cx={-240} cy={19} r={6} fill="#EF4444" opacity={0.6} />
            <circle cx={-220} cy={19} r={6} fill="#F59E0B" opacity={0.6} />
            <circle cx={-200} cy={19} r={6} fill="#10B981" opacity={0.6} />
            <text x={0} y={24} textAnchor="middle" fontSize={15} fontWeight={700} fill="#A78BFA" fontFamily="'Inter', sans-serif" opacity={0.6}>Prompt</text>
            {LINES.map((line, i) => {
              const lineStart = i / LINES.length;
              const lineEnd = (i + 1) / LINES.length;
              const lineProg = interpolate(typeProg, [lineStart, lineEnd], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
              if (lineProg <= 0) return null;
              return (
                <g key={i} opacity={lineProg}>
                  <text x={-240} y={73 + i * 50} fontSize={19} fontWeight={600} fill={i === 0 ? "#A78BFA" : "rgba(167,139,250,0.7)"} fontFamily="'Noto Sans TC', sans-serif">
                    {i === 0 ? "▸ " : "  "}{line}
                  </text>
                </g>
              );
            })}
            {typeProg < 1 && (
              <rect x={-240 + 19 * 8} y={57 + Math.floor(typeProg * LINES.length) * 50} width={10} height={20} rx={1} fill="#A78BFA" opacity={Math.sin(frame * 0.3) > 0 ? 0.8 : 0} />
            )}
          </g>
        </g>

        {/* Arrow */}
        <g opacity={arrowProg}>
          <line x1={630} y1={200} x2={630 + 75 * arrowProg} y2={200} stroke="rgba(255,255,255,0.3)" strokeWidth={4} strokeDasharray="10 6" />
          {arrowProg > 0.8 && <polygon points="708,193 722,200 708,207" fill="rgba(255,255,255,0.4)" />}
        </g>

        {/* Feature cards 2x2 */}
        <g transform="translate(750, 25)">
          {FEATURES.map((f, i) => {
            const sp = featureSprings[i];
            const col = i % 2;
            const row = Math.floor(i / 2);
            const x = col * 250;
            const y = row * 188;
            return (
              <g key={i} opacity={sp} transform={`translate(${x + (1 - sp) * 20}, ${y})`}>
                <rect x={0} y={0} width={225} height={163} rx={18} fill={`${f.color}08`} stroke={f.color} strokeWidth={3} />
                <text x={112} y={106} textAnchor="middle" fontSize={19} fontWeight={800} fill={f.color}>{f.zh}</text>
                <text x={112} y={128} textAnchor="middle" fontSize={14} fill={`${f.color}60`} fontFamily="'Inter', sans-serif">{f.label}</text>
                <g transform="translate(112, 150)">
                  <circle cx={0} cy={0} r={9} fill={`${f.color}20`} />
                  <polyline points="-4,0 -1,3 5,-3" fill="none" stroke={f.color} strokeWidth={2.5} strokeLinecap="round" />
                </g>
              </g>
            );
          })}
        </g>

        {/* Bottom spec doc */}
        <g transform="translate(660, 445)" opacity={specSpring}>
          <g transform={`scale(${specSpring})`}>
            <rect x={-375} y={-20} width={750} height={88} rx={20} fill="rgba(16,185,129,0.05)" stroke="#10B981" strokeWidth={3} />
            <text x={0} y={22} textAnchor="middle" fontSize={25} fontWeight={800} fill="#10B981">產品設計規格文件</text>
            <text x={0} y={50} textAnchor="middle" fontSize={16} fill="rgba(16,185,129,0.5)" fontFamily="'Inter', sans-serif">Product Design Specification</text>
          </g>
        </g>
      </svg>
    </AbsoluteFill>
  );
};

登入後查看完整程式碼