@charset "utf-8";
@import url('https://cdn.jsdelivr.net/npm/pretendard@1.3.9/dist/web/static/pretendard.min.css');

/* ============================================================================
   zbc-token.css  v4.0   집반찬연구소 랜딩 디자인 토큰
   v4.0 = v3.0 + OK PACK v1 (originkit.dev 효과 CSS 이식, 파일 하단)
   ⚠ 이 파일은 대표 승인 없이 수정하지 않습니다.
   ⚠ 화면을 만들 때는 2층(시맨틱) 토큰만 사용합니다.
   기준 프레임 720px · 모든 vw 값은 720 기준으로 환산
   ============================================================================ */

:root{

/* ── 1층 · 스케일 토큰 ── 브랜드가 바뀔 때만 수정 ──────────────────────── */

/* 그린 */
--zbc-green-900:#0d5611;   /* 브랜드 기본 */
--zbc-green-600:#54810a;
--zbc-green-500:#34c26f;   /* 강조 보더 */
--zbc-green-400:#9da269;
--zbc-green-200:#cadacb;   /* 연한 라인 */
--zbc-green-100:#dbe6db;   /* 연한 배경 */
--zbc-green-50:#f3f7f3;    /* 가장 연한 배경 */

/* 무채색 */
--zbc-gray-0:#ffffff;
--zbc-gray-50:#fafafa;
--zbc-gray-100:#f5f5f5;
--zbc-gray-200:#eeeeee;
--zbc-gray-300:#b5b5b5;
--zbc-gray-500:#757575;
--zbc-gray-700:#444444;
--zbc-gray-900:#171717;
--zbc-gray-950:#111111;

/* 웜(베이지) */
--zbc-warm-100:#faf7f2;
--zbc-warm-200:#f4f0e7;
--zbc-warm-300:#e1ddc9;

/* 포인트 */
--zbc-red-600:#bd2420;
--zbc-yellow-400:#ffd600;
--zbc-amber-600:#db8c10;
--zbc-amber-50:#fdf0db;

/* 타이포 · 8단계 (720px 기준) */
--zbc-fs-1:clamp(9px, 2.500vw, 18px);    /* 캡션·취소선 정가 */
--zbc-fs-2:clamp(10px,2.917vw, 21px);    /* 뱃지 */
--zbc-fs-3:clamp(11px,3.472vw, 25px);    /* 보조 설명 */
--zbc-fs-4:clamp(12px,3.889vw, 28px);    /* 본문 */
--zbc-fs-5:clamp(14px,4.583vw, 33px);    /* 금액·소제목 */
--zbc-fs-6:clamp(16px,5.556vw, 40px);    /* 카드 제목·CTA */
--zbc-fs-7:clamp(19px,6.250vw, 45px);    /* 섹션 헤더 */
--zbc-fs-8:clamp(28px,8.889vw, 64px);    /* 히어로 */

/* 아이콘(타입 스케일과 분리) */
--zbc-icon-sm:clamp(14px,4.500vw, 32px);
--zbc-icon-md:clamp(18px,6.000vw, 43px);
--zbc-icon-lg:clamp(24px,7.851vw, 56px);

/* 굵기 */
--zbc-fw-md:500;
--zbc-fw-sb:600;
--zbc-fw-b:700;

/* 행간 */
--zbc-lh-flat:1;
--zbc-lh-tight:1.2;
--zbc-lh-quote:1.182;
--zbc-lh-snug:1.3;
--zbc-lh-base:1.36;
--zbc-lh-loose:1.5;

/* 자간 */
--zbc-ls-tight:-.03em;
--zbc-ls-normal:-.02em;
--zbc-ls-wide:.09em;
--zbc-ls-x:-.05em;

/* 모서리 */
--zbc-r-1:clamp(2px,.556vw, 4px);
--zbc-r-2:clamp(4px,1.111vw, 8px);
--zbc-r-3:clamp(8px,2.222vw,16px);
--zbc-r-4:clamp(13px,3.750vw,27px);
--zbc-r-5:clamp(20px,8.333vw,60px);
--zbc-r-full:999px;

/* 그림자 */
--zbc-sh-1:0 .2857em .3929em rgba(0,0,0,.13);
--zbc-sh-2:0 8px 8px rgba(0,0,0,.25);

/* 여백(720 기준 %) */
--zbc-sp-1:1.389%;   /* 10px */
--zbc-sp-2:2.778%;   /* 20px */
--zbc-sp-3:4.167%;   /* 30px */
--zbc-sp-4:5.556%;   /* 40px */
--zbc-sp-5:8.889%;   /* 64px */
--zbc-sp-6:12.500%;  /* 90px */
--zbc-sp-7:16.667%;  /* 120px */

/* 레이어 */
--zbc-z-base:1;
--zbc-z-sticky:100;
--zbc-z-overlay:200;

/* 모션 */
--zbc-dur-1:150ms;   /* 탭 피드백 */
--zbc-dur-2:300ms;   /* 일반 전환 */
--zbc-dur-3:600ms;   /* 등장 */
--zbc-dur-4:900ms;   /* 히어로 */
--zbc-ease-out:cubic-bezier(.16,1,.3,1);
--zbc-ease-inout:cubic-bezier(.65,0,.35,1);
--zbc-ease-spring:cubic-bezier(.34,1.56,.64,1);


/* ── 2층 · 시맨틱 토큰 ── 화면을 만들 땐 이것만 사용 ─────────────────── */

/* 표면 */
--zbc-bg:var(--zbc-gray-0);
--zbc-bg-warm:var(--zbc-warm-200);
--zbc-bg-soft:var(--zbc-gray-50);
--zbc-bg-brand:var(--zbc-green-900);
--zbc-surface:var(--zbc-gray-0);
--zbc-surface-veil:rgba(250,250,250,.8);
--zbc-surface-tint:var(--zbc-green-50);

/* 텍스트 */
--zbc-text:var(--zbc-gray-950);
--zbc-text-sub:var(--zbc-gray-700);
--zbc-text-mute:var(--zbc-gray-500);
--zbc-text-on-brand:var(--zbc-gray-0);
--zbc-brand:var(--zbc-green-900);

/* 선 */
--zbc-line:var(--zbc-gray-300);
--zbc-line-soft:var(--zbc-gray-200);
--zbc-line-brand:var(--zbc-green-200);
--zbc-line-accent:var(--zbc-green-500);

/* ── CRO 전용 ── */

/* CTA 1순위(주 전환) / 2순위(반전) */
--zbc-cta-bg:var(--zbc-green-900);
--zbc-cta-fg:var(--zbc-gray-0);
--zbc-cta-alt-bg:var(--zbc-gray-0);
--zbc-cta-alt-fg:var(--zbc-green-900);
--zbc-cta-radius:var(--zbc-r-2);
--zbc-cta-shadow:var(--zbc-sh-2);
--zbc-tap-min:48px;              /* 최소 터치 영역 */

/* 긴급·희소성 */
--zbc-urgent:var(--zbc-red-600);
--zbc-urgent-fg:var(--zbc-gray-0);
--zbc-highlight:var(--zbc-yellow-400);
--zbc-marker:rgba(112,217,156,.7);   /* 형광펜 */

/* 가격 */
--zbc-price-was:var(--zbc-gray-500);
--zbc-price-now:var(--zbc-gray-950);
--zbc-price-off:var(--zbc-red-600);
--zbc-price-save:var(--zbc-green-900);

/* 신뢰 신호 */
--zbc-trust-bg:var(--zbc-green-100);
--zbc-trust-fg:var(--zbc-green-900);
--zbc-info-bg:var(--zbc-amber-50);
--zbc-info-fg:var(--zbc-amber-600);
--zbc-star:var(--zbc-green-900);

/* 접근성 */
--zbc-focus-ring:0 0 0 3px rgba(13,86,17,.35);
}


/* ── 기본 래퍼 ─────────────────────────────────────────────────────── */
.zbc{
  max-width:720px; margin:0 auto; text-align:left; box-sizing:border-box;
  font-family:'Pretendard','Apple SD Gothic Neo','Malgun Gothic',sans-serif;
  color:var(--zbc-text);
}
.zbc *{box-sizing:border-box;}
.zbc a{text-decoration:none;}
.zbc a:focus-visible{outline:none; box-shadow:var(--zbc-focus-ring);}


/* ══════════════════════════════════════════════════════════════════════
   모션 라이브러리 v3  ·  집반찬연구소 랜딩 공용
   JS 없이 CSS 스크롤 타임라인으로 동작. 미지원 브라우저/모션 최소화 설정
   에서는 전부 무시되고 콘텐츠가 즉시 정상 표시된다.

   설계 근거 (landing-page-cro/references/motion.md)
   · 주의를 끄는 건 "움직임의 시작·새 요소의 등장"이지 지속적 움직임이 아니다
     (Abrams & Christ 2003, A급). 무한 반복은 이점 없이 비용만 남는다.
   · 다가옴/확대(looming)가 축소보다 강하게 주의를 끈다
     (Franconeri & Simons 2003, A급) → 등장은 항상 작게→크게.
   · 무관한 장식 모션은 이해·기억을 해친다 (Rey 2012 메타분석, S급)
     → 연출은 핵심 메시지가 등장하는 순간에만. 한 화면에 2~3개까지.
   · 과제 몰입 구간(상품 고르기·결제·폼)에는 연출 금지 (Hamborg 2012, A급)
     → 상품 카드·CTA에는 zbc-still.
   · 자동 시작 + 5초 초과 모션은 정지 수단 필요 (WCAG 2.2.2 Level A)
     → 이 라이브러리의 반복 효과는 전부 스크롤 연동(사용자가 속도를 제어)
       또는 횟수 제한. 무한 반복은 zbc-float 하나뿐이고 사용 주의 표시.

   사용법
     <div class="zbc-up">        기본 등장
     <div class="zbc-up zbc-d2"> 시차 (d1~d6, 숫자가 클수록 늦게)
     <div class="zbc-zoom zbc-fast">  화면보다 큰 이미지
     <a class="zbc-cta zbc-still">    연출 제외
   ══════════════════════════════════════════════════════════════════════ */

/* ── A. 등장 (스크롤 진입 시 1회) ─────────────────────────────────── */
@keyframes zbc-in   {from{opacity:0}                                to{opacity:1}}
@keyframes zbc-up   {from{opacity:0; transform:translateY(16px)}    to{opacity:1; transform:none}}
@keyframes zbc-down {from{opacity:0; transform:translateY(-16px)}   to{opacity:1; transform:none}}
@keyframes zbc-right{from{opacity:0; transform:translateX(-24px)}   to{opacity:1; transform:none}}
@keyframes zbc-left {from{opacity:0; transform:translateX(24px)}    to{opacity:1; transform:none}}
@keyframes zbc-zoom {from{opacity:0; transform:scale(.94)}          to{opacity:1; transform:none}}
@keyframes zbc-pop  {from{opacity:0; transform:scale(.88)}          to{opacity:1; transform:none}}
@keyframes zbc-blur {from{opacity:0; filter:blur(8px)}              to{opacity:1; filter:blur(0)}}
@keyframes zbc-wipe {from{opacity:.001; clip-path:inset(30% 0 0 0)} to{opacity:1; clip-path:inset(0 0 0 0)}}
@keyframes zbc-flip {from{opacity:0; transform:perspective(800px) rotateX(-24deg)} to{opacity:1; transform:none}}
@keyframes zbc-tilt {from{opacity:0; transform:rotate(-3deg) translateY(14px)}     to{opacity:1; transform:none}}

/* ── B. 강조·리빌 ─────────────────────────────────────────────────── */
@keyframes zbc-draw      {from{background-size:0% 100%}   to{background-size:100% 100%}}
@keyframes zbc-underline {from{background-size:0% .09em}  to{background-size:100% .09em}}
@keyframes zbc-line      {from{transform:scaleX(0)}       to{transform:scaleX(1)}}
@keyframes zbc-type      {from{clip-path:inset(0 100% 0 0)} to{clip-path:inset(0 0 0 0)}}
@keyframes zbc-reverse   {0%{background-size:0% 100%}
                          59%{color:inherit}
                          60%{color:var(--zbc-text-on-brand)}
                          100%{background-size:100% 100%; color:var(--zbc-text-on-brand)}}
@keyframes zbc-count     {from{--zbc-n:0} to{--zbc-n:var(--zbc-to,100)}}

/* ── C. 스크롤 연동 지속 (스크롤하는 내내 반응) ───────────────────── */
@keyframes zbc-ken  {from{transform:scale(1)}      to{transform:scale(1.12)}}
/* 이동 전에 살짝 키워야 가장자리에 빈 공간이 생기지 않는다 (object-fit:cover 대응) */
@keyframes zbc-panx {from{transform:scale(1.1) translateX(-3%)} to{transform:scale(1.1) translateX(3%)}}
@keyframes zbc-pany {from{transform:scale(1.1) translateY(-3%)} to{transform:scale(1.1) translateY(3%)}}
@keyframes zbc-out  {from{opacity:1}               to{opacity:0}}
@keyframes zbc-nudge{0%,38%{transform:translateX(0)} 62%{transform:translateX(-4.5%)}
                     82%{transform:translateX(1%)}   100%{transform:translateX(0)}}

/* ── D. 반복 (전부 스크롤 연동 = 사용자가 속도 제어) ──────────────── */
@keyframes zbc-pulse{0%,100%{transform:scale(1)} 17%,50%,83%{transform:scale(1)}
                     8%,42%,75%{transform:scale(1.045)}}
@keyframes zbc-blink{0%,20%,40%,60%,80%,100%{opacity:1} 10%,30%,50%{opacity:.3}}
@keyframes zbc-shine{from{background-position:-140% 0} to{background-position:240% 0}}
@keyframes zbc-float{0%,100%{transform:translateY(0)} 50%{transform:translateY(-7px)}}

/* 숫자 카운트업 — 지원 브라우저에서만. 미지원 시 ::after 가 비어 그대로 표시 */
@property --zbc-n{syntax:"<integer>"; initial-value:0; inherits:false;}
@counter-style zbc-pad3{system:numeric; symbols:"0" "1" "2" "3" "4" "5" "6" "7" "8" "9"; pad:3 "0";}

@supports (animation-timeline: view()){
  @media (prefers-reduced-motion: no-preference){

    /* A. 등장 11종 — 기본값은 zbc-up */
    .zbc-in,.zbc-up,.zbc-down,.zbc-right,.zbc-left,
    .zbc-zoom,.zbc-pop,.zbc-blur,.zbc-wipe,.zbc-flip,.zbc-tilt{
      animation:zbc-up var(--zbc-dur-3) var(--zbc-ease-out) both;
      animation-timeline:view();
      animation-range:cover 22% cover 62%;   /* 화면 78% 지점에서 시작 → 50% 에서 완료 */
    }
    .zbc-in   {animation-name:zbc-in;}
    .zbc-down {animation-name:zbc-down;}
    .zbc-right{animation-name:zbc-right;}
    .zbc-left {animation-name:zbc-left;}
    .zbc-zoom {animation-name:zbc-zoom;}
    .zbc-blur {animation-name:zbc-blur;}
    .zbc-wipe {animation-name:zbc-wipe;}
    .zbc-flip {animation-name:zbc-flip;}
    .zbc-tilt {animation-name:zbc-tilt;}
    .zbc-pop  {animation-name:zbc-pop; animation-timing-function:var(--zbc-ease-spring);}

    /* B. 강조·리빌 */
    .zbc-mark{background-size:0% 100%;animation:zbc-draw linear both;
      animation-timeline:view();animation-range:cover 15% cover 55%;}
    .zbc-mark--2{animation-range:cover 20% cover 60%;}

    .zbc-underline{animation:zbc-underline linear both;
      animation-timeline:view();animation-range:cover 18% cover 58%;}

    .zbc-line{animation:zbc-line var(--zbc-dur-3) var(--zbc-ease-out) both;
      animation-timeline:view();animation-range:cover 15% cover 60%;}

    /* 타이핑 — --zbc-ch 에 글자 수를 넣으면 그만큼 끊어서 찍힌다 */
    .zbc-type{animation:zbc-type steps(var(--zbc-ch,24)) both;
      animation-timeline:view();animation-range:cover 18% cover 55%;}

    .zbc-reverse{background-size:0% 100%;animation:zbc-reverse linear both;
      animation-timeline:view();animation-range:cover 18% cover 52%;}

    /* 숫자 카운트업 — style="--zbc-to:374" 로 목표값 지정 */
    .zbc-count{animation:zbc-count linear both;
      animation-timeline:view();animation-range:cover 15% cover 60%;}

    /* C. 스크롤 연동 지속 */
    .zbc-ken {animation:zbc-ken  linear both;animation-timeline:view();animation-range:cover 0% cover 100%;}
    .zbc-panx{animation:zbc-panx linear both;animation-timeline:view();animation-range:cover 0% cover 100%;}
    .zbc-pany{animation:zbc-pany linear both;animation-timeline:view();animation-range:cover 0% cover 100%;}
    /* 들어올 때 페이드인, 나갈 때 페이드아웃 */
    /* 두 번째 애니메이션에 both 를 주면 backwards fill 이 entry 구간을 덮어써
       페이드인이 무효화된다. 반드시 forwards 로 둔다. */
    .zbc-inout{animation:zbc-in linear both, zbc-out linear forwards;
      animation-timeline:view(),view();
      animation-range:entry 5% entry 85%, exit 15% exit 95%;}
    .zbc-nudge{animation:zbc-nudge linear both;animation-timeline:--zbc-cw;
      animation-range:entry 0% cover 42%;}

    /* D. 반복 — 스크롤을 따라 3회 */
    .zbc-pulse{animation:zbc-pulse linear both;animation-timeline:view();animation-range:cover 20% cover 85%;}
    .zbc-blink{animation:zbc-blink linear both;animation-timeline:view();animation-range:cover 20% cover 85%;}
    /* ::after 오버레이 방식 — 대상이 background 단축을 쓰고 있어도 안전하다 */
    .zbc-shine::after{content:"";position:absolute;inset:0;pointer-events:none;border-radius:inherit;
      background-image:linear-gradient(100deg,transparent 35%,rgba(255,255,255,.55) 50%,transparent 65%);
      background-size:250% 100%;background-repeat:no-repeat;
      animation:zbc-shine linear both;animation-timeline:view();animation-range:cover 25% cover 75%;}

    /* 시차 — 순차 등장. 사진 여러 장을 차례로 띄울 때도 이걸 쓴다 */

    /* 속도 — fast 는 화면보다 큰 이미지 전용.
       큰 요소는 cover 구간이 길어져 기본값이면 화면 중앙에서도 반투명하게 남는다 */
    .zbc-fast{animation-range:cover 5% cover 38%;}
    .zbc-slow{animation-duration:var(--zbc-dur-4);}

    /* ⚠ 무한 반복 — 유일하게 시간 기반이다. 주변시야 모션은 읽기를 방해하고
       반복 노출 시 짜증으로 바뀐다(NN/g). 스크롤 유도 화살표처럼 화면당
       하나까지만, 결제·폼 구간에는 절대 쓰지 않는다. */
    .zbc-float{animation:zbc-float 2.6s var(--zbc-ease-inout) infinite;}

    /* 연출 제외 — CTA·상품 카드·폼처럼 고르고 누르는 구간 */
    .zbc-still{animation:none !important;opacity:1 !important;transform:none !important;
      filter:none !important;clip-path:none !important;background-size:auto !important;}
  }
}

/* 숫자 카운트업 출력부 — @supports 밖에 두어야 미지원 시에도 값이 보인다 */
.zbc-count{counter-reset:zbcn var(--zbc-n);}
.zbc-count::after{content:counter(zbcn);}
.zbc-count--pad3::after{content:counter(zbcn,zbc-pad3);}

/* 밑줄·구분선 기본 형태 (애니메이션 없이도 모양이 유지되도록) */
.zbc-underline{background-image:linear-gradient(var(--zbc-brand),var(--zbc-brand));
  background-repeat:no-repeat;background-position:0 100%;background-size:100% .09em;
  padding-bottom:.08em;}
.zbc-line{display:block;height:1px;background:var(--zbc-line);transform-origin:left center;}
.zbc-type{display:inline-block;}
.zbc-shine{position:relative;overflow:hidden;}
.zbc-reverse{display:inline;background-image:linear-gradient(var(--zbc-brand),var(--zbc-brand));
  background-repeat:no-repeat;background-size:100% 100%;color:var(--zbc-text-on-brand);
  padding:0 .12em;margin-left:-.12em;}

/* CTA 주목 효과 — 무한반복 대신 진입 시 1회만 */
@media (prefers-reduced-motion: no-preference){
  .zbc-cta{transition:transform var(--zbc-dur-1) var(--zbc-ease-out),
                      box-shadow var(--zbc-dur-1) var(--zbc-ease-out);}
  .zbc-cta:active{transform:scale(.985);}
}


/* ── F. 반복 강조 (시간 기반) ────────────────────────────────────────
   v1.9 변경
   · 속도를 사용자 검수값으로 확정 (깜빡임 1.7s / 카운트업 상승 3s / 별점 4s /
     타이핑 4s / 형광펜 4s / 사진 8s / 강조·그림자 1.6s / 광택 3.2s)
   · 숫자 카운트업을 iOS 대응 오도미터(숫자 띠를 transform 으로 굴리는 방식)로 교체.
     기존 counter() 방식은 WebKit(아이폰 크롬 포함)에서 숫자가 다시 그려지지 않는다.
   · 형광펜은 "1줄 → 2줄 순서로 그어지고 마지막에 둘이 동시에 사라지는" 구조로 변경.
   · 카운트업 상승과 깜빡임을 분리해 상승은 3초, 깜빡임은 1초씩 여유 있게.
   ------------------------------------------------------------------ */

/* 깜빡임 — 완전히 꺼졌다 켜진다 */
@keyframes zbc-flash{0%{opacity:1} 76%{opacity:0} 100%{opacity:1}}
@keyframes zbc-throb{0%,100%{transform:scale(1)} 50%{transform:scale(1.07)}}
@keyframes zbc-glow{0%,100%{box-shadow:var(--zbc-sh-2)}
                    50%{box-shadow:0 8px 8px rgba(0,0,0,.25), 0 0 0 7px rgba(13,86,17,.18)}}
@keyframes zbc-shineloop{0%{background-position:-160% 0} 55%,100%{background-position:260% 0}}

/* 숫자 오도미터 — 0~9 를 두 바퀴 굴려 목표 숫자에 멈춘다.
   transform 만 쓰므로 아이폰 사파리/크롬에서도 확실히 동작한다.
   앞 50%(3초) 동안 굴러 올라가고, 나머지 구간에서 3번 깜빡인다. */
/* 이동량을 띠 자체 높이의 % 로 준다. 숫자 20칸이므로 한 칸 = 5%.
   em 으로 주면 줄상자가 정수 픽셀로 반올림되면서 10칸 누적 시 몇 px 씩 어긋나
   숫자가 칸에 정확히 안 멈춘다. % 는 실제 렌더 높이 기준이라 오차가 없다. */
@keyframes zbc-od{
  0%  {transform:translateY(0)}
  50% {transform:translateY(calc((10 + var(--zbc-d,0)) * -5%))}
  100%{transform:translateY(calc((10 + var(--zbc-d,0)) * -5%))}
}
@keyframes zbc-odblink{
  0%,58%{opacity:1}
  65%{opacity:0} 72%{opacity:1}
  79%{opacity:0} 86%{opacity:1}
  93%{opacity:0} 100%{opacity:1}
}

/* 별점 — 한 칸씩 5칸까지 */
@keyframes zbc-stars{
  0%  {width:0; animation-timing-function:steps(5,end)}
  45% {width:100%}
  100%{width:100%}
}
/* 타이핑 — 한 글자씩 */
@keyframes zbc-type1{
  0%  {clip-path:inset(0 100% 0 0); animation-timing-function:steps(var(--zbc-ch,14),end)}
  50% {clip-path:inset(0 0 0 0)}
  100%{clip-path:inset(0 0 0 0)}
}
@keyframes zbc-type2{
  0%,45%{clip-path:inset(0 100% 0 0); animation-timing-function:steps(var(--zbc-ch,16),end)}
  85%   {clip-path:inset(0 0 0 0)}
  100%  {clip-path:inset(0 0 0 0)}
}
/* 형광펜 1줄 — 먼저 그어지고, 마지막에 한 번에 사라진다 */
@keyframes zbc-markloop{
  0%  {background-size:0% 100%}
  26% {background-size:100% 100%}
  88% {background-size:100% 100%; animation-timing-function:step-end}
  89% {background-size:0% 100%}
  100%{background-size:0% 100%}
}
/* 형광펜 2줄 — 1줄이 끝난 뒤 그어지고, 1줄과 동시에 사라진다 */
@keyframes zbc-markloop2{
  0%,26%{background-size:0% 100%}
  52%   {background-size:100% 100%}
  88%   {background-size:100% 100%; animation-timing-function:step-end}
  89%   {background-size:0% 100%}
  100%  {background-size:0% 100%}
}
/* 사진 */
@keyframes zbc-kenloop {0%,100%{transform:scale(1.02)} 50%{transform:scale(1.13)}}
@keyframes zbc-panloop {0%,100%{transform:scale(1.12) translateX(-2.6%)} 50%{transform:scale(1.12) translateX(2.6%)}}
@keyframes zbc-panyloop{0%,100%{transform:scale(1.12) translateY(-2.6%)} 50%{transform:scale(1.12) translateY(2.6%)}}
@keyframes zbc-bob{0%,100%{transform:translateY(0)} 50%{transform:translateY(-6px)}}

@media (prefers-reduced-motion: no-preference){
  .zbc-flash    {animation:zbc-flash 2s step-end infinite;}
  .zbc-throb    {animation:zbc-throb .8s ease-in-out infinite;}
  .zbc-glow     {animation:zbc-glow 2s ease-in-out infinite;}
  .zbc-od__s    {animation:zbc-od 4s cubic-bezier(.12,.9,.2,1) infinite;}
  .zbc-od       {animation:zbc-odblink 4s step-end infinite;}
  .zbc-stars__fg{animation:zbc-stars 2s linear infinite;}
  .zbc-type1    {animation:zbc-type1 3s linear infinite;}
  .zbc-type2    {animation:zbc-type2 3s linear infinite;}
  .zbc-markloop {animation:zbc-markloop 3s ease-in-out infinite !important;
                 animation-timeline:auto !important;}
  .zbc-markloop--2{animation-name:zbc-markloop2 !important; animation-delay:0s !important;}
  .zbc-kenloop  {animation:zbc-kenloop 5s ease-in-out infinite !important; animation-timeline:auto !important;}
  .zbc-panloop  {animation:zbc-panloop 5s ease-in-out infinite !important; animation-timeline:auto !important;}
  .zbc-panyloop {animation:zbc-panyloop 5s ease-in-out infinite !important; animation-timeline:auto !important;}
  .zbc-bob      {animation:zbc-bob 2.2s ease-in-out infinite;}
  .zbc-shineloop::after{content:"";position:absolute;inset:0;pointer-events:none;border-radius:inherit;
    background-image:linear-gradient(100deg,transparent 38%,rgba(255,255,255,.5) 50%,transparent 62%);
    background-size:260% 100%;background-repeat:no-repeat;
    animation:zbc-shineloop 2s linear infinite;}
  .zbc-flash.zbc-glow{animation:zbc-flash 2s step-end infinite,
                                zbc-glow  2s ease-in-out infinite;}

  /* 순차 등장 — 섹션 중간쯤 왔을 때 하나씩 (뱃지용) */
  .zbc-s1{animation-range:cover 26% cover 52%;}
  .zbc-s2{animation-range:cover 33% cover 59%;}
  .zbc-s3{animation-range:cover 40% cover 66%;}
  .zbc-s4{animation-range:cover 47% cover 73%;}
  .zbc-s5{animation-range:cover 54% cover 80%;}
  .zbc-s6{animation-range:cover 61% cover 87%;}

  .zbc-ph1,.zbc-ph2,.zbc-ph3{animation-delay:0s;}
}

/* ── 구조 규칙 ── */
.zbc-stars{position:relative;display:inline-block;white-space:nowrap;}
.zbc-stars__bg{color:var(--zbc-line-soft);}
.zbc-stars__fg{position:absolute;left:0;top:0;width:100%;overflow:hidden;
  color:var(--zbc-star);white-space:nowrap;}
.zbc-type1,.zbc-type2{display:inline-block;}
.zbc-mark--red{--zbc-marker:rgba(238,118,118,.58);}
.zbc-shineloop{position:relative;overflow:hidden;}
/* 오도미터 — 숫자 한 자리 */
/* 창 높이를 주변 텍스트의 줄 높이(1lh)와 똑같이 맞추고 줄상자 바닥에 붙여야
   콤마·"명"·"건" 과 기준선이 정확히 일치한다. lh 미지원 시 1.3em 폴백. */
.zbc-od{display:inline-block;height:1.3em;line-height:inherit;overflow:hidden;vertical-align:bottom;}
@supports (height:1lh){.zbc-od{height:1lh;}}
.zbc-od__s{display:block;line-height:inherit;}

/* 카운트업 출력부 (반복 버전) */
.zbc-tally{counter-reset:zbcn var(--zbc-n);}
.zbc-tally::after{content:counter(zbcn);}
.zbc-tally.zbc-count--pad3::after{content:counter(zbcn,zbc-pad3);}


/* ══════════════════════════════════════════════════════════════════════
   유틸리티 — 값을 미리 다 만들어 뒀다. CSS 를 고치지 말고 클래스만 바꿔 쓴다.
   ══════════════════════════════════════════════════════════════════════ */
@supports (animation-timeline: view()){
  @media (prefers-reduced-motion: no-preference){

    /* ── 등장 시점 · zbc-at5 ~ zbc-at100 (5% 단위) ──────────────────────
       숫자 = 요소가 화면 위에서 몇 % 지점에 왔을 때 나타나기 시작하는가.
       at100 = 화면 맨 아래(들어오자마자) / at50 = 화면 중앙 / at20 = 거의 위쪽
       기본값(클래스 없음) = at78 수준. 값이 클수록 일찍 나타난다. */
    .zbc-at5{animation-range:cover 95% cover 100%;}
    .zbc-at10{animation-range:cover 90% cover 100%;}
    .zbc-at15{animation-range:cover 85% cover 100%;}
    .zbc-at20{animation-range:cover 80% cover 100%;}
    .zbc-at25{animation-range:cover 75% cover 100%;}
    .zbc-at30{animation-range:cover 70% cover 100%;}
    .zbc-at35{animation-range:cover 65% cover 100%;}
    .zbc-at40{animation-range:cover 60% cover 100%;}
    .zbc-at45{animation-range:cover 55% cover 95%;}
    .zbc-at50{animation-range:cover 50% cover 90%;}
    .zbc-at55{animation-range:cover 45% cover 85%;}
    .zbc-at60{animation-range:cover 40% cover 80%;}
    .zbc-at65{animation-range:cover 35% cover 75%;}
    .zbc-at70{animation-range:cover 30% cover 70%;}
    .zbc-at75{animation-range:cover 25% cover 65%;}
    .zbc-at80{animation-range:cover 20% cover 60%;}
    .zbc-at85{animation-range:cover 15% cover 55%;}
    .zbc-at90{animation-range:cover 10% cover 50%;}
    .zbc-at95{animation-range:cover 5% cover 45%;}
    .zbc-at100{animation-range:cover 0% cover 40%;}

    /* ── 등장 속도 · zbc-sp02 ~ zbc-sp30 (초) ──────────────────────────
       sp02=0.2초(딱딱) / sp06=0.6초(기본) / sp15=1.5초(느긋) */
    .zbc-sp02{animation-duration:0.2s;}
    .zbc-sp03{animation-duration:0.3s;}
    .zbc-sp04{animation-duration:0.4s;}
    .zbc-sp05{animation-duration:0.5s;}
    .zbc-sp06{animation-duration:0.6s;}
    .zbc-sp08{animation-duration:0.8s;}
    .zbc-sp01{animation-duration:1s;}
    .zbc-sp12{animation-duration:1.2s;}
    .zbc-sp15{animation-duration:1.5s;}
    .zbc-sp02{animation-duration:2s;}
    .zbc-sp25{animation-duration:2.5s;}
    .zbc-sp03{animation-duration:3s;}

    /* ── 반복 주기 · zbc-lp10 ~ zbc-lp100 (초) ─────────────────────────
       깜빡임·카운트업·별점·타이핑·형광펜·사진 등 반복 효과의 한 사이클 길이.
       lp10=1초(빠름) / lp20=2초 / lp50=5초 / lp100=10초(느림) */
    .zbc-lp10{animation-duration:1s;}
    .zbc-lp15{animation-duration:1.5s;}
    .zbc-lp20{animation-duration:2s;}
    .zbc-lp25{animation-duration:2.5s;}
    .zbc-lp30{animation-duration:3s;}
    .zbc-lp35{animation-duration:3.5s;}
    .zbc-lp40{animation-duration:4s;}
    .zbc-lp45{animation-duration:4.5s;}
    .zbc-lp50{animation-duration:5s;}
    .zbc-lp55{animation-duration:5.5s;}
    .zbc-lp60{animation-duration:6s;}
    .zbc-lp65{animation-duration:6.5s;}
    .zbc-lp70{animation-duration:7s;}
    .zbc-lp75{animation-duration:7.5s;}
    .zbc-lp80{animation-duration:8s;}
    .zbc-lp85{animation-duration:8.5s;}
    .zbc-lp90{animation-duration:9s;}
    .zbc-lp95{animation-duration:9.5s;}
    .zbc-lp100{animation-duration:10s;}

    /* ── 순차 시차 · zbc-d1 ~ zbc-d12 ──────────────────────────────────
       같은 그룹을 하나씩 등장시킬 때. 숫자가 클수록 늦게. 3% 간격. */
    .zbc-d1{animation-range:cover 25% cover 65%;}
    .zbc-d2{animation-range:cover 28% cover 68%;}
    .zbc-d3{animation-range:cover 31% cover 71%;}
    .zbc-d4{animation-range:cover 34% cover 74%;}
    .zbc-d5{animation-range:cover 37% cover 77%;}
    .zbc-d6{animation-range:cover 40% cover 80%;}
    .zbc-d7{animation-range:cover 43% cover 83%;}
    .zbc-d8{animation-range:cover 46% cover 86%;}
    .zbc-d9{animation-range:cover 49% cover 89%;}
    .zbc-d10{animation-range:cover 52% cover 92%;}
    .zbc-d11{animation-range:cover 55% cover 95%;}
    .zbc-d12{animation-range:cover 58% cover 98%;}

    /* ── 넓은 시차 · zbc-s1 ~ zbc-s6 (뱃지처럼 느긋하게) ────────────── */
    .zbc-s1{animation-range:cover 26% cover 52%;}
    .zbc-s2{animation-range:cover 33% cover 59%;}
    .zbc-s3{animation-range:cover 40% cover 66%;}
    .zbc-s4{animation-range:cover 47% cover 73%;}
    .zbc-s5{animation-range:cover 54% cover 80%;}
    .zbc-s6{animation-range:cover 61% cover 87%;}
  }
}
/* 반복 효과(시간 기반)에도 주기 유틸이 먹도록 — @supports 밖에도 선언 */
@media (prefers-reduced-motion: no-preference){
  .zbc-lp10{animation-duration:1s;}
  .zbc-lp15{animation-duration:1.5s;}
  .zbc-lp20{animation-duration:2s;}
  .zbc-lp25{animation-duration:2.5s;}
  .zbc-lp30{animation-duration:3s;}
  .zbc-lp35{animation-duration:3.5s;}
  .zbc-lp40{animation-duration:4s;}
  .zbc-lp45{animation-duration:4.5s;}
  .zbc-lp50{animation-duration:5s;}
  .zbc-lp55{animation-duration:5.5s;}
  .zbc-lp60{animation-duration:6s;}
  .zbc-lp65{animation-duration:6.5s;}
  .zbc-lp70{animation-duration:7s;}
  .zbc-lp75{animation-duration:7.5s;}
  .zbc-lp80{animation-duration:8s;}
  .zbc-lp85{animation-duration:8.5s;}
  .zbc-lp90{animation-duration:9s;}
  .zbc-lp95{animation-duration:9.5s;}
  .zbc-lp100{animation-duration:10s;}
  .zbc-lp10 .zbc-od__s,.zbc-lp20 .zbc-od__s{animation-duration:inherit;}
}


/* ══════════════════════════════════════════════════════════════════════
   OK PACK v1  ·  originkit.dev 효과를 순수 CSS 로 이식한 확장 팩
   ----------------------------------------------------------------------
   왜 이식인가 : originkit 컴포넌트는 전부 React + WebGL/canvas 라서
   고도몰 게시판(<script> 차단 · <style> 이스케이프)에는 한 줄도 못 넣는다.
   그래서 "보이는 결과"만 CSS 로 다시 구현했다. 클래스만 붙이면 끝이다.

   원칙
   · 등장 계열(1회) = 스크롤 연동. 반복 계열 = 시간 기반(스크롤을 멈춰도 돈다)
   · 규칙 블록 {} 안에는 한글 주석을 절대 넣지 않는다 (EUC-KR 페이지에서
     주석 뒤 선언이 통째로 죽는다 · 2026-08-22 확인)
   · overflow 는 hidden 대신 clip. hidden 은 스크롤 컨테이너를 만들어
     자식의 view() 애니메이션을 전부 죽인다
   · 기존 유틸(zbc-at* / zbc-sp* / zbc-lp* / zbc-d* / zbc-s*)이 그대로 먹는다
   ══════════════════════════════════════════════════════════════════════ */

@property --zbc-ang{syntax:"<angle>"; initial-value:0deg; inherits:false;}

:root{
--zbc-g1:var(--zbc-green-900);
--zbc-g2:var(--zbc-green-500);
--zbc-g3:var(--zbc-amber-600);
--zbc-ok-spot:var(--zbc-green-500);
}


/* ══ G. 텍스트 연출 ═══════════════════════════════════════════════════
   Gradient Text / Text Colour Sweep / Spotlight Text / Outline Typeflow /
   Video Text / Glitch Text / Flicker Text / Block Text Reveal /
   Mask Text Reveal / Skew-in Text / Type Writer caret /
   Infinite Text Passage / Text Carousel / Shiny Pill
   ══════════════════════════════════════════════════════════════════════ */

@keyframes zbc-gradmove{from{background-position:0% 50%}   to{background-position:200% 50%}}
@keyframes zbc-spotmove{from{background-position:120% 0}   to{background-position:-20% 0}}
@keyframes zbc-imgpan  {0%,100%{background-position:0% 50%} 50%{background-position:100% 50%}}
@keyframes zbc-sweepx  {from{background-position:100% 0}   to{background-position:0% 0}}

/* 글자 안쪽을 배경으로 칠하는 계열. 미지원 브라우저에서 글자가 사라지지 않도록
   @supports 안에서만 text-fill-color 를 transparent 로 바꾼다. */
@supports ((-webkit-background-clip:text) or (background-clip:text)){
  .zbc-grad,.zbc-sweep,.zbc-spot,.zbc-imgtext,.zbc-outline{
    -webkit-background-clip:text; background-clip:text;
    -webkit-text-fill-color:transparent; color:transparent;
    background-repeat:no-repeat;
  }
  .zbc-grad{
    background-image:linear-gradient(90deg,var(--zbc-g1),var(--zbc-g2),var(--zbc-g3),var(--zbc-g1));
    background-size:200% 100%;
  }
  .zbc-spot{
    background-image:linear-gradient(100deg,
      var(--zbc-text) 0 40%, var(--zbc-ok-spot) 50%, var(--zbc-text) 60% 100%);
    background-size:280% 100%;
  }
  .zbc-sweep{
    background-image:linear-gradient(90deg,var(--zbc-brand) 0 50%,var(--zbc-line) 50% 100%);
    background-size:200% 100%; background-position:100% 0;
  }
  .zbc-imgtext{
    background-image:var(--zbc-img,linear-gradient(90deg,var(--zbc-g1),var(--zbc-g2)));
    background-size:cover; background-position:center;
    font-weight:var(--zbc-fw-b);
  }
  .zbc-outline{
    -webkit-text-stroke:.022em var(--zbc-brand);
    background-image:linear-gradient(var(--zbc-brand),var(--zbc-brand));
    background-size:0% 100%; background-position:0 0;
  }
}

/* 글리치 · data-txt 속성에 같은 글자를 넣어야 겹쳐 그려진다 */
@keyframes zbc-glitch1{
  0%,100%{clip-path:inset(88% 0 2% 0);  transform:translateX(0)}
  12%{clip-path:inset(12% 0 72% 0); transform:translateX(-.06em)}
  24%{clip-path:inset(56% 0 30% 0); transform:translateX(.05em)}
  36%{clip-path:inset(28% 0 58% 0); transform:translateX(-.03em)}
  48%{clip-path:inset(74% 0 14% 0); transform:translateX(.04em)}
  60%,99%{clip-path:inset(0 0 100% 0); transform:translateX(0)}
}
@keyframes zbc-glitch2{
  0%,100%{clip-path:inset(0 0 100% 0); transform:translateX(0)}
  8%{clip-path:inset(64% 0 22% 0);  transform:translateX(.06em)}
  20%{clip-path:inset(20% 0 66% 0); transform:translateX(-.05em)}
  32%{clip-path:inset(46% 0 40% 0); transform:translateX(.03em)}
  44%{clip-path:inset(8% 0 84% 0);  transform:translateX(-.04em)}
  56%,99%{clip-path:inset(0 0 100% 0); transform:translateX(0)}
}
.zbc-glitch{position:relative; display:inline-block;}
.zbc-glitch::before,.zbc-glitch::after{
  content:attr(data-txt); position:absolute; left:0; top:0; width:100%;
  pointer-events:none; white-space:pre;
}
.zbc-glitch::before{color:var(--zbc-urgent);}
.zbc-glitch::after {color:var(--zbc-green-500);}

/* 네온 점멸 */
@keyframes zbc-flicker{
  0%,18%,22%,25%,53%,57%,100%{opacity:1;   text-shadow:0 0 .12em rgba(255,255,255,.55)}
  20%,24%,55%{opacity:.28; text-shadow:none}
}
/* 블록 리빌 · 색 띠가 지나가면서 글자가 드러난다 */
@keyframes zbc-blockbar{
  0%  {transform:scaleX(0); transform-origin:left}
  46% {transform:scaleX(1); transform-origin:left}
  54% {transform:scaleX(1); transform-origin:right}
  100%{transform:scaleX(0); transform-origin:right}
}
@keyframes zbc-blocktxt{0%,49%{color:transparent} 50%,100%{color:var(--zbc-blockc,var(--zbc-text))}}
.zbc-block{position:relative; display:inline-block;}
.zbc-block::after{
  content:""; position:absolute; inset:-.06em -.12em;
  background:var(--zbc-brand); pointer-events:none;
}

/* 마스크 업 · 자식 한 겹이 필요하다 <span class="zbc-maskup"><span>문장</span></span> */
@keyframes zbc-maskup{from{transform:translateY(105%)} to{transform:translateY(0)}}
.zbc-maskup{display:inline-block; overflow:clip; vertical-align:bottom; padding-bottom:.06em;}
.zbc-maskup>*{display:inline-block;}

/* 스큐 인 */
@keyframes zbc-skew{from{opacity:0; transform:skewY(6deg) translateY(22px)} to{opacity:1; transform:none}}

/* 타이핑 커서 */
@keyframes zbc-caret{0%,49%{opacity:1} 50%,100%{opacity:0}}
.zbc-caret::after{
  content:""; display:inline-block; width:.06em; height:.95em; margin-left:.06em;
  background:currentColor; vertical-align:-.12em;
}

/* 무한 흐르는 띠 · 자식 .zbc-marquee__t 를 똑같이 2개 넣는다 */
@keyframes zbc-marq{from{transform:translateX(0)} to{transform:translateX(-100%)}}
.zbc-marquee{display:flex; width:100%; overflow:clip;}
.zbc-marquee__t{flex:0 0 auto; min-width:100%; white-space:nowrap; padding-right:1.4em;}
.zbc-marquee--r .zbc-marquee__t{animation-direction:reverse;}

/* 단어 교체 · 자식 마지막에 첫 단어를 한 번 더 넣는다 (2단어면 3개) */
@keyframes zbc-rot2{0%,38%{transform:translateY(0)}  50%,88%{transform:translateY(-33.3333%)} 100%{transform:translateY(-66.6667%)}}
@keyframes zbc-rot3{0%,25%{transform:translateY(0)}  33%,58%{transform:translateY(-25%)}      66%,91%{transform:translateY(-50%)} 100%{transform:translateY(-75%)}}
@keyframes zbc-rot4{0%,19%{transform:translateY(0)}  25%,44%{transform:translateY(-20%)}      50%,69%{transform:translateY(-40%)} 75%,94%{transform:translateY(-60%)} 100%{transform:translateY(-80%)}}
.zbc-rotate{display:inline-block; overflow:clip; vertical-align:bottom; height:1.3em;}
@supports (height:1lh){.zbc-rotate{height:1lh;}}
.zbc-rotate__i{display:block;}
.zbc-rotate__i>*{display:block; height:1.3em; line-height:1.3em; white-space:nowrap;}
@supports (height:1lh){.zbc-rotate__i>*{height:1lh; line-height:inherit;}}

/* 반짝이는 알약 뱃지 */
@keyframes zbc-shinyspin{to{--zbc-ang:360deg}}
.zbc-shiny{
  position:relative; display:inline-block; border-radius:var(--zbc-r-full);
  padding:.34em .95em; background:var(--zbc-surface); color:var(--zbc-brand);
  font-size:var(--zbc-fs-2); font-weight:var(--zbc-fw-b); letter-spacing:var(--zbc-ls-normal);
}
.zbc-shiny::before{
  content:""; position:absolute; inset:-2px; border-radius:inherit; padding:2px;
  background:conic-gradient(from var(--zbc-ang),
    var(--zbc-green-200) 0 55%, var(--zbc-green-500) 72%, var(--zbc-green-200) 88% 100%);
  -webkit-mask:linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  mask:linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite:xor; mask-composite:exclude;
  pointer-events:none;
}

@media (prefers-reduced-motion: no-preference){
  .zbc-grad   {animation:zbc-gradmove 6s linear infinite;}
  .zbc-spot   {animation:zbc-spotmove 3.4s linear infinite;}
  .zbc-imgtext{animation:zbc-imgpan 14s ease-in-out infinite;}
  .zbc-flicker{animation:zbc-flicker 4.5s linear infinite;}
  .zbc-glitch::before{animation:zbc-glitch1 3.6s steps(1) infinite;}
  .zbc-glitch::after {animation:zbc-glitch2 3.6s steps(1) infinite;}
  .zbc-caret::after  {animation:zbc-caret 1.1s steps(1) infinite;}
  .zbc-marquee__t    {animation:zbc-marq 22s linear infinite;}
  .zbc-rotate--2 .zbc-rotate__i{animation:zbc-rot2 5.2s var(--zbc-ease-out) infinite;}
  .zbc-rotate--3 .zbc-rotate__i{animation:zbc-rot3 7.8s var(--zbc-ease-out) infinite;}
  .zbc-rotate--4 .zbc-rotate__i{animation:zbc-rot4 10.4s var(--zbc-ease-out) infinite;}
  .zbc-shiny::before  {animation:zbc-shinyspin 4s linear infinite;}
}

@supports (animation-timeline: view()){
  @media (prefers-reduced-motion: no-preference){
    .zbc-sweep{animation:zbc-sweepx linear both;
      animation-timeline:view(); animation-range:cover 18% cover 58%;}
    .zbc-outline{animation:zbc-draw linear both;
      animation-timeline:view(); animation-range:cover 18% cover 58%;}
    .zbc-block::after{animation:zbc-blockbar 1s var(--zbc-ease-inout) both;
      animation-timeline:view(); animation-range:cover 20% cover 60%;}
    .zbc-block{animation:zbc-blocktxt 1s steps(1) both;
      animation-timeline:view(); animation-range:cover 20% cover 60%;}
    .zbc-maskup>*{animation:zbc-maskup var(--zbc-dur-3) var(--zbc-ease-out) both;
      animation-timeline:view(); animation-range:cover 22% cover 62%;}
    .zbc-skew{animation:zbc-skew var(--zbc-dur-3) var(--zbc-ease-out) both;
      animation-timeline:view(); animation-range:cover 22% cover 62%;}
  }
}


/* ══ H. 글자별 연출 ══════════════════════════════════════════════════
   Stagger Text Rise / Letter Drop / Domino Text Fall / Popcorn Text /
   3D Stagger Flip / Letter Swing / Motion Text Wave
   ----------------------------------------------------------------------
   마크업 : <span class="zbc-ltr zbc-ltr--drop"><span>초</span><span>신</span>...</span>
   글자를 span 으로 쪼개 넣는다. 공백은 <span>&#32;</span> 대신
   <span style="width:.3em"></span> 처럼 빈 칸을 쓴다.
   최대 24글자까지 시차가 걸린다. 그 이상은 마지막 시차가 반복된다.
   ══════════════════════════════════════════════════════════════════════ */

@keyframes zbc-lrise {from{opacity:0; transform:translateY(.7em)}                     to{opacity:1; transform:none}}
@keyframes zbc-ldrop {from{opacity:0; transform:translateY(-.8em) rotate(-8deg)}      to{opacity:1; transform:none}}
@keyframes zbc-lpop  {from{opacity:0; transform:scale(.3)}                            to{opacity:1; transform:none}}
@keyframes zbc-ldom  {from{opacity:0; transform:perspective(500px) rotateX(-92deg)}   to{opacity:1; transform:none}}
@keyframes zbc-lflip {from{opacity:0; transform:perspective(600px) rotateY(-88deg)}   to{opacity:1; transform:none}}
@keyframes zbc-lswing{0%,100%{transform:rotate(-7deg)} 50%{transform:rotate(7deg)}}
@keyframes zbc-lwave {0%,100%{transform:translateY(0)} 50%{transform:translateY(-.24em)}}

.zbc-ltr{display:inline-block;}
.zbc-ltr>*{display:inline-block; white-space:pre; transform-origin:50% 100%;}

@media (prefers-reduced-motion: no-preference){
  .zbc-ltr--swing>*{animation:zbc-lswing 1.8s var(--zbc-ease-inout) infinite;}
  .zbc-ltr--wave>* {animation:zbc-lwave  1.6s var(--zbc-ease-inout) infinite;}
  .zbc-ltr--loop>*:nth-child(1),.zbc-ltr--swing>*:nth-child(1),.zbc-ltr--wave>*:nth-child(1){animation-delay:0.00s;}
  .zbc-ltr--loop>*:nth-child(2),.zbc-ltr--swing>*:nth-child(2),.zbc-ltr--wave>*:nth-child(2){animation-delay:0.07s;}
  .zbc-ltr--loop>*:nth-child(3),.zbc-ltr--swing>*:nth-child(3),.zbc-ltr--wave>*:nth-child(3){animation-delay:0.14s;}
  .zbc-ltr--loop>*:nth-child(4),.zbc-ltr--swing>*:nth-child(4),.zbc-ltr--wave>*:nth-child(4){animation-delay:0.21s;}
  .zbc-ltr--loop>*:nth-child(5),.zbc-ltr--swing>*:nth-child(5),.zbc-ltr--wave>*:nth-child(5){animation-delay:0.28s;}
  .zbc-ltr--loop>*:nth-child(6),.zbc-ltr--swing>*:nth-child(6),.zbc-ltr--wave>*:nth-child(6){animation-delay:0.35s;}
  .zbc-ltr--loop>*:nth-child(7),.zbc-ltr--swing>*:nth-child(7),.zbc-ltr--wave>*:nth-child(7){animation-delay:0.42s;}
  .zbc-ltr--loop>*:nth-child(8),.zbc-ltr--swing>*:nth-child(8),.zbc-ltr--wave>*:nth-child(8){animation-delay:0.49s;}
  .zbc-ltr--loop>*:nth-child(9),.zbc-ltr--swing>*:nth-child(9),.zbc-ltr--wave>*:nth-child(9){animation-delay:0.56s;}
  .zbc-ltr--loop>*:nth-child(10),.zbc-ltr--swing>*:nth-child(10),.zbc-ltr--wave>*:nth-child(10){animation-delay:0.63s;}
  .zbc-ltr--loop>*:nth-child(11),.zbc-ltr--swing>*:nth-child(11),.zbc-ltr--wave>*:nth-child(11){animation-delay:0.70s;}
  .zbc-ltr--loop>*:nth-child(12),.zbc-ltr--swing>*:nth-child(12),.zbc-ltr--wave>*:nth-child(12){animation-delay:0.77s;}
  .zbc-ltr--loop>*:nth-child(13),.zbc-ltr--swing>*:nth-child(13),.zbc-ltr--wave>*:nth-child(13){animation-delay:0.84s;}
  .zbc-ltr--loop>*:nth-child(14),.zbc-ltr--swing>*:nth-child(14),.zbc-ltr--wave>*:nth-child(14){animation-delay:0.91s;}
  .zbc-ltr--loop>*:nth-child(15),.zbc-ltr--swing>*:nth-child(15),.zbc-ltr--wave>*:nth-child(15){animation-delay:0.98s;}
  .zbc-ltr--loop>*:nth-child(16),.zbc-ltr--swing>*:nth-child(16),.zbc-ltr--wave>*:nth-child(16){animation-delay:1.05s;}
  .zbc-ltr--loop>*:nth-child(17),.zbc-ltr--swing>*:nth-child(17),.zbc-ltr--wave>*:nth-child(17){animation-delay:1.12s;}
  .zbc-ltr--loop>*:nth-child(18),.zbc-ltr--swing>*:nth-child(18),.zbc-ltr--wave>*:nth-child(18){animation-delay:1.19s;}
  .zbc-ltr--loop>*:nth-child(19),.zbc-ltr--swing>*:nth-child(19),.zbc-ltr--wave>*:nth-child(19){animation-delay:1.26s;}
  .zbc-ltr--loop>*:nth-child(20),.zbc-ltr--swing>*:nth-child(20),.zbc-ltr--wave>*:nth-child(20){animation-delay:1.33s;}
  .zbc-ltr--loop>*:nth-child(21),.zbc-ltr--swing>*:nth-child(21),.zbc-ltr--wave>*:nth-child(21){animation-delay:1.40s;}
  .zbc-ltr--loop>*:nth-child(22),.zbc-ltr--swing>*:nth-child(22),.zbc-ltr--wave>*:nth-child(22){animation-delay:1.47s;}
  .zbc-ltr--loop>*:nth-child(23),.zbc-ltr--swing>*:nth-child(23),.zbc-ltr--wave>*:nth-child(23){animation-delay:1.54s;}
  .zbc-ltr--loop>*:nth-child(24),.zbc-ltr--swing>*:nth-child(24),.zbc-ltr--wave>*:nth-child(24){animation-delay:1.61s;}
}

@supports (animation-timeline: view()){
  @media (prefers-reduced-motion: no-preference){
    .zbc-ltr--rise>*,.zbc-ltr--drop>*,.zbc-ltr--pop>*,
    .zbc-ltr--domino>*,.zbc-ltr--flip>*{
      animation:zbc-lrise var(--zbc-dur-3) var(--zbc-ease-out) both;
      animation-timeline:view();
    }
    .zbc-ltr--drop>*   {animation-name:zbc-ldrop;}
    .zbc-ltr--pop>*    {animation-name:zbc-lpop; animation-timing-function:var(--zbc-ease-spring);}
    .zbc-ltr--domino>* {animation-name:zbc-ldom; transform-origin:50% 0;}
    .zbc-ltr--flip>*   {animation-name:zbc-lflip;}
    .zbc-ltr>*:nth-child(1){animation-range:cover 22.0% cover 62.0%;}
    .zbc-ltr>*:nth-child(2){animation-range:cover 23.4% cover 63.4%;}
    .zbc-ltr>*:nth-child(3){animation-range:cover 24.8% cover 64.8%;}
    .zbc-ltr>*:nth-child(4){animation-range:cover 26.2% cover 66.2%;}
    .zbc-ltr>*:nth-child(5){animation-range:cover 27.6% cover 67.6%;}
    .zbc-ltr>*:nth-child(6){animation-range:cover 29.0% cover 69.0%;}
    .zbc-ltr>*:nth-child(7){animation-range:cover 30.4% cover 70.4%;}
    .zbc-ltr>*:nth-child(8){animation-range:cover 31.8% cover 71.8%;}
    .zbc-ltr>*:nth-child(9){animation-range:cover 33.2% cover 73.2%;}
    .zbc-ltr>*:nth-child(10){animation-range:cover 34.6% cover 74.6%;}
    .zbc-ltr>*:nth-child(11){animation-range:cover 36.0% cover 76.0%;}
    .zbc-ltr>*:nth-child(12){animation-range:cover 37.4% cover 77.4%;}
    .zbc-ltr>*:nth-child(13){animation-range:cover 38.8% cover 78.8%;}
    .zbc-ltr>*:nth-child(14){animation-range:cover 40.2% cover 80.2%;}
    .zbc-ltr>*:nth-child(15){animation-range:cover 41.6% cover 81.6%;}
    .zbc-ltr>*:nth-child(16){animation-range:cover 43.0% cover 83.0%;}
    .zbc-ltr>*:nth-child(17){animation-range:cover 44.4% cover 84.4%;}
    .zbc-ltr>*:nth-child(18){animation-range:cover 45.8% cover 85.8%;}
    .zbc-ltr>*:nth-child(19){animation-range:cover 47.2% cover 87.2%;}
    .zbc-ltr>*:nth-child(20){animation-range:cover 48.6% cover 88.6%;}
    .zbc-ltr>*:nth-child(21){animation-range:cover 50.0% cover 90.0%;}
    .zbc-ltr>*:nth-child(22){animation-range:cover 51.4% cover 91.4%;}
    .zbc-ltr>*:nth-child(23){animation-range:cover 52.8% cover 92.8%;}
    .zbc-ltr>*:nth-child(24){animation-range:cover 54.2% cover 94.2%;}
  }
}


/* ══ I. 버튼 ═════════════════════════════════════════════════════════
   Neon Glow / Moving Gradient / Orbit Border / Prism Ring / Slide Fill /
   Radial Reveal / Arrow Reveal / Tactile / Keycap / Dotted Offset /
   Light Glass / Scan Grid / Starfield / Label Slide
   ----------------------------------------------------------------------
   모바일에는 hover 가 없다. hover 계열(fill/radial/labelslide)은 PC 전용이고
   모바일에서는 :active(누른 순간)로도 같은 상태가 된다.
   ══════════════════════════════════════════════════════════════════════ */

@keyframes zbc-neonpulse{
  0%,100%{box-shadow:0 0 .3em rgba(52,194,111,.55), 0 0 1.1em rgba(52,194,111,.30)}
  50%    {box-shadow:0 0 .55em rgba(52,194,111,.85), 0 0 2.2em rgba(52,194,111,.55)}
}
@keyframes zbc-gradbtn{0%,100%{background-position:0% 50%} 50%{background-position:100% 50%}}
@keyframes zbc-spin   {to{--zbc-ang:360deg}}
@keyframes zbc-arrowx {0%,100%{transform:translateX(0)} 50%{transform:translateX(.28em)}}
@keyframes zbc-scanline{from{transform:translateY(-120%)} to{transform:translateY(320%)}}
@keyframes zbc-starmove{from{background-position:0 0, 0 0, 0 0} to{background-position:-140px 60px, 90px -70px, -60px -110px}}

.zbc-neon{position:relative;}
.zbc-gradbtn{
  background-image:linear-gradient(100deg,var(--zbc-g1),var(--zbc-g2),var(--zbc-g3),var(--zbc-g2),var(--zbc-g1));
  background-size:320% 100%; color:var(--zbc-cta-fg); border:0;
}
.zbc-orbit,.zbc-prism{position:relative;}
.zbc-orbit::before,.zbc-prism::before{
  content:""; position:absolute; inset:-2px; border-radius:inherit; padding:2px;
  -webkit-mask:linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  mask:linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite:xor; mask-composite:exclude;
  pointer-events:none;
}
.zbc-orbit::before{
  background:conic-gradient(from var(--zbc-ang),
    transparent 0 62%, var(--zbc-green-500) 78%, transparent 92% 100%);
}
.zbc-prism::before{
  background:conic-gradient(from var(--zbc-ang),
    #ff5f6d,#ffc371,#47e5bc,#4facfe,#a06cff,#ff5f6d);
  filter:saturate(.85);
}

.zbc-fill{position:relative; overflow:clip; isolation:isolate;}
.zbc-fill::before{
  content:""; position:absolute; inset:0; z-index:-1; border-radius:inherit;
  background:var(--zbc-green-600); transform:scaleX(0); transform-origin:left;
  transition:transform var(--zbc-dur-2) var(--zbc-ease-out);
}
.zbc-fill:hover::before,.zbc-fill:active::before{transform:scaleX(1);}

.zbc-radial{position:relative; overflow:clip; isolation:isolate;}
.zbc-radial::before{
  content:""; position:absolute; left:50%; top:50%; z-index:-1;
  width:240%; aspect-ratio:1; border-radius:50%; translate:-50% -50%;
  background:var(--zbc-green-600); transform:scale(0);
  transition:transform var(--zbc-dur-2) var(--zbc-ease-out);
}
.zbc-radial:hover::before,.zbc-radial:active::before{transform:scale(1);}

.zbc-arrow::after{content:"\2192"; display:inline-block; margin-left:.35em;}

.zbc-tactile{
  box-shadow:0 5px 0 var(--zbc-green-600), 0 7px 12px rgba(0,0,0,.22);
  transition:transform var(--zbc-dur-1) var(--zbc-ease-out), box-shadow var(--zbc-dur-1) var(--zbc-ease-out);
}
.zbc-tactile:active{transform:translateY(4px); box-shadow:0 1px 0 var(--zbc-green-600), 0 2px 5px rgba(0,0,0,.22);}

.zbc-keycap{
  border-radius:var(--zbc-r-3);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.42), inset 0 -3px 0 rgba(0,0,0,.20),
             0 6px 0 var(--zbc-green-600), 0 9px 16px rgba(0,0,0,.26);
  transition:transform var(--zbc-dur-1) var(--zbc-ease-out), box-shadow var(--zbc-dur-1) var(--zbc-ease-out);
}
.zbc-keycap:active{
  transform:translateY(5px);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.42), inset 0 -2px 0 rgba(0,0,0,.20),
             0 1px 0 var(--zbc-green-600), 0 2px 6px rgba(0,0,0,.26);
}

.zbc-dotted{
  position:relative;
  box-shadow:.32em .32em 0 0 var(--zbc-brand);
  outline:2px dashed var(--zbc-brand); outline-offset:3px;
  transition:box-shadow var(--zbc-dur-2) var(--zbc-ease-out), transform var(--zbc-dur-2) var(--zbc-ease-out);
}
.zbc-dotted:hover,.zbc-dotted:active{transform:translate(.16em,.16em); box-shadow:.16em .16em 0 0 var(--zbc-brand);}

.zbc-glass{
  background:rgba(255,255,255,.16);
  border:1px solid rgba(255,255,255,.42);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.55), 0 8px 24px rgba(0,0,0,.18);
}
@supports ((-webkit-backdrop-filter:blur(1px)) or (backdrop-filter:blur(1px))){
  .zbc-glass{-webkit-backdrop-filter:blur(10px) saturate(1.4); backdrop-filter:blur(10px) saturate(1.4);}
}

.zbc-scan{position:relative; overflow:clip;}
.zbc-scan::before{
  content:""; position:absolute; inset:0; pointer-events:none; border-radius:inherit;
  background-image:linear-gradient(rgba(255,255,255,.16) 1px,transparent 1px),
                   linear-gradient(90deg,rgba(255,255,255,.16) 1px,transparent 1px);
  background-size:14px 14px;
}
.zbc-scan::after{
  content:""; position:absolute; left:0; right:0; top:0; height:38%;
  pointer-events:none; border-radius:inherit;
  background:linear-gradient(rgba(255,255,255,0),rgba(255,255,255,.30),rgba(255,255,255,0));
}

.zbc-starfield{position:relative; overflow:clip;}
.zbc-starfield::before{
  content:""; position:absolute; inset:-30%; pointer-events:none;
  background-image:radial-gradient(1.6px 1.6px at 20px 30px,rgba(255,255,255,.95),transparent),
                   radial-gradient(1.2px 1.2px at 70px 90px,rgba(255,255,255,.75),transparent),
                   radial-gradient(1.8px 1.8px at 130px 40px,rgba(255,255,255,.85),transparent);
  background-size:160px 160px, 200px 200px, 240px 240px;
}

.zbc-labelslide{display:inline-block; overflow:clip; position:relative;}
.zbc-labelslide>*{display:block; transition:transform var(--zbc-dur-2) var(--zbc-ease-out);}
.zbc-labelslide>*:last-child{position:absolute; left:0; right:0; top:100%;}
.zbc-labelslide:hover>*,.zbc-labelslide:active>*{transform:translateY(-100%);}

@media (prefers-reduced-motion: no-preference){
  .zbc-neon    {animation:zbc-neonpulse 2.2s ease-in-out infinite;}
  .zbc-gradbtn {animation:zbc-gradbtn 5s ease-in-out infinite;}
  .zbc-orbit::before{animation:zbc-spin 3s linear infinite;}
  .zbc-prism::before{animation:zbc-spin 4.5s linear infinite;}
  .zbc-arrow::after {animation:zbc-arrowx 1.3s var(--zbc-ease-inout) infinite;}
  .zbc-scan::after  {animation:zbc-scanline 2.6s linear infinite;}
  .zbc-starfield::before{animation:zbc-starmove 26s linear infinite;}
}


/* ══ J. 테두리 ═══════════════════════════════════════════════════════
   Neon Border / Glow Border / Pulsating Border / Electric(회전 conic) Border
   ══════════════════════════════════════════════════════════════════════ */

@keyframes zbc-bpulse{
  0%  {opacity:.55; transform:scale(1)}
  70% {opacity:0;   transform:scale(1.16)}
  100%{opacity:0;   transform:scale(1.16)}
}
@keyframes zbc-bglow{
  0%,100%{box-shadow:0 0 0 0 rgba(13,86,17,.30), 0 0 .8em rgba(13,86,17,.18)}
  50%    {box-shadow:0 0 0 .42em rgba(13,86,17,.10), 0 0 1.6em rgba(13,86,17,.34)}
}
.zbc-bneon{
  border:2px solid var(--zbc-green-500); border-radius:inherit;
  box-shadow:0 0 .35em rgba(52,194,111,.7), inset 0 0 .35em rgba(52,194,111,.45);
}
.zbc-bpulse{position:relative;}
.zbc-bpulse::after{
  content:""; position:absolute; inset:0; pointer-events:none; border-radius:inherit;
  border:2px solid var(--zbc-brand);
}
.zbc-borbit{position:relative;}
.zbc-borbit::before{
  content:""; position:absolute; inset:-2.5px; border-radius:inherit; padding:2.5px;
  background:conic-gradient(from var(--zbc-ang),
    transparent 0 55%, var(--zbc-green-500) 68%, #eafff2 76%, var(--zbc-green-500) 84%, transparent 96% 100%);
  -webkit-mask:linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  mask:linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite:xor; mask-composite:exclude;
  pointer-events:none;
}
@media (prefers-reduced-motion: no-preference){
  .zbc-bneon {animation:zbc-neonpulse 2.4s ease-in-out infinite;}
  .zbc-bglow {animation:zbc-bglow 2.4s ease-in-out infinite;}
  .zbc-bpulse::after{animation:zbc-bpulse 2s var(--zbc-ease-out) infinite;}
  .zbc-borbit::before{animation:zbc-spin 3.4s linear infinite;}
}


/* ══ K. 배경 연출 ════════════════════════════════════════════════════
   Light Bloom / Silk Waves / Snow Fall / Stardust / Bubble Stream /
   Dot Matrix / Blinking Squares / Pulse Lines / Sonar Bloom / Hex Comb /
   Moire Lattice / Halftone Pulse / Light Curtain / Grain
   ----------------------------------------------------------------------
   마크업 :
     <div class="zbc-bgwrap">
       <div class="zbc-bg zbc-bg--snow"></div>
       ... 실제 내용 ...
     </div>
   배경 레이어는 클릭을 먹지 않고 내용은 자동으로 위에 올라온다.
   ══════════════════════════════════════════════════════════════════════ */

.zbc-bgwrap{position:relative; isolation:isolate;}
.zbc-bgwrap>*{position:relative; z-index:1;}
.zbc-bg{
  position:absolute; inset:0; z-index:0; pointer-events:none; overflow:clip;
  border-radius:inherit;
}

@keyframes zbc-bloom{
  0%,100%{background-position:12% 20%, 82% 72%, 48% 96%}
  33%    {background-position:70% 34%, 24% 18%, 88% 60%}
  66%    {background-position:34% 84%, 62% 46%, 14% 24%}
}
@keyframes zbc-silk{0%,100%{transform:translate3d(-6%,0,0) rotate(0deg)} 50%{transform:translate3d(6%,0,0) rotate(4deg)}}
@keyframes zbc-fall{from{background-position:0 -240px, 0 -240px, 0 -240px} to{background-position:0 240px, 60px 240px, -40px 240px}}
@keyframes zbc-twinkle{0%,100%{opacity:.35} 50%{opacity:1}}
@keyframes zbc-bubrise{from{background-position:0 100%, 90px 100%, 180px 100%} to{background-position:0 -100%, 90px -100%, 180px -100%}}
@keyframes zbc-drift{from{background-position:0 0} to{background-position:44px 44px}}
@keyframes zbc-gridblink{0%,100%{opacity:.30} 50%{opacity:.85}}
@keyframes zbc-stripes{from{background-position:0 0} to{background-position:120px 0}}
@keyframes zbc-sonar{0%{transform:scale(.2); opacity:.55} 80%,100%{transform:scale(1.7); opacity:0}}
@keyframes zbc-moire{from{transform:rotate(0deg) scale(1.5)} to{transform:rotate(360deg) scale(1.5)}}
@keyframes zbc-halftone{0%,100%{background-size:26px 26px} 50%{background-size:34px 34px}}
@keyframes zbc-curtain{0%,100%{transform:translateX(-14%) skewX(-14deg)} 50%{transform:translateX(14%) skewX(-14deg)}}
@keyframes zbc-grain{
  0%{transform:translate(0,0)}    20%{transform:translate(-4%,3%)}
  40%{transform:translate(3%,-3%)} 60%{transform:translate(-3%,-4%)}
  80%{transform:translate(4%,2%)} 100%{transform:translate(0,0)}
}

.zbc-bg--bloom{
  background-image:radial-gradient(closest-side circle, rgba(52,194,111,.34), transparent),
                   radial-gradient(closest-side circle, rgba(219,140,16,.22), transparent),
                   radial-gradient(closest-side circle, rgba(13,86,17,.26), transparent);
  background-size:62% 62%, 52% 52%, 72% 72%;
  background-repeat:no-repeat;
  filter:blur(14px);
}
.zbc-bg--silk{
  background-image:linear-gradient(115deg, rgba(13,86,17,.00) 18%, rgba(52,194,111,.28) 38%,
                   rgba(13,86,17,.00) 55%, rgba(219,140,16,.20) 72%, rgba(13,86,17,.00) 88%);
  background-size:180% 180%;
  filter:blur(6px);
}
.zbc-bg--snow{
  background-image:radial-gradient(2.4px 2.4px at 24px 12px, rgba(255,255,255,.95), transparent),
                   radial-gradient(1.8px 1.8px at 96px 60px, rgba(255,255,255,.78), transparent),
                   radial-gradient(3px 3px at 160px 110px, rgba(255,255,255,.62), transparent);
  background-size:200px 240px, 260px 240px, 320px 240px;
}
.zbc-bg--stars{
  background-image:radial-gradient(1.6px 1.6px at 30px 40px, rgba(255,255,255,.95), transparent),
                   radial-gradient(1.2px 1.2px at 110px 90px, rgba(255,255,255,.8), transparent),
                   radial-gradient(2px 2px at 180px 30px, rgba(255,255,255,.7), transparent);
  background-size:220px 220px, 180px 180px, 260px 260px;
}
.zbc-bg--bubble{
  background-image:radial-gradient(circle 9px at 30px 50%, rgba(255,255,255,.34), transparent),
                   radial-gradient(circle 6px at 20px 50%, rgba(255,255,255,.26), transparent),
                   radial-gradient(circle 12px at 45px 50%, rgba(255,255,255,.20), transparent);
  background-size:120px 200px, 90px 260px, 170px 320px;
}
.zbc-bg--dots{
  background-image:radial-gradient(rgba(13,86,17,.22) 1.6px, transparent 1.6px);
  background-size:22px 22px;
}
.zbc-bg--grid{
  background-image:linear-gradient(rgba(13,86,17,.16) 1px, transparent 1px),
                   linear-gradient(90deg, rgba(13,86,17,.16) 1px, transparent 1px);
  background-size:36px 36px;
}
.zbc-bg--lines{
  background-image:repeating-linear-gradient(115deg,
    rgba(52,194,111,.18) 0 2px, transparent 2px 26px);
  background-size:120px 100%;
}
.zbc-bg--sonar{display:grid; place-items:center;}
.zbc-bg--sonar::before,.zbc-bg--sonar::after{
  content:""; grid-area:1/1; width:min(78%,520px); aspect-ratio:1; border-radius:50%;
  border:2px solid var(--zbc-green-500);
}
.zbc-bg--hex{
  background-image:
    repeating-linear-gradient(60deg, rgba(13,86,17,.13) 0 1px, transparent 1px 34px),
    repeating-linear-gradient(-60deg, rgba(13,86,17,.13) 0 1px, transparent 1px 34px),
    repeating-linear-gradient(0deg, rgba(13,86,17,.13) 0 1px, transparent 1px 34px);
}
.zbc-bg--moire{overflow:clip;}
.zbc-bg--moire::before,.zbc-bg--moire::after{
  content:""; position:absolute; inset:-40%;
  background-image:repeating-linear-gradient(0deg, rgba(13,86,17,.20) 0 1px, transparent 1px 7px);
}
.zbc-bg--moire::after{background-image:repeating-linear-gradient(90deg, rgba(52,194,111,.20) 0 1px, transparent 1px 7px);}
.zbc-bg--halftone{
  background-image:radial-gradient(rgba(13,86,17,.30) 34%, transparent 36%);
  background-size:26px 26px;
}
.zbc-bg--rays{overflow:clip;}
.zbc-bg--rays::before{
  content:""; position:absolute; inset:-30% -20%;
  background-image:repeating-linear-gradient(90deg,
    rgba(255,255,255,.00) 0 40px, rgba(255,255,255,.22) 40px 66px, rgba(255,255,255,.00) 66px 120px);
  filter:blur(7px);
}
.zbc-bg--grain{
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='140' height='140'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3'/></filter><rect width='140' height='140' filter='url(%23n)' opacity='.42'/></svg>");
  background-size:140px 140px;
  opacity:.30; mix-blend-mode:multiply;
}

@media (prefers-reduced-motion: no-preference){
  .zbc-bg--bloom {animation:zbc-bloom 18s ease-in-out infinite;}
  .zbc-bg--silk  {animation:zbc-silk 14s ease-in-out infinite;}
  .zbc-bg--snow  {animation:zbc-fall 11s linear infinite;}
  .zbc-bg--stars {animation:zbc-twinkle 3.2s ease-in-out infinite;}
  .zbc-bg--bubble{animation:zbc-bubrise 13s linear infinite;}
  .zbc-bg--dots  {animation:zbc-drift 9s linear infinite;}
  .zbc-bg--grid  {animation:zbc-gridblink 3.4s ease-in-out infinite;}
  .zbc-bg--lines {animation:zbc-stripes 6s linear infinite;}
  .zbc-bg--sonar::before,.zbc-bg--sonar::after{animation:zbc-sonar 2.6s var(--zbc-ease-out) infinite;}
  .zbc-bg--sonar::after{animation-delay:1.3s;}
  .zbc-bg--moire::before{animation:zbc-moire 44s linear infinite;}
  .zbc-bg--moire::after {animation:zbc-moire 60s linear reverse infinite;}
  .zbc-bg--halftone{animation:zbc-halftone 4.2s ease-in-out infinite;}
  .zbc-bg--hex{animation:zbc-drift 22s linear infinite;}
  .zbc-bg--rays::before{animation:zbc-curtain 9s ease-in-out infinite;}
  .zbc-bg--grain{animation:zbc-grain 1.1s steps(1) infinite;}
}


/* ══ L. 이미지·카드 ══════════════════════════════════════════════════
   Image Spotlight / Frost Glass Image / Iris Reveal / Image Fold /
   Image Flipper / Ripple Image Card / Shine(Holo) Card
   ══════════════════════════════════════════════════════════════════════ */

@keyframes zbc-spotbg{
  0%,100%{background-position:22% 30%}
  50%    {background-position:78% 70%}
}
@keyframes zbc-iris{from{clip-path:circle(0% at 50% 50%)} to{clip-path:circle(78% at 50% 50%)}}
@keyframes zbc-fold{from{opacity:0; transform:perspective(1200px) rotateX(-62deg)} to{opacity:1; transform:none}}
@keyframes zbc-cardflip{0%,44%{transform:rotateY(0)} 56%,94%{transform:rotateY(180deg)} 100%{transform:rotateY(360deg)}}
@keyframes zbc-rippleout{0%{transform:scale(.35); opacity:.6} 78%,100%{transform:scale(1.9); opacity:0}}
@keyframes zbc-holo{0%{background-position:-60% 0} 60%,100%{background-position:160% 0}}

.zbc-imgspot{position:relative; overflow:clip;}
.zbc-imgspot::after{
  content:""; position:absolute; inset:0; pointer-events:none; border-radius:inherit;
  background-image:radial-gradient(circle closest-side, rgba(0,0,0,0) 30%, rgba(0,0,0,.52) 100%);
  background-size:220% 220%; background-repeat:no-repeat;
}
.zbc-frost{position:relative; overflow:clip;}
.zbc-frost::after{
  content:""; position:absolute; left:0; right:0; bottom:0; height:38%;
  pointer-events:none; background:rgba(255,255,255,.28);
  border-top:1px solid rgba(255,255,255,.5);
}
@supports ((-webkit-backdrop-filter:blur(1px)) or (backdrop-filter:blur(1px))){
  .zbc-frost::after{-webkit-backdrop-filter:blur(10px); backdrop-filter:blur(10px); background:rgba(255,255,255,.18);}
}
.zbc-fold{transform-origin:50% 0;}

.zbc-flipcard{perspective:1000px; display:block;}
.zbc-flipcard__i{position:relative; transform-style:preserve-3d; display:block;}
.zbc-flipcard__f,.zbc-flipcard__b{
  -webkit-backface-visibility:hidden; backface-visibility:hidden; display:block;
}
.zbc-flipcard__b{position:absolute; inset:0; transform:rotateY(180deg);}

.zbc-ripple{position:relative; isolation:isolate;}
.zbc-ripple::before,.zbc-ripple::after{
  content:""; position:absolute; left:50%; top:50%; z-index:-1;
  width:70%; aspect-ratio:1; translate:-50% -50%; border-radius:50%;
  border:2px solid var(--zbc-green-500); pointer-events:none;
}

.zbc-holo{position:relative; overflow:clip;}
.zbc-holo::after{
  content:""; position:absolute; inset:0; pointer-events:none; border-radius:inherit;
  background-image:linear-gradient(105deg, transparent 38%,
    rgba(255,90,120,.34) 45%, rgba(90,200,255,.34) 52%, rgba(150,255,180,.34) 58%, transparent 66%);
  background-size:260% 100%; background-repeat:no-repeat;
  mix-blend-mode:screen;
}

@media (prefers-reduced-motion: no-preference){
  .zbc-imgspot::after{animation:zbc-spotbg 8s ease-in-out infinite;}
  .zbc-flipcard__i  {animation:zbc-cardflip 9s var(--zbc-ease-inout) infinite;}
  .zbc-ripple::before,.zbc-ripple::after{animation:zbc-rippleout 2.8s var(--zbc-ease-out) infinite;}
  .zbc-ripple::after{animation-delay:1.4s;}
  .zbc-holo::after  {animation:zbc-holo 4.2s linear infinite;}
}
@supports (animation-timeline: view()){
  @media (prefers-reduced-motion: no-preference){
    .zbc-iris{animation:zbc-iris var(--zbc-dur-4) var(--zbc-ease-out) both;
      animation-timeline:view(); animation-range:cover 20% cover 62%;}
    .zbc-fold{animation:zbc-fold var(--zbc-dur-4) var(--zbc-ease-out) both;
      animation-timeline:view(); animation-range:cover 20% cover 62%;}
  }
}


/* ══ M. 기타 ═════════════════════════════════════════════════════════
   Glitter Wrap / Star Burst / Floating Icons / 스와이프 캐러셀(무JS)
   ══════════════════════════════════════════════════════════════════════ */

@keyframes zbc-glitterA{0%,100%{opacity:.15; transform:scale(.7)} 50%{opacity:1; transform:scale(1)}}
@keyframes zbc-glitterB{0%,100%{opacity:1; transform:scale(1)}   50%{opacity:.15; transform:scale(.7)}}
@keyframes zbc-burst{from{transform:scale(.4) rotate(0deg); opacity:.85} to{transform:scale(1.6) rotate(35deg); opacity:0}}

.zbc-glitter{position:relative; overflow:clip;}
.zbc-glitter::before,.zbc-glitter::after{
  content:""; position:absolute; inset:0; pointer-events:none; border-radius:inherit;
  background-image:radial-gradient(2.6px 2.6px at 18px 22px, #fff, transparent),
                   radial-gradient(2px 2px at 78px 58px, #fff, transparent),
                   radial-gradient(3px 3px at 138px 26px, #fff, transparent);
  background-size:170px 130px;
}
.zbc-glitter::after{background-position:60px 44px; background-size:150px 110px;}

.zbc-burst{position:relative; isolation:isolate;}
.zbc-burst::before{
  content:""; position:absolute; left:50%; top:50%; z-index:-1;
  width:180%; aspect-ratio:1; translate:-50% -50%; pointer-events:none;
  background:conic-gradient(from 0deg,
    var(--zbc-highlight) 0 3deg, transparent 3deg 30deg);
}

.zbc-snap{
  display:flex; gap:clamp(8px,2.2vw,16px);
  overflow-x:auto; overflow-y:clip;
  scroll-snap-type:x mandatory; -webkit-overflow-scrolling:touch;
  scrollbar-width:none;
}
.zbc-snap::-webkit-scrollbar{display:none;}
.zbc-snap__i{flex:0 0 var(--zbc-snapw,78%); scroll-snap-align:center;}

.zbc-floaty>*{will-change:transform;}

@media (prefers-reduced-motion: no-preference){
  .zbc-glitter::before{animation:zbc-glitterA 2.4s ease-in-out infinite;}
  .zbc-glitter::after {animation:zbc-glitterB 2.4s ease-in-out infinite;}
  .zbc-floaty>*{animation:zbc-float 2.8s var(--zbc-ease-inout) infinite;}
  .zbc-floaty>*:nth-child(2){animation-delay:.35s;}
  .zbc-floaty>*:nth-child(3){animation-delay:.7s;}
  .zbc-floaty>*:nth-child(4){animation-delay:1.05s;}
  .zbc-floaty>*:nth-child(5){animation-delay:1.4s;}
  .zbc-floaty>*:nth-child(6){animation-delay:1.75s;}
}
@supports (animation-timeline: view()){
  @media (prefers-reduced-motion: no-preference){
    .zbc-burst::before{animation:zbc-burst 1.1s var(--zbc-ease-out) both;
      animation-timeline:view(); animation-range:cover 26% cover 58%;}
  }
}


/* 기존 유틸 오타 보정 · sp02/sp03 이 각각 두 번 선언돼 뒤 값(2s/3s)이 이겼다.
   sp20 / sp30 을 따로 만들어 의도대로 쓸 수 있게 한다. */
@media (prefers-reduced-motion: no-preference){
  .zbc-sp20{animation-duration:2s;}
  .zbc-sp30{animation-duration:3s;}
}
