shadcn-ui Skill 網站成果展示
展示使用 shadcn-ui skill 後能產出的四種高品質網站縮圖:Landing Page、Dashboard、E-commerce、Blog,最終顯示完成度高的評語。
shadcnAI工具網站設計成果展示
提示詞(可直接修改內容)
import React from "react";
import {
AbsoluteFill,
useCurrentFrame,
useVideoConfig,
interpolate,
spring,
} from "remotion";
const colors = {
background: "#0A0E14",
backgroundGradient: "linear-gradient(135deg, #0A0E14 0%, #131A24 100%)",
accent: "#00D4AA",
accentSecondary: "#4DA3FF",
warning: "#FFB547",
};
const fonts = { main: "'Inter', 'Noto Sans TC', sans-serif" };
const SITES = [
{ label: "Landing Page", accent: "#8B5CF6" },
{ label: "Dashboard", accent: "#3B82F6" },
{ label: "E-commerce", accent: "#10B981" },
{ label: "Blog", accent: "#F59E0B" },
];
const SiteThumbnail: React.FC<{ accent: string; label: string; frame: number }> = ({ accent, label, frame }) => {
const glowPulse = interpolate(Math.sin(frame * 0.06), [-1, 1], [0.3, 0.6]);
return (
<div style={{ display: "flex", flexDirection: "column", alignItems: "center", gap: 21 }}>
<svg width="330" height="240" viewBox="0 0 220 160">
<defs>
<linearGradient id={`siteGrad-${accent}`} x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stopColor="#0D1117" />
<stop offset="100%" stopColor="#161B22" />
</linearGradient>
</defs>
<rect x="0" y="0" width="220" height="160" rx="10" fill={`url(#siteGrad-${accent})`} stroke={`${accent}40`} strokeWidth="1.5" />
<rect x="0" y="0" width="220" height="18" rx="10" fill="rgba(255,255,255,0.04)" />
<circle cx="12" cy="9" r="3" fill="#FF5F57" opacity={0.6} />
<circle cx="22" cy="9" r="3" fill="#FFBD2E" opacity={0.6} />
<circle cx="32" cy="9" r="3" fill="#28CA41" opacity={0.6} />
<rect x="0" y="18" width="220" height="45" fill={`${accent}20`} />
<rect x="60" y="30" width="100" height="8" rx="3" fill={`${accent}60`} />
<rect x="75" y="44" width="70" height="5" rx="2" fill="rgba(255,255,255,0.15)" />
{[0, 1, 2].map((i) => (
<g key={i}>
<rect x={12 + i * 68} y="72" width="60" height="45" rx="6" fill="rgba(255,255,255,0.03)" stroke="rgba(255,255,255,0.06)" strokeWidth="1" />
<circle cx={42 + i * 68} cy="87" r="6" fill={accent} opacity={glowPulse} />
<rect x={22 + i * 68} y="100" width="40" height="4" rx="2" fill="rgba(255,255,255,0.08)" />
<rect x={27 + i * 68} y="108" width="30" height="3" rx="1.5" fill="rgba(255,255,255,0.04)" />
</g>
))}
<rect x="70" y="148" width="80" height="3" rx="1.5" fill="rgba(255,255,255,0.05)" />
</svg>
<span style={{ fontSize: 27, fontWeight: 600, fontFamily: fonts.main, color: accent }}>{label}</span>
</div>
);
};
export const Scene56-ShadcnResults: React.FC = () => {
const frame = useCurrentFrame();
const { fps } = useVideoConfig();
const badgeSpring = spring({ frame: Math.max(0, frame - 5), fps, config: { damping: 10, mass: 0.5, stiffness: 120 } });
const badgeScale = interpolate(badgeSpring, [0, 1], [0.3, 1]);
const badgeOpacity = interpolate(badgeSpring, [0, 0.4], [0, 1], { extrapolateRight: "clamp" });
const siteSprings = SITES.map((_, i) => spring({ frame: Math.max(0, frame - (45 + i * 20)), fps, config: { damping: 10, mass: 0.5, stiffness: 120 } }));
const checkSpring = spring({ frame: Math.max(0, frame - 140), fps, config: { damping: 8, mass: 0.4, stiffness: 150 } });
const checkScale = interpolate(checkSpring, [0, 1], [0.3, 1]);
const checkOpacity = interpolate(checkSpring, [0, 0.3], [0, 1], { extrapolateRight: "clamp" });
const fadeOut = interpolate(frame, [210, 240], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
const glowPulse = interpolate(Math.sin(frame * 0.04), [-1, 1], [0.03, 0.08]);
return (
<AbsoluteFill style={{ background: colors.backgroundGradient }}>
<div style={{ position: "absolute", top: "45%", left: "50%", width: 900, height: 900, borderRadius: "50%", background: `radial-gradient(circle, ${colors.accentSecondary}0a 0%, transparent 60%)`, transform: "translate(-50%, -50%)", opacity: glowPulse * fadeOut }} />
<AbsoluteFill style={{ display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", gap: 67, opacity: fadeOut }}>
<div style={{ display: "flex", alignItems: "center", gap: 24, opacity: badgeOpacity, transform: `scale(${badgeScale})` }}>
<div style={{ padding: "18px 48px", borderRadius: 16, background: `${colors.accentSecondary}12`, border: `2px solid ${colors.accentSecondary}40`, fontSize: 54, fontWeight: 700, fontFamily: fonts.main, color: colors.accentSecondary, letterSpacing: 2 }}>
shadcn-ui skill
</div>
</div>
<div style={{ display: "flex", gap: 42 }}>
{SITES.map((site, i) => {
const tScale = interpolate(siteSprings[i], [0, 1], [0.4, 1]);
const tOp = interpolate(siteSprings[i], [0, 0.3], [0, 1], { extrapolateRight: "clamp" });
const hover = Math.sin(frame * 0.04 + i * 1.5) * 4;
return (
<div key={site.label} style={{ opacity: tOp, transform: `scale(${tScale}) translateY(${hover}px)` }}>
<SiteThumbnail accent={site.accent} label={site.label} frame={frame} />
</div>
);
})}
</div>
{checkOpacity > 0 && (
<div style={{ display: "flex", alignItems: "center", gap: 24, opacity: checkOpacity, transform: `scale(${checkScale})` }}>
<svg width="60" height="60" viewBox="0 0 40 40">
<circle cx="20" cy="20" r="18" fill={`${colors.accent}20`} stroke={colors.accent} strokeWidth="2.5" />
<path d="M12 20 L17 25 L28 14" fill="none" stroke={colors.accent} strokeWidth="3" strokeLinecap="round" strokeLinejoin="round" />
</svg>
<span style={{ fontSize: 45, fontWeight: 600, fontFamily: fonts.main, color: "rgba(255,255,255,0.75)" }}>完成度高,可直接使用</span>
</div>
)}
</AbsoluteFill>
</AbsoluteFill>
);
};登入後查看完整程式碼