
        .hap-wrap{margin:4px 0 26px;padding:20px;border:1px solid var(--border,#e8edf4);border-radius:18px;background:var(--bg,#fff);box-shadow:var(--sh-sm,0 2px 8px rgba(0,0,0,.04))}
        [data-theme="dark"] .hap-wrap{background:#0f1420;border-color:#30363d}
        .hap-head{display:flex;align-items:flex-start;justify-content:space-between;gap:18px;flex-wrap:wrap;margin-bottom:14px}
        .hap-heading{min-width:0;flex:1 1 360px}
        .hap-title-row{display:flex;align-items:center;gap:9px;flex-wrap:wrap}
        .hap-title{font-size:18px;font-weight:900;letter-spacing:-.02em;color:var(--txt-hi,#0f172a)}
        [data-theme="dark"] .hap-title{color:#e6edf3}
        .hap-status{display:inline-flex;align-items:center;min-height:24px;padding:3px 9px;border-radius:999px;background:rgba(22,163,74,.10);border:1px solid rgba(22,163,74,.25);color:#15803d;font-size:10.5px;font-weight:900}
        [data-theme="dark"] .hap-status{background:rgba(34,197,94,.14);border-color:rgba(34,197,94,.28);color:#86efac}
        .hap-desc{margin:5px 0 0;color:var(--txt-mid,#475569);font-size:13px;line-height:1.55}
        [data-theme="dark"] .hap-desc{color:#9aa7b4}
        .hap-pricing-link{display:inline-flex;align-items:center;min-height:44px;color:var(--accent,#1a3de8);font-size:12.5px;font-weight:800;text-decoration:none;white-space:nowrap}
        [data-theme="dark"] .hap-pricing-link{color:#8ab4ff}
        .hap-pricing-link:focus-visible,.hap-card:focus-visible{outline:3px solid rgba(26,61,232,.34);outline-offset:3px}
        /* v2.144.1 hotfix: 이 섹션은 모바일 셸 레이아웃을 절대 건드리지 않는다.
           v2.144.0이 여기서 모바일 강제 노출 규칙으로 PC 홈(#page-home)까지 함께 띄웠는데,
           body(flex column·overflow:hidden) 안의 .content 두 개가 flex:1을 반씩 나눠 갖고
           각자 내부 스크롤로 잘려, 모바일 전용 홈과 뉴스가 모두 반토막 나 겹쳐 보였다.
           → 해당 규칙 전부 제거. 광고상품은 PC 홈에서만 노출하고, 모바일은 전용 홈
             (#page-home-mobile) 흐름을 그대로 유지한다. 회귀 방지: tests/home-ad-products.test.js */
        .hap-promo{display:flex;align-items:center;gap:8px;min-height:40px;margin:0 0 14px;padding:9px 12px;border-radius:11px;font-size:12px;font-weight:750;line-height:1.5}
        .hap-promo[hidden],.hap-load-error[hidden]{display:none}
        .hap-promo-loading{color:var(--txt-mid,#475569);background:rgba(148,163,184,.11);border:1px dashed rgba(148,163,184,.38)}
        .hap-promo-active{color:#166534;background:rgba(34,197,94,.10);border:1px solid rgba(34,197,94,.27)}
        .hap-promo-error{color:#92400e;background:rgba(245,158,11,.10);border:1px solid rgba(245,158,11,.28)}
        [data-theme="dark"] .hap-promo-loading{color:#9aa7b4}
        [data-theme="dark"] .hap-promo-active{color:#86efac;background:rgba(34,197,94,.12)}
        [data-theme="dark"] .hap-promo-error{color:#fcd34d;background:rgba(245,158,11,.12)}
        .hap-load-error{margin:0 0 14px;padding:12px;border-radius:11px;background:rgba(220,38,38,.08);border:1px solid rgba(220,38,38,.22);color:#991b1b;font-size:12.5px;line-height:1.55}
        [data-theme="dark"] .hap-load-error{color:#fca5a5;background:rgba(220,38,38,.12)}
        .hap-grid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:12px}
        .hap-card{appearance:none;-webkit-appearance:none;width:100%;min-width:0;min-height:255px;display:flex;flex-direction:column;align-items:stretch;gap:9px;padding:16px 14px;text-align:left;font:inherit;color:inherit;background:var(--bg,#fff);border:1px solid var(--border,#e8edf4);border-radius:14px;cursor:pointer;box-shadow:0 2px 7px rgba(15,23,42,.04);transition:transform .14s ease,box-shadow .14s ease,border-color .14s ease}
        [data-theme="dark"] .hap-card{background:#0b1020;border-color:#30363d}
        .hap-card:hover:not(:disabled){transform:translateY(-2px);box-shadow:0 10px 24px rgba(12,31,184,.10);border-color:rgba(26,61,232,.32)}
        .hap-card:disabled{cursor:wait;opacity:.62}
        .hap-card-badge{align-self:flex-start;padding:2px 7px;border-radius:999px;background:rgba(26,61,232,.08);color:var(--accent,#1a3de8);font-size:9.5px;font-weight:900}
        [data-theme="dark"] .hap-card-badge{background:rgba(99,102,241,.16);color:#a5b4fc}
        .hap-name{min-height:43px;color:var(--txt-hi,#0f172a);font-size:14px;font-weight:850;line-height:1.45;word-break:keep-all;overflow-wrap:anywhere}
        [data-theme="dark"] .hap-name{color:#e6edf3}
        .hap-price-row{display:flex;align-items:baseline;gap:6px;flex-wrap:wrap}
        .hap-price{color:#101828;font-size:21px;font-weight:950;letter-spacing:-.035em}
        [data-theme="dark"] .hap-price{color:#f8fafc}
        .hap-price-free{color:#15803d}
        [data-theme="dark"] .hap-price-free{color:#86efac}
        .hap-original-price{color:var(--txt-lo,#94a3b8);font-size:11px;text-decoration:line-through}
        .hap-unit{color:var(--txt-mid,#475569);font-size:10.5px;font-weight:700}
        [data-theme="dark"] .hap-unit{color:#9aa7b4}
        .hap-target{min-height:36px;color:var(--txt-mid,#475569);font-size:11px;line-height:1.55}
        [data-theme="dark"] .hap-target{color:#9aa7b4}
        .hap-note{color:var(--txt-mid,#475569);font-size:11px;line-height:1.55}
        [data-theme="dark"] .hap-note{color:#9aa7b4}
        .hap-card-promo{display:none;padding:7px 8px;border-radius:8px;background:rgba(34,197,94,.08);color:#166534;font-size:10.5px;font-weight:750;line-height:1.45}
        [data-theme="dark"] .hap-card-promo{color:#86efac;background:rgba(34,197,94,.11)}
        .hap-cta{display:flex;align-items:center;min-height:44px;margin-top:auto;padding-top:7px;border-top:1px solid var(--border,#e8edf4);color:var(--accent,#1a3de8);font-size:11.5px;font-weight:850;line-height:1.4}
        [data-theme="dark"] .hap-cta{border-color:#30363d;color:#8ab4ff}
        @media(max-width:1320px){.hap-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}
        @media(max-width:980px){.hap-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
        @media(max-width:768px){.hap-wrap{margin:0;padding:16px 14px;border-radius:16px}.hap-grid{grid-template-columns:1fr}.hap-card{min-height:230px}.hap-name,.hap-target{min-height:0}}
        @media(prefers-reduced-motion:reduce){.hap-card{transition:none}.hap-card:hover:not(:disabled){transform:none}}
      