Files
kidgo/css/style.css
T

325 lines
16 KiB
CSS

:root{
--bg:#0a0a10; --bg2:#13131c; --line:#2c2c3c;
--fg:#e8e8f0; --dim:#9a9ab0;
--red:#e03050; --red2:#ff5c7a;
--gold:#ffc63a; --green:#3ddc84; --blue:#4aa8ff; --purple:#a86bff;
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%;overscroll-behavior:none}
body{
background:
radial-gradient(circle at 50% 20%, #1a1a28 0%, #08080d 70%);
color:var(--fg);
font-family:"Courier New",Consolas,Monaco,monospace;
display:flex;align-items:center;justify-content:center;
overflow:hidden;
}
#app{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:8px}
#stage{
position:relative;
width:min(100%, calc((100vh - 16px) * 800 / 608));
aspect-ratio:800/608;
background:#000;
border:3px solid var(--line);
box-shadow:0 0 0 3px #000, 0 12px 60px rgba(0,0,0,.8);
overflow:hidden;
}
canvas#game{
width:100%;height:100%;display:block;
image-rendering:pixelated;image-rendering:crisp-edges;
background:#0d0d16;
}
/* ---------- HUD ---------- */
#hud{position:absolute;inset:0;pointer-events:none;font-size:clamp(9px,1.35vh,14px)}
.hud-row{position:absolute;top:8px;left:8px;right:8px;display:flex;gap:6px;flex-wrap:wrap}
.hud-box{
background:rgba(0,0,0,.55);border:1px solid rgba(255,255,255,.18);
padding:3px 8px;letter-spacing:.5px;color:#fff;text-shadow:0 1px 0 #000;
}
.hud-box#hud-save.on{color:#d9b3ff;border-color:rgba(176,107,255,.7);box-shadow:0 0 8px rgba(176,107,255,.35)}
#boss-bar{position:absolute;top:38px;left:50%;transform:translateX(-50%);width:60%;min-width:220px}
.boss-name{text-align:center;font-size:clamp(10px,1.6vh,15px);letter-spacing:3px;color:var(--red2);text-shadow:0 2px 0 #000;margin-bottom:3px}
.boss-track{height:12px;background:#22222e;border:2px solid #000;box-shadow:0 0 0 1px #555}
.boss-fill{height:100%;width:100%;background:linear-gradient(#ff6b8a,#c01a3a);transition:width .12s linear}
#toast{
position:absolute;left:50%;top:34%;transform:translateX(-50%);
background:rgba(0,0,0,.72);border:1px solid #fff3;padding:8px 16px;
font-size:clamp(11px,2vh,18px);color:#fff;opacity:0;transition:opacity .2s;max-width:80%;text-align:center;line-height:1.5;
}
#toast.show{opacity:1}
/* ---------- Screens ---------- */
.screen{
position:absolute;inset:0;display:flex;flex-direction:column;
align-items:center;justify-content:center;gap:2vh;padding:3vh 3vw;
background:linear-gradient(#0a0a12ee,#0a0a12f6);
backdrop-filter:blur(2px);
font-size:clamp(10px,1.6vh,15px);
}
.screen.hidden{display:none}
#hud.hidden,#boss-bar.hidden{display:none}
.hidden{display:none !important} /* 通用:任何元素加 hidden 类即隐藏(如自制页「管理地图」按钮) */
.title-wrap{text-align:center;margin-bottom:1vh}
.title-sub{color:var(--dim);letter-spacing:6px;font-size:.75em}
.title-main{
font-size:clamp(22px,5.6vh,54px);line-height:1.05;letter-spacing:2px;
text-shadow:3px 3px 0 #000, 0 0 24px rgba(224,48,80,.35);
}
.title-main .red{color:var(--red);text-shadow:3px 3px 0 #000,0 0 20px rgba(224,48,80,.6)}
.title-tag{margin-top:1vh;color:var(--gold);letter-spacing:2px;font-size:.9em}
.menu{display:flex;flex-direction:column;gap:8px;width:min(340px,80%)}
.btn{
background:var(--bg2);color:var(--fg);border:2px solid var(--line);
padding:9px 14px;font-family:inherit;font-size:1em;letter-spacing:2px;
cursor:pointer;transition:.12s;text-align:center;
}
.btn:hover{background:var(--red);border-color:var(--red2);color:#fff;transform:translateY(-1px)}
.btn:active{transform:translateY(1px)}
.btn.big{font-size:1.25em;padding:12px;background:var(--red);border-color:var(--red2)}
.btn.big:hover{background:#ff4466}
.btn.small{font-size:.8em;padding:6px;color:var(--dim)}
.btn.tiny{font-size:.8em;padding:5px 10px}
.btn.go{background:var(--green);border-color:#7dffb0;color:#04180d}
.foot{position:absolute;bottom:10px;color:#5a5a70;font-size:.72em;text-align:center;width:100%;padding:0 12px}
/* ---------- Panels ---------- */
.panel{
background:var(--bg2);border:2px solid var(--line);
width:min(760px,96%);max-height:94%;display:flex;flex-direction:column;
padding:14px;gap:10px;overflow:hidden;
}
.panel.narrow{width:min(400px,92%)}
.panel-head{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--line);padding-bottom:6px}
.head-btns{display:flex;gap:6px;align-items:center}
.head-btns .btn.on{background:var(--red);border-color:var(--red2);color:#fff}
.panel h2{font-size:1.3em;letter-spacing:3px}
.panel h3{font-size:1em;letter-spacing:2px;color:var(--gold);margin-bottom:5px}
.tabs{display:flex;gap:6px;flex-wrap:wrap}
.tab{
background:#1b1b26;border:1px solid var(--line);color:var(--dim);
padding:4px 12px;cursor:pointer;font-size:.9em;letter-spacing:1px;font-family:inherit;
}
.tab.on{background:var(--red);border-color:var(--red2);color:#fff}
.level-grid{
display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));
gap:8px;overflow-y:auto;padding:4px 2px;flex:1;align-content:start;
}
.lv-card{
background:#1a1a25;border:1px solid var(--line);padding:8px;cursor:pointer;
transition:.12s;position:relative;text-align:left;
}
.lv-card:hover{border-color:var(--red2);background:#24243a;transform:translateY(-2px)}
.lv-card .idx{color:#55556a;font-size:.75em}
.lv-card .nm{font-size:1.05em;margin:2px 0 5px;letter-spacing:1px}
.lv-card .meta{display:flex;gap:5px;align-items:center;flex-wrap:wrap;font-size:.78em;color:var(--dim)}
.lv-card .st{margin-top:5px;font-size:.78em;color:var(--dim)}
.lv-card.cleared{border-color:#2f6b45}
.lv-card .chk{position:absolute;right:7px;top:6px;color:var(--green)}
/* 自制页管理态:删除按钮 */
.lv-card.manage{cursor:default;border-color:var(--red2)}
.lv-card.manage:hover{transform:none;border-color:var(--red);background:#241a22}
.lv-del{
position:absolute;right:6px;top:6px;width:22px;height:22px;padding:0;
background:#3a1420;border:1px solid var(--red2);color:var(--red);
font-family:inherit;font-size:.8em;line-height:1;cursor:pointer;border-radius:2px;
}
.lv-del:hover{background:var(--red);color:#fff;border-color:var(--red)}
.tag{padding:1px 6px;border:1px solid;font-size:.85em}
.t-jump{color:#ff8a5c;border-color:#ff8a5c}
.t-endur{color:#4ad0ff;border-color:#4ad0ff}
.t-boss{color:#ff5c7a;border-color:#ff5c7a}
.t-troll{color:#c08aff;border-color:#c08aff}
.t-custom{color:#ffc63a;border-color:#ffc63a}
.legend{display:flex;gap:8px;flex-wrap:wrap;border-top:1px solid var(--line);padding-top:7px;color:var(--dim);font-size:.85em;align-items:center}
.clear-title{text-align:center;font-size:2.4em;color:var(--gold);letter-spacing:6px;text-shadow:3px 3px 0 #000}
.result-body{display:flex;flex-direction:column;gap:5px}
.rline{display:flex;justify-content:space-between;border-bottom:1px dotted var(--line);padding:4px 2px}
.rline span{color:var(--dim)}
.rbest{color:var(--green);font-size:.85em;text-align:center;margin-top:4px}
/* ---------- Editor ---------- */
.editor-wrap{display:flex;gap:10px;flex:1;overflow:hidden}
.palette{width:112px;display:flex;flex-direction:column;gap:3px;overflow-y:auto;border-right:1px solid var(--line);padding-right:6px}
.pal{
display:flex;align-items:center;gap:5px;background:#1b1b26;border:1px solid var(--line);
padding:2px 5px;cursor:pointer;font-size:.75em;color:var(--dim);
}
.pal:hover{border-color:#888}
.pal.on{border-color:var(--gold);color:#fff;background:#2b2b3c}
.pal-cv{width:26px;height:26px;flex:none;border:1px solid #000;background:#101018;image-rendering:pixelated}
.pal .ch{font-weight:bold;color:var(--fg);width:12px;text-align:center}
.editor-main{flex:1;display:flex;flex-direction:column;gap:6px;min-width:0;overflow:auto}
.editor-bar{display:flex;gap:5px;align-items:center;flex-wrap:wrap}
.editor-bar input,.editor-bar select{
background:#111119;border:1px solid var(--line);color:var(--fg);
font-family:inherit;font-size:.85em;padding:4px 6px;
}
#ed-name{width:110px}#ed-w{width:52px}#ed-h{width:52px}
.ed-wh{display:inline-flex;align-items:center;gap:3px;font-size:.78em;color:var(--dim)}
.ed-wh input{width:48px}
canvas#ed-canvas{
width:800px;height:auto;background:#0d0d16;border:1px solid var(--line);
image-rendering:pixelated;cursor:crosshair;display:block;
}
.editor-tip{color:var(--dim);font-size:.78em}
.editor-side{width:170px;display:flex;flex-direction:column;gap:5px;border-left:1px solid var(--line);padding-left:8px;overflow-y:auto}
#my-levels{display:flex;flex-direction:column;gap:4px}
.my-lv{background:#1b1b26;border:1px solid var(--line);padding:4px 6px;font-size:.78em;cursor:pointer;display:flex;justify-content:space-between;gap:4px}
.my-lv:hover{border-color:var(--gold)}
.my-lv.on{border-color:var(--gold);background:#2b2b3c}
.my-lv .x{color:var(--red)}
.face-btns{display:flex;gap:4px;flex-wrap:wrap}
#ed-faces{display:flex;flex-direction:column;gap:4px;max-height:160px;overflow-y:auto}
.face-row{background:#1b1b26;border:1px solid var(--line);padding:3px 5px;font-size:.78em;cursor:pointer;display:flex;flex-direction:column;gap:2px}
.face-row:hover{border-color:var(--gold)}
.face-row.on{border-color:var(--gold);background:#2b2b3c}
.face-row .face-name{background:#111119;border:1px solid var(--line);color:var(--fg);font-family:inherit;font-size:1em;padding:2px 4px;width:100%}
.face-row .face-wh{color:var(--dim);font-size:.9em}
/* 属性面板(选中方块) */
#ed-props{display:flex;flex-direction:column;gap:5px;max-height:36vh;overflow-y:auto;border:1px solid var(--line);background:#111119;padding:6px}
.prop-empty{color:var(--dim);font-size:.76em;line-height:1.5}
.prop-head{color:var(--gold);font-weight:bold;font-size:.92em;letter-spacing:1px;margin-bottom:2px}
.prop-row{display:flex;flex-direction:column;gap:3px;background:#1b1b26;border:1px solid var(--line);padding:4px 5px;font-size:.78em}
.prop-lab{color:var(--fg)}
.prop-note{color:var(--dim);font-size:.92em}
.prop-ctl{display:flex;gap:4px}
.prop-in{background:#111119;border:1px solid var(--line);color:var(--fg);font-family:inherit;font-size:1em;padding:3px 4px;width:100%}
.prop-ctl .prop-in{width:auto;flex:1}
/* 「保存」去向提示 */
.save-state{color:var(--dim);font-size:.78em;white-space:nowrap;align-self:center}
.save-state.on{color:var(--gold)}
/* 导入地图弹窗 */
.modal{position:fixed;inset:0;z-index:60;display:flex;align-items:center;justify-content:center;background:rgba(4,4,10,.72);padding:4vh 4vw}
.modal.hidden{display:none}
.modal-panel{background:var(--bg2);border:2px solid var(--line);width:min(380px,94%);max-height:86vh;display:flex;flex-direction:column;gap:8px;padding:14px}
.modal-panel h3{font-size:1.05em;letter-spacing:2px;color:var(--gold)}
.modal-tip{color:var(--dim);font-size:.78em;line-height:1.5}
#ed-import-list{display:flex;flex-direction:column;gap:4px;overflow-y:auto}
.imp-row{background:#1b1b26;border:1px solid var(--line);padding:6px 8px;font-size:.84em;cursor:pointer;display:flex;justify-content:space-between;align-items:center;gap:6px}
.imp-row:hover{border-color:var(--gold)}
.imp-row.on{border-color:var(--gold);background:#2b2b3c}
.imp-nm{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.imp-meta{color:var(--dim);font-size:.9em;white-space:nowrap}
.imp-empty{color:var(--dim);font-size:.8em;padding:10px 2px}
.modal-btns{display:flex;justify-content:flex-end;gap:6px}
/* ---------- 设置界面 ---------- */
.title-user{color:var(--dim);font-size:.85em;letter-spacing:2px;margin-top:1vh}
.set-body{display:flex;flex-direction:column;gap:14px;overflow-y:auto;padding:2px}
.set-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.set-row.col{flex-direction:column;align-items:stretch;gap:6px;justify-content:flex-start}
.set-lab{color:var(--gold);letter-spacing:1px;font-size:.95em;min-width:64px}
.set-in{background:#111119;border:1px solid var(--line);color:var(--fg);font-family:inherit;font-size:1em;padding:6px 8px;min-width:200px}
.set-in:focus{outline:none;border-color:var(--gold)}
.set-hint{color:var(--dim);font-size:.78em}
.set-btns{margin-top:2px}
/* 键盘按键映射面板(电脑端) */
.set-keys{display:flex;flex-direction:column;gap:8px}
.krow{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.kact{color:var(--fg);min-width:104px;font-size:.92em}
.kkeys{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.kchip{
position:relative;background:#1a1a26;border:1px solid var(--line);color:var(--fg);
font-family:inherit;font-size:.88em;padding:5px 22px 5px 10px;border-radius:7px;cursor:pointer;
transition:border-color .1s,background .1s;
}
.kchip:hover{border-color:var(--gold)}
.kchip.listen{border-color:var(--gold);background:rgba(255,198,58,.16);box-shadow:0 0 0 2px rgba(255,198,58,.25)}
.kchip .krm{
position:absolute;top:-7px;right:-7px;width:16px;height:16px;border-radius:50%;
background:#c01a3a;color:#fff;font-size:.62em;line-height:16px;text-align:center;
border:1px solid #000;cursor:pointer;
}
.kadd{
background:transparent;border:1px dashed var(--line);color:var(--dim);
font-family:inherit;font-size:.82em;padding:5px 9px;border-radius:7px;cursor:pointer;
}
.kadd:hover{color:var(--gold);border-color:var(--gold)}
.klisten{color:var(--gold);font-size:.8em;animation:blink 1s infinite}
.klisten.bad{color:#ff6b6b;animation:none;font-weight:bold}
.kwarb{
width:100%;box-sizing:border-box;margin:0 0 10px;padding:8px 12px;border-radius:8px;
background:rgba(192,26,58,.16);border:1px solid #c01a3a;color:#ff8a8a;font-size:.86em;
}
@keyframes blink{50%{opacity:.4}}
/* 手机手柄预览区(与舞台同比例),按钮绝对定位可拖拽 */
.touch-preview{
position:relative;width:100%;aspect-ratio:800/608;
background:#0d0d16;border:1px solid var(--line);overflow:hidden;max-height:46vh;
}
.tp-tip{
position:absolute;top:6px;left:50%;transform:translateX(-50%);
color:var(--dim);font-size:.72em;background:rgba(0,0,0,.45);
padding:2px 8px;border-radius:6px;pointer-events:none;z-index:3;white-space:nowrap;
}
::-webkit-scrollbar{width:8px;height:8px}
::-webkit-scrollbar-track{background:#111}
::-webkit-scrollbar-thumb{background:#333;}
@media (max-width:720px){
.editor-wrap{flex-direction:column;overflow-y:auto}
.palette{width:100%;flex-direction:row;flex-wrap:wrap;border-right:none;border-bottom:1px solid var(--line);padding-bottom:6px}
.editor-side{width:100%;border-left:none;border-top:1px solid var(--line);padding-top:8px}
}
/* ---------- 移动端虚拟手柄(参考 IWBT Creator 触屏布局) ---------- */
/* 桌面端兜底:只要 <html> 没有 .touch 类(即未检测到移动端/触屏),无论如何都不显示按钮 */
html:not(.touch) #touch{display:none !important}
#touch{
position:absolute;inset:0;z-index:25;
display:flex;justify-content:space-between;align-items:flex-end;
padding:12px 12px max(14px, env(safe-area-inset-bottom));
pointer-events:none; /* 仅按钮可点,中间区域穿透到画布 */
touch-action:none;
}
#touch.hidden{display:none}
.tc-left,.tc-right{display:flex;gap:14px;align-items:flex-end;pointer-events:none}
.tc-right{flex-direction:column;align-items:flex-end}
.tc-top{display:flex;gap:10px;margin-bottom:10px}
.tc-mid{display:flex;gap:12px;align-items:flex-end;margin-bottom:10px}
.tc-btn{
pointer-events:auto;-webkit-user-select:none;user-select:none;touch-action:none;
position:absolute;transform:translate(-50%,-50%);
background:rgba(18,18,28,.52);border:2px solid rgba(255,255,255,.28);
color:#fff;font-family:inherit;display:flex;align-items:center;justify-content:center;
flex-direction:column;line-height:1;backdrop-filter:blur(2px);
box-shadow:0 2px 8px rgba(0,0,0,.35);
transition:transform .05s, background .1s, filter .1s;
}
.tc-btn span{font-size:1.5em}
.tc-btn .lbl{font-size:.6em;letter-spacing:1px;opacity:.85;margin-top:2px}
.tc-btn.on,.tc-btn:active{transform:translate(-50%,-50%) scale(.93);background:rgba(224,48,80,.6);border-color:#ff5c7a}
/* 设置界面预览里的缩放手柄(真实手柄不挂此元素) */
.tc-rsz{
position:absolute;right:-7px;bottom:-7px;width:16px;height:16px;border-radius:50%;
background:var(--gold);border:2px solid #000;cursor:nwse-resize;opacity:.92;touch-action:none;
box-shadow:0 1px 4px rgba(0,0,0,.5);
}
.tc-move{width:62px;height:62px;border-radius:14px}
.tc-item{width:54px;height:54px;border-radius:50%}
.tc-sm{width:42px;height:42px;border-radius:11px;font-size:1em}
.tc-jump{
width:94px;height:94px;border-radius:50%;margin-top:4px;
background:radial-gradient(circle at 35% 30%, #ff7088, #c01a3a);
border:3px solid #ffd0da;box-shadow:0 6px 18px rgba(192,26,58,.5);
font-size:1.9em;font-weight:bold;color:#fff;
}
.tc-jump.on,.tc-jump:active{transform:translate(-50%,-50%) scale(.92);filter:brightness(1.12)}
/* 未持枪时射击键置灰 */
#tc-gun.off{opacity:.4;filter:grayscale(1);background:rgba(18,18,28,.4)}