/* ============================================================
   GOOD JOB! 手写加载动画 · 蜻蜓好工作全站统一 Loading
   复刻官网预载动画：逐字母手写 → 装饰线条淡入 → 感叹号圆点弹跳
   ============================================================ */

/* ---------- 全屏遮罩（页面首载 + 异步等待共用） ---------- */
/* 收尾动效：从中心向四周逐步清晰（径向镂空扩散），底层页面随之显现 */
@property --gj-r { syntax:'<percentage>'; inherits:false; initial-value:0%; }
.gj-overlay{position:fixed;inset:0;z-index:99999;display:flex;flex-direction:column;
    align-items:center;justify-content:center;gap:18px;
    background:#F7F4EC;}
.gj-overlay.gj-hide{pointer-events:none;
    -webkit-mask-image:radial-gradient(circle at 50% 44%, transparent var(--gj-r), #000 calc(var(--gj-r) + 24%));
    mask-image:radial-gradient(circle at 50% 44%, transparent var(--gj-r), #000 calc(var(--gj-r) + 24%));
    animation:gj-reveal .85s cubic-bezier(.5,0,.15,1) forwards;}
.gj-overlay.gj-hide .gj-svg{transform:scale(1.07);opacity:0;transition:transform .8s cubic-bezier(.3,0,.2,1),opacity .45s ease;}
.gj-overlay.gj-hide .gj-msg,.gj-overlay.gj-hide .gj-sub{opacity:0;transition:opacity .3s ease;}
@keyframes gj-reveal{from{--gj-r:0%}to{--gj-r:170%}}
/* 不支持 @property 的浏览器退化为轻微放大淡出 */
.gj-overlay.gj-hide-simple{pointer-events:none;opacity:0;transform:scale(1.03);
    transition:opacity .5s ease,transform .5s ease;}
.gj-overlay .gj-svg{width:min(300px,64vw);height:auto;display:block;}
.gj-overlay .gj-msg{font-size:15px;font-weight:600;color:#0d7a4a;letter-spacing:.5px;
    margin:0;text-align:center;line-height:1.7;padding:0 24px;}
.gj-overlay .gj-sub{font-size:12.5px;color:#8a968f;margin:0;}

/* ---------- 内嵌阶段版（报告生成页 loadingView 等） ---------- */
.gj-stage{display:flex;justify-content:center;align-items:center;}
.gj-stage .gj-svg{width:220px;max-width:60vw;height:auto;display:block;}

/* ---------- 迷你版（替换原 .spinner 圆环） ---------- */
.gj-mini{display:inline-flex;align-items:center;justify-content:center;}
.gj-mini .gj-svg{width:96px;height:auto;display:block;}
.gj-mini.gj-inline .gj-svg{width:72px;}

/* ---------- SVG 内部样式 ---------- */
.gj-svg [data-letter]{stroke-dasharray:100;stroke-dashoffset:100;}
.gj-svg [data-shadow-path-1],.gj-svg [data-shadow-path-2]{opacity:0;}
.gj-svg [data-path-circle]{transform:scaleY(0);transform-origin:center;transform-box:fill-box;}

/* 迷你版纯 CSS 循环（负延迟保持相位差，波浪式书写感） */
.gj-mini .gj-svg [data-letter]{animation:gjm-draw 2.4s cubic-bezier(.45,.05,.55,.95) infinite;}
.gj-mini .gj-svg [data-letter]:nth-child(1){animation-delay:0s}
.gj-mini .gj-svg [data-letter]:nth-child(2){animation-delay:-.18s}
.gj-mini .gj-svg [data-letter]:nth-child(3){animation-delay:-.36s}
.gj-mini .gj-svg [data-letter]:nth-child(4){animation-delay:-.54s}
.gj-mini .gj-svg [data-letter]:nth-child(5){animation-delay:-.72s}
.gj-mini .gj-svg [data-letter]:nth-child(6){animation-delay:-.9s}
.gj-mini .gj-svg [data-letter]:nth-child(7){animation-delay:-1.08s}
.gj-mini .gj-svg [data-letter]:nth-child(8){animation-delay:-1.26s}
.gj-mini .gj-svg [data-letter]:nth-child(9){animation-delay:-1.44s}
.gj-mini .gj-svg [data-letter]:nth-child(10){animation-delay:-1.62s}
.gj-mini .gj-svg [data-letter]:nth-child(11){animation-delay:-1.8s}
.gj-mini .gj-svg [data-shadow-path-1],.gj-mini .gj-svg [data-shadow-path-2]{animation:gjm-fade 2.4s ease infinite;animation-delay:-.9s;}
.gj-mini .gj-svg [data-path-circle]{animation:gjm-dot 2.4s ease infinite;animation-delay:-1.1s;}
@keyframes gjm-draw{0%{stroke-dashoffset:100;opacity:1}30%{stroke-dashoffset:0}72%{stroke-dashoffset:0;opacity:1}84%{opacity:0}84.1%{stroke-dashoffset:100;opacity:0}100%{stroke-dashoffset:100;opacity:0}}
@keyframes gjm-fade{0%,25%{opacity:0}40%,75%{opacity:.9}88%,100%{opacity:0}}
@keyframes gjm-dot{0%,30%{transform:scaleY(0);opacity:1}45%,72%{transform:scaleY(1);opacity:1}84%,100%{transform:scaleY(0);opacity:0}}

/* 动效减敏：直接静态呈现 */
@media (prefers-reduced-motion: reduce){
    .gj-svg [data-letter]{stroke-dashoffset:0!important;animation:none!important;}
    .gj-svg [data-shadow-path-1],.gj-svg [data-shadow-path-2]{opacity:.9!important;animation:none!important;}
    .gj-svg [data-path-circle]{transform:scaleY(1)!important;animation:none!important;}
    .gj-overlay{transition:opacity .2s ease;}
}
