Remotion LabRemotion Lab
返回模板庫

那些被投資人拒絕的點子

依序展示四家公司(Airbnb、Uber、Instagram、Slack)被投資人質疑的話,接著劃掉拒絕語並顯示現在的市值,說明點子可行性難以事先判斷。

創業投資市值反轉
提示詞(可直接修改內容)
import React from "react";
import {
  AbsoluteFill,
  useCurrentFrame,
  useVideoConfig,
  interpolate,
  spring,
  Sequence,
} from "remotion";

const fonts = { main: "'Noto Sans TC', 'Inter', sans-serif" };

const COMPANIES = [
  {
    name: "Airbnb",
    initial: "A",
    quote: "「誰會想睡在陌生人家裡?」",
    quoteEn: '"Who would want to sleep in a stranger\'s house?"',
    rejectCount: "被拒絕 7 次以上",
    value: "$80B+",
    color: "#FF5A5F",
    startFrame: 10,
  },
  {
    name: "Uber",
    initial: "U",
    quote: "「沒人會用手機叫車」",
    quoteEn: '"Nobody will use a phone to hail a cab"',
    rejectCount: "計程車行業不可能被顛覆",
    value: "$150B+",
    color: "#1a1a1a",
    startFrame: 120,
  },
  {
    name: "Instagram",
    initial: "I",
    quote: "「只是一個拍照 app,怎麼賺錢?」",
    quoteEn: '"Just a photo app, how will it make money?"',
    rejectCount: "被嘲笑 $1B 收購太貴",
    value: "$1B → 收購",
    color: "#E1306C",
    startFrame: 240,
  },
  {
    name: "Slack",
    initial: "S",
    quote: "「為什麼要做另一個聊天工具?」",
    quoteEn: '"Why build another chat tool? Email is enough"',
    rejectCount: "投資人早期質疑",
    value: "$27.7B → 收購",
    color: "#4A154B",
    startFrame: 360,
  },
];

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

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

  return (
    <AbsoluteFill style={{ background: "linear-gradient(135deg, #0A0E14 0%, #111825 100%)", opacity: masterOpacity, fontFamily: fonts.main }}>
      {COMPANIES.map((company, idx) => {
        const sf = company.startFrame;
        const localFrame = frame - sf;
        const duration = 120;

        if (localFrame < -5 || localFrame > duration + 10) return null;

        const cardIn = spring({ frame: Math.max(0, localFrame), fps, config: { damping: 14, stiffness: 90 } });
        const cardOut = interpolate(localFrame, [duration - 15, duration], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
        const cardOpacity = Math.min(cardIn, cardOut);

        const logoSpring = spring({ frame: Math.max(0, localFrame - 5), fps, config: { damping: 10, stiffness: 100 } });
        const quoteSpring = spring({ frame: Math.max(0, localFrame - 15), fps, config: { damping: 12, stiffness: 90 } });
        const valueSpring = spring({ frame: Math.max(0, localFrame - 55), fps, config: { damping: 10, stiffness: 100 } });
        const strikeProgress = interpolate(localFrame, [55, 70], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });

        return (
          <AbsoluteFill key={idx} style={{ opacity: cardOpacity, display: "flex", alignItems: "center", justifyContent: "center" }}>
            <div style={{ display: "flex", flexDirection: "column", alignItems: "center", maxWidth: 2100 }}>
              <div style={{ display: "flex", alignItems: "center", gap: 36, opacity: logoSpring, transform: `scale(${logoSpring})`, marginBottom: 60 }}>
                <div style={{ width: 120, height: 120, borderRadius: 24, background: company.color, display: "flex", alignItems: "center", justifyContent: "center", flexShrink: 0, boxShadow: `0 0 30px ${company.color}40` }}>
                  <span style={{ fontSize: 60, fontWeight: 900, color: "#FFFFFF", fontFamily: "'Inter', sans-serif" }}>{company.initial}</span>
                </div>
                <div style={{ fontSize: 72, fontWeight: 800, color: "#FFFFFF", fontFamily: "'Inter', sans-serif" }}>{company.name}</div>
              </div>

              <div style={{ opacity: quoteSpring, transform: `translateY(${(1 - quoteSpring) * 15}px)`, position: "relative", marginBottom: 24 }}>
                <div style={{ fontSize: 54, fontWeight: 600, color: "#EF4444", textAlign: "center", lineHeight: 1.5, opacity: 1 - strikeProgress * 0.4 }}>
                  投資人說:{company.quote}
                </div>
                {strikeProgress > 0 && (
                  <div style={{ position: "absolute", top: "50%", left: `${50 - strikeProgress * 50}%`, width: `${strikeProgress * 100}%`, height: 4, background: "#EF4444", opacity: 0.7 }} />
                )}
              </div>

              <div style={{ opacity: quoteSpring * 0.4 * (1 - strikeProgress * 0.5), fontSize: 33, color: "rgba(255,255,255,0.35)", fontFamily: "'Inter', sans-serif", fontStyle: "italic", marginBottom: 75 }}>
                {company.quoteEn}
              </div>

              <div style={{ opacity: valueSpring, transform: `scale(${valueSpring})`, display: "flex", flexDirection: "column", alignItems: "center", gap: 12 }}>
                <div style={{ fontSize: 39, color: "rgba(255,255,255,0.5)" }}>現在</div>
                <div style={{ fontSize: 108, fontWeight: 900, color: "#10B981", fontFamily: "'Inter', sans-serif", textShadow: "0 0 40px rgba(16,185,129,0.3)" }}>
                  {company.value}
                </div>
              </div>
            </div>
          </AbsoluteFill>
        );
      })}
    </AbsoluteFill>
  );
};

登入後查看完整程式碼