@font-face{font-family:GuardTitle;src:url(assets/title.ttf) format('truetype');font-display:swap}
:root{color-scheme:dark;--ink:#101b20;--panel:#1d2e31;--line:#9e8656;--gold:#edcf89;--paper:#e7dfc5;--muted:#aeb6a1;--jade:#87b5a1;--danger:#e38d74;--ui-scale:1;font:16px/1.5 'Microsoft YaHei UI','Microsoft YaHei',system-ui,sans-serif}
*{box-sizing:border-box}html,body{margin:0;width:100%;height:100%;overflow:hidden;background:#142220;color:var(--paper);user-select:none}button,input,select{font:inherit}button{cursor:pointer;color:inherit}button:disabled{cursor:default;filter:saturate(.4);opacity:.45}button:focus-visible,select:focus-visible,input:focus-visible{outline:2px solid #bde9dd;outline-offset:4px}button:not(:disabled):active{transform:translateY(2px)}button{touch-action:manipulation}h1,h2,h3,p{margin:0}h1,h2{font-family:GuardTitle,'Microsoft YaHei',sans-serif;font-weight:normal;letter-spacing:.08em}h3{font-size:1rem}small{font-size:.76rem;color:var(--muted)}svg{width:1.2em;height:1.2em;fill:currentColor;vertical-align:-.2em;flex-shrink:0}img{display:block;max-width:100%}
#game,#battlefield,#lettering,#ui{position:absolute;inset:0;width:100%;height:100%}#battlefield{display:block;outline:0}#lettering{pointer-events:none}#ui{pointer-events:none}#ui button,#ui select,#ui .interactive{pointer-events:auto}#loader{position:absolute;inset:0;z-index:100;display:flex;align-items:center;justify-content:center;flex-direction:column;gap:18px;background:radial-gradient(ellipse at 50% 35%,#314449,#101d23 75%)}#loader h1{font-size:3.4rem;color:var(--gold);text-shadow:0 3px 0 #090f14}.loading-crest{font-size:5rem;color:#ddc68d;animation:breathe 2.5s ease-in-out infinite}.loading-track{height:4px;width:240px;background:#8e927128;overflow:hidden;border-radius:4px}.loading-track i{display:block;height:100%;background:var(--gold);width:35%;animation:loading 1.5s ease-in-out infinite}#loader.hidden{display:none}@keyframes loading{0%{transform:translateX(-120%)}100%{transform:translateX(350%)}}@keyframes breathe{50%{opacity:.5;transform:scale(.94)}}
.glass{background:linear-gradient(140deg,#253a3aef,#17262bf5);border:1px solid #a58d5f;box-shadow:0 3px 0 #111a20,0 6px 18px #05111655,inset 0 1px #e4d9a71c}.plate{position:relative;border:1px solid #7e7554;border-radius:8px;background:linear-gradient(#30413d,#233531);box-shadow:inset 0 1px #d4c49826,0 3px 0 #0d191c;color:#e3d7b4;padding:10px 19px;min-height:44px;transition:background .15s,border-color .15s,filter .15s}.plate:hover:not(:disabled){background:linear-gradient(#43554a,#2b423b);border-color:#d8bf84}.plate.primary{background:linear-gradient(#c19b52,#986832);border-color:#e2bd79;color:#fff0c7;text-shadow:0 1px #493519;box-shadow:inset 0 1px #ffdf8a70,0 3px 0 #52391d}.plate.primary:hover:not(:disabled){background:linear-gradient(#d7ae61,#a67c3e)}.plate.danger{border-color:#9a6c57;color:#f0b49a}.plate.active{border-color:#e7cf8d;color:#ffe7a6;box-shadow:inset 0 0 20px #cab27320,0 3px 0 #0d191c}.plate.icon{width:44px;height:44px;padding:8px}.plate.icon svg{width:24px;height:24px}.tag{font-size:.7rem;letter-spacing:.14em;color:#c9b989;text-transform:uppercase}.serif{font-family:GuardTitle,'Microsoft YaHei',sans-serif}.gold{color:var(--gold)}.muted{color:var(--muted)}.row{display:flex;align-items:center;gap:12px}.spread{justify-content:space-between}.column{display:flex;flex-direction:column;gap:12px}.pill{font-size:.8rem;padding:5px 10px;border:1px solid #86917566;border-radius:20px;background:#111f26aa}.separator{height:1px;background:linear-gradient(90deg,transparent,#9c8b625a,transparent);margin:14px 0}
.campaign-title{position:absolute;top:max(22px,env(safe-area-inset-top));left:32px;text-shadow:0 2px 3px #13241c,0 0 20px #13241c}.campaign-title h1{font-size:2.3rem;color:#f4d895}.campaign-title p{font-size:.8rem;letter-spacing:.2em;color:#f2e9ce}.campaign-top{position:absolute;top:25px;right:28px;display:flex;gap:10px;align-items:center}.star-count{padding:8px 18px;border-radius:7px;font-size:1.2rem;color:var(--gold)}.star-count svg{margin-right:10px}.campaign-legend{position:absolute;top:118px;left:32px;display:flex;gap:8px;flex-direction:column;color:#e7e4c9;text-shadow:0 1px 5px #17261a;font-size:.82rem}.campaign-legend i{display:inline-block;width:7px;height:7px;margin-right:7px;transform:rotate(45deg)}.campaign-node{position:absolute;width:60px;height:64px;transform:translate(-50%,-50%);pointer-events:auto;background:linear-gradient(#334944,#172927);border:2px solid #b2a16a;border-radius:13px 13px 20px 20px;box-shadow:0 4px 0 #283023,0 7px 14px #13221677;color:#e4d79e}.campaign-node:not(:disabled):active{transform:translate(-50%,calc(-50% + 2px))}.campaign-node:hover:not(:disabled){border-color:#fff0af;filter:brightness(1.2)}.campaign-node.selected{border-color:#fff2b6;box-shadow:0 0 0 3px #ffe3a23b,0 0 24px #ffd98870,0 5px 0 #293123}.campaign-node.boss{border-color:#be8b66}.campaign-node .level-number{font-family:GuardTitle,sans-serif;font-size:1.55rem;display:block;line-height:1.2}.campaign-node svg{width:19px;height:19px}.campaign-node .node-stars{position:absolute;top:65px;left:-9px;width:75px;color:#f1d58b;font-size:.87rem;letter-spacing:1px;text-shadow:0 2px #283123}.campaign-node .node-name{position:absolute;top:87px;left:-52px;width:160px;text-align:center;color:#f5eed9;font-size:.8rem;text-shadow:0 1px 5px #0c211b;white-space:nowrap}.campaign-node:disabled{opacity:.82;filter:saturate(.45);background:#273333}.campaign-bottom{position:absolute;bottom:22px;left:50%;transform:translateX(-50%);width:min(920px,calc(100% - 44px));display:flex;flex-direction:column;gap:14px}.mission-strip{border-radius:10px;padding:16px 22px;display:flex;align-items:center;justify-content:space-between;gap:20px}.mission-strip h2{font-size:1.25rem;color:var(--gold)}.mission-strip p{margin-top:4px;color:#d2d5bf;font-size:.82rem}.mission-actions{display:flex;gap:10px;align-items:center}.mission-actions select{background:#273b37;color:#efe6c5;border:1px solid #9a8a61;border-radius:6px;padding:10px;min-height:44px}.mission-actions .primary{min-width:160px}.navigation{align-self:center;display:flex;gap:8px;padding:8px;border-radius:10px}.navigation button{min-width:120px;font-size:.9rem;display:flex;gap:8px;align-items:center;justify-content:center}.save-badge{font-size:.65rem;color:#c4cdba;max-width:140px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#modal-root{position:absolute;inset:0;z-index:30;pointer-events:none}.veil{position:absolute;inset:0;background:#08151dcc;backdrop-filter:blur(5px);display:flex;align-items:center;justify-content:center;padding:24px;pointer-events:auto}.modal{width:min(1040px,96vw);max-height:92dvh;display:flex;flex-direction:column;border-radius:14px;border:1px solid #b9a06a;background:radial-gradient(ellipse at 50% 0,#3a4c43 0,#243638 42%,#162731 100%);box-shadow:0 20px 80px #020a13cc,inset 0 1px #f5d7934d;overflow:hidden;animation:arrive .22s ease-out}.modal:before{content:'';position:absolute;pointer-events:none}.modal-header{padding:20px 26px 14px;display:flex;justify-content:space-between;align-items:center;gap:20px;border-bottom:1px solid #a68e5b44}.modal-header h2{color:var(--gold);font-size:1.6rem}.modal-header p{font-size:.8rem;color:#adb9a8;margin-top:4px}.modal-header button{width:36px;height:36px;border-radius:50%;border:1px solid #a69363;background:#172a2f;color:#e9d19c;font-size:1.5rem}.modal-body{overflow:auto;padding:24px 26px 28px;scrollbar-width:thin;scrollbar-color:#8e9a79 #172b32}.modal.compact{max-width:520px}.modal.compact .modal-body{padding:22px 30px 28px}.modal-footer{padding:14px 26px;border-top:1px solid #95885b44;display:flex;gap:10px;justify-content:flex-end}.hero-roster{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}.hero-card{position:relative;border:1px solid #6f7d6c;border-radius:10px;background:radial-gradient(ellipse at 50% 35%,#4a5964,#1a2a34 78%);padding:14px;text-align:left;overflow:hidden}.hero-card img{width:100%;height:225px;object-fit:contain;filter:drop-shadow(0 6px 6px #06131d99)}.hero-card h3{font:1.15rem GuardTitle,sans-serif;color:#ecd299;margin-top:10px}.hero-card p{font-size:.73rem;color:#c3ccbd;margin-top:3px}.hero-card .role{min-height:34px}.hero-card.selected{border-color:#ebd298;box-shadow:inset 0 0 30px #e2bd7620}.hero-detail{margin-top:23px;display:grid;grid-template-columns:1fr 1.8fr;gap:28px}.hero-detail h2{font-size:1.3rem;color:#ead49a;margin-bottom:10px}.hero-detail p{font-size:.8rem;color:#c5cdbc}.xp-track{height:6px;border-radius:5px;background:#15242c;margin:10px 0 5px;overflow:hidden}.xp-track i{display:block;height:100%;background:linear-gradient(90deg,#7aab95,#c1d38e)}.hero-numbers{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:15px;font-size:.78rem}.hero-numbers span{padding:7px 10px;background:#0f22275e;border-radius:6px}.skill-list{display:flex;flex-direction:column;gap:8px}.hero-skill{display:flex;align-items:center;gap:13px;border-bottom:1px solid #8191742e;padding:10px 0}.hero-skill .skill-emblem{width:42px;height:42px;border:1px solid #7e8e72;border-radius:50%;display:flex;align-items:center;justify-content:center;color:#ddcea1;flex-shrink:0}.hero-skill .skill-copy{flex:1}.hero-skill h3{color:#ded3ab;font-size:.8rem}.hero-skill p{font-size:.7rem;color:#aebbaa;margin:3px 0}.hero-skill button{padding:7px 11px;font-size:.74rem;min-width:72px}.tech-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.tech-tree{border:1px solid #6e7b68;border-radius:10px;padding:16px;background:#10252c55}.tech-tree h3{color:#e4ce97;font-family:GuardTitle,sans-serif;font-size:1.15rem;margin-bottom:14px}.tech-node{display:flex;align-items:center;gap:10px;padding:10px 0;border-top:1px solid #8c987035}.tech-node .tech-number{border:1px solid #69775e;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:50%;font-size:.75rem;flex-shrink:0}.tech-node.learned .tech-number{background:#60774f;border-color:#d3c48e;color:#fff0b4}.tech-node h4{margin:0;font-size:.8rem;font-weight:500}.tech-node p{font-size:.7rem;color:#adbda7}.tech-tree button{width:100%;font-size:.8rem;margin-top:10px}.codex-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}.codex-entry{border:1px solid #6e7a6580;border-radius:8px;padding:13px;display:flex;gap:12px;background:#10232b77}.codex-entry img{width:65px;height:75px;object-fit:contain}.codex-entry h3{color:#e3d09e;font-size:.8rem}.codex-entry p{font-size:.69rem;color:#b6c2b1;margin-top:4px}.section-title{font-family:GuardTitle,sans-serif;color:#e8cb8d;font-size:1.2rem;margin:20px 0 14px}.section-title:first-child{margin-top:0}.setting-row{display:flex;align-items:center;justify-content:space-between;padding:12px 0;border-bottom:1px solid #7b8f7529;gap:12px}.setting-row label{font-size:.85rem}.toggle{width:50px;height:27px;border-radius:20px;background:#14232a;border:1px solid #839274;position:relative;padding:0}.toggle:after{content:'';position:absolute;width:19px;height:19px;border-radius:50%;background:#9aa595;top:3px;left:3px;transition:left .15s}.toggle.on{background:#526d56}.toggle.on:after{left:25px;background:#e5d99f}.setting-buttons{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:18px}.setting-buttons .plate{font-size:.78rem}.settings-help{font-size:.74rem;line-height:1.9;color:#b7c3af;margin-top:20px}.settings-help kbd{color:#e6d19a;font-family:inherit}.result-crest{text-align:center;margin:8px 0 20px}.result-crest .stars{font-size:3.4rem;letter-spacing:8px;color:#efce7a;text-shadow:0 3px #6b5739,0 0 25px #e4bd532f}.result-crest h2{margin-top:8px;color:#e6d29c;font-size:1.8rem}.result-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:20px 0}.result-grid div{text-align:center;background:#14272b77;border:1px solid #6b7f6566;padding:12px;border-radius:8px}.result-grid strong{display:block;font:1.6rem GuardTitle,sans-serif;color:#e4d393}.result-grid span{font-size:.73rem;color:#adbda7}#toasts{position:absolute;left:50%;top:105px;transform:translateX(-50%);display:flex;flex-direction:column;gap:6px;align-items:center;pointer-events:none;z-index:60}.toast{background:#142930ed;border:1px solid #b6a16a88;border-radius:7px;padding:8px 20px;font-size:.78rem;color:#edddb6;box-shadow:0 4px 15px #07151e44;animation:arrive .2s ease-out}.error-note{padding:12px;border:1px solid #bc7c62;border-radius:8px;color:#e5b8a1;font-size:.78rem;line-height:1.7;margin-top:12px}.build-menu .tower-option img{image-rendering:auto}
@keyframes arrive{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
@media(min-width:1800px){:root{font-size:18px}.hero-button{width:113px;height:142px}.hero-button img{height:103px}.spell-button{width:100px;height:118px}.spell-button img{width:84px;height:84px}.build-menu{width:352px}.tower-option img{width:96px;height:86px}.tower-option{min-height:139px}.campaign-node{width:66px;height:70px}.campaign-node .node-stars{top:71px}.campaign-node .node-name{top:94px}.wave-call{min-width:216px;min-height:84px}.battle-dock{gap:16px;bottom:25px}}
@media(max-height:760px){.campaign-title h1{font-size:1.8rem}.campaign-title{top:16px}.campaign-legend{top:93px}.campaign-bottom{bottom:15px;gap:9px}.mission-strip{padding:12px 18px}.navigation{padding:5px}.navigation button{padding:8px 13px;min-height:40px}.hero-button{width:88px;height:110px}.hero-button img{height:78px}.spell-button{width:78px;height:94px}.spell-button img{width:64px;height:64px}.battle-dock{bottom:15px;left:16px;gap:10px}.battle-stats{font-size:1rem;padding:8px 15px;top:12px;left:14px;gap:18px}.battle-controls{top:12px;right:14px}.wave-call{bottom:15px;right:16px;min-width:170px;min-height:66px}.hero-card img{height:165px}.modal-body{padding:18px 22px}.modal-header{padding:15px 22px}.hero-detail{margin-top:18px}.campaign-node{width:51px;height:55px}.campaign-node .level-number{font-size:1.3rem}.campaign-node .node-stars{top:54px}.campaign-node .node-name{top:74px;font-size:.72rem}.build-menu{max-height:calc(100dvh - 95px)}.battle-hint{bottom:127px}.inspector{bottom:15px}}
@media(max-width:950px){.battle-name{top:71px;font-size:.76rem}.battle-stats{gap:15px}.campaign-title{left:20px}.campaign-title h1{font-size:1.8rem}.campaign-top{right:18px;top:18px}.campaign-legend{display:none}.hero-roster{gap:8px}.hero-card{padding:9px}.hero-card img{height:165px}.hero-detail{grid-template-columns:1fr;gap:18px}.tech-grid,.codex-grid{grid-template-columns:repeat(2,1fr)}.inspector{left:auto;right:15px;bottom:99px;transform:none;min-width:220px;max-width:280px}.navigation button{min-width:0}.campaign-node .node-name{font-size:.65rem}.mission-strip p{max-width:350px}.mission-actions .primary{min-width:125px}}
@media(max-width:620px){:root{font-size:14px}.battle-stats{gap:12px;padding:8px 10px;left:8px;top:8px}.battle-controls{right:8px;top:8px;gap:5px}.battle-controls .plate{min-width:34px;min-height:36px;width:36px;height:36px;padding:5px}.battle-controls .fullscreen{display:none}.battle-dock{left:8px;bottom:10px;gap:7px}.hero-button{width:67px;height:88px}.hero-button img{height:63px}.hero-button .hero-lv{font-size:.6rem}.spell-button{width:56px;height:76px;padding:4px 4px 20px}.spell-button img{width:47px;height:47px}.spell-button .label{font-size:.6rem;bottom:4px}.spell-button kbd{font-size:.6rem}.spell-button .countdown{font-size:1.3rem;top:15px}.wave-call{right:8px;bottom:12px;min-width:109px;min-height:62px;padding:8px 10px;gap:6px}.wave-call strong{font-size:.8rem}.wave-call small{font-size:.65rem}.wave-call .horn{font-size:1rem}.battle-hint{bottom:105px;max-width:80vw;text-align:center;font-size:.7rem}.entrance-wave{width:38px;height:38px}.entrance-wave small{top:38px}.hero-roster{grid-template-columns:repeat(2,1fr)}.hero-card img{height:145px}.tech-grid,.codex-grid{grid-template-columns:1fr}.modal-body{padding:16px}.modal-header{padding:14px 16px}.modal-header h2{font-size:1.3rem}.veil{padding:10px}.modal{max-height:95dvh}.mission-strip{padding:12px;gap:10px;flex-direction:column;align-items:stretch}.mission-actions{justify-content:space-between}.mission-strip h2{font-size:1.05rem}.mission-strip p{font-size:.72rem}.navigation{width:100%;justify-content:space-around;gap:3px}.navigation button{padding:8px 7px;font-size:.77rem}.navigation svg{display:none}.campaign-bottom{width:calc(100% - 20px);bottom:10px}.campaign-title{top:12px;left:12px}.campaign-title h1{font-size:1.4rem}.campaign-title p{font-size:.6rem}.campaign-top{top:12px;right:12px;gap:6px}.star-count{padding:7px 10px;font-size:.9rem}.campaign-top .save-badge{display:none}.campaign-node{width:42px;height:45px;border-radius:10px}.campaign-node .level-number{font-size:1.1rem}.campaign-node .node-name{display:none}.campaign-node .node-stars{top:46px;left:-18px;font-size:.7rem}.build-menu{width:276px;max-height:calc(100dvh - 90px);padding:11px}.tower-option{min-height:108px}.tower-option img{width:75px;height:65px}.inspector{min-width:190px;bottom:88px;padding:8px 10px;right:8px;max-width:230px}.inspector .stats{font-size:.68rem;gap:8px}.boss-bar{top:93px;width:58vw}.battle-name{top:58px}.campaign-title p{letter-spacing:.05em}}
@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.001ms!important;transition:none!important}}
