.sub{color:#666;font-size:.9rem;margin:0 0 1rem}.card{background:#fff;border-radius:12px;padding:18px 18px 16px;margin:0 0 14px;box-shadow:0 1px 3px rgba(0,0,0,.07);border:1px solid #e8eaed}.card .title{font-size:1.05rem;margin:0 0 10px;display:flex;align-items:center;gap:8px}.hint{font-size:.82rem;color:#666;margin:0 0 10px}.tabs{display:flex;gap:6px;flex-wrap:wrap;margin:0 0 4px}.tab{border:1.5px solid #ddd;background:#fff;border-radius:10px;padding:7px 14px;font-size:.85rem;font-weight:600;cursor:pointer;color:#333}.tab:hover{border-color:#0d6efd;color:#0d6efd}.tab.active{background:#0d6efd;border-color:#0d6efd;color:#fff}.panel{display:none}.panel.active{display:block}.badge{display:inline-block;padding:3px 10px;border-radius:999px;font-size:.8rem;font-weight:700}.b-unavailable{background:#fee;color:#c00}.b-downloadable{background:#fff3cd;color:#856404}.b-downloading{background:#cce5ff;color:#004085}.b-available{background:#d4edda;color:#155724}.b-idle{background:#eee;color:#555}.row{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:10px}.req{font-size:.88rem;margin:4px 0}.req .dot{display:inline-block;width:1.1em;text-align:center;margin-right:4px}.dot.ok{color:#28a745}.dot.fail{color:#dc3545}.dot.warn{color:#e0a800}.dot.idle{color:#aaa}.req .d{font-size:.78rem;color:#888;margin-left:1.4em}button,input,select,textarea{font:inherit}textarea{width:100%;min-height:96px;padding:10px 12px;border:1px solid #ddd;border-radius:8px;resize:vertical;font-family:inherit;background:#fff}input:focus,select:focus,textarea:focus{outline:2px solid #0d6efd;outline-offset:-1px}button{padding:9px 18px;border:none;border-radius:8px;cursor:pointer;font-weight:600}button:disabled{opacity:.5;cursor:not-allowed}.btn-primary{background:#0d6efd;color:#fff}.btn-primary:hover:not(:disabled){background:#0b5ed7}.btn-load{background:#e67e22;color:#fff}.btn-load:hover:not(:disabled){filter:brightness(.95)}.btn-ghost{background:0 0;color:#0d6efd;border:1px solid #0d6efd;padding:7px 12px;font-size:.85rem}.btn-sec{background:#6c757d;color:#fff}.progress-wrap{display:none;margin-top:10px;padding:12px;background:#f8f9fa;border:1px solid #e8eaed;border-radius:8px}.progress-wrap.on{display:block}.progress-wrap .t{font-size:.85rem;font-weight:600;margin-bottom:6px}progress{width:100%;height:18px}.progress-wrap .s{font-size:.8rem;color:#666;margin-top:4px}.out{margin-top:12px;padding:12px 14px;background:#f0f4ff;border-radius:8px;min-height:48px;white-space:pre-wrap;word-break:break-word;font-size:.95rem}.out:empty{display:none}.out .lbl{font-size:.75rem;color:#666;margin-bottom:4px;font-weight:600}.err{display:none;margin-top:10px;padding:10px 12px;background:#fee;color:#c00;border-radius:8px;font-size:.88rem;white-space:pre-wrap}.err.on{display:block}.meta{font-size:.78rem;color:#888;margin-top:6px}.browser-note{display:none;margin-top:10px;padding:10px 12px;background:#fff8e6;color:#856404;border:1px solid #ffe08a;border-radius:8px;font-size:.85rem}.browser-note.on{display:block}.drop{border:2px dashed #c5cdd8;border-radius:10px;padding:18px;text-align:center;color:#666;cursor:pointer;background:#fafbfc;font-size:.9rem}.drop.over,.drop:hover{border-color:#0d6efd;background:#eef4ff;color:#0d6efd}.drop input{display:none}.preview{display:none;margin-top:10px}.preview.on{display:flex;gap:12px;align-items:flex-start;flex-wrap:wrap}.preview img{max-width:200px;max-height:160px;border-radius:8px;border:1px solid #eee;object-fit:contain;background:#fff}.preview .m{font-size:.82rem;color:#555}.foot{font-size:.8rem;color:#888;margin-top:8px}.foot a{color:#0d6efd}code{font-size:.85em;background:#f0f0f0;padding:1px 5px;border-radius:4px}label.inline{font-size:.85rem;font-weight:600;display:flex;align-items:center;gap:6px}select{padding:6px 10px;border:1px solid #ddd;border-radius:8px;background:#fff}.console-card{padding-top:14px}.console-head{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap;margin-bottom:8px}.console-head .title{margin:0}.console-panel{background:#1e1e1e;color:#d4d4d4;border-radius:8px;padding:10px 12px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.78rem;max-height:220px;overflow-y:auto;min-height:48px;line-height:1.45}.console-panel:empty::before{content:'（執行時的 console.warn / error 與 API 失敗會出現在這裡）';color:#777}.console-panel .c-line{padding:3px 0;border-bottom:1px solid #333;word-break:break-word;white-space:pre-wrap}.console-panel .c-line:last-child{border-bottom:none}.console-panel .c-tag{display:inline-block;padding:0 6px;border-radius:3px;font-weight:700;font-size:.68rem;margin-right:6px;vertical-align:middle}.console-panel .c-tag.warn{background:#ffc107;color:#000}.console-panel .c-tag.error{background:#dc3545;color:#fff}.console-panel .c-tag.info{background:#0d6efd;color:#fff}.console-panel .c-tag.api{background:#6f42c1;color:#fff}.live-banner{display:none;margin-top:10px;padding:10px 12px;border-radius:8px;font-size:.88rem;background:#fee;color:#a00;border:1px solid #f5c2c7;white-space:pre-wrap;word-break:break-word}.live-banner.on{display:block}.live-banner.warn-tone{background:#fff3cd;color:#856404;border-color:#ffe08a}@keyframes btn-pulse{0%,100%{opacity:1}50%{opacity:.65}}button.loading{animation:btn-pulse .8s ease-in-out infinite;pointer-events:none}