05Simple pricing
All three plans share the same white card, but the recommended one gets a thin blue border and a slightly deeper shadow — hierarchy made from border weight and shadow depth alone, not color.
Best forThree-tier pricing, plan comparison
테두리 위계그림자 깊이차radius card

<main class="stage">
<div class="pricing">
<div class="pricing__card">
<p class="pricing__name">Starter</p>
<p class="pricing__price">₩0</p>
</div>
<div class="pricing__card pricing__card--pro">
<span class="pricing__badge">Recommended</span>
<p class="pricing__name">Pro</p>
<p class="pricing__price">₩29,000</p>
</div>
<div class="pricing__card">
<p class="pricing__name">Enterprise</p>
<p class="pricing__price">Contact</p>
</div>
</div>
</main>@use "../../../../site/static/demo-tokens" as *;
$duration: $dur-loop;
$easing: $ease-out;
$color: $subject-blue;
$trust-offwhite: #f7f9fc;
$trust-ink: $subject-ink;
$trust-slate: #475569;
$trust-blue: $subject-blue;
@include stage($trust-offwhite);
.pricing {
display: flex;
align-items: center;
gap: $sp-2;
}
.pricing__card {
position: relative;
box-sizing: border-box;
width: 92px;
display: flex;
flex-direction: column;
align-items: center;
gap: $sp-1;
padding: $sp-3 $sp-2;
border-radius: $r-card;
border: 1px solid #e2e8f0;
background: $stage-paper;
box-shadow: 0 6px 12px rgba($trust-ink, .05);
text-align: center;
}
.pricing__card--pro {
width: 100px;
padding: $sp-4 $sp-2;
border: 2px solid $trust-blue;
box-shadow: 0 16px 26px rgba($trust-blue, .18);
animation: proLift $duration $easing infinite;
}
.pricing__badge {
position: absolute;
top: -12px;
left: 50%;
transform: translateX(-50%);
border-radius: $r-pill;
background: $trust-blue;
color: $stage-paper;
padding: $sp-1 $sp-2;
font-weight: 700; font-size: 10px; line-height: 1.6;
font-family: inherit;
animation: badgePulse $duration $easing infinite;
}
.pricing__name {
margin: 0;
color: $trust-ink;
font-weight: 700; font-size: 12px; line-height: 1.2;
font-family: inherit;
}
.pricing__price {
margin: 0;
color: $trust-slate;
font-weight: 600; font-size: 13px; line-height: 1.2;
font-family: inherit;
}
// 데모: 추천 플랜만 배지가 숨 쉬듯 살짝 커졌다 작아지고, 카드 전체도 아주 완만하게 떠오른다 — 화려한 색 대신 테두리·그림자 차이가 위계를 만든다
@keyframes proLift {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-6px); }
}
@keyframes badgePulse {
0%, 100% { transform: translateX(-50%) scale(1); }
50% { transform: translateX(-50%) scale(1.1); }
}
@media (max-width: 340px), (max-height: 220px) {
.pricing { gap: $sp-1; }
.pricing__card { width: 76px; padding: $sp-2 $sp-1; }
.pricing__card--pro { width: 82px; padding: $sp-3 $sp-1; }
.pricing__name { font-size: 10px; }
.pricing__price { font-size: 11px; }
}
@media (prefers-reduced-motion: reduce) {
.pricing__card--pro, .pricing__badge { animation: none !important; transform: none; }
.pricing__badge { transform: translateX(-50%); }
}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);
}
.pricing {
display: flex;
align-items: center;
gap: 8px;
}
.pricing__card {
position: relative;
box-sizing: border-box;
width: 92px;
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
padding: 12px 8px;
border-radius: 16px;
border: 1px solid #e2e8f0;
background: #ffffff;
box-shadow: 0 6px 12px rgba(23, 20, 26, 0.05);
text-align: center;
}
.pricing__card--pro {
width: 100px;
padding: 16px 8px;
border: 2px solid #2f6df6;
box-shadow: 0 16px 26px rgba(47, 109, 246, 0.18);
animation: proLift 2s ease-out infinite;
}
.pricing__badge {
position: absolute;
top: -12px;
left: 50%;
transform: translateX(-50%);
border-radius: 999px;
background: #2f6df6;
color: #ffffff;
padding: 4px 8px;
font-weight: 700;
font-size: 10px;
line-height: 1.6;
font-family: inherit;
animation: badgePulse 2s ease-out infinite;
}
.pricing__name {
margin: 0;
color: #17141a;
font-weight: 700;
font-size: 12px;
line-height: 1.2;
font-family: inherit;
}
.pricing__price {
margin: 0;
color: #475569;
font-weight: 600;
font-size: 13px;
line-height: 1.2;
font-family: inherit;
}
@keyframes proLift {
0%, 100% {
transform: translateY(0);
}
50% {
transform: translateY(-6px);
}
}
@keyframes badgePulse {
0%, 100% {
transform: translateX(-50%) scale(1);
}
50% {
transform: translateX(-50%) scale(1.1);
}
}
@media (max-width: 340px), (max-height: 220px) {
.pricing {
gap: 4px;
}
.pricing__card {
width: 76px;
padding: 8px 4px;
}
.pricing__card--pro {
width: 82px;
padding: 12px 4px;
}
.pricing__name {
font-size: 10px;
}
.pricing__price {
font-size: 11px;
}
}
@media (prefers-reduced-motion: reduce) {
.pricing__card--pro, .pricing__badge {
animation: none !important;
transform: none;
}
.pricing__badge {
transform: translateX(-50%);
}
}import type { CSSProperties } from "react";
import styles from "./PricingTrust.module.scss";
export type PricingTrustProps = {
duration?: number;
easing?: string;
color?: string;
};
type Vars = CSSProperties & { "--duration"?: string; "--easing"?: string; "--color"?: string };
export default function PricingTrust({ duration = 2000, easing = "ease-out", color = "#2f6df6" }: PricingTrustProps) {
const vars: Vars = { "--duration": `${duration}ms`, "--easing": easing, "--color": color };
return (
<div className={styles.pricing} style={vars}>
<div className={styles.card}>
<p className={styles.name}>스타터</p>
<p className={styles.price}>₩0</p>
</div>
<div className={`${styles.card} ${styles.pro}`}>
<span className={styles.badge}>추천</span>
<p className={styles.name}>프로</p>
<p className={styles.price}>₩29,000</p>
</div>
<div className={styles.card}>
<p className={styles.name}>기업용</p>
<p className={styles.price}>문의</p>
</div>
</div>
);
}05 Simple pricing — Measured area 2.276% · moving frames 23/23Original by GODRICH · SCSS and React ship in the zip · SaaS Landing Page Design: 9 Clean Trust Sections
The post this demo lives in
SaaS Landing Page Design: 9 Clean Trust SectionsGood SaaS landing page design leans on two neutral backgrounds — white and a barely-there off-white — plus exactly one b See all demos in this post


