/* 오하 전문검사 — 화면 스타일 + 인쇄(A4) 스타일. 색은 tokens.css 값만 사용. */
/* 디자인 원본(_design_src/오하_전문검사 보고서 추가_2026.09/app/pro.css)을 그대로 포팅.
   devplan28 part003에서는 .pbar-* .fbar-* .dom-* .keep .trend-*만 실제로 쓰인다 —
   .pulse-line .a4-* .printhint .prev-* 등은 devplan29(분석·인쇄 화면)에서 쓸 클래스라 아직
   매칭되는 마크업이 없어 죽은 규칙이지만, "그대로 포팅"(design_map §46) 지침에 따라 파일을
   쪼개지 않고 원본 그대로 둔다. .pro-toast는 devplan29 part003(추천 링크 복사)부터 실제로
   쓰기 시작했다 — position만 아래에서 보강한다(바로 아래 주석 참고). */

.pro-wrap { width:100%; max-width:1120px; margin:0 auto; padding:0 32px; }
@container app (max-width: 720px) { .pro-wrap { padding:0 20px; } }
.pro-narrow { max-width:720px; }
.pro-read { max-width:600px; }   /* 한 줄 45~50자 */
.keep { word-break:keep-all; overflow-wrap:break-word; }
.tnum { font-variant-numeric: tabular-nums; }

/* ---------- 결과보고서 머리말의 두 버튼(분석보고서 · 인쇄 / PDF 저장) — w1 #4237 ---------- */
/* [높이 44px → 40px] 폴이 "이 두 버튼만" 40px로 내려 달라고 했다. app.css의 .btn-md는 `padding:11px 20px; font-size:15px; min-height:44px`이고
   .btn 기본이 line-height:1이라, 글자만 있으면 내용 높이가 15+22=37px이다(아이콘이 18px인 인쇄 버튼은 18+22=40px). 어느 쪽이든 내용 높이는 40px 이하라서
   min-height만 40px로 내리면 두 버튼 높이가 정확히 40px로 같아진다 — padding은 건드릴 필요가 없다.
   ★ 전역 .btn-md(44px)는 건드리지 않는다. 지난 차수에 손가락 터치 영역 때문에 일부러 44px로 올린 값이고, 이번 요청은 이 두 버튼 한정이다.
   ★ 선택자를 `.reflection .btn-md`로 쓰지 않은 이유: .reflection은 landing.php·result.php·result_multi.php에서도 쓰여서 엉뚱한 버튼까지 작아진다.
     그래서 마크업(result_profile.php 머리말의 버튼 묶음)에 전용 클래스 .pro-head-actions를 달고 그 안으로만 한정했다.
   ★ 구체성 `.pro-head-actions .btn-md`(0,2,0)가 app.css의 `.btn-md`(0,1,0)보다 높아서 두 파일의 로딩 순서와 상관없이 이긴다. */
.pro-head-actions .btn-md { min-height:40px; }

/* [폰에서 두 버튼을 한 줄에] 폰(글 영역 약 300px)에서는 "분석보고서 →"와 "인쇄 / PDF 저장" 합이 약 378px이라 두 줄로 쌓여 버튼이 더 커 보였다.
   그래서 인쇄 버튼의 글자를 두 span으로 나눠 두고(마크업은 result_profile.php) 폰에서는 짧은 "인쇄"만 보이게 한다. 데스크톱은 지금처럼 전체 글자가 보인다.
   기준은 이 파일의 다른 좁은 화면 규칙과 같은 컨테이너 쿼리(app, 560px 이하)다.
   ★ 이 컨테이너 쿼리는 일부러 새 블록으로 따로 뒀다 — 아래 "폰에서의 인쇄 미리보기" 블록은 인쇄 미리보기 전용이라 여기에 합치지 않는다.
   ★ 구체성 함정(컨테이너 쿼리는 구체성을 올려 주지 않는다)에는 걸리지 않는다: .pro-lbl-wide / .pro-lbl-phone은 이 파일에 다른 규칙이 없는 새 클래스이고,
     같은 구체성(0,1,0)끼리는 소스에서 뒤에 있는 쪽이 이기는데 아래 쿼리 안의 규칙이 기본 규칙(.pro-lbl-phone { display:none })보다 뒤에 있다. */
.pro-lbl-phone { display:none; }
@container app (max-width: 560px) {
  .pro-lbl-wide { display:none; }
  .pro-lbl-phone { display:inline; }
}

/* ---------- 백분위 막대 ---------- */
/* [세로 맞춤 — w1 #4156] 막대 아래에 양 끝 줄이 붙으면서 .pbar-main(막대 + 양 끝 줄)이 이름·점수보다 키가 커졌다.
   예전처럼 align-items:center로 두면 이름·점수가 "막대+양 끝 줄" 덩어리의 한가운데(= 막대보다 아래)에 앉아 막대와 어긋난다.
   그래서 세 칸을 위쪽에 붙이고(align-items:start), 이름·점수의 줄 높이를 --pbar-line으로 못 박은 뒤, 막대에는 같은 값에서
   계산한 margin-top을 줘서 "이름 첫 줄의 가운데 = 막대의 가운데 = 점수 첫 줄의 가운데"가 되게 했다.
   --pbar-track-h는 막대 높이의 단일 출처다(.pbar-track이 이 값을 쓴다) — 인쇄(.a4)에서는 아래에서 두 변수를 함께 줄인다. */
.pbar-row { --pbar-line:22px; --pbar-track-h:12px; display:grid; grid-template-columns:96px 1fr 132px; align-items:start; gap:16px; padding:14px 0; }
.pbar-row + .pbar-row { box-shadow:0 -1px 0 var(--border-hairline); }
.pbar-name { font-weight:600; font-size:15px; line-height:var(--pbar-line); }
.pbar-main { min-width:0; }   /* 1fr 칸 안에서 양 끝 글이 길어도 칸을 밀어내지 않고 줄바꿈되게 */
.pbar-main .pbar-track { margin-top:calc((var(--pbar-line) - var(--pbar-track-h)) / 2); }
.pbar-track { position:relative; height:var(--pbar-track-h, 12px); border-radius:var(--radius-pill); background:var(--surface-section); overflow:hidden; }
.pbar-fill { position:absolute; left:0; top:0; bottom:0; border-radius:var(--radius-pill); background:var(--brand-primary); transition:width var(--motion-slow); }
.pbar-mid { position:absolute; left:50%; top:-3px; bottom:-3px; width:1px; background:var(--border-subtle); }
.pbar-meta { text-align:right; }
.pbar-top { font-size:15px; font-weight:700; color:var(--brand-primary); line-height:var(--pbar-line); }
.pbar-band { font-size:12.5px; color:var(--fg-secondary); margin-top:2px; }
/* 양 끝 표현 줄 — 왼쪽 글 = 점수 낮은 쪽, 오른쪽 글 = 높은 쪽(Traits가 값을 들고 있다, partials/pct_bar.php 참고).
   막대와 같은 칸(.pbar-main) 안에 있으므로 막대의 좌우 끝과 자동으로 같은 범위다. 글이 길어 한 줄에 안 들어가면
   두 글이 각자 줄바꿈된다(왼쪽 글은 왼쪽 정렬, 오른쪽 글은 오른쪽 정렬).
   [화면 가독성 — w1 M-05] 실측에서 글자가 작고(12px) 흐렸다(--fg-tertiary는 흰 바탕 대비 3.2~3.4 — 본문 글자 기준 4.5에 못 미친다).
   그래서 이 줄만 글자를 12.5px로 키우고 색을 --fg-secondary(흰 바탕 대비 6.4)로 올렸다.
   ★ 색을 고친 곳은 이 클래스 하나뿐이다. --fg-tertiary 토큰 자체를 어둡게 하거나 다른 클래스의 색을 같이 바꾸지 않은 이유:
     토큰을 바꾸면 그 색을 쓰는 모든 화면(보조 문구·날짜·빈 상태 등)이 한꺼번에 달라져 영향 범위를 가늠할 수 없다.
     전역 대비 개선은 별건이라 이번에는 범위를 "양 끝 줄 두 클래스"로 좁혔다.
   ★ 인쇄 크기는 그대로다: 아래 `.a4 .pbar-ends { font-size:10px }`(선택자 구체성 0,2,0)가 이 규칙(0,1,0)을 항상 이긴다.
     인쇄 글자가 커지면 결과보고서가 2장에서 3장이 되므로, 이 규칙의 font-size를 키울 때는 반드시 그 인쇄 규칙이 살아 있는지 같이 본다.
     (글자 색은 @media print의 `.pbar-ends, .fbar-ends { color:#555 !important }`가 인쇄에서 따로 정한다.) */
.pbar-ends { display:flex; justify-content:space-between; gap:12px; margin-top:4px; font-size:12.5px; line-height:1.4; color:var(--fg-secondary); }
.pbar-ends > :last-child { text-align:right; }
@container app (max-width: 560px) {
  .pbar-row { grid-template-columns:1fr auto; grid-template-areas:"name meta" "main main"; gap:8px 12px; }
  .pbar-name { grid-area:name; } .pbar-meta { grid-area:meta; } .pbar-main { grid-area:main; }
  .pbar-main .pbar-track { margin-top:0; }   /* 막대가 자기 줄로 내려오면 줄 높이 맞춤용 위쪽 여백은 필요 없다 */
  .pbar-band { font-size:12px; }
  /* [인쇄 결과보고서 "한눈에 보기" 폰 우측 공백] 위 `.pbar-row`의 2칸짜리 배치("name meta" "main main")는 폰에서 잘 먹는데, 인쇄 화면(.a4) 안에서는
     열 정의가 따로 이긴다: 아래쪽 `.a4 .pbar-row { grid-template-columns:58px 1fr 104px }`가 선택자 구체성 0,2,0이라 위 `.pbar-row`(0,1,0)의 열을 덮어쓴다.
     배치 이름(grid-template-areas)은 덮어쓰는 쪽이 없어 그대로 남으므로 "3열 위에 2칸짜리 배치"가 얹혀 세 번째 열(104px)이 빈 채로 남았다(오른쪽 공백).
     그래서 열만 다시 2열(이름 ··· 점수 / 막대)로 맞춘다.
     ★ 선택자를 `.a4 .pbar-row`가 아니라 `.a4-wrap .a4 .pbar-row`(0,3,0)로 쓴 이유: 구체성이 같으면(0,2,0 대 0,2,0) 소스에서 뒤에 있는 쪽이 이기는데,
       `.a4 .pbar-row`는 이 블록보다 아래(".a4" 구역)에 있어서 같은 구체성으로는 진다. 컨테이너 쿼리는 구체성을 올려 주지 않는다.
       바깥에 `.a4-wrap`(인쇄 두 화면 모두 `.a4`의 부모)을 하나 붙여 구체성으로 확실히 이기게 했다.
     ★ 글자 크기(.a4 .pbar-name 11.5px · .pbar-top 11px · .pbar-band·.pbar-ends 10px)와 행 간격(.a4의 gap 12px·padding 7px)은 그대로 둔다 —
       인쇄 크기 기준이라 폰에서도 바꾸지 않는다. 인쇄(종이, 폭 약 673px)에서는 이 쿼리(560px 이하)가 켜지지 않아 3열이 그대로다. */
  .a4-wrap .a4 .pbar-row { grid-template-columns:1fr auto; }
}

/* 하위요인 (작은 막대) */
/* [세로 맞춤 — w1 #4156] 결 막대(.pbar-*)와 같은 방식: 세 칸을 위에 붙이고 이름·점수의 줄 높이(--fbar-line)를 못 박은 뒤
   막대에 같은 값에서 계산한 margin-top을 줘서 이름·막대·점수의 가운데 높이를 맞춘다. 하위요인은 한 결에 6개씩 줄이 많아서
   예전(padding 9px)보다 위아래 간격을 줄였다(양 끝 줄이 붙어 줄 하나가 커진 만큼 영역이 과하게 길어지지 않게).
   --fbar-track-h는 막대 높이의 단일 출처다 — 인쇄(.a4-dom)에서는 아래에서 두 변수를 함께 줄인다. */
.fbar { --fbar-line:18px; --fbar-track-h:8px; display:grid; grid-template-columns:108px 1fr 70px; align-items:start; gap:12px; padding:6px 0; }
.fbar-main { min-width:0; }
.fbar-main .fbar-track { margin-top:calc((var(--fbar-line) - var(--fbar-track-h)) / 2); }
.fbar-track { height:var(--fbar-track-h, 8px); border-radius:var(--radius-pill); background:var(--surface-section); position:relative; overflow:hidden; }
.fbar-fill { position:absolute; inset:0 auto 0 0; border-radius:var(--radius-pill); background:var(--blue-400); }
/* [하위요인 이름 진하게 — w1 #4237-4] 이름과 양 끝 표현(.fbar-ends, 12px · --fg-secondary)의 굵기·색이 같아 어느 쪽이 이름인지 구분이 안 됐다.
   그래서 이름만 굵게(600) · 진한 색(--fg-primary)으로 올렸다. .fbar-ends는 지난 차수에 대비를 맞춰 둔 값이라 그대로 둔다.
   ★ 이 변화는 화면(.dom-card 안)만 의도한 것이다. 종이(인쇄·인쇄 미리보기)는 아래 `.a4-dom .fbar-name`이 예전 값(400 · --fg-secondary)으로 못 박아 둔다.
   ★ 560px 이하의 `.dom-card .fbar-name { font-size:13px }`는 굵기·색을 건드리지 않으므로 이 변화를 그대로 물려받는다 — 의도한 동작이다. */
.fbar-name { font-size:13.5px; line-height:var(--fbar-line); font-weight:600; color:var(--fg-primary); }
.fbar-val { font-size:13px; line-height:var(--fbar-line); font-weight:600; text-align:right; color:var(--fg-primary); }
/* 양 끝 표현 줄 — 왼쪽 글 = 점수 낮은 쪽, 오른쪽 글 = 높은 쪽(Traits가 값을 들고 있다, partials/facet_bar.php 참고).
   결 막대(12.5px)보다 반 단계 작게(12px) — 하위요인이 한 결에 6개씩 있어 세로가 늘어나는 걸 줄이려는 값이다.
   [화면 가독성 — w1 M-05] 예전 값은 11px·--fg-tertiary(대비 3.2~3.4)라 작고 흐렸다. 12px로 키우고 색을 --fg-secondary로 올렸다.
   세로는 하위요인 29줄 × 약 1px만큼 늘지만 화면에서는 문제없다.
   ★ 색은 이 클래스(와 위 .pbar-ends) 두 곳만 고쳤다. --fg-tertiary 토큰은 건드리지 않았다 — 토큰을 바꾸면 그 색을 쓰는 모든 화면이
     같이 달라지므로, 전역 대비 개선은 별건으로 남기고 이번 범위를 이 두 클래스로 좁혔다.
   ★ 인쇄 크기는 그대로다: 아래 `.a4-dom .fbar-ends { font-size:10px }`(구체성 0,2,0)가 이 규칙(0,1,0)을 항상 이긴다.
     여기 font-size를 더 키우면 인쇄가 커져 결과보고서 쪽수가 늘 수 있으니, 바꿀 때는 그 인쇄 규칙이 이기는지부터 확인한다. */
.fbar-ends { display:flex; justify-content:space-between; gap:8px; margin-top:2px; font-size:12px; line-height:1.3; color:var(--fg-secondary); }
.fbar-ends > :last-child { text-align:right; }
/* 좁은 화면(웹 영역 카드 안): 예전처럼 3열을 유지하면 막대가 90px 안팎까지 줄어서 양 끝 글(각 80~100px)이 들어갈 자리가 없다.
   결 막대(.pbar-row)의 좁은 화면 배치와 같게 "이름 ··· 점수 / 막대 + 양 끝 줄" 두 줄로 쌓는다.
   .dom-card 안으로 한정한 이유: 인쇄 미리보기(.a4-dom .fbar)는 아래에서 자기 3열 값을 따로 정하고, 이 쌓기 규칙이 섞이면 안 된다. */
@container app (max-width: 560px) {
  .dom-card .fbar { grid-template-columns:1fr auto; grid-template-areas:"name val" "main main"; gap:4px 8px; }
  .dom-card .fbar-name { grid-area:name; font-size:13px; } .dom-card .fbar-val { grid-area:val; font-size:12.5px; } .dom-card .fbar-main { grid-area:main; }
  .dom-card .fbar-main .fbar-track { margin-top:0; }
}

/* ---------- 영역 펼치기 카드 ---------- */
.dom-card { background:var(--surface-elevated); border-radius:var(--radius-card); box-shadow:var(--shadow-1); overflow:hidden; }
.dom-card + .dom-card { margin-top:10px; }
/* [아이폰에서 영역(결) 이름·화살표가 파랗게 보이던 것 — w1 #4237-3] .dom-head는 <button>이다. tokens.css의 `button { font-family:inherit; cursor:pointer }`는 글자색을
   정하지 않아서, 버튼 안의 글자는 브라우저 기본색을 쓴다: iOS 사파리는 파랑, 데스크톱 크롬은 ButtonText(검정). 데스크톱에서만 확인해 와서 여태 안 드러났다.
   그래서 버튼 자신(.dom-head)에 글자색을 주고(안의 chevron 아이콘은 stroke="currentColor"라 이 색을 따른다), 아래 .dh-name에도 명시한다.
   .dh-top은 자기 색(--brand-primary)이 있어 해당 없다. 이 규칙은 화면 전용이라 인쇄(@media print)와 무관하다. */
.dom-head { display:flex; align-items:center; gap:16px; width:100%; border:none; background:transparent; color:var(--fg-primary); padding:18px 22px; cursor:pointer; text-align:left; transition:background var(--motion-fast); }
.dom-head:hover { background:var(--brand-primary-soft); }
.dom-head .dh-name { font-weight:600; font-size:16px; min-width:64px; color:var(--fg-primary); }   /* 버튼 안 글자라 색을 명시해야 iOS에서 파랗지 않다(위 .dom-head 주석) */
.dom-head .dh-track { flex:1; position:relative; height:10px; border-radius:var(--radius-pill); background:var(--surface-section); overflow:hidden; }
.dom-head .dh-fill { position:absolute; inset:0 auto 0 0; border-radius:var(--radius-pill); background:var(--brand-primary); }
.dom-head .dh-top { font-size:14px; font-weight:700; color:var(--brand-primary); min-width:62px; text-align:right; }
.dom-body { padding:4px 22px 22px; }
.dom-lead { font-size:15px; font-weight:600; margin-bottom:6px; }
.dom-text { font-size:14px; line-height:1.75; color:var(--fg-secondary); margin-bottom:14px; }
@container app (max-width: 560px) {
  .dom-head { flex-wrap:wrap; padding:16px; gap:8px 12px; }
  .dom-head .dh-track { order:3; flex-basis:100%; }
  .dom-head .dh-top { flex:1; text-align:right; }
  .dom-body { padding:0 16px 18px; }
}

/* devplan28 part003 추가 — DomainCard 펼치기 화살표. 디자인은 React에서 Icon을
   chevronUp/chevronDown으로 바꿔치기하지만 서버 렌더에서는 아이콘을 고정하고 회전만 시킨다. */
.js-dom-chevron { transition: transform var(--motion-fast); flex: none; }
.dom-head[aria-expanded="true"] .js-dom-chevron { transform: rotate(180deg); }

/* ---------- 변화 보기 ---------- */
/* 넓은 화면(560px 초과): 예전과 똑같이 2열 — 왼쪽에 이름 + (그 아래) 변화 문구, 오른쪽에 그래프(viewBox 520).
   .trend-head / .trend-graph 는 예전에 이름 칸·그래프 칸을 감싸던 이름 없는 <div>에 클래스만 붙인 것이다.
   min-width:0 은 칸이 1fr 하나로 바뀌는 좁은 화면에서 그래프(SVG)가 칸을 밀어 넓히지 않게 하는 안전장치다
   (넓은 화면은 고정폭 78px 열이라 값이 있어도 모양이 달라지지 않는다). */
.trend-row { display:grid; grid-template-columns:78px 1fr; align-items:center; gap:14px; padding:12px 0; }
.trend-row + .trend-row { box-shadow:0 -1px 0 var(--border-hairline); }
.trend-head, .trend-graph { min-width:0; }
.trend-name { font-size:14px; font-weight:600; }
.trend-note { color:var(--fg-tertiary); margin-top:2px; }   /* 글자 크기(12px)·줄간격은 마크업의 .t-caption-2 가 정한다 */

/* 그래프는 viewBox 폭이 다른 SVG 두 장(넓은 판 520 / 좁은 판 300)을 같이 그려 두고 하나만 보인다.
   SVG의 viewBox는 CSS로 못 바꾸고, 폭이 좁을수록 viewBox 안의 글자가 같이 줄어들기 때문이다
   (390px 폰에서 520 viewBox = 배율 0.44 → 숫자 4.6px). 자세한 설명은 history_profile.php 의 마크업 주석.
   숨긴 쪽은 display:none 이라 스크린리더도 읽지 않는다. 기본은 넓은 판만 보인다. */
.trend-narrow { display:none; }

@container app (max-width: 560px) {
  /* 좁은 화면: 2열을 풀어 세로로 쌓는다 — 위 한 줄에 이름 + 변화 문구, 아래에 그래프가 전체 폭.
     (예전엔 64px 왼쪽 칸에서 "지난 회차보다 많이 낮아요"가 3줄로 쪼개지고 그래프는 230px로 눌렸다.) */
  .trend-row { grid-template-columns:1fr; gap:6px; }
  .trend-head { display:flex; justify-content:space-between; align-items:baseline; gap:10px; }
  /* 이름은 줄어들지 않게(flex:none) 못 박고, 변화 문구가 남는 폭(flex:1)을 쓰게 한다.
     문구가 한 줄에 안 들어가면 문구 쪽이 두 줄로 접힌다 — 이름이 3줄로 쪼개지는 일은 없다. */
  .trend-name { font-size:14px; flex:none; }
  .trend-note { flex:1; text-align:right; margin-top:0; }
  .trend-wide { display:none; }
  .trend-narrow { display:block; }
}

/* 회차 기록 카드의 결과보고서·분석보고서 링크 — 손가락으로 누르기 편하도록 높이를 44px로.
   예전엔 padding:6px 0 + 글자 높이라 33px였다. min-height 로 높이를 직접 보장하고(글자 줄간격이 바뀌어도 44px 유지),
   .row(flex, align-items:center)라서 글자·화살표는 가운데에 놓인다. 가로로 나란히 두다 폭이 모자라면 부모의 flex-wrap 이 줄을 바꾼다. */
.trend-link { gap:6px; font-size:13px; font-weight:600; color:var(--brand-primary); min-height:44px; padding:0; }

/* 회차 기록 카드의 링크 묶음(결과보고서 · 분석보고서) — w1 #4240. 오른쪽 정렬, 폰에서는 세로 2단(위 결과보고서 / 아래 분석보고서).
   분석보고서가 없는 회차는 링크가 하나뿐이라 결과보고서만 남는다(마크업의 $s['hasAnalysis'] 조건) — 이 규칙은 개수와 무관하게 같은 모양을 만든다.
   예전엔 마크업의 인라인 style(gap:0 16px;flex-wrap:wrap)이었다. 인라인 style은 컨테이너 쿼리로 덮어쓸 수 없어(폰에서만 방향을 바꿔야 한다) 이 파일로 옮겼다.
   ★ margin-left:auto인 이유: 바깥 카드 줄(.row, flex-wrap:wrap)에서 왼쪽 칸(날짜 + 기준 문구)이 flex:1이라 넓은 화면에서는 이 묶음이 이미 오른쪽 끝이지만,
     폭이 모자라 묶음이 다음 줄로 내려갈 때는 그 줄에서 왼쪽에 붙어 버린다(카드마다 링크 위치가 들쭉날쭉했던 원인). 자동 여백은 어느 줄에 놓이든 묶음을 오른쪽 끝으로 민다.
     justify-content:flex-end로는 이걸 못 한다 — 그건 묶음 "안쪽"에서 링크를 정렬할 뿐 묶음 자체의 위치를 바꾸지 못한다.
   ★ 이 묶음은 마크업에서 `.row`(app.css 244행: display:flex; align-items:center; gap:var(--space-3))를 같이 달고 있다. .trend-links의 gap은 .row의 gap과
     같은 구체성(0,1,0)이라 로딩 순서(tokens → app → site → pro)상 뒤에 오는 이 파일이 소스 순서로 이긴다 — 위 .trend-link가 .row의 gap을 덮는 것과 같은 방식이다.
     폰 규칙의 align-items:flex-end도 .row의 align-items:center를 같은 식으로 덮는다. 컨테이너 쿼리는 구체성을 올려 주지 않으므로, 폰 규칙이 이기는 건
     "기본 규칙(.trend-links)보다 소스에서 뒤에 있기" 때문이다 — 이 쿼리 블록을 기본 규칙 위로 옮기면 안 먹는다.
   ★ 폰에서만 세로로 쌓는 이유: 글 영역이 좁아 가로 두 링크(약 190px)가 날짜·기준 문구 칸(최소 160px)과 한 줄에 못 앉으면 링크 묶음이 아래줄로 떨어져 카드가 길어진다.
     세로로 쌓으면 폭이 링크 하나(약 90px)로 줄어 날짜 칸 옆 같은 줄에 남는다. 기준은 이 파일의 다른 좁은 화면 규칙과 같은 컨테이너 쿼리(app, 560px 이하).
   ★ 폰 규칙에서 flex-wrap:nowrap + gap:0을 같이 주는 이유: 세로 배치에서 wrap이 남아 있으면 높이가 모자랄 때 열이 갈라질 수 있고, 가로 간격 16px은 세로에서 의미가 없다.
     링크마다 min-height:44px라 세로 간격 0으로도 충분히 떨어진다. 세로 2단이 되면 묶음 높이가 88px로 왼쪽 칸(약 45px)보다 커지지만, 카드 줄이 align-items:center라 가운데가 맞는다. */
.trend-links { margin-left:auto; gap:0 16px; flex-wrap:wrap; }
@container app (max-width: 560px) {
  .trend-links { flex-direction:column; align-items:flex-end; flex-wrap:nowrap; gap:0; }
}

/* ---------- 생성 대기 (은은한 맥박) ---------- */
.pulse-line { height:13px; border-radius:99px; background:var(--surface-section); animation:proPulse 1.9s ease-in-out infinite; }
.pulse-line + .pulse-line { margin-top:12px; }
@keyframes proPulse { 0%,100%{opacity:.55;} 50%{opacity:1;} }

/* ---------- 샘플 보고서 배너(/pro/sample) — devplan29 part002 §4-6 ----------
   gnb도 position:sticky;top:0이라 같은 화면에 두면 두 sticky가 겹친다. 그래서 이 배너를
   쓰는 화면(pro/sample.php)은 bare(gnb 없음)로 그리고, 이 배너 하나만 top:0에 붙인다. */
.pro-sample-bar { position:sticky; top:0; z-index:70; display:flex; align-items:center; justify-content:center; gap:14px; flex-wrap:wrap; padding:10px 16px; background:var(--brand-primary); box-shadow:var(--shadow-2); }
.pro-sample-bar .pro-sample-exit { display:inline-flex; align-items:center; gap:5px; color:#fff; text-decoration:none; font-weight:600; font-size:13px; opacity:.92; }
.pro-sample-bar .pro-sample-label { display:inline-flex; align-items:center; gap:6px; color:#fff; font-weight:700; font-size:13.5px; text-align:center; }

/* ---------- 토스트(복사 완료) ---------- */
/* 디자인 원본은 position:absolute다 — 프로토타입의 .device(고정 높이 프레임, position:relative)
   안에서 그 프레임 기준 하단에 뜨는 걸 전제로 한 값이다. 실제 사이트에는 그런 프레임이 없어
   absolute로 두면 기준점이 문서 최상단(뷰포트가 아니라 페이지 전체)이 되어 버린다 —
   devplan29 part003에서 fixed로 바꿔 뷰포트 하단에 뜨도록 보강했다. 클래스명·나머지 값은
   그대로다. */
.pro-toast { position:fixed; left:50%; bottom:28px; transform:translateX(-50%); z-index:400; display:flex; align-items:center; gap:9px; background:var(--surface-inverse); color:#fff; font-size:14px; font-weight:600; padding:12px 20px; border-radius:var(--radius-pill); box-shadow:var(--shadow-3); }

/* ---------- 인쇄용 문서(화면에서도 A4 미리보기) ---------- */
.a4 { background:#fff; width:210mm; min-height:297mm; margin:0 auto 20px; padding:18mm 16mm; box-shadow:var(--shadow-3); color:var(--fg-primary); }
.a4-hd { display:flex; justify-content:space-between; align-items:flex-end; padding-bottom:10px; box-shadow:0 1px 0 var(--border-subtle); margin-bottom:20px; }
.a4-ft { margin-top:26px; padding-top:10px; box-shadow:0 -1px 0 var(--border-subtle); display:flex; justify-content:space-between; font-size:10.5px; color:var(--fg-secondary); }
.a4 h1 { font-size:22px; font-weight:700; }
.a4 h2 { font-size:15px; font-weight:700; margin:22px 0 10px; }
.a4 h3 { font-size:13px; font-weight:700; margin:14px 0 6px; }
.a4 p { font-size:11.5px; line-height:1.75; color:var(--fg-secondary); }
.a4-note { background:var(--surface-section); border-radius:8px; padding:10px 12px; font-size:10.5px; line-height:1.65; color:var(--fg-secondary); }
.a4-about { margin-top:14px; padding:12px 14px; border-radius:8px; background:var(--brand-primary-soft); break-inside:avoid; page-break-inside:avoid; }
.a4-about p { color:var(--fg-secondary); }
/* 오하 소개 첫 줄(오하(오늘하루) / 소개 문구 / 도메인) — 예전에는 print/_about.php의 인라인 style이었다. 인라인은 컨테이너 쿼리로 못 바꾸므로 클래스로 뺐다.
   종이·데스크톱: 한 줄(글자 밑선 맞춤), 도메인은 오른쪽 끝. 폰에서 세로로 쌓는 규칙은 아래 "폰에서의 인쇄 미리보기" 블록에 모아 뒀다. */
.a4-about-hd { display:flex; align-items:baseline; gap:8px; margin-bottom:6px; }
.a4-about-dom { margin-left:auto; }
.a4-dom { break-inside:avoid; page-break-inside:avoid; padding:12px 0; box-shadow:0 -1px 0 var(--border-hairline); }
/* 하위요인 묶음(print/_domain.php) — 예전에는 인라인 style이었다. 종이·데스크톱은 2열(자리를 아끼는 배치) + 칸마다 이름/막대/점수 3열(아래 .a4-dom .fbar).
   폰에서 1열로 푸는 규칙은 아래 "폰에서의 인쇄 미리보기" 블록. */
.a4-facets { display:grid; grid-template-columns:repeat(2,1fr); column-gap:20px; }
.a4-sug { break-inside:avoid; page-break-inside:avoid; padding:9px 0; }
.a4-cover { display:flex; flex-direction:column; justify-content:center; min-height:200mm; }
.printhint { display:flex; gap:10px; align-items:flex-start; background:var(--accent-warm-soft); color:var(--fg-primary); border-radius:var(--radius-md); padding:14px 16px; font-size:13.5px; line-height:1.6; }
/* [폰 안내 한 문장 — w1 M-10] 인쇄 화면의 미리보기는 A4 종이 크기(210mm) 그대로라 폰에서는 본문이 10px 안팎으로 작게 보인다.
   미리보기를 키우면 "실제 인쇄와 다르게 보이는" 새 문제가 생기므로 키우지 않고, 대신 안내 문구 맨 앞에 "그래서 '인쇄 창 열기'를 눌러 달라"는
   한 문장을 더했다(마크업은 print/_hint.php). 데스크톱에서는 미리보기가 충분히 커서 군더더기이므로 좁은 화면에서만 보이게 한다.
   기준은 이 파일의 다른 좁은 화면 규칙과 같은 컨테이너 쿼리(app, 560px 이하)다.
   인쇄 때는 걱정하지 않아도 된다: 이 문장은 .printhint 안에 있고, .printhint는 .noprint라서 @media print에서 통째로 사라진다(아래 "인쇄 (A4)" 구역 참고). */
.a4-hint-mobile { display:none; margin-bottom:6px; }
@container app (max-width: 560px) { .a4-hint-mobile { display:block; } }
.a4-wrap { background:var(--surface-section); padding:24px; overflow-x:auto; }
@container app (max-width: 720px) { .a4 { width:auto; min-height:0; padding:24px 20px; } .a4-wrap { padding:16px; } .a4-cover{min-height:0;} }

/* w1 #3814 — 분석보고서 표지 하단 구역(결 이름 + 결 설명). 마크업은 print/_cover_art.php.
   w1 #4070 — 예전에 있던 가로선 5줄(장식 막대용 규칙 포함)은 폴 요청으로 없앴다. 그 자리에 결별 설명이 들어간다.
   이미지·SVG 없이 글만 쓴다. 화면(.a4-cover가 center)에서는 내용 바로 아래에 붙고,
   인쇄(@media print에서 .a4-cover가 space-between)에서는 표지 바닥에 앉는다.
   .a4-cover-body는 표지 기존 내용을 묶는 래퍼 — flex column이라 예전(.a4-cover의 직계 자식)과
   같은 방식으로 배치된다(블록으로 두면 안쪽 margin이 겹쳐 간격이 달라진다).
   글자 크기·행간·간격·위쪽 여백·최대 가로는 CSS가 아니라 _cover_art.php 안의 "실측 조정 손잡이"(인라인 style)에 모아 뒀다 —
   표지가 2장이 될 때 한곳에서만 고치려는 것이다. 여기서는 손잡이가 필요 없는 고정 규칙(굵기·색·쪼개짐 금지)만 둔다. */
.a4-cover-body { display:flex; flex-direction:column; }
.a4-art { break-inside:avoid; page-break-inside:avoid; }
.a4-art-label { font-size:10.5px; letter-spacing:.06em; color:var(--fg-tertiary); margin-bottom:6px; }
.a4-art-names { font-size:12px; line-height:1.6; color:var(--fg-secondary); }
.a4-art-trait { break-inside:avoid; page-break-inside:avoid; }
/* 결 이름은 색이 아니라 굵기로 설명과 나눈다 — 흑백 인쇄에서도 구분되도록. */
.a4-art-tname { font-weight:700; color:var(--fg-primary); }
.a4-art-brief { color:var(--fg-secondary); }

/* 인쇄본 안에서의 막대 밀도(devplan29 part005 리뷰 F-5).
   화면용 .pbar-* .fbar-*를 그대로 재사용하되(파셜 재사용 — 새 마크업을 만들지 않는다),
   A4 폭에서는 글자·행 높이가 과하게 커서 .a4 / .a4-dom 안에서만 디자인(P6) 치수로 줄인다.
   화면 결과보고서(result_profile.php)에는 .a4가 없으므로 영향이 없다. */
.a4 .pbar-row { --pbar-line:17px; --pbar-track-h:10px; grid-template-columns:58px 1fr 104px; gap:12px; padding:7px 0; }
.a4 .pbar-name { font-size:11.5px; }
.a4 .pbar-top { font-size:11px; }
.a4 .pbar-band { font-size:10px; margin-top:1px; }
.a4 .pbar-ends { font-size:10px; margin-top:3px; }   /* w1 #4156 — 결 막대 양 끝 줄(인쇄 크기) */
.a4-dom .fbar { --fbar-line:15px; --fbar-track-h:6px; grid-template-columns:74px 1fr 62px; gap:8px; padding:4px 0; }
/* [종이 고정 — w1 #4237-4] 위 `.fbar-name`을 화면용으로 굵고 진하게(600 · --fg-primary) 바꿨는데, 이 줄에 굵기·색 선언이 없으면 그 변화가 종이(인쇄 · 인쇄 미리보기)에까지 번진다.
   그래서 예전 값(400 · --fg-secondary)을 명시해 종이 모양을 그대로 둔다. 구체성 `.a4-dom .fbar-name`(0,2,0)이 `.fbar-name`(0,1,0)보다 높아 순서와 상관없이 이긴다.
   화면만 바꿨고, 종이를 같이 진하게 할지는 실측 후 opus가 판단한다. */
.a4-dom .fbar-name { font-size:10.5px; font-weight:400; color:var(--fg-secondary); }
.a4-dom .fbar-val { font-size:10px; }
.a4-dom .fbar-ends { font-size:10px; margin-top:1px; gap:6px; }   /* w1 #4156 — 하위요인 양 끝 줄(인쇄 크기) */

/* ---------- 폰에서의 인쇄 미리보기 (컨테이너 app 560px 이하) ----------
   인쇄 화면의 미리보기는 종이 크기(210mm) 그대로의 가로 배치라 폰(글 영역 약 320px)에서는 칸이 모자라 줄바꿈되며 잘리거나 막대가 찌그러졌다.
   그래서 폰에서만 세로로 쌓는다. 이 블록 하나에 폰 전용 규칙을 모았다(결 막대 .pbar-row 한 가지만 위쪽 .pbar-row 컨테이너 쿼리 안에 있다).
   ★ 이 블록은 위의 .a4 기본 규칙들보다 뒤에 있어야 한다: .a4-dom .fbar(0,2,0)처럼 같은 구체성끼리는 소스에서 뒤에 있는 쪽이 이긴다.
   ★ 인쇄(종이)는 그대로다. 인쇄 폭(178mm ≈ 673px)에서는 이 쿼리(560px 이하)가 켜지지 않는다 — 컨테이너(.oha-app)의 폭이 인쇄 때는 용지의 글 영역 폭이 되기 때문이다.
     또 아래 "인쇄 (A4)"의 @media print 안에는 이 블록이 건드리는 속성(flex-direction · grid-template-* · margin-left)을 바꾸는 규칙이 없어서,
     종이는 위쪽 기본값(꼬리말·소개 첫 줄은 한 줄, 하위요인은 2열 + 칸마다 3열)을 그대로 쓴다.
   ★ 글자 크기는 일부러 하나도 바꾸지 않는다 — 위 .a4 규칙이 정한 인쇄 크기 기준이다(폰 안내 문구가 "인쇄 창 열기를 누르세요"인 이유와 같다, .a4-hint-mobile 참고). */
@container app (max-width: 560px) {
  /* 꼬리말: 왼쪽 고지 문구 위, 오른쪽 "도메인 · 보고서 이름" 아래. 양 끝 정렬(space-between)은 세로에서는 아무 일도 안 해서 따로 풀 필요가 없다. */
  .a4-ft { flex-direction:column; align-items:flex-start; gap:2px; }

  /* 오하 소개 첫 줄: 이름 / 소개 문구 / 도메인을 위→아래로. 도메인의 margin-left:auto는 세로(교차축)에서는 "오른쪽 끝으로 밀기"가 되므로 반드시 0으로 푼다. */
  .a4-about-hd { flex-direction:column; align-items:flex-start; gap:2px; }
  .a4-about-dom { margin-left:0; }

  /* 하위요인: 2열 → 1열. 한 칸이 약 160px이던 때는 `74px 1fr 62px` 중 막대 칸이 8px 안팎으로 찌그러졌다. */
  .a4-facets { grid-template-columns:1fr; }
  /* 하위요인 막대 한 줄: "이름 ··· 점수 / 막대 + 양 끝 줄" 두 줄 배치. 이미 같은 모양이 있다 — 위쪽 `.dom-card .fbar`(화면 결과 카드)의 560px 이하 규칙이다.
     같은 것: 열 `1fr auto` · 배치 이름 "name val" "main main" · 막대가 자기 줄로 내려오므로 줄 높이 맞춤용 위쪽 여백(.fbar-main .fbar-track의 margin-top)을 0으로.
     다른 것: ① 선택자가 `.a4-dom .fbar`다 — `.dom-card .fbar`는 `.dom-card` 안으로 한정돼 있어(그 주석 참고) 인쇄 화면에는 닿지 않는다.
              ② 글자 크기를 키우지 않는다 — `.dom-card`는 화면용이라 13px/12.5px로 키우지만 여기는 인쇄 크기(10.5px/10px) 그대로다.
              ③ 행 간격 3px — 인쇄 쪽 padding(4px)이 `.dom-card`(6px)보다 촘촘해서 그에 맞췄다.
     이 규칙은 위 `.a4-dom .fbar { grid-template-columns:74px 1fr 62px }`(0,2,0)와 구체성이 같지만 소스에서 뒤에 있으므로 이긴다. */
  .a4-dom .fbar { grid-template-columns:1fr auto; grid-template-areas:"name val" "main main"; gap:3px 8px; }
  .a4-dom .fbar-name { grid-area:name; }
  .a4-dom .fbar-val { grid-area:val; }
  .a4-dom .fbar-main { grid-area:main; }
  .a4-dom .fbar-main .fbar-track { margin-top:0; }
}

/* ============================================================
 * 인쇄 (A4)
 * ============================================================ */
@media print {
  @page { size:A4; margin:18mm 16mm; }
  .proto-bar, .proto-seg, .proto-jump, .gnb, .footer, .noprint,
  .toast-wrap, .pro-toast, .overlay, .slideover, .drawer { display:none !important; }
  .proto-root, .proto-stage { display:block !important; padding:0 !important; margin:0 !important; background:#fff !important; min-height:0 !important; }
  .device, .device.desktop, .device.mobile { width:auto !important; max-width:none !important; min-height:0 !important; box-shadow:none !important; border-radius:0 !important; margin:0 !important; }
  .device .notch { display:none !important; }
  .device-scroll { height:auto !important; max-height:none !important; overflow:visible !important; padding:0 !important; }
  body { background:#fff !important; }
  .oha-app, .page, .a4-wrap { background:#fff !important; height:auto !important; min-height:0 !important; animation:none !important; padding:0 !important; }
  .a4 { width:auto !important; min-height:0 !important; margin:0 !important; padding:0 !important; box-shadow:none !important; }
  /* 흑백 대응 — 명도 차이 + 숫자 동반 표기 */
  body, .a4, .a4 h1, .a4 h2, .a4 h3 { color:#000 !important; }
  .a4 p, .a4-ft, .a4-note, .a4-art-brief { color:#333 !important; }
  .pbar-track, .fbar-track, .dom-head .dh-track { background:#e8e8e4 !important; }
  .pbar-fill, .fbar-fill, .dom-head .dh-fill { background:#5a5a56 !important; }
  .pbar-top, .dom-head .dh-top { color:#000 !important; }
  /* w1 #4156 — 양 끝 표현 글은 화면에서 옅은 회색(--fg-tertiary)인데, 흑백 인쇄에서는 더 옅어져 읽기 어렵다. 진하게 올린다. */
  .pbar-ends, .fbar-ends { color:#555 !important; }
  .a4-dom, .a4-sug, .a4-about, .dom-card, .card { break-inside:avoid; page-break-inside:avoid; box-shadow:none !important; }
  /* w1 #4156 — "한눈에 보기"의 결 막대 한 줄(이름·막대·양 끝 줄·점수)이 쪽 경계에서 반으로 갈리지 않게 한다.
     위 규칙에 합치지 않은 이유: 저 규칙은 box-shadow:none !important라서 .pbar-row 사이의 가는 구분선까지 지워 버린다.
     하위요인 막대(.fbar)는 부모 .a4-dom 전체가 이미 쪼개지지 않아서 따로 둘 필요가 없다. */
  .pbar-row { break-inside:avoid; page-break-inside:avoid; }
  .a4-about { background:#f2f2ee !important; }
  .a4-about b, .a4-about span { color:#000 !important; }
  .a4-hd { position:running(hd); }
  .print-running-ft { position:fixed; bottom:0; left:0; right:0; font-size:9.5px; color:#444; text-align:center; }
  /* w1 #3814 — 인쇄 폭(178mm≈673px)이 컨테이너 쿼리 720px 아래로 들어가 표지 세로 채움이 풀린다. 되돌린다.
     이 블록은 컨테이너 쿼리보다 뒤에 있어 !important와 함께 우선한다. 화면과 같은 가운데 정렬을 유지한다 —
     space-between으로 장식만 바닥에 붙이면 가운데가 크게 비어 "여백이 길다"는 원래 증상이 그대로 남는다(실측 확인).
     225mm는 실측값 — A4에서 표지가 1장(904px, 인쇄영역 986px)에 들어가고, @page size를 무시하는 브라우저가
     Letter(인쇄영역 918px)로 뽑아도 넘치지 않는 선이다. 더 키우면 3장이 된다. */
  .a4-cover { min-height:225mm !important; }
  /* devplan44 part005 F-3 — 전문기관 안내 카드(.crisis-card, partials/crisis_card.php)의 바깥 아래 여백과 안쪽 여백만 줄인다.
     왜: 분석보고서에 이 카드가 들어가면(최대치: 문단 8·문장 5·제안 5 + 안내 카드) 마지막 쪽 맨 아래 꼬리줄(.a4-ft) 한 줄만 4쪽으로 넘어갔다(실측 4쪽 → 이 규칙으로 3쪽).
     글자 크기·줄 간격은 건드리지 않는다 — 종이에서 읽히는 게 목적이다. 화면용 모양(24px 안쪽 여백·18px 아래 여백)은 app.css 그대로다(이 규칙은 인쇄에서만).
     margin-bottom은 카드를 감싼 div(print/analysis.php, margin-bottom:18px)와 겹쳐(마진 병합) 거기서는 18px이 그대로고, 감싸는 div가 없는 제안 안의 카드에서만 8px로 줄어든다. */
  .crisis-card { margin-top:0; margin-bottom:8px; padding:10px 14px; }
  /* devplan44 part005 G-1(리뷰 opus) — F-3 뒤 여유가 8pt뿐이었다. 본문이 한 줄(약 15pt) 길어지면 다시 4쪽이 된다.
     카드 안 제목의 위 여백(.a4 h2의 22px이 카드 안에서도 걸린다)을 없애 여유를 벌고, 카드가 쪽 경계에서
     반으로 갈라지지 않게 묶는다 — 연락처만 다음 장으로 넘어가면 안내가 안내 구실을 못 한다. */
  .crisis-card { break-inside: avoid; page-break-inside: avoid; }
  .crisis-card h2, .crisis-card .t-heading-2 { margin-top:0; }
}
