01ソフトグリッドのヒーロー
オフホワイトの背景にごく薄いドットグリッドを敷き、手前の白いカードの上で青いバッジが緩やかに上下します。影はグレー系で浅く、色は青一色だけを効かせます。
使いどころSaaS・フィンテックLPの最初の画面
점 격자 배경중립 그림자radius 16

<main class="stage">
<section class="herotrust">
<span class="herotrust__badge" aria-hidden="true">
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 256 256"><g fill="currentColor"><path d="M216 56v56c0 96-88 120-88 120s-88-24-88-120V56a8 8 0 0 1 8-8h160a8 8 0 0 1 8 8" opacity=".2"/><path d="M208 40H48a16 16 0 0 0-16 16v56c0 52.72 25.52 84.67 46.93 102.19c23.06 18.86 46 25.26 47 25.53a8 8 0 0 0 4.2 0c1-.27 23.91-6.67 47-25.53C198.48 196.67 224 164.72 224 112V56a16 16 0 0 0-16-16m0 72c0 37.07-13.66 67.16-40.6 89.42a129.3 129.3 0 0 1-39.4 22.2a128.3 128.3 0 0 1-38.92-21.81C61.82 179.51 48 149.3 48 112V56h160ZM82.34 141.66a8 8 0 0 1 11.32-11.32L112 148.69l50.34-50.35a8 8 0 0 1 11.32 11.32l-56 56a8 8 0 0 1-11.32 0Z"/></g></svg>
</span>
<div class="herotrust__card">
<p class="herotrust__eyebrow">Trusted by teams</p>
<h1 class="herotrust__title">より速く、安全なスタート</h1>
<p class="herotrust__desc">信頼が必要なチームのためのSaaSランディング</p>
<button class="herotrust__cta" type="button">無料で始める</button>
</div>
</section>
</main>@use "../../../../site/static/demo-tokens" as *;
$duration: $dur-loop; // 카드가 한 번 뜨고 가라앉는 주기
$easing: $ease-out; // 통통 튀지 않는 절제된 곡선
$color: $subject-blue; // 유일한 브랜드 컬러
// 신뢰감 팔레트 — 흰색·오프화이트 바탕에 파란색 하나만 강조. 카드류는 잉크 대비 4.5:1 이상(접근성 섹션 참고), 그림자는 회색 계열로 얕게
$trust-offwhite: #f7f9fc;
$trust-ink: $subject-ink;
$trust-slate: #475569;
$trust-blue: $subject-blue;
@include stage($trust-offwhite);
// 점 격자 배경 — 정적 장식. 애니메이션 대상이 아니다
.stage {
background-image: radial-gradient(circle, rgba($trust-ink, .08) 1px, transparent 1px);
background-size: 20px 20px;
}
.herotrust {
position: relative;
width: clamp(220px, 76vw, 340px);
}
.herotrust__badge {
position: absolute;
top: -16px;
right: 12px;
width: clamp(28px, 8vw, 36px);
aspect-ratio: 1;
display: grid;
place-items: center;
border-radius: 50%;
background: $trust-blue;
color: $stage-paper;
box-shadow: 0 8px 16px rgba($trust-blue, .35);
font-size: clamp(14px, 4vw, 18px);
animation: badgeFloat $duration $easing infinite;
}
.herotrust__card {
box-sizing: border-box;
width: 100%;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: $sp-2;
padding: $sp-5;
border-radius: $r-card;
background: $stage-paper;
box-shadow: 0 14px 28px rgba($trust-ink, .1);
animation: cardBob $duration $easing infinite;
}
.herotrust__eyebrow {
margin: 0;
color: $trust-blue;
font-weight: 700; font-size: clamp(10px, 2.6vw, 12px); line-height: 1;
font-family: inherit;
letter-spacing: .08em;
text-transform: uppercase;
}
.herotrust__title {
margin: 0;
color: $trust-ink;
font-weight: 700; font-size: clamp(18px, 4.6vw, 24px); line-height: 1.25;
font-family: inherit;
}
.herotrust__desc {
margin: 0;
color: $trust-slate;
font-weight: 500; font-size: clamp(12px, 2.8vw, 14px); line-height: 1.4;
font-family: inherit;
}
.herotrust__cta {
margin-top: $sp-1;
border: 0;
border-radius: $r-pill;
background: $trust-blue;
color: $stage-paper;
padding: $sp-2 $sp-5;
font-weight: 700; font-size: clamp(12px, 2.8vw, 14px); line-height: 1;
font-family: inherit;
box-shadow: 0 8px 18px rgba($trust-blue, .3);
}
.herotrust__cta:focus-visible {
outline: 3px solid $trust-blue;
outline-offset: 2px;
}
// 데모: 카드가 완만하게 떠올랐다 가라앉고(큰 피사체라 누적면적을 확보), 배지는 다른 위상으로 살짝 흔들린다
@keyframes cardBob {
0%, 100% { transform: translateY(0); box-shadow: 0 14px 28px rgba($trust-ink, .1); }
50% { transform: translateY(-9px); box-shadow: 0 20px 32px rgba($trust-ink, .07); }
}
@keyframes badgeFloat {
0%, 100% { transform: translateY(0) scale(1); }
50% { transform: translateY(6px) scale(1.06); }
}
@media (max-width: 340px), (max-height: 220px) {
.herotrust__card { padding: $sp-3 $sp-4; gap: $sp-1; }
.herotrust__eyebrow { display: none; }
.herotrust__title { font-size: 15px; line-height: 1.15; }
.herotrust__desc { display: none; }
.herotrust__cta { padding: $sp-1 $sp-4; margin-top: 0; }
.herotrust__badge { width: 22px; top: -8px; right: 6px; }
}
@media (prefers-reduced-motion: reduce) {
.herotrust__badge, .herotrust__card { animation: none !important; transform: none; }
}html, body {
margin: 0;
overflow: hidden;
}
.stage {
box-sizing: border-box;
min-height: 100vh;
display: grid;
place-items: center;
margin: 0;
background: #f7f9fc;
font-family: -apple-system, "Segoe UI", "Noto Sans KR", sans-serif;
padding: clamp(8px, 4vw, 24px);
}
.stage {
background-image: radial-gradient(circle, rgba(23, 20, 26, 0.08) 1px, transparent 1px);
background-size: 20px 20px;
}
.herotrust {
position: relative;
width: clamp(220px, 76vw, 340px);
}
.herotrust__badge {
position: absolute;
top: -16px;
right: 12px;
width: clamp(28px, 8vw, 36px);
aspect-ratio: 1;
display: grid;
place-items: center;
border-radius: 50%;
background: #2f6df6;
color: #ffffff;
box-shadow: 0 8px 16px rgba(47, 109, 246, 0.35);
font-size: clamp(14px, 4vw, 18px);
animation: badgeFloat 2s ease-out infinite;
}
.herotrust__card {
box-sizing: border-box;
width: 100%;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 8px;
padding: 20px;
border-radius: 16px;
background: #ffffff;
box-shadow: 0 14px 28px rgba(23, 20, 26, 0.1);
animation: cardBob 2s ease-out infinite;
}
.herotrust__eyebrow {
margin: 0;
color: #2f6df6;
font-weight: 700;
font-size: clamp(10px, 2.6vw, 12px);
line-height: 1;
font-family: inherit;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.herotrust__title {
margin: 0;
color: #17141a;
font-weight: 700;
font-size: clamp(18px, 4.6vw, 24px);
line-height: 1.25;
font-family: inherit;
}
.herotrust__desc {
margin: 0;
color: #475569;
font-weight: 500;
font-size: clamp(12px, 2.8vw, 14px);
line-height: 1.4;
font-family: inherit;
}
.herotrust__cta {
margin-top: 4px;
border: 0;
border-radius: 999px;
background: #2f6df6;
color: #ffffff;
padding: 8px 20px;
font-weight: 700;
font-size: clamp(12px, 2.8vw, 14px);
line-height: 1;
font-family: inherit;
box-shadow: 0 8px 18px rgba(47, 109, 246, 0.3);
}
.herotrust__cta:focus-visible {
outline: 3px solid #2f6df6;
outline-offset: 2px;
}
@keyframes cardBob {
0%, 100% {
transform: translateY(0);
box-shadow: 0 14px 28px rgba(23, 20, 26, 0.1);
}
50% {
transform: translateY(-9px);
box-shadow: 0 20px 32px rgba(23, 20, 26, 0.07);
}
}
@keyframes badgeFloat {
0%, 100% {
transform: translateY(0) scale(1);
}
50% {
transform: translateY(6px) scale(1.06);
}
}
@media (max-width: 340px), (max-height: 220px) {
.herotrust__card {
padding: 12px 16px;
gap: 4px;
}
.herotrust__eyebrow {
display: none;
}
.herotrust__title {
font-size: 15px;
line-height: 1.15;
}
.herotrust__desc {
display: none;
}
.herotrust__cta {
padding: 4px 16px;
margin-top: 0;
}
.herotrust__badge {
width: 22px;
top: -8px;
right: 6px;
}
}
@media (prefers-reduced-motion: reduce) {
.herotrust__badge, .herotrust__card {
animation: none !important;
transform: none;
}
}import type { CSSProperties } from "react";
import styles from "./HeroTrust.module.scss";
export type HeroTrustProps = {
eyebrow?: string;
title?: string;
desc?: string;
cta?: string;
/** 한 주기(기본 2000ms) */
duration?: number;
easing?: string;
color?: string;
};
type Vars = CSSProperties & { "--duration"?: string; "--easing"?: string; "--color"?: string };
export default function HeroTrust({
eyebrow = "Trusted by teams",
title = "더 빠르고 안전한 시작",
desc = "신뢰가 필요한 팀을 위한 SaaS 랜딩",
cta = "무료로 시작",
duration = 2000,
easing = "ease-out",
color = "#2f6df6",
}: HeroTrustProps) {
const vars: Vars = { "--duration": `${duration}ms`, "--easing": easing, "--color": color };
return (
<section className={styles.herotrust} style={vars}>
<span className={styles.badge} aria-hidden="true">
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 256 256"><g fill="currentColor"><path d="M216 56v56c0 96-88 120-88 120s-88-24-88-120V56a8 8 0 0 1 8-8h160a8 8 0 0 1 8 8" opacity=".2"/><path d="M208 40H48a16 16 0 0 0-16 16v56c0 52.72 25.52 84.67 46.93 102.19c23.06 18.86 46 25.26 47 25.53a8 8 0 0 0 4.2 0c1-.27 23.91-6.67 47-25.53C198.48 196.67 224 164.72 224 112V56a16 16 0 0 0-16-16m0 72c0 37.07-13.66 67.16-40.6 89.42a129.3 129.3 0 0 1-39.4 22.2a128.3 128.3 0 0 1-38.92-21.81C61.82 179.51 48 149.3 48 112V56h160ZM82.34 141.66a8 8 0 0 1 11.32-11.32L112 148.69l50.34-50.35a8 8 0 0 1 11.32 11.32l-56 56a8 8 0 0 1-11.32 0Z"/></g></svg>
</span>
<div className={styles.card}>
<p className={styles.eyebrow}>{eyebrow}</p>
<h1 className={styles.title}>{title}</h1>
<p className={styles.desc}>{desc}</p>
<button type="button" className={styles.cta}>{cta}</button>
</div>
</section>
);
}01 ソフトグリッドのヒーロー — 計測 累積面積 11.469% · 動いたフレーム 23/23GODRICH オリジナル · SCSS と React は zip に同梱 · saas サイト デザイン 信頼感キット、クリーンなセクション9選
このデモが属する記事
saas サイト デザイン 信頼感キット、クリーンなセクション9選saas サイト デザインの良さは、白とオフホワイトという二つの中立な背景の上に、ブランドカラーを青一色だけ重ね、影は色付きにせずグレー系で浅く、角の丸みも抑えた半径に統一するところにあります。パステルやキャンディグラデーションの明るさとは この記事のデモをすべて見る


