

View Details
テスティモニアル
統計付きテスティモニアル
#グリッドレイアウト#アニメーション
時系列に沿ってクライアントの声を交互に表示する、タイムライン形式のテスティモニアルセクション
1export function TestimonialTimeline001() {2 const testimonials = [3 {4 quote:5 "プロジェクトの本質を深く理解し、期待を超えるアウトプットを提供していただきました。",6 author: "田中 美咲",7 role: "CEO",8 company: "テックスタート株式会社",9 year: "2025",10 },11 {12 quote:13 "デザインシステムの構築からUIの実装まで、一貫した品質で仕上げていただきました。",14 author: "佐藤 健一",15 role: "プロダクトマネージャー",16 company: "クラウドベース株式会社",17 year: "2024",18 },19 {20 quote:21 "緻密なリサーチに基づいた提案で、ユーザー体験が大幅に改善されました。",22 author: "鈴木 あかり",23 role: "デザインディレクター",24 company: "デジタルクラフト株式会社",25 year: "2024",26 },27 {28 quote:29 "スピードと品質の両立。短期間でこれほどの成果を上げられるチームは稀有です。",30 author: "高橋 涼太",31 role: "CTO",32 company: "イノベーションラボ株式会社",33 year: "2023",34 },35 ];3637 return (38 <section className="bg-background py-28 border-t border-border">39 <div className="mx-auto max-w-6xl px-4 sm:px-6 lg:px-8">40 {/* ヘッダー */}41 <div className="text-center">42 <p className="text-[10px] uppercase tracking-[0.3em] text-muted-foreground">43 Client Voices44 </p>45 <h2 className="mt-3 text-2xl font-medium tracking-wide text-foreground sm:text-3xl">46 お客様の声47 </h2>48 <p className="mx-auto mt-4 max-w-md text-sm font-light leading-relaxed text-muted-foreground">49 これまでご一緒させていただいたクライアントからの評価をご紹介します。50 </p>51 </div>5253 <div className="mt-6 flex justify-center">54 <div className="h-px w-12 bg-border/40" />55 </div>5657 {/* タイムライン */}58 <div className="relative mt-16">59 {/* 中央線 */}60 <div className="absolute left-4 top-0 bottom-0 w-px bg-border/40 sm:left-1/2 sm:-translate-x-px" />6162 <div className="space-y-12 sm:space-y-16">63 {testimonials.map((item, index) => {64 const isLeft = index % 2 === 0;6566 return (67 <div key={index} className="relative">68 {/* ドットインジケーター */}69 <div className="absolute left-4 top-1 z-10 -translate-x-1/2 sm:left-1/2">70 <div className="flex h-3 w-3 items-center justify-center rounded-full border border-border bg-background">71 <div className="h-1.5 w-1.5 rounded-full bg-foreground/20" />72 </div>73 </div>7475 {/* コンテンツ */}76 <div77 className={`pl-10 sm:w-1/2 sm:pl-0 ${78 isLeft79 ? "sm:pr-12 sm:text-right"80 : "sm:ml-auto sm:pl-12"81 }`}82 >83 {/* 年 */}84 <span className="text-[10px] uppercase tracking-[0.3em] text-muted-foreground/50">85 {item.year}86 </span>8788 {/* 引用 */}89 <p className="mt-3 text-base font-light leading-relaxed tracking-wide text-foreground/90 sm:text-lg">90 “{item.quote}”91 </p>9293 {/* 著者情報 */}94 <div95 className={`mt-4 flex items-center gap-3 ${96 isLeft ? "sm:justify-end" : ""97 }`}98 >99 <span className="h-px w-6 bg-border/60" />100 <div>101 <p className="text-sm tracking-wide text-foreground">102 {item.author}103 </p>104 <p className="mt-0.5 text-xs tracking-wide text-muted-foreground/70">105 {item.role} — {item.company}106 </p>107 </div>108 </div>109 </div>110 </div>111 );112 })}113 </div>114 </div>115116 {/* ボトムアクセント */}117 <div className="mt-20 flex justify-center">118 <div className="flex items-center gap-2">119 <div className="h-1 w-1 rounded-full bg-muted-foreground/30" />120 <div className="h-1 w-1 rounded-full bg-muted-foreground/30" />121 <div className="h-1 w-1 rounded-full bg-muted-foreground/30" />122 </div>123 </div>124 </div>125 </section>126 );127}