/* =====================================================================
   components.css — C안 「만들 블록 팝」 부품 모음

   이 파일이 하는 일
   - 여러 화면에서 같이 쓰는 부품(버튼, 선택지, 진행 표시, 카드, 칩, 스티커,
     난이도 별, 결과 카드 틀, 정보 줄, 안내 문구, 아이콘)의 모양을 정한다.
   - 색·크기 값은 직접 쓰지 않고 tokens.css 의 이름(var(--...))만 쓴다.
   - 부품마다 위에 "쓰는 법(HTML 예시)"을 적어 두었다.
     견본은 design/components.html 에서 눈으로 볼 수 있다.

   C안 규칙 세 가지 (design/디자인_방향_3안.md 4장)
   1. 누를 수 있는 것은 모두 "블록": 먹색 테두리 + 흐림 없는 그림자. 누르면 4px 내려간다.
   2. 기울이는 것은 스티커 라벨과 캐릭터만. 질문·선택지·본문은 반듯하게.
   3. 한 화면 = 먹색 + 옐로 + (네온 블루 또는 태그 색 하나). 색이 시끄러워지지 않게.

   아이폰 사파리 주의
   - 사파리는 화면 어딘가에 touchstart 듣는 코드가 없으면 :active(누른 모양)를 안 보여 준다.
     app.js 에 다음 한 줄을 두면 된다:
     document.addEventListener("touchstart", function () {}, { passive: true });
   ===================================================================== */


/* =====================================================================
   0. 태그 이름 → 태그 색 연결
   쓰는 법: <li class="tag-chip" data-tag="빛">#빛</li>
   - data-tag 에 태그 글자(빛·꾸미기·기술·디자인·추억·실용)를 그대로 넣으면
     --tag-color(진한 색), --tag-soft(옅은 색)가 정해진다.
   - 왜: JS가 색 값을 몰라도 되고, 태그→색 짝이 이곳 한 군데에만 있게 하려고.
   - 질문 화면에서는 쓰지 않는다 (D-38).
   ===================================================================== */
[data-tag="빛"]     { --tag-color: var(--tag-light);  --tag-soft: var(--tag-light-soft); }
[data-tag="꾸미기"] { --tag-color: var(--tag-deco);   --tag-soft: var(--tag-deco-soft); }
[data-tag="기술"]   { --tag-color: var(--tag-tech);   --tag-soft: var(--tag-tech-soft); }
[data-tag="디자인"] { --tag-color: var(--tag-design); --tag-soft: var(--tag-design-soft); }
[data-tag="추억"]   { --tag-color: var(--tag-memory); --tag-soft: var(--tag-memory-soft); }
[data-tag="실용"]   { --tag-color: var(--tag-useful); --tag-soft: var(--tag-useful-soft); }


/* =====================================================================
   1. 아이콘
   쓰는 법: <span class="icon icon--arrow" aria-hidden="true"></span>
   - 아이콘 모양을 "구멍 뚫린 틀(mask)"로 쓰고, 그 틀에 글자색(currentColor)을 칠한다.
     그래서 아이콘 색은 항상 둘러싼 글자색을 따라가고, 색 값을 따로 쓰지 않는다.
   - 아래 그림 주소 안의 currentColor 는 틀 모양만 정하는 값이라 화면 색과 무관하다.
   - 그림은 C안 시안(design/drafts/c)의 아이콘을 그대로 옮겼다.
   ===================================================================== */
:root {
  --icon-check: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M5 12.5l4.5 4.5L19 7.5' fill='none' stroke='currentColor' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  --icon-back: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M19 12H6M11 6l-6 6 6 6' fill='none' stroke='currentColor' stroke-width='2.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  --icon-arrow: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h13M13 6l6 6-6 6' fill='none' stroke='currentColor' stroke-width='2.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  --icon-lock: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='currentColor' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='5' y='10.5' width='14' height='10' rx='2.5'/%3E%3Cpath d='M8.5 10.5V8a3.5 3.5 0 0 1 7 0v2.5'/%3E%3C/g%3E%3C/svg%3E");
  --icon-clock: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='currentColor' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='8.5'/%3E%3Cpath d='M12 7.5V12l3 2'/%3E%3C/g%3E%3C/svg%3E");
  --icon-download: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='currentColor' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 4v11M7 10.5l5 5 5-5M5 20h14'/%3E%3C/g%3E%3C/svg%3E");
  --icon-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M9 5l7 7-7 7' fill='none' stroke='currentColor' stroke-width='2.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  --icon-home: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='currentColor' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 11l8-6.5 8 6.5'/%3E%3Cpath d='M6.5 9.5V19.5h11V9.5'/%3E%3Cpath d='M10 19.5v-5h4v5'/%3E%3C/g%3E%3C/svg%3E");
  --icon-chat: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='currentColor' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.5 6.5a2 2 0 0 1 2-2h11a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H11l-4.5 3.5V16.5h0a2 2 0 0 1-2-2z'/%3E%3Cpath d='M8.5 9.5h7M8.5 12.5h4.5'/%3E%3C/g%3E%3C/svg%3E");
  --icon-redo: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='currentColor' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M19 12a7 7 0 1 1-2.05-4.95'/%3E%3Cpath d='M19 4.5v4h-4'/%3E%3C/g%3E%3C/svg%3E");
  --icon-tap: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='currentColor' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9.5 13V5.5a1.75 1.75 0 0 1 3.5 0V11l4.2.9a2 2 0 0 1 1.55 2.3l-.85 4.3a2.5 2.5 0 0 1-2.45 2H11a2.5 2.5 0 0 1-2-1l-3.3-4.4a1.6 1.6 0 0 1 2.4-2.1z'/%3E%3C/g%3E%3C/svg%3E");
  /* 점 3개: 분석 중 화면의 "지금 하는 중" 표시 (기준 화면 SCR-03) */
  --icon-dots: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='currentColor'%3E%3Ccircle cx='5.5' cy='12' r='2.6'/%3E%3Ccircle cx='12' cy='12' r='2.6'/%3E%3Ccircle cx='18.5' cy='12' r='2.6'/%3E%3C/g%3E%3C/svg%3E");
  /* 난이도 별: 바깥 테두리용(굵은 선 포함)과 안쪽 면용 두 장 */
  --icon-star-outline: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-1 -1 26 26'%3E%3Cpath d='M12 2.8l2.85 5.8 6.4.93-4.63 4.5 1.1 6.37L12 17.4l-5.72 3l1.1-6.37-4.63-4.5 6.4-.93z' stroke='currentColor' stroke-width='4.4' stroke-linejoin='round'/%3E%3C/svg%3E");
  --icon-star-fill: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-1 -1 26 26'%3E%3Cpath d='M12 2.8l2.85 5.8 6.4.93-4.63 4.5 1.1 6.37L12 17.4l-5.72 3l1.1-6.37-4.63-4.5 6.4-.93z'/%3E%3C/svg%3E");
}

.icon {
  display: inline-block;
  flex: none;
  width: var(--icon-size);
  height: var(--icon-size);
  background-color: currentColor;
  -webkit-mask: var(--icon) center / contain no-repeat;
  mask: var(--icon) center / contain no-repeat;
}
.icon--check    { --icon: var(--icon-check); }
.icon--back     { --icon: var(--icon-back); }
.icon--arrow    { --icon: var(--icon-arrow); }
.icon--lock     { --icon: var(--icon-lock); }
.icon--clock    { --icon: var(--icon-clock); }
.icon--download { --icon: var(--icon-download); }
.icon--chevron  { --icon: var(--icon-chevron); }
.icon--home     { --icon: var(--icon-home); }
.icon--chat     { --icon: var(--icon-chat); }
.icon--redo     { --icon: var(--icon-redo); }
.icon--tap      { --icon: var(--icon-tap); }


/* =====================================================================
   2. 글자 부품
   쓰는 법:
     <h1 class="text-title">나는 어떤 메이커?</h1>        제목·유형 이름 (팝 글꼴 34px)
     <h2 class="text-question">친구에게 선물을…</h2>      질문 (22px / 800)
     <p class="text-body">질문 10개로…</p>                본문 (16px / 500)
     <p class="text-small">보조 설명</p>                  보조 (14px / 600, 진회색)
   - 질문·선택지 글자에 \n 이 있으면 그 자리에서 줄을 바꾼다 (white-space: pre-line).
   ===================================================================== */
.text-title {
  font-family: var(--font-pop);
  font-weight: 400;              /* Bagel Fat One 은 굵기가 한 가지뿐 */
  font-size: var(--text-title);
  line-height: var(--leading-tight);
  letter-spacing: -0.01em;
}

.text-question {
  font-size: var(--text-question);
  font-weight: var(--weight-heavy);
  line-height: var(--leading-snug);
  white-space: pre-line;
  text-wrap: balance;  /* 줄 길이를 고르게 나눠 "…할 / 일은?"처럼 끝에 한 낱말만 넘어가지 않게 (지원 안 하는 브라우저는 무시) */
}

.text-body {
  font-size: var(--text-body);
  font-weight: var(--weight-regular);
  line-height: var(--leading-body);
}

.text-small {
  font-size: var(--text-small);
  font-weight: var(--weight-medium);
  line-height: var(--leading-snug);
  color: var(--color-ink-sub);
}


/* =====================================================================
   3. 버튼 (주 버튼 · 보조 버튼)
   쓰는 법:
     <button class="btn btn--primary" type="button">테스트 시작<span class="icon icon--arrow" aria-hidden="true"></span></button>
     <a class="btn btn--secondary" href="…" target="_blank" rel="noopener">이 키트 알아보기</a>
     두 개를 나란히: <div class="btn-row"> 버튼 2개 </div>
   - 높이 56px(최소 48px 규칙보다 여유), 화면 폭 가득.
   - 누르면(:active) 4px 내려가고 그림자가 사라져 "딸깍" 들어간 느낌.
   - 주 버튼 위 글자는 먹색만 (옐로 위 흰 글자는 대비 부족).
   ===================================================================== */
.btn {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
  width: 100%;
  min-height: var(--btn-height);
  padding: var(--space-2) var(--space-4);
  margin-bottom: var(--press-depth);   /* 그림자 자리만큼 아래를 비워 둔다 (다음 요소와 겹치지 않게) */
  border: var(--border);
  border-radius: var(--radius-md);
  background-color: var(--color-surface);
  color: var(--color-ink);
  box-shadow: var(--shadow-block);
  font-family: var(--font-body);
  font-size: var(--text-choice);
  font-weight: var(--weight-heavy);
  line-height: 1.25;
  text-align: center;
  text-decoration: none;
  touch-action: manipulation;          /* 두 번 눌러 확대하는 기능 때문에 생기는 0.3초 지연 없애기 */
  user-select: none;
  -webkit-user-select: none;
  transition:
    transform var(--duration-press) var(--ease-out),
    box-shadow var(--duration-press) var(--ease-out),
    background-color var(--duration-press) var(--ease-out);
}

/* 누른 모양. .is-pressed 는 견본 페이지에서 누른 모양을 멈춰 보여 줄 때 쓴다 */
.btn:active,
.btn.is-pressed {
  transform: translateY(var(--press-depth));
  box-shadow: var(--shadow-none);
}

.btn--primary {
  background-color: var(--color-primary);
}
.btn--primary:active,
.btn--primary.is-pressed {
  background-color: var(--color-primary-press);
}

.btn--secondary {
  background-color: var(--color-surface);
}

/* 누를 수 없는 상태 (예: 보내기 전에 아무것도 안 골랐을 때). 이미 눌린 블록처럼 납작하게 */
.btn:disabled,
.btn[aria-disabled="true"] {
  cursor: not-allowed;
  transform: translateY(var(--press-depth));
  box-shadow: var(--shadow-none);
  background-color: var(--color-bg);
  color: var(--color-ink-sub);
  border-color: var(--color-ink-sub);
}

/* 버튼 두 개를 나란히. 좁아서 안 들어가면 저절로 위아래로 쌓인다 */
.btn-row {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: var(--space-3);
}
.btn-row .btn {
  padding-left: var(--space-2);    /* 반 칸 버튼은 좁으니 옆 여백을 줄여 375px에서 글자가 한 줄에 들어가게 */
  padding-right: var(--space-2);
  font-size: var(--text-body);
  gap: 6px;
}
.btn-row .btn .icon {
  width: 18px;
  height: 18px;
}


/* =====================================================================
   4. 선택지 버튼 (질문 화면)
   쓰는 법:
     <div class="choice-list">
       <button class="choice" type="button" aria-pressed="false">
         <span class="choice__badge" aria-hidden="true">A</span>
         <span class="choice__text">방을 내 스타일로 새롭게 꾸민다</span>
       </button>
       … (선택지 수만큼)
     </div>
   - 상태 세 가지
     · 기본: 흰 바탕 + 먹색 테두리 + 블록 그림자, 왼쪽 노란 동그라미 배지(A·B·C)
     · 누름(:active): 4px 내려가고 그림자 사라짐 (0.12초)
     · 선택됨(aria-pressed="true"): D-38 규칙 — 흰 바탕 그대로 + 굵은 먹색 테두리(4px)
       + 배지가 네온 블루로 바뀌고 흰 체크. 태그 색은 쓰지 않는다
       (선택지에 태그 색이 보이면 점수 구조가 드러나 재미가 줄어듦).
   - "선택됨"을 색 하나로만 알리지 않고 테두리 굵기·체크 모양·눌린 위치로도 알린다
     (작업 규칙 13장 5번, 색을 구분하기 어려운 사람도 알 수 있게).
   - 다음 질문으로 넘어가는 동안 연속 클릭을 막으려고 disabled 를 붙여도 모양은 그대로 둔다.
   ===================================================================== */
.choice-list {
  display: grid;
  gap: var(--space-3);
  padding-bottom: var(--press-depth);  /* 마지막 선택지의 그림자 자리 */
}

.choice {
  display: flex;
  align-items: center;
  gap: 14px;
  width: 100%;
  min-height: var(--choice-min-height);
  padding: var(--space-3) var(--space-4);
  border: var(--border);
  border-radius: var(--radius-md);
  background-color: var(--color-surface);
  color: var(--color-ink);
  box-shadow: var(--shadow-block);
  font-size: var(--text-choice);
  font-weight: var(--weight-bold);
  line-height: 1.4;
  text-align: left;
  touch-action: manipulation;
  user-select: none;
  -webkit-user-select: none;
  transition:
    transform var(--duration-press) var(--ease-out),
    box-shadow var(--duration-press) var(--ease-out);
}

.choice:active,
.choice.is-pressed {
  transform: translateY(var(--press-depth));
  box-shadow: var(--shadow-none);
}

/* 선택됨: 테두리 두께를 직접 바꾸면 글자가 1~2px 밀리므로, 안쪽 그림자로 1.5px 선을 덧그려 4px로 보이게 */
.choice[aria-pressed="true"] {
  background-color: var(--color-surface);
  transform: translateY(var(--press-depth));
  box-shadow: inset 0 0 0 var(--border-extra-selected) var(--color-ink);
}

.choice:disabled {
  cursor: default;
}

/* 왼쪽 동그라미 배지 (A·B·C) */
.choice__badge {
  position: relative;
  display: grid;
  place-items: center;
  flex: none;
  width: 32px;
  height: 32px;
  border: var(--border-thin);
  border-radius: var(--radius-pill);
  background-color: var(--color-primary);
  font-size: var(--text-body);
  font-weight: var(--weight-heavy);
  line-height: 1;
}

/* 선택되면 배지 글자를 숨기고 흰 체크를 그린다 (체크는 CSS가 그리므로 HTML에 따로 안 넣어도 됨) */
.choice[aria-pressed="true"] .choice__badge {
  background-color: var(--color-accent);
  color: transparent;
}
.choice[aria-pressed="true"] .choice__badge::after {
  content: "";
  position: absolute;
  inset: 5px;
  background-color: var(--color-white);
  -webkit-mask: var(--icon-check) center / contain no-repeat;
  mask: var(--icon-check) center / contain no-repeat;
  /* 누른 순간 체크가 작게 → 제 크기로 "톡" 나타난다 (선택 누름 피드백, F-13).
     다음 질문으로 넘어가기 전 0.25초 안에 끝나도록 짧게 (누름과 같은 0.12초) */
  animation: check-pop var(--duration-press) var(--ease-pop) both;
}
@keyframes check-pop {
  from { opacity: 0; transform: scale(0.4); }
  to   { opacity: 1; transform: none; }
}

.choice__text {
  flex: 1;
  min-width: 0;
  white-space: pre-line;   /* questions.json 의 \n 줄바꿈을 살린다 */
  text-wrap: balance;      /* 두 줄일 때 줄 길이를 고르게 (끝에 "때" 한 글자만 넘어가지 않게) */
}


/* =====================================================================
   5. 이전 버튼 + 진행 표시 (질문 화면 맨 위 줄)
   쓰는 법:
     <div class="topbar">
       <button class="back-btn" type="button" aria-label="이전 질문"></button>
       <div class="progress">
         <div class="progress__bar" role="progressbar" aria-label="진행"
              aria-valuemin="0" aria-valuemax="10" aria-valuenow="3">
           <span class="progress__fill" style="width: 30%"></span>
         </div>
         <span class="progress__count">3 / 10</span>
       </div>
     </div>
   - 숫자 10·3·30% 는 예시다. 질문 수는 questions.json 에서 세어 JS가 넣는다 (작업 규칙 3-2).
   - 이전 버튼은 48×48px(누르기 쉬운 최소 크기). 화살표는 CSS가 그린다.
   - 이전 버튼을 숨겨야 할 때 .is-invisible 을 붙이면 자리는 남아서 진행 바 길이가 그대로다.
   ===================================================================== */
.topbar {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  min-height: var(--tap-min);
}

.back-btn {
  display: grid;
  place-items: center;
  flex: none;
  width: var(--tap-min);
  height: var(--tap-min);
  border: var(--border-thin);
  border-radius: var(--radius-pill);
  background-color: var(--color-surface);
  color: var(--color-ink);
  touch-action: manipulation;
  transition: transform var(--duration-press) var(--ease-out);
}
.back-btn::before {
  content: "";
  width: 22px;
  height: 22px;
  background-color: currentColor;
  -webkit-mask: var(--icon-back) center / contain no-repeat;
  mask: var(--icon-back) center / contain no-repeat;
}
.back-btn:active,
.back-btn.is-pressed {
  transform: scale(0.94);
}

.progress {
  flex: 1;
  display: flex;
  align-items: center;
  gap: var(--space-3);
  min-width: 0;
}

.progress__bar {
  position: relative;
  flex: 1;
  height: var(--progress-height);
  border: var(--border-thin);
  border-radius: var(--radius-pill);
  background-color: var(--color-surface);
  overflow: hidden;
}

/* 조립 단계 눈금: 질문 수만큼 칸을 나누는 먹색 세로선 (질문 10개면 칸 10개).
   왜: 조립 설명서의 "단계 1·2·3…"처럼 몇 칸 남았는지 한눈에 보이게 (03 조사 Top 10 1번, LEGO·IKEA 설명서).
   칸 수는 app.js 가 질문 수로 --progress-steps 에 넣는다 (숫자를 고정하지 않음, 작업 규칙 13장 1번).
   그리는 법: "먹색 1px · 빈칸 · 먹색 1px" 무늬를 한 칸 너비(100% ÷ 질문 수)마다 되풀이한다 → 칸 경계마다 2px 선.
   색이 서서히 바뀌는 그라데이션이 아니라, 선을 긋는 데만 쓰는 무늬다 (D-32 "그라데이션 금지"와 다름) */
.progress__bar::after {
  --step: calc(100% / var(--progress-steps, 1));
  content: "";
  position: absolute;
  inset: 0;
  background-image: repeating-linear-gradient(
    to right,
    var(--color-ink) 0 1px,
    transparent 1px calc(var(--step) - 1px),
    var(--color-ink) calc(var(--step) - 1px) var(--step)
  );
  pointer-events: none;
}

.progress__fill {
  display: block;
  width: 0;
  height: 100%;
  border-radius: var(--radius-pill);
  background-color: var(--color-accent);
  transition: width var(--duration-screen) var(--ease-out);  /* 다음 질문에서 부드럽게 차오름 */
  /* 질문 화면이 처음 나올 때(시작 → 1번, 새로고침)도 빈 막대에서 지금 칸까지 차오른다.
     backwards: 움직임이 끝나면 손을 떼서, 그다음부터는 위 transition 이 늘어나는 모습을 맡는다 */
  animation: progress-grow var(--duration-screen) var(--ease-out) backwards;
}
@keyframes progress-grow {
  from { width: 0; }
}

.progress__count {
  flex: none;
  font-size: var(--text-body);
  font-weight: var(--weight-heavy);
  line-height: 1;
  font-variant-numeric: tabular-nums;   /* 숫자 폭을 같게 해서 3/10 → 10/10 일 때 흔들리지 않게 */
  white-space: nowrap;
  /* 두 자리 숫자("10 / 10")가 들어갈 폭을 처음부터 잡아 둔다 (ch = 숫자 "0" 한 글자 폭, 글꼴이 바뀌어도 같이 바뀜).
     왜: 마지막 질문에서 "9 / 10" → "10 / 10"으로 한 글자 늘면 진행 바가 다 차오르는 순간 약 11px 짧아져 출렁였다.
     "10 / 10"은 5.25ch 쯤이라 조금 넉넉하게 5.6ch. 질문 수는 숫자로 고정하지 않으므로 px 대신 ch 를 쓴다 */
  min-width: 5.6ch;
  text-align: right;
}


/* =====================================================================
   6. 카드 · 노란 점무늬 면
   쓰는 법:
     <section class="card"> … </section>                 흰 카드 (큰 블록 그림자)
     <div class="pop-panel"> … </div>                    노란 점무늬 면 (분석 중 화면 쟁반 등)
     <div class="dots"> … </div>                         아무 바탕 위에 먹색 점 무늬만 더하기
   - 큰 카드는 그림자가 오른쪽 아래(6px)로 나가므로 오른쪽에 6px 자리를 비워 둔다.
   ===================================================================== */
.card {
  position: relative;
  margin-right: 6px;
  padding: var(--space-5) var(--space-4);
  border: var(--border);
  border-radius: var(--radius-lg);
  background-color: var(--color-surface);
  box-shadow: var(--shadow-block-lg);
}

.pop-panel {
  position: relative;
  margin-right: 6px;
  padding: var(--space-6) var(--space-5);
  border: var(--border);
  border-radius: var(--radius-lg);
  background-color: var(--color-primary);
  background-image: var(--pattern-dots);
  background-size: var(--pattern-dots-size) var(--pattern-dots-size);
  box-shadow: var(--shadow-block-lg);
}

.dots {
  background-image: var(--pattern-dots);
  background-size: var(--pattern-dots-size) var(--pattern-dots-size);
}


/* =====================================================================
   7. 태그 칩 (결과 화면 전용)
   쓰는 법:
     <ul class="tag-chip-list" aria-label="태그">
       <li class="tag-chip" data-tag="빛">#빛</li>
       <li class="tag-chip" data-tag="꾸미기">#꾸미기</li>
     </ul>
   - 바탕은 그 태그의 옅은 색, 왼쪽 동그라미는 진한 색, 글자는 언제나 먹색 (대비 14:1 이상).
   - 태그 이름 글자가 함께 있으므로 색만으로 구분하지 않는다.
   - 단, 결과 카드의 1순위 키트 상자 안 칩은 흰 칩(색 점 없음)으로 바꿔 그린다 (아래 11번 .kit-box .tag-chip).
     왜: C안 규칙 3 "한 화면 = 먹색 + 옐로 + 태그 색 하나". 태그마다 색을 칠하면 결과 화면에
     둘째 태그 색이 더해져 시끄러워진다 (기준 화면도 흰 칩). 통계 화면은 태그 칩·태그 색을 쓰지 않는다 (D-43 ①).
   ===================================================================== */
.tag-chip-list {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}

.tag-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-height: 30px;
  padding: 0 12px 0 7px;
  border: var(--border-thin);
  border-radius: var(--radius-pill);
  background-color: var(--tag-soft, var(--color-surface));
  color: var(--color-ink);
  font-size: var(--text-small);
  font-weight: var(--weight-bold);
  line-height: 1;
  white-space: nowrap;
}
.tag-chip::before {
  content: "";
  flex: none;
  width: 14px;
  height: 14px;
  border: var(--border-thin);
  border-radius: var(--radius-pill);
  background-color: var(--tag-color, var(--color-surface));
}


/* =====================================================================
   8. 배지 (반듯한 알약 표시) · 스티커 라벨 (기울어진 팝 글꼴 라벨)
   배지 쓰는 법:
     <span class="badge">만들차 메이커 테스트</span>                   흰 배지 (시작 화면 위)
     <span class="badge badge--lg"><span class="icon icon--clock" aria-hidden="true"></span>질문 10개 · 약 3분</span>
     <span class="badge badge--ink">2순위</span>                       먹색 배지
   스티커 쓰는 법:
     <span class="sticker sticker--primary sticker--lg">Q3</span>       질문 번호
     <span class="sticker sticker--primary sticker--right">절반 왔어요!</span>
     <span class="sticker">이 중에 나는 누구?</span>
   - --primary 는 "주 색 바탕"(지금은 만들 옐로). 색 이름 대신 역할 이름을 써서
     공식 브랜드 색으로 바뀌어도 클래스 이름은 그대로 쓸 수 있다.
   - 스티커는 C안 규칙 2에 따라 -3도(또는 3도) 기울인다. 본문·선택지는 기울이지 않는다.
   - 카드 테두리 위에 걸쳐 붙이려면 .sticker--pinned (부모에 position: relative 필요,
     .result-card 와 .pin-area 는 이미 되어 있다).
   ===================================================================== */
.badge {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-height: 30px;
  padding: 4px 12px;
  border: var(--border-thin);
  border-radius: var(--radius-pill);
  background-color: var(--color-surface);
  color: var(--color-ink);
  font-size: var(--text-small);
  font-weight: var(--weight-bold);
  line-height: 1.2;
  white-space: nowrap;
}
.badge .icon {
  width: 18px;
  height: 18px;
}

.badge--primary {
  background-color: var(--color-primary);
}

.badge--ink {
  border-color: var(--color-ink);
  background-color: var(--color-ink);
  color: var(--color-white);
}

.badge--lg {
  min-height: 40px;
  padding: 0 16px 0 12px;
  gap: var(--space-2);
  font-size: var(--text-body);
  font-weight: var(--weight-heavy);
}
.badge--lg .icon {
  width: var(--icon-size);
  height: var(--icon-size);
}

.sticker {
  display: inline-block;
  align-self: flex-start;          /* 세로로 쌓는 상자 안에서도 글자 폭만큼만 */
  padding: 8px 14px 7px;
  border: var(--border);
  border-radius: var(--radius-pill);
  background-color: var(--color-surface);
  color: var(--color-ink);
  font-family: var(--font-pop);
  font-weight: 400;
  font-size: var(--text-body);
  line-height: 1;
  white-space: nowrap;
  transform: rotate(-3deg);
}

.sticker--primary {
  background-color: var(--color-primary);
}

.sticker--right {
  transform: rotate(3deg);
}

.sticker--lg {
  padding: 9px 15px 8px;
  font-size: var(--text-choice);
}

.sticker--pinned {
  position: absolute;
  top: -17px;
  left: 14px;
  z-index: 2;
  transform: rotate(-4deg);
}

/* 스티커를 위 테두리에 붙일 상자 (예: "이런 키트도 잘 맞아요" + 2순위 카드) */
.pin-area {
  position: relative;
  margin-top: var(--space-8);
}
.pin-area > .kit-row {
  padding-top: 22px;    /* 붙인 스티커와 글자가 겹치지 않게 */
}


/* =====================================================================
   9. 난이도 별 (1~3개)
   쓰는 법 (난이도 2):
     <span class="difficulty" role="img" aria-label="난이도 3단계 중 2단계">
       <span class="star is-on"></span><span class="star is-on"></span><span class="star"></span>
     </span>
   - 채운 별 = 옐로 면, 빈 별 = 흰 면. 둘 다 먹색 테두리.
   - 색만으로 알리지 않도록 aria-label(화면 읽기)과, 필요하면 옆에 글자를 함께 둔다:
     <span class="difficulty__text">보통</span>
   ===================================================================== */
.difficulty {
  display: inline-flex;
  align-items: center;
  gap: 2px;
  vertical-align: middle;
}

.star {
  position: relative;
  display: inline-block;
  flex: none;
  width: 18px;
  height: 18px;
}
.star::before,
.star::after {
  content: "";
  position: absolute;
  inset: 0;
  -webkit-mask-position: center;
  mask-position: center;
  -webkit-mask-size: contain;
  mask-size: contain;
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
}
.star::before {          /* 먹색 테두리 */
  background-color: var(--color-ink);
  -webkit-mask-image: var(--icon-star-outline);
  mask-image: var(--icon-star-outline);
}
.star::after {           /* 안쪽 면: 빈 별은 흰색 */
  background-color: var(--color-surface);
  -webkit-mask-image: var(--icon-star-fill);
  mask-image: var(--icon-star-fill);
}
.star.is-on::after {     /* 채운 별은 옐로 */
  background-color: var(--color-primary);
}

.difficulty__text {
  margin-left: var(--space-1);
}


/* =====================================================================
   10. 결과 카드 틀 (결과 화면 맨 위, 이미지 저장 대상)
   쓰는 법:
     <article class="result-card" data-tag="빛" aria-label="결과 카드">
       <span class="sticker sticker--primary sticker--pinned">당신은</span>
       <h2 class="result-card__name">감성 라이트<br>메이커</h2>
       <div class="result-card__art dots">
         <img src="img/types/wood-mood-light.svg" alt="감성 라이트 메이커 캐릭터">
       </div>
       <p class="result-card__desc">따뜻한 분위기와 빛을 좋아하는 당신!</p>
       <div class="kit-box"> … 1순위 키트 (11번) … </div>
       <div class="result-card__band">
         <span class="result-card__band-title">나는 어떤 메이커?</span>
         <span class="band-dot" aria-hidden="true"></span>
         <span>만들닷 Makedot</span>
       </div>
     </article>
   - data-tag 에 1순위 키트의 첫 번째 태그를 넣으면 그림 면이 그 태그 진한 색이 된다.
   - 태그 색 면 위에는 글자를 올리지 않는다 (그림만). 글자는 흰 카드 안에만.
   - 아래 먹색 띠: 먹색 위 옐로 글자 12.08:1, 금색 점은 장식.
   ===================================================================== */
.result-card {
  position: relative;
  margin-top: 18px;          /* 위에 걸친 스티커 자리 */
  margin-right: 6px;         /* 오른쪽 블록 그림자 자리 */
  padding: 30px var(--space-4) 0;
  border: var(--border);
  border-radius: var(--radius-lg);
  background-color: var(--color-surface);
  box-shadow: var(--shadow-block-lg);
}

.result-card__name {
  font-family: var(--font-pop);
  font-weight: 400;
  font-size: var(--text-title);
  line-height: 1.18;
  letter-spacing: -0.01em;
}

.result-card__art {
  position: relative;
  display: grid;
  place-items: center;
  height: 166px;
  margin-top: 14px;
  border: var(--border);
  border-radius: var(--radius-md);
  background-color: var(--tag-color, var(--color-primary));
  overflow: hidden;
}
.result-card__art img {
  width: auto;
  height: 150px;
  max-width: 90%;
  object-fit: contain;
}

.result-card__desc {
  margin-top: 14px;
  font-size: var(--text-body);
  font-weight: var(--weight-medium);
  line-height: 1.55;
}

.result-card__band {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: 9px;
  min-height: 44px;
  /* 카드 안쪽 여백과 테두리까지 덮어 카드 바깥 끝에 딱 맞춘다 (띠와 테두리가 같은 먹색이라 한 몸으로 보임).
     왜 테두리까지 덮나: 테두리 안쪽에 맞추면 둥근 모서리 두 곡선 사이에 아주 가는 밝은 틈이 보였다 (묶음 1 알려진 문제) */
  margin: 18px calc((var(--space-4) + var(--border-width)) * -1) calc(var(--border-width) * -1);
  padding: 0 10px;
  border-radius: 0 0 var(--radius-lg) var(--radius-lg);
  background-color: var(--color-ink);
  color: var(--color-primary);
  font-size: var(--text-small);
  font-weight: var(--weight-heavy);
  line-height: 1.2;
}
.result-card__band-title {
  font-family: var(--font-pop);
  font-weight: 400;
  font-size: var(--text-body);
}
.band-dot {
  flex: none;
  width: 8px;
  height: 8px;
  border-radius: var(--radius-pill);
  background-color: var(--color-gold);
}


/* =====================================================================
   11. 키트 상자 (1순위) · 1순위 빨간 스티커 · 키트 줄 (2순위)
   1순위 쓰는 법 (결과 카드 안):
     <div class="kit-box">
       <span class="rank-sticker">1순위</span>
       <div class="kit-box__head">
         <span class="kit-thumb"><img src="img/default-kit.svg" alt=""></span>
         <div>
           <p class="kit-box__eyebrow">나에게 딱 맞는 키트</p>
           <p class="kit-box__name">우드 무드등</p>
           <ul class="tag-chip-list" aria-label="태그"> … </ul>
         </div>
       </div>
       <p class="kit-box__desc">나무 틀에 전구를 단 무드등을 만들어요.</p>
       <dl class="info-list"> … (12번) … </dl>
     </div>
   - 1순위 스티커의 빨강은 한 화면에 이 한 곳만 쓴다 (빨강 위 흰 글자 5.75:1).
   2순위 쓰는 법:
     <section class="pin-area">
       <h3 class="sticker sticker--primary sticker--pinned">이런 키트도 잘 맞아요</h3>
       <a class="kit-row" href="…" target="_blank" rel="noopener">
         <span class="kit-thumb"><img src="…" alt=""></span>
         <span class="kit-row__text">
           <span class="badge badge--ink">2순위</span>
           <span class="kit-row__name">네온 액자</span>
           <span class="kit-row__sub">레트로 감성 메이커의 키트</span>
         </span>
       </a>
     </section>
   - 주소(url)가 없으면 <a> 대신 <div class="kit-row"> 로 쓴다 → 그림자·화살표가 저절로 빠져
     누를 수 없는 카드로 보인다 (주소가 있을 때만 블록 모양).
   ===================================================================== */
.kit-box {
  position: relative;
  margin-top: 18px;
  padding: var(--space-3);
  border: var(--border-thin);
  border-radius: var(--radius-md);
  background-color: var(--tag-soft, var(--color-bg));
}

.kit-box__head {
  display: flex;
  flex-wrap: wrap;          /* 폭이 아주 좁으면(화면 확대 등) 이름 칸이 사진 아래 줄로 내려간다 (result.css 의 .kit-box__title) */
  align-items: center;
  gap: var(--space-3);
}

.kit-box__eyebrow {
  padding-right: 40px;      /* 오른쪽 위 1순위 스티커와 겹치지 않게 (스티커는 맨 윗줄 높이까지만 내려옴) */
  font-size: var(--text-small);
  font-weight: var(--weight-bold);
  line-height: 1.3;
  color: var(--color-ink-sub);
}

/* 키트 상자 안 태그 칩: 조금 작게(좁은 칸에 두 개가 한 줄로 들어가게) + 흰 바탕 + 색 점 없음.
   왜 흰 칩: 결과 화면의 태그 색은 결과 카드의 첫 태그 색 하나만 (C안 규칙 3, 기준 화면 SCR-04) */
.kit-box .tag-chip {
  min-height: 26px;
  padding: 0 9px;
  background-color: var(--color-surface);
}
.kit-box .tag-chip::before {
  content: none;
}

.kit-box__name {
  margin: 2px 0 6px;
  font-family: var(--font-pop);
  font-weight: 400;
  font-size: var(--text-question);
  line-height: 1.2;
}

.kit-box__desc {
  margin-top: 10px;
  font-size: var(--text-body);
  line-height: 1.55;
}

/* 키트 사진 칸 (정사각형). 사진이 없으면 img/default-kit.svg 를 넣는다 */
.kit-thumb {
  display: grid;
  place-items: center;
  flex: none;
  width: 64px;
  height: 64px;
  border: var(--border-thin);
  border-radius: var(--radius-sm);
  background-color: var(--color-surface);
  overflow: hidden;
}
.kit-thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* 아주 좁은 휴대폰(360px 미만, 예: 320px): 1순위 키트 상자의 글자 칸이 약 130px 뿐이라
   작은 제목이 "나에게 딱 맞는 / 키트"처럼 끝 낱말 하나만 다음 줄로 넘어가고, 태그 칩 두 개도 세로로 쌓였다.
   → 사진 칸과 1순위 스티커 자리를 조금 줄여 글자 칸을 넓힌다. 스티커는 맨 윗줄 오른쪽 끝에만 걸리므로 28px 면 충분하다 */
@media (max-width: 359px) {
  .kit-box .kit-thumb {
    width: 56px;
    height: 56px;
  }
  .kit-box__eyebrow {
    padding-right: 28px;
  }
}

.rank-sticker {
  position: absolute;
  top: -18px;
  right: -10px;
  z-index: 2;
  display: grid;
  place-items: center;
  width: 52px;
  height: 52px;
  border: 3px solid var(--color-white);
  border-radius: var(--radius-pill);
  background-color: var(--color-red);
  box-shadow: 0 0 0 1.5px var(--color-ink);   /* 흰 테두리 바깥 먹색 선 → 오려 붙인 스티커 */
  color: var(--color-white);
  font-size: var(--text-small);
  font-weight: var(--weight-heavy);
  line-height: 1;
  white-space: nowrap;
  transform: rotate(8deg);
}

.kit-row {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  padding: 14px 14px 14px 12px;
  border: var(--border);
  border-radius: var(--radius-md);
  background-color: var(--color-surface);
  color: var(--color-ink);
  text-decoration: none;
}
/* 주소가 있는 키트 줄만 누르는 블록 모양 + 오른쪽 화살표 */
a.kit-row {
  margin-bottom: var(--press-depth);
  box-shadow: var(--shadow-block);
  touch-action: manipulation;
  transition:
    transform var(--duration-press) var(--ease-out),
    box-shadow var(--duration-press) var(--ease-out);
}
a.kit-row::after {
  content: "";
  flex: none;
  width: 22px;
  height: 22px;
  background-color: currentColor;
  -webkit-mask: var(--icon-chevron) center / contain no-repeat;
  mask: var(--icon-chevron) center / contain no-repeat;
}
a.kit-row:active,
a.kit-row.is-pressed {
  transform: translateY(var(--press-depth));
  box-shadow: var(--shadow-none);
}

.kit-row__text {
  flex: 1;
  min-width: 0;
}
.kit-row__text .badge {
  min-height: 0;
  padding: 3px 9px;
}
.kit-row__name {
  display: block;
  margin-top: 4px;
  font-size: var(--text-choice);
  font-weight: var(--weight-heavy);
  line-height: 1.35;
}
.kit-row__sub {
  display: block;
  font-size: var(--text-small);
  font-weight: var(--weight-medium);
  line-height: 1.4;
  color: var(--color-ink-sub);
}


/* =====================================================================
   12. 정보 줄 (라벨 + 값) — 난이도 · 소요 시간 · 사용 장비
   쓰는 법:
     <dl class="info-list">
       <div class="info-row"><dt class="info-row__label">난이도</dt><dd class="info-row__value"> 별 </dd></div>
       <div class="info-row"><dt class="info-row__label">소요 시간</dt><dd class="info-row__value">60분</dd></div>
       <div class="info-row" hidden><dt class="info-row__label">사용 장비</dt><dd class="info-row__value"></dd></div>
     </dl>
   - 값이 비어 있는 줄은 hidden 을 붙여 줄째로 숨긴다 (F-04, D-24).
   - 줄 사이 선은 "보이는 줄"끼리만 그어서, 어떤 줄을 숨겨도 선이 겹치거나 남지 않는다.
   - 줄이 모두 숨겨지면 바깥 상자도 저절로 사라진다 (:has 지원 브라우저).
   ===================================================================== */
.info-list {
  margin-top: 10px;
  border: var(--border-thin);
  border-radius: var(--radius-sm);
  background-color: var(--color-surface);
  overflow: hidden;
}
.info-list:not(:has(.info-row:not([hidden]))) {
  display: none;
}

.info-row {
  display: flex;
  flex-wrap: wrap;          /* 라벨과 값이 한 줄에 안 들어가면 값이 다음 줄로 (글자가 겹치지 않게, F-05) */
  align-items: center;
  justify-content: space-between;
  column-gap: var(--space-3);
  min-height: 44px;
  padding: 8px 14px;
}
.info-row:not([hidden]) ~ .info-row:not([hidden]) {
  border-top: var(--border-thin);
}

.info-row__label {
  flex: none;
  font-size: var(--text-small);
  font-weight: var(--weight-medium);
  line-height: 1.3;
  color: var(--color-ink-sub);
}

.info-row__value {
  display: flex;
  margin-left: auto;        /* 다음 줄로 내려가도 오른쪽에 붙게 */
  align-items: center;
  justify-content: flex-end;
  flex-wrap: wrap;
  gap: var(--space-1);
  min-width: 0;
  font-size: var(--text-body);
  font-weight: var(--weight-heavy);
  line-height: 1.35;
  text-align: right;
}


/* =====================================================================
   13. 안내 문구 (개인정보 안내 · 질문 화면 도움말)
   쓰는 법:
     <p class="notice"><span class="icon icon--lock" aria-hidden="true"></span>개인정보는 수집하지 않아요</p>
     <p class="notice notice--left"><span class="icon icon--tap" aria-hidden="true"></span>고르면 바로 다음 질문으로 넘어가요</p>
   - 14px 진회색 (크림 바탕 위 8.57:1). 시작 화면 맨 아래, 의견 남기기 아래 (D-31).
   ===================================================================== */
.notice {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  font-size: var(--text-small);
  font-weight: var(--weight-medium);
  line-height: 1.4;
  color: var(--color-ink-sub);
  text-align: center;
}
.notice .icon {
  width: 16px;
  height: 16px;
}
.notice--left {
  justify-content: flex-start;
  text-align: left;
}
.notice--left .icon {
  width: 18px;
  height: 18px;
}


/* =====================================================================
   14. 움직임 (모두 한 번만, 0.3초 안팎, F-13)
   쓰는 법: 움직일 요소에 클래스를 붙인다. 다시 움직이게 하려면 클래스를 뗐다가 다시 붙인다.
     .anim-slide-in    다음 질문이 오른쪽 24px에서 밀려 들어옴 (0.3초)
     .anim-slide-back  이전 질문으로 돌아갈 때는 왼쪽 24px에서 들어옴 (0.3초).
                       왜: 앞으로 = 오른쪽에서, 뒤로 = 왼쪽에서 오면 "되돌아갔다"는 것을 몸으로 느낀다
                       (03 조사 Top 10 4번, Material "같은 축" 전환)
     .anim-stick       결과 캐릭터가 0.92 → 1.04 → 1배로 "툭" 붙음 (0.4초, 한 번만 튕김)
     .anim-rise-in     유형 이름이 0.1초 늦게 6px 아래에서 올라오며 나타남
     .anim-rise-late   1순위 키트 상자가 0.25초 늦게 8px 아래에서 올라오며 나타남 ("착" 끼워짐)
     .anim-twinkle     반짝이 별이 0.25초 늦게 작게 → 제 크기로 "반짝" (한 번만)
     .anim-hop         분석 중 아이콘이 통통 튐 (1.5초 한 바퀴, 2·3번째는 animation-delay 로 차례로).
                       분석 중 화면은 1.5초만 떠 있으므로 실제로는 한 바퀴만 보인다
   - 모두 "보이는 모양"만 바꾼다. 움직이는 동안에도 버튼은 그대로 누를 수 있다 (F-13 "조작이 막히면 안 됨").
   - "동작 줄이기" 설정이면 tokens.css·base.css 가 움직임을 끈다 (끝 모습만 바로 보임).
   - 계속 도는 효과, 화면을 덮는 꽃가루 효과는 쓰지 않는다 (C안 4-8).
   ===================================================================== */
@keyframes slide-in {
  from { opacity: 0; transform: translateX(var(--slide-distance)); }
  to   { opacity: 1; transform: none; }
}
@keyframes slide-back {
  from { opacity: 0; transform: translateX(calc(var(--slide-distance) * -1)); }
  to   { opacity: 1; transform: none; }
}
/* "툭": 0.92배 → 1.04배(한 번 넘침) → 1배. 곡선은 넘치지 않는 ease-out 을 쓴다.
   왜: 넘치는 곡선(--ease-pop)까지 쓰면 칸마다 한 번씩 더 넘쳐 두 번 튕긴다 (03 조사 Top 10 7번) */
@keyframes stick {
  0%   { opacity: 0; transform: scale(0.92) rotate(-2deg); }
  55%  { opacity: 1; transform: scale(1.04) rotate(-2deg); }
  100% { opacity: 1; transform: scale(1) rotate(-2deg); }
}
@keyframes rise-in {
  from { opacity: 0; transform: translateY(6px); }
  to   { opacity: 1; transform: none; }
}
@keyframes rise-late {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: none; }
}
@keyframes twinkle {
  from { opacity: 0; transform: scale(0.3) rotate(-30deg); }
  to   { opacity: 1; transform: none; }
}
@keyframes hop {
  0%, 46%, 100% { transform: translateY(0); }
  18%           { transform: translateY(-8px); }
  32%           { transform: translateY(0); }
}

.anim-slide-in   { animation: slide-in var(--duration-screen) var(--ease-out) both; }
.anim-slide-back { animation: slide-back var(--duration-screen) var(--ease-out) both; }
.anim-stick      { animation: stick var(--duration-pop) var(--ease-out) both; }
.anim-rise-in    { animation: rise-in var(--duration-screen) var(--ease-out) var(--delay-name) both; }
.anim-rise-late  { animation: rise-late var(--duration-screen) var(--ease-out) var(--delay-kit) both; }
.anim-twinkle    { animation: twinkle var(--duration-screen) var(--ease-pop) var(--delay-kit) both; }
.anim-hop        { animation: hop var(--duration-analyzing) ease-in-out infinite; }
