/**
 * 머블로 무비 스튜디오 — 판매 홈 화면
 *
 * 블록 편집기가 넣는 HTML 이 이 클래스들을 쓴다. **스타일을 블록 안에 인라인으로
 * 넣지 않는다** — 그러면 운영자가 문구 한 줄 고치려고 열 때마다 스타일 덩어리를
 * 헤치고 들어가야 하고, 색을 바꾸려면 블록을 전부 다시 써야 한다.
 *
 * **색은 하드코딩하지 않는다.** 코어 토큰(tokens.css)의 semantic 을 쓴다 —
 * front.css 가 `--primary` 를 핑크로 묶어 뒀으므로 여기서는 그것만 참조하면
 * 다크 모드까지 따라온다.
 */

/* **배경은 화면 끝까지, 내용은 가운데로** (사용자 결정).
 *
 * 띠 배경이 컨테이너 안에서 끊기면 양옆이 허옇게 남아 섹션이 갈린 것처럼 보인다.
 * 그렇다고 글까지 화면 끝까지 늘리면 한 줄이 2000px 이 되어 눈이 되돌아올 자리를
 * 못 찾는다.
 *
 * 그래서 둘을 나눈다 — 배경은 `.block-container` 제한을 풀어 펴고(맨 아래),
 * 내용은 여기서 다시 가운데로 모은다. */
.st-wrap { max-width: 1200px; margin-inline: auto; padding-inline: clamp(18px, 4vw, 40px); }

.st-kicker {
    font-size: 12.5px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase;
    color: var(--primary); margin: 0;
}
.st-h2 { margin: 12px 0 0; font-size: clamp(23px, 3.1vw, 35px); letter-spacing: -.028em;
         line-height: 1.24; text-wrap: balance; font-weight: 700; }
.st-lede { margin: 13px 0 0; color: var(--muted-foreground); font-size: 16px; max-width: 62ch; }

/* 섹션의 세로 여백.
 *
 * **이 값이 두 배로 쌓인다.** 섹션끼리 맞붙어 있어서 위 섹션의 아래 여백과 아래
 * 섹션의 위 여백이 더해진다 — 84px 이면 사이가 168px 이 되어, 내용이 400px 인
 * 섹션 둘 사이에 화면 절반이 빈다.
 *
 * 52px 로 줄여 사이를 104px 로 둔다. 섹션이 갈린 것은 알아보면서, 스크롤 두 번에
 * 빈 화면만 지나가지는 않는다. */
.st-band { padding-block: clamp(30px, 4vw, 52px); }

/* 서브 페이지의 머리말.
 *
 * `.st-band` 가 아니라 세로 여백이 0 이었다 — 헤더 바로 밑에 글자가 붙는다.
 * 메인 히어로는 제 여백을 따로 가지므로(`.crv-hero__grid`) 여기서 뺀다. */
.st-hero:not(.crv-hero) > .st-wrap { padding-block: clamp(34px, 4.6vw, 60px); }
/* 배경 교대를 쓰지 않는다 (2026-09-20). 섹션마다 바탕색이 갈리면 화면이 띠로
   토막 나 보인다 — 흰 바탕 하나로 두고 경계는 카드 테두리와 여백이 맡는다.
   이미 깔린 HTML 에 클래스가 남아 있어도 아무 일이 없도록 규칙만 지운다. */

/* ── 히어로 — 다운로드가 제일 먼저 온다 ───────────────────── */
/* 빛무리를 걷었다 (2026-10-02). 분홍 빛무리 둘이 히어로를 분홍 바탕으로 만들었다 —
   바탕은 흰색이고, 핑크는 제목의 강조 낱말과 주 버튼이 맡는다. */
.st-hero { background: var(--background); }
.st-hero h1 { margin: 13px 0 0; font-size: clamp(30px, 4.5vw, 52px); letter-spacing: -.038em;
              line-height: 1.24; font-weight: 700; text-wrap: balance; }

/* ── 가운데로 세운 히어로 (블덱스 구조) ──────────────────────
 *
 * 2026-09-20 에 블덱스 실물을 다시 보고 가져왔다. 위에서 아래로 한 줄이다 —
 * 작은 배너 → 큰 타이포 → 한 줄 카피 → **행동 하나** → 보조 링크.
 *
 * **두 열을 버리는 것이 요점이다.** 왼쪽에 글, 오른쪽에 그림을 두면 눈이 둘로
 * 갈리고 "무엇을 하는 물건인지" 와 "무엇을 누르면 되는지" 가 같은 무게로 놓인다.
 * 한 줄로 세우면 순서가 곧 중요도가 된다.
 *
 * 위 `.st-hero__in`(두 열)은 남겨 둔다 — 다른 화면이 아직 쓴다. */
/* 큰 타이포가 한 줄로 서게 폭을 좁힌다. 화면 끝까지 늘리면 한 줄이 2000px 이 된다.
 *
 * 가운데로 세운 히어로에서는 두 열일 때보다 **더 커야 한다.** 옆에 그림이 없으니
 * 이 글자가 화면을 혼자 잡아야 하고, 작으면 넓은 여백 속에 떠 있는 문장이 된다. */

/* 맨 위 작은 배너. 블덱스는 여기에 업데이트 노트를 건다 — 우리는 걸 것이 아직
   없으므로 **사실 한 줄**을 둔다. "곧 나옵니다" 같은 우리 쪽 할 일 메모는 두지 않는다. */

/* 66px 짜리 제목 밑에 15px 를 두면 한 줄 카피가 주석처럼 보인다. 이 문장이
   "무엇을 하는 물건인지" 를 혼자 설명하므로 제목 다음으로 읽혀야 한다. */

/* 블덱스의 검색창만큼 크게. 이 화면에서 제일 먼저 눈에 걸려야 하는 것이다. */
.st-btn--xl { padding: 21px 50px; font-size: 19.5px; border-radius: var(--radius-xl); }
/* **두 줄로 나눠 적는다.** 한 문단으로 두면 "로그인 없이 받으실 수 있습니다" 가
   가운데서 끊겨 "로그인 없 / 이 받으실 수 있습니다" 로 읽힌다. 사양은 사양끼리,
   약속은 약속대로 줄을 나눈다. */


/* 그림은 맨 아래. 세로 흐름을 끊지 않게 여백을 크게 준다.
 *
 * **두 열일 때보다 작게.** 옆에 글이 없어 폰이 화면을 혼자 차지하는데, 원래 크기로
 * 두면 세로로 한 화면을 더 먹어서 그 아래 섹션이 한참 밀린다. 여기서 폰은 주장이
 * 아니라 곁들이다 — 진짜 증거는 바로 아래 쇼케이스가 맡는다. */


/* 새 값을 칠한다 — 형광펜으로 그은 모양.
 *
 * 아래 32% 만 칠하는 것이 요점이다. 글자 전체를 칠하면 배지가 되고, 아래만
 * 칠하면 펜으로 그은 것이 된다. */
.st-hl {
    color: var(--primary); padding: 0 .06em; border-radius: 3px; white-space: nowrap;
    background: linear-gradient(to top,
        color-mix(in srgb, var(--primary) 20%, transparent) 0,
        color-mix(in srgb, var(--primary) 20%, transparent) 32%,
        transparent 32%);
}
/* `.st-hero__lede` 와 `.st-get*` 규칙을 지웠다 (2026-09-20).
 *
 * 제품 페이지의 HTML 머리말이 쓰던 옷이다 — 흰 카드 안에 버튼 둘을 담던 것.
 * 세 화면이 모두 `crever_hero` 블록을 쓰게 되면서 부르는 데가 없어졌다.
 * 머리말의 한 줄은 그 블록의 `.crv-hero__lede` 가 맡는다. */


/* ── 버튼 ── */
.st-btn {
    display: inline-flex; align-items: center; justify-content: center; gap: 8px;
    padding: 15px 26px; border-radius: var(--radius-lg); font: inherit; font-size: 15.5px;
    font-weight: 700; text-decoration: none; cursor: pointer;
    background: transparent; border: 1.5px solid transparent;
    transition: transform .12s, box-shadow .18s;
}
.st-btn:active { transform: translateY(1px); }
.st-btn--primary {
    background: linear-gradient(135deg, var(--primary),
                color-mix(in srgb, var(--primary) 62%, var(--color-white)));
    color: var(--primary-foreground);
    box-shadow: 0 10px 26px color-mix(in srgb, var(--primary) 30%, transparent);
}
.st-btn--primary:hover { box-shadow: 0 14px 34px color-mix(in srgb, var(--primary) 40%, transparent); }
.st-btn--line { border-color: var(--border); background: var(--card); color: var(--foreground); }
.st-btn--line:hover { border-color: var(--primary); color: var(--primary); }

/* ── 폰 목업 — 실제로 만든 장면이 넘어간다 ───────────────── */
.st-phonehold { display: grid; place-items: center; }
.st-phone {
    position: relative; width: min(280px, 78vw); aspect-ratio: 9/16;
    border-radius: 30px; background: #120A10; padding: 9px;
    border: 1px solid color-mix(in srgb, var(--foreground) 14%, transparent);
    box-shadow: 0 28px 66px color-mix(in srgb, var(--foreground) 26%, transparent);
}
.st-screen { position: relative; width: 100%; height: 100%; border-radius: 22px;
             overflow: hidden; background: #000; }
/* `.st-frame`·`.st-cap`·`.st-progress` 규칙을 지웠다 (2026-09-20).
 *
 * 연출 컷 넉 장을 넘기고, 그 위에 우리가 적은 자막을 얹고, 진행 막대를 그리던
 * 옷이다. 폰 안에 **이 프로그램이 실제로 만들어 올린 영상**이 들어가면서 셋 다
 * 쓰이지 않는다 — 자막은 그 영상에 이미 구워져 있고, 재생 위치는 유튜브가
 * 그린다. 폰 껍데기(`.st-phone`·`.st-screen`·`.st-live`)만 남는다. */
/* `.st-phonecap` 규칙을 지웠다 (2026-09-20). 폰 밑에 달던 설명 줄을 뺐고, 이 클래스를
   붙이는 HTML 이 하나도 안 남았다. */

/* ── 나타나기 ── */
.js .st-reveal { opacity: 0; transform: translateY(26px); }
.js .st-reveal.is-in {
    opacity: 1; transform: none;
    transition: opacity .7s cubic-bezier(.2,.8,.2,1), transform .7s cubic-bezier(.2,.8,.2,1);
}

/* ── 만든 화면 갤러리 ──
 *
 * **한 줄에 다섯 장으로 못 박는다**(사용자 결정). 전에는 `auto-fit`/`minmax` 로
 * 폭에 맡겼는데, 그러면 화면 폭에 따라 여섯 장이 되었다가 넉 장이 되었다가 해서
 * 열 장이 5+5 로 딱 떨어지지 않고 마지막 줄에 한두 장만 남아 빈칸이 생겼다.
 *
 * 좁은 화면에서는 다섯 장이 손톱만 해지므로 단수를 줄인다. */
.st-gal { display: grid; grid-template-columns: repeat(5, 1fr);
          gap: 12px; margin-top: 30px; }
@media (max-width: 900px) { .st-gal { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 560px) { .st-gal { grid-template-columns: repeat(2, 1fr); } }
.st-gal figure { margin: 0; border-radius: var(--radius-lg); overflow: hidden;
                 background: var(--card); border: 1px solid var(--border); aspect-ratio: 3/4; }
.st-gal img { width: 100%; height: 100%; object-fit: cover; display: block;
              transition: transform .5s ease; }
.st-gal figure:hover img { transform: scale(1.05); }

/* ── 프로그램 화면 (제품 페이지) ────────────────────────────
 *
 * `.st-gal` 과 나눠 둔다. 저쪽은 3:4 세로 그림(만든 장면)이고 여기는 **가로로 넓은
 * 앱 화면**이다. 같은 규칙에 넣으면 스크린샷이 세로로 잘려 무슨 화면인지 안 보인다.
 *
 * 잘라 내지 않는다(`contain`) — 화면 구석이 잘리면 "이 프로그램 이렇게 생겼구나"
 * 를 보러 온 사람이 본 것이 반쪽이 된다. */
.st-shots { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
            gap: 16px; margin-top: 30px; }
.st-shots figure { margin: 0; }
.st-shots img {
    display: block; width: 100%; height: auto;
    border-radius: var(--radius-lg); border: 1px solid var(--border);
    background: var(--card); box-shadow: var(--st-lift);
}
.st-shots figcaption { margin-top: 10px; font-size: 13.5px; color: var(--muted-foreground); }

/* ── 카드 ──────────────────────────────────────────────────
 *
 * **띠 색이 흰색일 때 카드가 안 보인다.** 바탕(`--background`, #FFFCFD)과
 * 카드(`--card`, #FFFFFF)가 사실상 같은 색이라, 분홍 띠(`--band--alt`) 위에서는
 * 카드가 떠 보이는데 흰 띠 위에서는 옅은 테두리 한 줄만 남아 그냥 글 뭉치로
 * 읽혔다. 실제로 FAQ 를 카드로 바꿔 놓고도 "카드 같지 않다" 는 말을 들었다.
 *
 * 색으로 벌리려면 카드를 분홍으로 칠해야 하는데, 그러면 분홍 띠 위에서 또 같은
 * 문제가 뒤집혀 생긴다. 그래서 **색이 아니라 그림자로 띄운다** — 띠 색이 무엇이든
 * 통한다. 바탕이 무채색이 된 뒤로(2026-10-02) 그림자도 무채색이다. */
:root {
    --st-lift:       0 1px 2px color-mix(in srgb, var(--foreground) 6%, transparent),
                     0 8px 22px color-mix(in srgb, var(--foreground) 7%, transparent);
    --st-lift-hover: 0 2px 4px color-mix(in srgb, var(--foreground) 8%, transparent),
                     0 14px 34px color-mix(in srgb, var(--foreground) 13%, transparent);
}

/* **카드로 읽혀야 하는 것을 한자리에 모아 둔다.** 섹션마다 클래스 이름은 다르지만
 * 눈에는 전부 "띠 위에 놓인 카드" 하나다. 각자 자기 규칙에서 그림자를 따로 주면
 * 값이 조금씩 어긋나고, 나중에 하나를 고칠 때 나머지를 못 찾는다.
 *
 * 여기 없는 것 — 알약(`.st-flow li`), 갤러리 사진, 다운로드 절차 줄 — 은 카드가
 * 아니라 목록이다. 전부 띄우면 화면에 뜬 것이 너무 많아져 아무것도 안 뜬 것과
 * 같아진다. */
.st-signup { box-shadow: var(--st-lift); }

/* 여섯 장을 기본 격자에 두면 4 + 2 로 떨어져 끝줄이 비어 보인다. 셋씩 두 줄. */

/* 단계 카드(.st-steps·.st-step)·올라가는 곳 줄(.st-plat)을 지웠다 (2026-10-02).
   블로그·동영상 v3 가 각각 기능 격자(.cv-feats)와 히어로 아래 로고 줄(.cv-plat)로
   받았고, 옛 행은 꺼 두었다. */

/* 흐르는 로고 띠(.st-marq)를 지웠다 (2026-10-02). 메인 v3 는 히어로 아래에 로고를
   이름과 함께 한 줄로 세운다(.cv-plat) — 판매 화면에서 로고만 흘러가면 치지직·스레드를
   못 알아보는 사람이 있다. 옛 띠 행(creator-platforms)은 시더에서 꺼 두었다. */

/* ── 다섯 축 ── */

/* ── 채널 안전 ── */
/* 자료 카드는 표로 그린다.
 *
 * 처음에는 `<dl><dt><dd>` 로 썼는데 **블록 정화기가 그 태그들을 통째로 걷어내서**
 * 이름과 값이 한 덩어리로 붙어 버렸다 ("가져온 곳미국 지질조사국…"). `<table>` 은
 * 그대로 통과하고, 이름-값 쌍이라는 뜻에도 표가 더 맞는다. */

/* ── 성과 ── */
.st-bars { display: flex; flex-direction: column; gap: 13px; }
.st-bar { display: grid; grid-template-columns: 84px 1fr 52px; gap: 12px;
          align-items: center; font-size: 13.5px; }
.st-bar > span:first-child { color: var(--muted-foreground); }
.st-bar__track { height: 9px; border-radius: var(--radius-full); background: var(--border); overflow: hidden; }
.st-bar__track i { display: block; height: 100%; width: 0; border-radius: var(--radius-full);
                   background: var(--primary); transition: width 1s ease-out; }
.st-bar b { font-size: 12.5px; color: var(--primary); font-variant-numeric: tabular-nums; text-align: right; }

/* ── 비용 ── */

/* ── 요금 ── */
/* **판 배경을 두지 않는다** (2026-09-20). 분홍 판 위에 흰 카드를 올리면 바탕이
   두 겹이 되어, 정작 봐야 할 카드가 그 안에 갇힌 것처럼 보인다. 흰 바탕 하나로
   두고 경계는 카드 테두리가 맡는다. */
/* 1년 구독 혜택.
 *
 * **가격 바로 아래에 둔다.** 값을 본 순간이 "그래서 얼마짜리인가" 를 재는
 * 자리라, 여기서 한 박자 늦으면 목록에 묻혀 그냥 지나간다. */


/* 요금제 셋 (블로그 · 동영상 · 둘 다).
 *
 * 글은 위, 카드 세 장은 아래 한 줄이다. 전처럼 옆에 두면 카드가 셋이라 좁아져
 * 값이 안 읽힌다. 카드는 세로 flex 라 버튼과 "준비 중" 줄이 바닥에 맞춰진다 —
 * 항목 수가 달라도 세 장의 아랫선이 같아야 한 줄로 읽힌다. */
/* 요금제 묶음의 이름표 — "달마다" / "1년치를 한 번에".
 *
 * 카드 여섯 장을 한 판에 늘어놓으면 어느 셋이 한 묶음인지 읽는 사람이 세어 봐야
 * 한다. 묶음마다 줄 하나를 얹어 그 일을 없앤다. */

/* 체험 카드 줄. **한 장이라 3열 격자에 그냥 두면 왼쪽 1/3만 차지한다** — 옆의
 * 빈자리가 "뭔가 빠졌다" 로 읽힌다. 두 칸 폭으로 세워 유료 카드들과 무게를 맞춘다. */
/* 준비 중인 것은 점선이다. 흐리게(opacity) 하면 값이 안 읽혀서 "얼마인가" 를
 * 묻는 사람이 못 본다. 선만 다르게 한다. */

/* ── 가입 ── */
/* 가입 안내.
 *
 * **폼을 여기 두지 않는다.** 블록 HTML 은 정화기가 `<form>`·`<input>` 을 걷어낸다
 * (본문에 입력칸이 생기지 않게 하려는 의도된 설계). 게다가 프레임워크에 이미
 * 3단계 가입 절차가 있으므로, 여기 폼을 또 만들면 가입 경로가 둘이 된다. */
.st-signup { display: flex; flex-direction: column; gap: 14px; max-width: 420px;
             background: var(--card); border: 1px solid var(--border);
             border-radius: var(--radius-xl); padding: clamp(20px, 3vw, 28px); }
.st-signup .st-btn { width: 100%; }
.st-signup .st-fine a { color: var(--primary); font-weight: 600; }
.st-fine { font-size: 12.5px; color: var(--muted-foreground); }

/* ── 자주 묻는 것 — 카드 ──────────────────────────────────
 *
 * 전에는 테두리 없이 문답만 늘어놓았다. 그러면 **한 문답이 어디서 끝나고 다음이
 * 어디서 시작하는지 눈이 못 찾는다** — 질문과 답의 차이가 글자 크기 1px 뿐이라
 * 아홉 개가 한 덩어리 글로 읽혔다. 카드로 하나씩 끊는다.
 *
 * 열은 셋으로 못 박는다. 문답이 아홉이라 3열이면 3줄로 딱 떨어진다 —
 * `auto-fit` 에 맡기면 폭에 따라 4열이 되면서 마지막 줄에 한 장만 남는다.
 *
 * **카드는 자식 `div` 를 그대로 잡는다.** 처음에는 `.st-qa` 클래스를 붙여
 * 잡으려 했는데, 시더는 설치 때만 돌므로 **이미 DB 에 들어간 블록에는 그 클래스가
 * 없다** — 화면에서는 아무것도 안 바뀌었다. 운영자가 관리자에서 문답을 하나
 * 더 붙일 때도 `div` 를 복사하지 클래스까지 챙기지 않는다. 구조로 잡는 편이
 * 지금 있는 것과 앞으로 들어올 것 모두에 붙는다. */

/* 카드 안은 `Q` 동그라미 한 칸 + 글 한 칸. 질문과 답이 같은 세로선에서
 * 시작하므로 답이 질문에 딸린 것으로 읽힌다.
 * (그림자·호버는 위 «카드» 묶음이 준다.) */
/* 동그라미(26px)와 질문 첫 줄(약 22px)의 높이 차를 메운다 — 안 메우면 글자가
 * 동그라미보다 살짝 올라붙어 삐뚤어 보인다. */

/* 사양 안내는 문답이 아니다 — 카드와 같은 흰 상자로 두면 열 번째 문답으로
 * 읽힌다. 분홍 바탕으로 깔아 성격이 다른 것임을 먼저 보이게 한다. */
/* 사양 상자(.st-spec) CSS 가 있던 자리 — 지웠다 (2026-09-20).
 *
 * 받기 섹션에서 그 상자를 걷어냈다. 히어로에 이미 사양이 있고, 상자에는
 * "다음 판에서 CREVER 로 바뀝니다" 같은 우리 쪽 메모까지 들어 있었다. */

/* ══ v2 (2026-08-30) ═══════════════════════════════════════
 *
 * 판매 페이지를 docs/creator-site-plan.md §2 대로 다시 짠 것. 아직 결정 안 난
 * 자리는 `st-tbd` 계열 — **점선**으로 그린다. 흐리게(opacity) 하면 무엇이 들어갈
 * 자리인지 못 읽는다. 채우면 그 클래스만 뗀다.
 */

/* ── 자리표 ── */

/* ── 히어로 숫자 셋 ── */

/* ── 결과물 탭 ──
 *
 * 탭은 `<a>` 다 — 정화기가 `<button>` 을 걷는다. href 는 섹션 앵커라 JS 가 죽어도
 * 화면이 튀지 않는다. 짝은 클래스로: `.st-tab--know` ↔ `figure.st-made--know`. */
.st-tabs { list-style: none; display: flex; flex-wrap: wrap; gap: 8px; margin: 26px 0 0; padding: 0; }
.st-tab { display: inline-block; padding: 8px 15px; border-radius: var(--radius-full);
          border: 1px solid var(--border); background: var(--card); font-size: 13.5px;
          color: var(--muted-foreground); text-decoration: none; transition: .15s; }
.st-tab:hover { border-color: var(--primary); color: var(--primary); }
.st-tab.is-on { background: var(--primary); border-color: var(--primary); color: #fff; }
.st-gal { margin-top: 18px; }
.st-gal figure { position: relative; }
.st-gal figure.is-off { display: none; }
.st-gal figcaption { position: absolute; left: 9px; bottom: 9px; font-size: 11px;
                     padding: 4px 9px; border-radius: var(--radius-full);
                     background: rgba(0, 0, 0, .55); color: #fff; }
/* 영상이 있는 카드에는 재생 표시. `<a class="st-made__play" href="*.mp4">` 가 있을 때만. */
.st-made__play { position: absolute; inset: 0; display: grid; place-items: center;
                 color: #fff; font-size: 0; }
.st-made__play::after { content: "\25B6"; font-size: 18px; width: 46px; height: 46px;
                        display: grid; place-items: center; border-radius: 50%;
                        background: rgba(0, 0, 0, .55); }
/* 재생 창 (JS 가 만든다) */
.st-player { position: fixed; inset: 0; z-index: 9999; display: grid; place-items: center;
             background: rgba(0, 0, 0, .82); padding: 24px; }
.st-player video { max-height: 88vh; max-width: min(92vw, 480px); border-radius: var(--radius-lg);
                   background: #000; }
.st-player__close { position: absolute; top: 18px; right: 22px; color: #fff; font-size: 28px;
                    background: none; border: 0; cursor: pointer; }

/* ── 작동 방식 · 그동안 vs 머블로 ──
 *
 * 한 단계 = 한 줄, 세 칸(번호 · 그동안 · 머블로). 오른칸이 조금 넓다 — 거기가
 * 팔 것이다. 모바일은 세로로 쌓고 오른칸 위에 선을 긋는다. */

/* ── 특장점 전부 (번호 격자) ── */
.st-feats { list-style: none; margin: 30px 0 0; padding: 0; display: grid;
            grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 12px; }
.st-feats li { background: var(--card); border: 1px solid var(--border);
               border-radius: var(--radius-lg); padding: 16px 17px;
               display: grid; grid-template-columns: 30px 1fr; gap: 3px 12px;
               align-content: start; box-shadow: var(--st-lift);
               transition: transform .16s, border-color .16s, box-shadow .18s; }
.st-feats li:hover { transform: translateY(-3px); box-shadow: var(--st-lift-hover); border-color: var(--primary); }
.st-feats b { grid-row: 1 / 3; font-size: 12.5px; color: var(--primary);
              font-variant-numeric: tabular-nums; padding-top: 3px; }
.st-feats strong { font-size: 14.5px; line-height: 1.4; }
.st-feats span { font-size: 12.5px; color: var(--muted-foreground); line-height: 1.55; }

/* 어느 제품의 기능인지 알려 주는 꼬리표.
   **색으로만 가르지 않는다.** 색을 못 가리는 사람에게는 서른 개가 한 덩어리로
   보인다. 글자로 적고, 색은 훑을 때 빨리 잡히라고 얹는 것뿐이다. */
.st-tag { display: inline-block; margin-right: 7px; padding: 1px 7px;
          border-radius: 999px; font-style: normal; font-size: 10.5px;
          font-weight: 700; vertical-align: 2px; letter-spacing: .02em;
          background: var(--muted); color: var(--muted-foreground); }
.st-tag--both { background: var(--muted); color: var(--muted-foreground); }
.st-tag--b { background: color-mix(in srgb, var(--studio-coral) 15%, transparent);
             color: color-mix(in srgb, var(--studio-coral) 72%, var(--studio-ink)); }
.st-tag--v { background: var(--accent); color: var(--accent-foreground); }

@media (prefers-reduced-motion: reduce) { .st-feats li:hover { transform: none; } }

/* ── 비용 표 ── */

/* ── 카드 안 링크 · 배지 ── */
.st-more { display: inline-block; margin-top: 12px; font-size: 13.5px; font-weight: 600;
           color: var(--primary); }

/* ── 증명 ── */

/* ── 로그인 회원 다운로드 카드 (Index 스킨이 블록 앞에 그린다) ── */
/* 회원 상단 다운로드 카드(.st-top)의 CSS 가 있던 자리 — 지웠다 (2026-09-20).
 *
 * 그 카드를 걷어냈다(views/Front/Index/studio/Index.php). 히어로의 받기 버튼과
 * 헤더의 다운로드가 같은 곳으로 가는데 카드가 하나 더 있으면, 회원에게만 같은
 * 말이 세 번 나온다.
 *
 * 쓰이지 않는 옷을 남겨 두면 다음 사람이 어디에 쓰이는지 찾아 헤맨다. */

@media (prefers-reduced-motion: reduce) {
    .st-reveal { opacity: 1; transform: none; }
}


/* ── 전체 폭으로 편다 ────────────────────────────────────────
 *
 * 블록 렌더러는 행을 `.block-container`(max-width 1200px) 안에 넣는다. 그 안에서
 * 배경색을 칠하면 **띠가 화면 끝까지 안 가고 양옆이 허옇게 남는다.**
 *
 * 행 하나하나를 관리자 화면에서 '전체 폭'으로 바꿔 둘 수도 있지만, 그러면 이
 * 화면을 다시 심을 때마다 사람이 열세 번 눌러야 한다. 우리 섹션이 든 컨테이너만
 * 여기서 푼다 — `:has()` 가 그 판정을 한다.
 *
 * `.st-band`(또는 히어로)를 가진 컨테이너만 걸리므로 게시판·상점 블록은
 * 그대로 1200px 이다.
 *
 * 히어로는 `.st-band` 를 붙이지 않는다 — `striped()` 가 첫 `.st-band` 에
 * `--alt` 를 얹으므로 배경 교대가 히어로에서 시작돼 버리고, `.st-band` 의
 * 세로 여백이 `.st-hero__in` 것과 겹친다. 그래서 여기서 따로 이름을 부른다.
 */
.block-container:has(> .block-row :is(.st-band, .st-hero)) {
    max-width: none;
    padding-inline: 0;
}

/* `:has()` 를 모르는 브라우저를 위한 대비 — 섹션이 스스로 컨테이너를 밀고 나간다.
 * 위 규칙이 먹으면 좌우 여백이 0 이라 이 값도 0 이 되어 겹쳐도 탈이 없다. */
@supports not selector(:has(*)) {
    .st-band, .st-hero {
        margin-inline: calc(50% - 50vw);
        padding-inline: calc(50vw - 50%);
    }
}


/* ==========================================================================
 * 판매 화면 v3 (2026-10-02) — 첫 화면·블로그·동영상·요금제가 같이 쓴다.
 *
 * 무채색 바탕 위에 핑크(--primary)는 제목의 강조 낱말·주 버튼·순위 1위에만.
 * 짙은 칸(받기 카드)은 --studio-graphite 하나다.
 *
 * 섹션은 `.st-band` / `.st-hero` 를 같이 단다 — 그래야 위의 `:has()` 규칙이
 * 컨테이너를 전체 폭으로 풀고, 폭은 안쪽 `.st-wrap` 이 잡는다.
 *
 * **앱 화면 그림(.cv-app)은 실제 앱의 색을 그대로 쓴다** — 인디고 버튼, 연회색
 * 바닥(#F4F6FB). 사이트 토큰을 따라가게 두면 "실제 프로그램과 다르다" 가 된다
 * (사용자 지적, 2026-10-02). 값의 원본은 데스크톱 앱 frontend/src/styles/theme.css.
 *
 * 블록 HTML 정화기(HTMLPurifier)가 svg·button·style 속성을 걷으므로 아이콘은
 * CSS 마스크로, 메뉴 색은 클래스로 단다.
 * ========================================================================== */
.cv-band { padding-block: clamp(64px, 8vw, 96px); }
.cv-band--gray { background: var(--muted); }
.cv-band--flush { padding-top: 0; }
.cv-h2 { font-size: clamp(28px, 3.4vw, 40px); line-height: 1.25; font-weight: 800; letter-spacing: -0.035em; text-wrap: balance; margin: 0; }
.cv-h2 em, .cv-hero h1 em { font-style: normal; color: var(--primary); }
.cv-head { display: flex; align-items: end; justify-content: space-between; gap: 24px; margin-bottom: 36px; }
.cv-more { font-size: 15px; font-weight: 600; color: var(--muted-foreground); white-space: nowrap; text-decoration: none; }
.cv-more:hover { color: var(--foreground); }

.cv-btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; height: 52px; padding: 0 24px;
          border-radius: 12px; font-weight: 700; font-size: 16px; text-decoration: none; border: 1px solid transparent; }
.cv-btn--primary { background: var(--primary); color: var(--primary-foreground); }
.cv-btn--primary:hover { filter: brightness(.92); }
.cv-btn--line { background: var(--background); border-color: var(--border); color: var(--foreground); }
.cv-btn--line:hover { border-color: var(--studio-ink-3); }

/* ── 히어로 ── */
.cv-hero > .st-wrap { padding-block: 72px 56px; }
.cv-hero__grid { display: grid; grid-template-columns: minmax(0,1fr) minmax(0,1.06fr); gap: 56px; align-items: center; }
.cv-eyebrow { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin: 0; font-size: 14px; font-weight: 600; color: var(--muted-foreground); }
.cv-eyebrow i { width: 6px; height: 6px; border-radius: 50%; background: var(--studio-ink-3); }
.cv-hero h1 { margin: 20px 0 0; font-size: clamp(38px, 5.2vw, 62px); line-height: 1.16; font-weight: 800; letter-spacing: -0.035em; text-wrap: balance; }
.cv-hero__cta { margin-top: 40px; display: flex; gap: 10px; flex-wrap: wrap; }
.cv-plat { margin-top: 64px; padding-top: 28px; border-top: 1px solid var(--border); display: flex; align-items: center; gap: 28px; flex-wrap: wrap; }
.cv-plat > p { margin: 0; font-size: 14px; font-weight: 600; color: var(--muted-foreground); }
.cv-plat ul { display: flex; gap: 14px; flex-wrap: wrap; list-style: none; margin: 0; padding: 0; }
.cv-plat li { display: flex; align-items: center; gap: 8px; font-size: 13.5px; color: var(--muted-foreground); }
.cv-plat img { width: 28px; height: 28px; }

/* ── 앱 화면 그림 — 실제 앱 값 ── */
.cv-app { border-radius: 16px; overflow: hidden; background: #f4f6fb; border: 1px solid #e2e8f0; color: #0f172a;
          box-shadow: 0 30px 60px -24px rgba(15,23,42,.28), 0 12px 30px rgba(15,23,42,.08); }
.cv-app__bar { display: flex; align-items: center; gap: 7px; padding: 10px 14px; background: #fff; border-bottom: 1px solid #e2e8f0; }
.cv-app__bar i { width: 10px; height: 10px; border-radius: 50%; background: #e2e8f0; }
.cv-app__bar b { margin-left: 8px; font-size: 12px; font-weight: 600; color: #64748b; }
.cv-app__body { display: grid; grid-template-columns: 128px minmax(0,1fr); }
.cv-app__side { background: #fff; border-right: 1px solid #e2e8f0; padding: 14px 8px; }
.cv-app__logo { display: block; width: 92px; height: auto; margin: 2px 4px 12px; }
.cv-app__mode { display: grid; grid-template-columns: 1fr 1fr; gap: 3px; padding: 3px; border: 1px solid #e2e8f0; border-radius: 9px; background: #f1f5f9; margin-bottom: 12px; }
.cv-app__mode span { text-align: center; padding: 5px 0; border-radius: 7px; font-size: 11.5px; font-weight: 650; color: #64748b; }
.cv-app__mode .is-on { background: #fff; color: #6366f1; box-shadow: 0 1px 2px rgba(15,23,42,.08); }
.cv-app__nav { display: flex; flex-direction: column; gap: 2px; }
.cv-app__nav span { position: relative; display: flex; align-items: center; gap: 8px; padding: 6px 8px; border-radius: 8px; font-size: 12px; font-weight: 500; color: #0f172a; }
.cv-app__nav span::before { content: ""; width: 8px; height: 8px; border-radius: 3px; border: 2px solid var(--cv-ic, #64748b); flex: none; }
.cv-app__nav .is-on { background: #eef2ff; color: #6366f1; font-weight: 600; }
.cv-app__nav .is-on::after { content: ""; position: absolute; left: -8px; top: 7px; bottom: 7px; width: 3px; border-radius: 0 3px 3px 0; background: #6366f1; }
.cv-ic-amber { --cv-ic: #D97706; } .cv-ic-pink { --cv-ic: #E9358E; } .cv-ic-indigo { --cv-ic: #6366F1; }
.cv-ic-sky { --cv-ic: #0284C7; } .cv-ic-violet { --cv-ic: #7C3AED; } .cv-ic-slate { --cv-ic: #64748B; } .cv-ic-teal { --cv-ic: #0D9488; }
.cv-app__main { padding: 16px 16px 18px; min-width: 0; }
.cv-app__main h3 { margin: 0; font-size: 17px; font-weight: 800; letter-spacing: -0.02em; }
.cv-app__card { margin-top: 12px; background: #fff; border: 1px solid #e2e8f0; border-radius: 12px; padding: 12px; display: grid; gap: 8px; }
.cv-app__card-h { font-size: 12.5px; font-weight: 700; }
.cv-badge { font-style: normal; flex: none; padding: 2px 9px; border-radius: 999px; font-size: 10.5px; font-weight: 600; background: #f1f5f9; color: #64748b; }
.cv-badge--ok { background: #d1fae5; color: #10b981; }
.cv-badge--run { background: #eef2ff; color: #6366f1; }

/* 대시보드 · 오늘의 통합 일정 (첫 화면) — 앱 Dashboard.tsx 의 dashboard-schedule-* */
.cv-ds__head { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 12px; font-size: 11px; color: #475569; }
.cv-ds__head b { font-size: 12.5px; color: #0f172a; margin-right: 4px; }
.cv-ds__head strong { margin-left: 3px; color: #0f172a; }
.cv-ds__grid { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 8px; }
.cv-ds__tile { display: grid; grid-template-columns: minmax(0,1fr) auto; gap: 5px; padding: 9px; border: 1px solid #e2e8f0; border-radius: 10px; background: #fff; min-width: 0; }
.cv-ds__tile time { font-size: 13px; font-weight: 700; font-variant-numeric: tabular-nums; }
.cv-ds__dom { justify-self: end; padding: 2px 6px; border-radius: 4px; font-size: 9.5px; font-weight: 800; }
.cv-ds__dom--blog { color: #047857; background: #d1fae5; }
.cv-ds__dom--shorts { color: #b91c1c; background: #fee2e2; }
.cv-ds__tile strong { grid-column: 1 / -1; font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cv-ds__tile small { font-size: 10px; color: #64748b; align-self: center; white-space: nowrap; }
.cv-ds__tile .cv-badge { justify-self: end; }

/* 발행 성과 (블로그) — 앱 Blog.tsx 의 blog-performance-* */
.cv-pf { border: 1px solid #e2e8f0; border-radius: 11px; padding: 10px 12px; min-width: 0; }
.cv-pf__top { display: flex; justify-content: space-between; align-items: center; }
.cv-pf__btn { border-radius: 7px; padding: 4px 10px; font-size: 10.5px; font-weight: 600; color: #fff; background: #6366f1; }
.cv-pf__title { margin: 6px 0 0; font-size: 12.5px; font-weight: 700; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cv-pf__meta { display: flex; gap: 10px; margin: 4px 0 0; font-size: 10px; color: #64748b; }
.cv-pf__metrics { margin-top: 8px; display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 8px; }
.cv-pf__metrics > div { display: grid; gap: 1px; min-width: 0; }
.cv-pf__metrics span, .cv-pf__metrics small { font-size: 9.5px; color: #64748b; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cv-pf__metrics strong { font-size: 13px; font-weight: 700; }
.cv-pf .r-top { color: #dc2626; } .cv-pf .r-mid { color: #2563eb; } .cv-pf .r-out { color: #111827; }
.cv-pf .chg { font-weight: 700; } .cv-pf .chg.up { color: #dc2626; }

/* 편집 · 제작 영상 목록 (동영상) — 앱 Projects.tsx 의 project-card-* */
.cv-ed__head { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.cv-ed__tabs { display: flex; gap: 6px; }
.cv-ed__tabs span { padding: 4px 10px; border-radius: 8px; font-size: 11px; font-weight: 600; color: #475569; background: #fff; border: 1px solid #e2e8f0; }
.cv-ed__tabs .is-on { background: #6366f1; color: #fff; border-color: #6366f1; }
.cv-ed__grid { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 8px; }
.cv-ed__card { display: flex; flex-direction: column; gap: 6px; padding: 7px; border: 1px solid #e2e8f0; border-radius: 10px; min-width: 0; }
.cv-ed__card img { width: 100%; aspect-ratio: 16/10; object-fit: cover; border-radius: 7px; }
.cv-ed__card p { margin: 0; font-size: 11px; font-weight: 600; line-height: 1.4; min-height: 2.8em;
                 display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.cv-ed__card .cv-badge { align-self: flex-start; }

/* ── 아직도 직접 하세요? ── */
.cv-vs { border-top: 2px solid var(--foreground); }
.cv-vs__row { display: grid; grid-template-columns: 180px minmax(0,1fr) 220px; gap: 24px; align-items: center; padding-block: 22px; border-bottom: 1px solid var(--border); }
.cv-vs__row b { font-size: 17px; font-weight: 800; }
.cv-vs__row span { color: var(--studio-ink-3); font-size: 16px; text-decoration: line-through; text-decoration-color: #C9C9CF; }
.cv-vs__row strong { font-size: 22px; font-weight: 800; letter-spacing: -0.03em; }
.cv-vs__row--head { padding-block: 14px; }
.cv-vs__row--head span { text-decoration: none; font-size: 13px; font-weight: 700; }
.cv-vs__row--head span:last-child { color: var(--primary); }

/* ── 세팅은 한 번 · 이번 주 일정 ── */
.cv-week { background: var(--card); border: 1px solid var(--border); border-radius: 20px; padding: 24px 24px 20px; margin-bottom: 20px; overflow-x: auto; }
.cv-week__head { display: flex; justify-content: space-between; align-items: center; gap: 16px; margin-bottom: 16px; }
.cv-week__head b { font-size: 16px; font-weight: 800; }
.cv-week__key { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; color: var(--muted-foreground); }
.cv-week__key i { width: 10px; height: 10px; border-radius: 3px; margin-left: 6px; }
.cv-week__key .k-v { background: var(--foreground); }
.cv-week__key .k-b { border: 1.5px solid var(--foreground); }
.cv-week__grid { display: grid; grid-template-columns: 52px repeat(7, minmax(72px, 1fr)); gap: 6px; min-width: 620px; }
.cv-week__grid .dh { text-align: center; font-size: 13px; font-weight: 700; color: var(--muted-foreground); padding-bottom: 4px; }
.cv-week__grid .dh.today { color: var(--primary); }
.cv-week__grid .tm { font-size: 12px; color: var(--studio-ink-3); display: flex; align-items: center; font-variant-numeric: tabular-nums; }
.cv-cell { height: 34px; border-radius: 8px; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 600; line-height: 1; }
.cv-cell--v.done { background: var(--foreground); color: var(--background); }
.cv-cell--b.done { background: var(--card); border: 1.5px solid var(--foreground); }
.cv-cell.done::before { content: "✓"; margin-right: 4px; font-size: 11px; }
.cv-cell.next { border: 1.5px dashed #C9C9CF; color: var(--studio-ink-3); background: var(--card); }
.cv-cell.empty { background: var(--muted); }
.cv-cell.now { outline: 2px solid var(--primary); outline-offset: 2px; }
.cv-steps { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 20px; }
.cv-step { background: var(--card); border: 1px solid var(--border); border-radius: 16px; padding: 28px; }
.cv-step__n { margin: 0; font-size: 13px; font-weight: 600; color: var(--studio-ink-3); letter-spacing: .04em; }
.cv-step h3 { margin: 18px 0 0; font-size: 21px; font-weight: 800; }
.cv-chips { margin-top: 20px; display: flex; flex-wrap: wrap; gap: 6px; }
.cv-chips span { font-size: 12.5px; font-weight: 600; padding: 5px 10px; border-radius: 999px; background: var(--muted); color: var(--muted-foreground); }

/* ── 블로그 / 동영상 두 제품 ── */
.cv-duo { display: grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap: 20px; }
.cv-prod { border: 1px solid var(--border); border-radius: 20px; padding: 36px; display: flex; flex-direction: column; background: var(--card); }
.cv-prod__tag { margin: 0; font-size: 13.5px; font-weight: 700; color: var(--studio-ink-3); }
.cv-prod h3 { margin: 10px 0 0; font-size: 26px; font-weight: 800; line-height: 1.3; }
.cv-prod ul { margin: 24px 0 0; padding: 0; list-style: none; }
.cv-prod li { display: grid; grid-template-columns: 148px minmax(0,1fr); gap: 16px; padding-block: 14px; border-top: 1px solid var(--border); font-size: 15px; }
.cv-prod li span { color: var(--muted-foreground); }
.cv-prod__go { margin-top: auto; padding-top: 24px; font-weight: 700; font-size: 15px; color: var(--foreground); text-decoration: none; }
.cv-prod__go:hover { text-decoration: underline; text-underline-offset: 4px; }

/* ── 기능 목록 (블로그·동영상 페이지) ── */
.cv-feats { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); border-top: 2px solid var(--foreground); }
.cv-feats > div { padding: 26px 24px 26px 0; border-bottom: 1px solid var(--border); }
.cv-feats h3 { margin: 0; font-size: 20px; font-weight: 800; line-height: 1.35; }
.cv-feats p { margin: 6px 0 0; font-size: 15px; color: var(--muted-foreground); }

/* ── 받기 카드 ── */
.cv-end { position: relative; overflow: hidden; border-radius: 24px; padding: 56px; color: #fff;
          display: grid; grid-template-columns: minmax(0,1fr) 340px; gap: 40px; align-items: center;
          background: radial-gradient(600px 300px at 18% 0%, rgba(120,130,160,.22), transparent 70%),
                      radial-gradient(500px 300px at 100% 100%, rgba(255,255,255,.06), transparent 70%),
                      var(--studio-graphite); }
.cv-end h2 { margin: 20px 0 0; font-size: clamp(28px, 3.6vw, 44px); font-weight: 800; line-height: 1.25; letter-spacing: -0.035em; color: #fff; }
.cv-end__badge { display: inline-flex; align-items: center; gap: 8px; margin: 0; padding: 7px 14px; border-radius: 999px; font-size: 13px; font-weight: 700;
                 background: rgba(255,255,255,.08); border: 1px solid rgba(255,255,255,.14); }
.cv-end__badge::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: var(--primary); box-shadow: 0 0 0 4px rgba(212,20,114,.25); }
.cv-end__biz { margin: 16px 0 0; font-size: 16px; color: #B4B4BC; }
.cv-end__side { display: flex; flex-direction: column; gap: 12px; }
.cv-end__dl { display: flex; align-items: center; justify-content: center; gap: 10px; height: 76px; border-radius: 18px;
              background: #fff; color: var(--primary); font-size: 18px; font-weight: 800; text-decoration: none; }
.cv-end__dl::before { content: ""; width: 22px; height: 22px; background: currentColor;
    -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 4v11m0 0-4.5-4.5M12 15l4.5-4.5M5 19h14'/%3E%3C/svg%3E") center / contain no-repeat;
            mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 4v11m0 0-4.5-4.5M12 15l4.5-4.5M5 19h14'/%3E%3C/svg%3E") center / contain no-repeat; }
.cv-end__call { display: grid; grid-template-columns: auto minmax(0,1fr) auto; gap: 12px; align-items: center;
                padding: 16px 18px; border-radius: 16px; background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.1); color: #fff; }
.cv-end__call::before { content: ""; width: 26px; height: 26px; background: #D6D6DC;
    -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 14v-2a8 8 0 0 1 16 0v2M4 14a2 2 0 0 0 2 2h1v-5H6a2 2 0 0 0-2 2zm16 0a2 2 0 0 1-2 2h-1v-5h1a2 2 0 0 1 2 2zM17 16c0 2-1.5 3-4 3'/%3E%3C/svg%3E") center / contain no-repeat;
            mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 14v-2a8 8 0 0 1 16 0v2M4 14a2 2 0 0 0 2 2h1v-5H6a2 2 0 0 0-2 2zm16 0a2 2 0 0 1-2 2h-1v-5h1a2 2 0 0 1 2 2zM17 16c0 2-1.5 3-4 3'/%3E%3C/svg%3E") center / contain no-repeat; }
.cv-end__call--mail::before {
    -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6h16v12H4zM4 7l8 6 8-6'/%3E%3C/svg%3E") center / contain no-repeat;
            mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6h16v12H4zM4 7l8 6 8-6'/%3E%3C/svg%3E") center / contain no-repeat; }
.cv-end__call small { display: block; font-size: 12px; color: #A6A6AE; }
.cv-end__call b { font-size: 20px; font-weight: 800; font-variant-numeric: tabular-nums; }
.cv-end__call > span { font-size: 12.5px; color: #A6A6AE; white-space: nowrap; }

@media (max-width: 1080px) { .cv-feats { grid-template-columns: repeat(2, minmax(0,1fr)); } }
@media (max-width: 900px) {
    .cv-hero__grid, .cv-duo, .cv-steps { grid-template-columns: minmax(0,1fr); }
    .cv-end { grid-template-columns: minmax(0,1fr); padding: 40px 24px; }
}
@media (max-width: 720px) {
    .cv-vs__row { grid-template-columns: minmax(0,1fr) auto; gap: 4px 16px; }
    .cv-vs__row b { grid-column: 1 / -1; }
    .cv-vs__row--head { display: none; }
    .cv-vs__row strong { font-size: 18px; }
}
@media (max-width: 560px) {
    .cv-hero > .st-wrap { padding-block: 40px; }
    .cv-head { flex-direction: column; align-items: start; }
    .cv-feats { grid-template-columns: minmax(0,1fr); }
    .cv-prod { padding: 26px 22px; }
    .cv-prod li { grid-template-columns: minmax(0,1fr); gap: 2px; }
    .cv-app__body { grid-template-columns: minmax(0,1fr); }
    .cv-app__side { display: none; }
    .cv-ds__grid, .cv-ed__grid { grid-template-columns: repeat(2, minmax(0,1fr)); }
}

/* ── 롱폼 (동영상 페이지) ──
 * 기능 목록 아래, 기능 중 하나로 둔다 — 히어로에 올리지 않는다(사용자 지적,
 * 2026-10-02). 길이는 숫자로 약속하지 않는다 — 사용자가 정하는 값이다. */
.cv-pipe { list-style: none; margin: 0; padding: 0; counter-reset: cvp; display: grid; grid-template-columns: repeat(6, minmax(0,1fr)); gap: 10px; }
.cv-pipe li { counter-increment: cvp; padding: 20px 18px; border: 1px solid var(--border); border-radius: 16px; background: var(--card); }
.cv-pipe li::before { content: counter(cvp, decimal-leading-zero); display: block; font-size: 12px; color: var(--studio-ink-3); margin-bottom: 14px; font-variant-numeric: tabular-nums; }
.cv-pipe b { display: block; font-size: 16.5px; font-weight: 800; line-height: 1.35; }
.cv-pipe span { display: block; margin-top: 6px; font-size: 13.5px; color: var(--muted-foreground); }
.cv-lfspec { margin-top: 16px; display: grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap: 10px; }
.cv-lfspec > div { padding: 18px 20px; border-radius: 14px; background: var(--card); border: 1px solid var(--border); }
.cv-lfspec small { display: block; font-size: 12.5px; color: var(--studio-ink-3); font-weight: 600; }
.cv-lfspec b { display: block; margin-top: 4px; font-size: 22px; font-weight: 800; letter-spacing: -0.03em; }
.cv-lfmore { margin-top: 40px; display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 32px; }
.cv-lfmore > div { border-top: 2px solid var(--foreground); padding-top: 18px; }
.cv-lfmore h3 { margin: 0; font-size: 20px; font-weight: 800; }
.cv-lfmore p { margin: 6px 0 0; font-size: 15px; color: var(--muted-foreground); }
@media (max-width: 1080px) { .cv-pipe { grid-template-columns: repeat(3, minmax(0,1fr)); } }
@media (max-width: 720px) {
    .cv-pipe, .cv-lfspec { grid-template-columns: repeat(2, minmax(0,1fr)); }
    .cv-lfmore { grid-template-columns: minmax(0,1fr); gap: 24px; }
}

/* ── 기업 맞춤 제작 · 관리 대행 (요금제 페이지) ── */
.cv-offers { margin-top: 22px; display: grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap: 10px; max-width: 520px; }
.cv-offers > div { padding: 16px 18px; border-radius: 14px; background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.12); }
.cv-offers b { display: block; font-size: 17px; font-weight: 800; }
.cv-offers span { display: block; margin-top: 4px; font-size: 13.5px; color: #B4B4BC; }
.cv-end__call b.cv-end__mail { font-size: 17px; }
@media (max-width: 560px) { .cv-offers { grid-template-columns: minmax(0,1fr); } }
