要在問題的圈子裡
左右對比動畫:左側「不在圈子裡」的人向痛點射箭全部偏移打叉,右側「在圈子裡」的人在圓圈內直接射中靶心並爆發衝擊環,說明精準打擊痛點的關鍵是身處問題圈子中。
產品思維痛點圈子精準打擊
提示詞(可直接修改內容)
import React from "react";
import {
AbsoluteFill,
useCurrentFrame,
useVideoConfig,
interpolate,
spring,
} from "remotion";
export const INSIDE-THE-PROBLEM-DURATION-FRAMES = 210;
export const Scene217-InsideTheProblem: React.FC = () => {
const frame = useCurrentFrame();
const { fps } = useVideoConfig();
const fadeIn = interpolate(frame, [0, 8], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
const fadeOut = interpolate(frame, [190, 210], [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 circleLeft = spring({ frame: Math.max(0, frame - 20), fps, config: { damping: 12, stiffness: 80 } });
const personLeft = spring({ frame: Math.max(0, frame - 35), fps, config: { damping: 12, stiffness: 80 } });
const arrow1 = interpolate(frame, [50, 70], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
const arrow2 = interpolate(frame, [65, 85], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
const arrow3 = interpolate(frame, [80, 100], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
const xMark = spring({ frame: Math.max(0, frame - 100), fps, config: { damping: 10, stiffness: 90 } });
const vsProg = spring({ frame: Math.max(0, frame - 90), fps, config: { damping: 12, stiffness: 80 } });
const circleRight = spring({ frame: Math.max(0, frame - 105), fps, config: { damping: 12, stiffness: 80 } });
const personRight = spring({ frame: Math.max(0, frame - 115), fps, config: { damping: 12, stiffness: 80 } });
const hitArrow = spring({ frame: Math.max(0, frame - 135), fps, config: { damping: 8, stiffness: 100 } });
const impactRings = [0, 1, 2].map((i) =>
spring({ frame: Math.max(0, frame - 145 - i * 8), fps, config: { damping: 10, stiffness: 60 } })
);
const checkSpring = spring({ frame: Math.max(0, frame - 155), fps, config: { damping: 10, stiffness: 80 } });
const pulse = interpolate(Math.sin(frame * 0.1), [-1, 1], [0.9, 1.1]);
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: 63, fontWeight: 800, color: "#FFFFFF", textAlign: "center", marginBottom: 9, lineHeight: 1.4 }}>
要在<span style={{ color: "#10B981" }}>問題的圈子</span>裡
</div>
<div style={{ opacity: titleSpring * 0.4, fontSize: 30, color: "rgba(255,255,255,0.4)", fontFamily: "'Inter', sans-serif", fontStyle: "italic", marginBottom: 45 }}>
Be inside the problem circle — otherwise you can't hit the pain point
</div>
<svg width={1575} height={645} viewBox="0 0 1050 430">
{/* Left: Outside the circle */}
<g transform="translate(250, 215)">
<text x={0} y={-190} textAnchor="middle" fontSize={18} fontWeight={700} fill="#EF4444" opacity={circleLeft}>不在圈子裡</text>
<text x={0} y={-170} textAnchor="middle" fontSize={12} fill="rgba(239,68,68,0.4)" fontFamily="'Inter', sans-serif" opacity={circleLeft}>Outside the circle</text>
<circle cx={0} cy={0} r={100} fill="rgba(239,68,68,0.03)" stroke="#EF4444" strokeWidth={2.5} strokeDasharray="10 6" opacity={circleLeft * 0.6} />
<text x={0} y={-5} textAnchor="middle" fontSize={14} fontWeight={600} fill="#EF4444" opacity={circleLeft * 0.35}>問題圈子</text>
<circle cx={0} cy={20} r={18} fill="none" stroke="#EF4444" strokeWidth={2} opacity={circleLeft * 0.4} />
<circle cx={0} cy={20} r={8} fill="#EF4444" opacity={circleLeft * 0.3} />
<g transform="translate(-130, -60)" opacity={personLeft}>
<circle cx={0} cy={-12} r={12} fill="rgba(239,68,68,0.15)" stroke="#EF4444" strokeWidth={2} />
<path d="M -10 12 Q -10 0 0 0 Q 10 0 10 12" fill="rgba(239,68,68,0.15)" stroke="#EF4444" strokeWidth={2} />
<text x={18} y={-8} fontSize={18} fontWeight={800} fill="#EF4444" fontFamily="'Inter', sans-serif">?</text>
</g>
{arrow1 > 0 && (
<g opacity={arrow1 * 0.8}>
<line x1={-100} y1={-30} x2={-100 + 70 * arrow1} y2={-30 + 30 * arrow1} stroke="#EF4444" strokeWidth={2.5} strokeLinecap="round" />
{arrow1 > 0.9 && <text x={-25} y={5} fontSize={16} fill="#EF4444" opacity={0.6}>✕</text>}
</g>
)}
{arrow2 > 0 && (
<g opacity={arrow2 * 0.8}>
<line x1={-110} y1={-10} x2={-110 + 80 * arrow2} y2={-10 + 60 * arrow2} stroke="#EF4444" strokeWidth={2.5} strokeLinecap="round" />
{arrow2 > 0.9 && <text x={-22} y={58} fontSize={16} fill="#EF4444" opacity={0.6}>✕</text>}
</g>
)}
{arrow3 > 0 && (
<g opacity={arrow3 * 0.8}>
<line x1={-105} y1={-50} x2={-105 + 60 * arrow3} y2={-50 + 110 * arrow3} stroke="#EF4444" strokeWidth={2.5} strokeLinecap="round" />
{arrow3 > 0.9 && <text x={-40} y={68} fontSize={16} fill="#EF4444" opacity={0.6}>✕</text>}
</g>
)}
{xMark > 0 && (
<g opacity={xMark * 0.5}>
<line x1={-80} y1={-80} x2={-80 + 160 * xMark} y2={-80 + 160 * xMark} stroke="#EF4444" strokeWidth={5} strokeLinecap="round" />
<line x1={80} y1={-80} x2={80 - 160 * xMark} y2={-80 + 160 * xMark} stroke="#EF4444" strokeWidth={5} strokeLinecap="round" />
</g>
)}
<text x={0} y={145} textAnchor="middle" fontSize={16} fontWeight={700} fill="#EF4444" opacity={circleLeft}>很難精準打擊痛點</text>
<text x={0} y={165} textAnchor="middle" fontSize={12} fill="rgba(239,68,68,0.4)" fontFamily="'Inter', sans-serif" opacity={circleLeft}>Hard to hit the pain point</text>
</g>
{/* VS */}
<g transform="translate(525, 215)" opacity={vsProg}>
<rect x={-25} y={-25} width={50} height={50} rx={25} fill="rgba(255,255,255,0.05)" stroke="rgba(255,255,255,0.15)" strokeWidth={2} />
<text x={0} y={8} textAnchor="middle" fontSize={20} fontWeight={900} fill="rgba(255,255,255,0.4)" fontFamily="'Inter', sans-serif">VS</text>
</g>
{/* Right: Inside the circle */}
<g transform="translate(800, 215)">
<text x={0} y={-190} textAnchor="middle" fontSize={18} fontWeight={700} fill="#10B981" opacity={circleRight}>在圈子裡</text>
<text x={0} y={-170} textAnchor="middle" fontSize={12} fill="rgba(16,185,129,0.4)" fontFamily="'Inter', sans-serif" opacity={circleRight}>Inside the circle</text>
<circle cx={0} cy={0} r={100} fill="rgba(16,185,129,0.04)" stroke="#10B981" strokeWidth={3} opacity={circleRight * 0.7} />
<text x={0} y={-75} textAnchor="middle" fontSize={14} fontWeight={600} fill="#10B981" opacity={circleRight * 0.5}>問題圈子</text>
<g transform="translate(-30, -25)" opacity={personRight}>
<circle cx={0} cy={-12} r={12} fill="rgba(16,185,129,0.2)" stroke="#10B981" strokeWidth={2.5} />
<path d="M -10 12 Q -10 0 0 0 Q 10 0 10 12" fill="rgba(16,185,129,0.2)" stroke="#10B981" strokeWidth={2.5} />
</g>
<g transform="translate(30, 25)">
<circle cx={0} cy={0} r={28} fill="none" stroke="#10B981" strokeWidth={2} opacity={circleRight * 0.4} />
<circle cx={0} cy={0} r={18} fill="none" stroke="#10B981" strokeWidth={2} opacity={circleRight * 0.5} />
<circle cx={0} cy={0} r={8} fill="#10B981" opacity={circleRight * 0.6} />
{hitArrow > 0 && (
<g>
<line x1={-45 + 45 * hitArrow} y1={-30 + 30 * hitArrow} x2={0} y2={0} stroke="#FFD700" strokeWidth={3} strokeLinecap="round" opacity={hitArrow} />
<polygon points="-3,-5 5,0 -3,5" fill="#FFD700" opacity={hitArrow} transform="rotate(-35)" />
</g>
)}
{impactRings.map((sp, i) => (
<circle key={i} cx={0} cy={0} r={(15 + i * 18) * sp * pulse} fill="none" stroke="#FFD700" strokeWidth={2} opacity={sp * (0.4 - i * 0.1)} />
))}
</g>
<g transform="translate(85, -50)" opacity={checkSpring}>
<circle cx={0} cy={0} r={18} fill="rgba(16,185,129,0.15)" stroke="#10B981" strokeWidth={2.5} />
<polyline points="-7,0 -2,6 8,-5" fill="none" stroke="#10B981" strokeWidth={3} strokeLinecap="round" strokeLinejoin="round" />
</g>
<text x={0} y={145} textAnchor="middle" fontSize={16} fontWeight={700} fill="#10B981" opacity={circleRight}>精準打擊痛點</text>
<text x={0} y={165} textAnchor="middle" fontSize={12} fill="rgba(16,185,129,0.4)" fontFamily="'Inter', sans-serif" opacity={circleRight}>Hit the pain point precisely</text>
</g>
</svg>
</AbsoluteFill>
);
};登入後查看完整程式碼