Skip to content

Commit a96086b

Browse files
committed
Code audit fixes + download page redesign
- Fix XSS vulnerability in code block rendering (innerHTML → DOM API) - Fix missing @Keyframes fadeOut breaking view transitions - Replace busy-wait search index loading with Promise-based approach - Add clipboard API fallback using execCommand for older browsers - Rewrite service worker with LRU cache eviction and offline HTML fallback - Add WCAG accessibility: aria-hidden on decorative SVGs, aria-labels on links - Add focus-visible styles for keyboard navigation - Remove unused CSS variables and dead shimmer animation - Improve i18n setLang() to preserve content when translation key missing - Add responsive breakpoints (1200px, 900px) and enhance print styles - Optimize hero-orb blur performance with will-change:transform - Redesign download page changelog: card-based timeline with gradient line - Redesign download page system requirements: icon cards with hover accents - Cache-bust all static assets to v=20260319b
1 parent 4e4f7a6 commit a96086b

File tree

193 files changed

+1107
-1023
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

193 files changed

+1107
-1023
lines changed

404.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@
2020
<link rel="icon" href="favicon.svg" type="image/svg+xml">
2121
<link rel="icon" href="favicon-32x32.png" sizes="32x32" type="image/png">
2222
<link rel="apple-touch-icon" href="apple-touch-icon.png">
23-
<link rel="manifest" href="manifest.json?v=20260319">
23+
<link rel="manifest" href="manifest.json?v=20260319b">
2424
<link rel="preconnect" href="https://fonts.googleapis.com">
2525
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
2626
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&family=Noto+Sans+SC:wght@300;400;500;700;900&family=Orbitron:wght@700;900&display=swap" rel="stylesheet">
27-
<link rel="stylesheet" href="css/style.css?v=20260319">
27+
<link rel="stylesheet" href="css/style.css?v=20260319b">
2828
<style>
2929
.err-wrap{display:flex;flex-direction:column;align-items:center;justify-content:center;
3030
text-align:center;min-height:calc(100vh - 200px);padding:100px 20px 80px}
@@ -82,7 +82,7 @@ <h1 class="err-title" data-i18n="err404Title">页面未找到</h1>
8282
</section>
8383

8484
<div id="footer"></div>
85-
<script src="js/shared.js?v=20260319"></script>
85+
<script src="js/shared.js?v=20260319b"></script>
8686
<script>
8787
document.getElementById('nav').innerHTML = navHTML('');
8888
document.getElementById('footer').innerHTML = footerHTML();
@@ -104,6 +104,6 @@ <h1 class="err-title" data-i18n="err404Title">页面未找到</h1>
104104
if (currentLang !== 'zh') setLang(currentLang);
105105
</script>
106106
<script>if('serviceWorker' in navigator){navigator.serviceWorker.register('sw.js')}</script>
107-
<script src="js/search.js?v=20260319"></script>
107+
<script src="js/search.js?v=20260319b"></script>
108108
</body>
109109
</html>

compat.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@
2929
<link rel="icon" href="favicon.svg" type="image/svg+xml">
3030
<link rel="icon" href="favicon-32x32.png" sizes="32x32" type="image/png">
3131
<link rel="apple-touch-icon" href="apple-touch-icon.png">
32-
<link rel="manifest" href="manifest.json?v=20260319">
32+
<link rel="manifest" href="manifest.json?v=20260319b">
3333
<link rel="preconnect" href="https://fonts.googleapis.com">
3434
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
3535
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&family=Noto+Sans+SC:wght@300;400;500;700;900&family=Orbitron:wght@700;900&display=swap" rel="stylesheet">
36-
<link rel="stylesheet" href="css/style.css?v=20260319">
36+
<link rel="stylesheet" href="css/style.css?v=20260319b">
3737
<style>
3838
/* HERO */
3939
.cp-hero{padding:80px 0 20px;text-align:center}
@@ -277,7 +277,7 @@ <h1 class="anim-up grad-text" data-i18n="cpTitle">安装合集</h1>
277277
</div></section>
278278

279279
<div id="footer"></div>
280-
<script src="js/shared.js?v=20260319"></script>
280+
<script src="js/shared.js?v=20260319b"></script>
281281
<script>
282282
document.getElementById('nav').innerHTML = navHTML('compat');
283283
document.getElementById('footer').innerHTML = footerHTML();
@@ -665,6 +665,6 @@ <h1 class="anim-up grad-text" data-i18n="cpTitle">安装合集</h1>
665665
});
666666
</script>
667667
<script>if('serviceWorker' in navigator){navigator.serviceWorker.register('sw.js')}</script>
668-
<script src="js/search.js?v=20260319"></script>
668+
<script src="js/search.js?v=20260319b"></script>
669669
</body>
670670
</html>

css/style.css

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,30 @@
44
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
55
:root{
66
--red:#C74634;--red-glow:#e05a48;--red-dark:#a83a2b;
7-
--bg:#0a0a0e;--bg2:#111118;--bg3:#181822;--bg4:#1e1e2a;
8-
--card:#14141d;--card-hover:#1a1a26;
7+
--bg:#0a0a0e;--bg2:#111118;--bg3:#181822;
8+
--card:#14141d;
99
--border:#232334;--border-light:#33334a;--border-red:rgba(199,70,52,.25);
1010
--text:#e8e6e3;--text-dim:#9a9aaa;--text-muted:#5a5a6e;
11-
--accent:#C74634;--accent2:#e8934a;--green:#3aba6a;--blue:#4a8fe8;--purple:#9a6aee;
11+
--accent:#C74634;--accent2:#e8934a;--green:#3aba6a;--blue:#4a8fe8;
1212
--font:'Noto Sans SC',system-ui,sans-serif;
1313
--mono:'JetBrains Mono','Fira Code',monospace;
1414
--display:'Orbitron',sans-serif;
15-
--r:10px;--r-sm:6px;--r-lg:14px;--r-xl:20px;
15+
--r:10px;--r-sm:6px;--r-lg:14px;
1616
--max-w:1160px;
1717
--nav-h:64px;
1818
--term-bg:#1a1a24;
1919
--glow-sm:0 0 20px rgba(199,70,52,.15);
20-
--glow-md:0 0 40px rgba(199,70,52,.12);
2120
}
2221
/* Light theme */
2322
[data-theme="light"]{
24-
--bg:#f4f4f7;--bg2:#eaeaef;--bg3:#e0e0e8;--bg4:#d6d6e0;
25-
--card:#fff;--card-hover:#f8f8fb;
23+
--bg:#f4f4f7;--bg2:#eaeaef;--bg3:#e0e0e8;
24+
--card:#fff;
2625
--border:#d0d0da;--border-light:#b8b8c8;--border-red:rgba(199,70,52,.2);
2726
--text:#1a1a2e;--text-dim:#5a5a70;--text-muted:#8a8a9e;
2827
--green:#1a8a4a;--blue:#2a6ac0;
28+
--accent2:#d07830;
2929
--term-bg:#1a1a24;
3030
--glow-sm:0 0 20px rgba(199,70,52,.08);
31-
--glow-md:0 0 40px rgba(199,70,52,.06);
3231
}
3332
/* Keep terminal areas dark in light mode */
3433
[data-theme="light"] .cmd-code,
@@ -204,8 +203,8 @@ img{max-width:100%;display:block}
204203
/* === ANIMATIONS === */
205204
@keyframes fadeUp{from{opacity:0;transform:translateY(24px)}to{opacity:1;transform:translateY(0)}}
206205
@keyframes fadeIn{from{opacity:0}to{opacity:1}}
206+
@keyframes fadeOut{from{opacity:1}to{opacity:0}}
207207
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.5}}
208-
@keyframes shimmer{0%{background-position:-200% 0}100%{background-position:200% 0}}
209208
.anim-up{animation:fadeUp .7s cubic-bezier(.4,0,.2,1) both}
210209
.anim-d1{animation-delay:.1s}.anim-d2{animation-delay:.2s}.anim-d3{animation-delay:.3s}.anim-d4{animation-delay:.4s}
211210

@@ -269,8 +268,13 @@ img{max-width:100%;display:block}
269268
:focus-visible{outline:2px solid var(--red);outline-offset:2px;border-radius:4px}
270269

271270
/* === RESPONSIVE === */
271+
@media(max-width:1200px){
272+
.container{padding:0 20px}
273+
}
272274
@media(max-width:900px){
273275
.footer-inner{grid-template-columns:1fr 1fr;gap:30px}
276+
.section{padding:60px 0}
277+
.nav-links a{padding:6px 10px;font-size:.82rem}
274278
}
275279
@media(max-width:768px){
276280
/* Lighter glassmorphism on mobile for performance */
@@ -323,6 +327,9 @@ img{max-width:100%;display:block}
323327

324328
/* Stats grid - 2 col on mobile */
325329
.stat-num{font-size:1.6rem}
330+
331+
.nav-search-btn kbd{display:none}
332+
.nav-search-btn{padding:4px 8px}
326333
}
327334
/* Hide tabbar on desktop, show in mobile media query above */
328335
.mobile-tabbar{display:none}
@@ -364,7 +371,7 @@ img{max-width:100%;display:block}
364371
/* === HERO FLOATING ORBS === */
365372
@keyframes floatOrb1{0%,100%{transform:translate(0,0) scale(1)}25%{transform:translate(30px,-20px) scale(1.1)}50%{transform:translate(-15px,-40px) scale(.95)}75%{transform:translate(-30px,-10px) scale(1.05)}}
366373
@keyframes floatOrb2{0%,100%{transform:translate(0,0) scale(1)}25%{transform:translate(-25px,15px) scale(.9)}50%{transform:translate(20px,30px) scale(1.1)}75%{transform:translate(35px,-15px) scale(.95)}}
367-
.hero-orb{position:absolute;border-radius:50%;pointer-events:none;filter:blur(60px);z-index:0}
374+
.hero-orb{position:absolute;border-radius:50%;pointer-events:none;filter:blur(40px);z-index:0;will-change:transform}
368375
.hero-orb-1{width:300px;height:300px;background:rgba(199,70,52,.12);top:-50px;right:10%;animation:floatOrb1 12s ease-in-out infinite}
369376
.hero-orb-2{width:200px;height:200px;background:rgba(232,147,74,.08);bottom:0;left:5%;animation:floatOrb2 15s ease-in-out infinite}
370377
.hero-orb-3{width:150px;height:150px;background:rgba(74,143,232,.06);top:30%;left:35%;animation:floatOrb1 18s ease-in-out infinite reverse}
@@ -441,6 +448,7 @@ img{max-width:100%;display:block}
441448
.search-icon{color:var(--text-muted);flex-shrink:0}
442449
.search-input{flex:1;background:none;border:none;color:var(--text);font-size:1rem;outline:none;font-family:inherit}
443450
.search-input::placeholder{color:var(--text-muted)}
451+
.search-input:focus-visible{box-shadow:0 0 0 2px var(--red);border-radius:4px}
444452
.search-close{background:var(--border);border:none;color:var(--text-muted);font-size:.7rem;padding:3px 8px;border-radius:4px;cursor:pointer;font-family:monospace}
445453
.search-results{max-height:50vh;overflow-y:auto;padding:6px}
446454
.search-item{display:block;padding:10px 14px;border-radius:8px;text-decoration:none;color:var(--text);transition:background .15s}
@@ -455,7 +463,6 @@ img{max-width:100%;display:block}
455463
.nav-search-btn{background:none;border:1px solid var(--border);color:var(--text-muted);padding:4px 12px 4px 8px;border-radius:6px;cursor:pointer;display:flex;align-items:center;gap:6px;font-size:.8rem;transition:border-color .2s,color .2s}
456464
.nav-search-btn:hover{border-color:var(--red);color:var(--text)}
457465
.nav-search-btn kbd{font-size:.7rem;background:var(--border);padding:1px 5px;border-radius:3px;font-family:inherit}
458-
@media(max-width:768px){.nav-search-btn kbd{display:none}.nav-search-btn{padding:4px 8px}}
459466

460467
/* === PAGE LOAD PROGRESS BAR === */
461468
.page-progress{position:fixed;top:0;left:0;height:3px;background:linear-gradient(90deg,var(--red),var(--red-glow),var(--accent2));
@@ -496,16 +503,19 @@ img{max-width:100%;display:block}
496503

497504
/* === PRINT STYLES === */
498505
@media print{
499-
.nav,.mobile-tabbar,.back-to-top,.wechat-fab,.wechat-popup,.search-overlay,.nav-actions{display:none!important}
500-
body{background:#fff;color:#000;font-size:12pt;line-height:1.5}
506+
.nav,.mobile-tabbar,.back-to-top,.wechat-fab,.wechat-popup,.search-overlay,.nav-actions,.noise-overlay,.btt-progress,.hero-orb,.page-progress{display:none!important}
507+
body{background:#fff;color:#000;font-size:12pt;line-height:1.5;padding-top:0}
501508
a{color:#000;text-decoration:underline}
502509
.footer{background:#f5f5f5;color:#333;border-top:1px solid #ccc}
503510
.footer-bottom{text-align:center}
504511
.hero{background:#fff!important;color:#000!important;min-height:auto;padding:20pt 0}
505512
.hero h1,.hero h2,.hero p{color:#000!important}
506513
.card,.mac-term{border:1px solid #ccc;box-shadow:none;break-inside:avoid}
507-
pre,code{font-size:9pt;white-space:pre-wrap;word-wrap:break-word}
514+
.section{page-break-after:auto;page-break-inside:avoid}
515+
pre,code{font-size:8pt;white-space:pre-wrap;word-wrap:break-word}
516+
.mac-term pre{font-size:8pt;padding:10px 14px}
508517
.mac-term-bar{background:#eee;-webkit-print-color-adjust:exact;print-color-adjust:exact}
518+
.code-copy-btn{display:none!important}
509519
img{max-width:100%!important;page-break-inside:avoid}
510520
.btn,.btn-primary,.btn-ghost,.nav-cta{border:1px solid #333;color:#000!important;background:none!important}
511521
}

docs.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@
2929
<link rel="icon" href="favicon.svg" type="image/svg+xml">
3030
<link rel="icon" href="favicon-32x32.png" sizes="32x32" type="image/png">
3131
<link rel="apple-touch-icon" href="apple-touch-icon.png">
32-
<link rel="manifest" href="manifest.json?v=20260319">
32+
<link rel="manifest" href="manifest.json?v=20260319b">
3333
<link rel="preconnect" href="https://fonts.googleapis.com">
3434
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
3535
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&family=Noto+Sans+SC:wght@300;400;500;700;900&family=Orbitron:wght@700;900&display=swap" rel="stylesheet">
36-
<link rel="stylesheet" href="css/style.css?v=20260319">
36+
<link rel="stylesheet" href="css/style.css?v=20260319b">
3737
<style>
3838
.doc-layout{display:grid;grid-template-columns:220px 1fr;gap:40px;padding:50px 0 80px;align-items:start}
3939
.doc-sidebar{position:sticky;top:calc(var(--nav-h) + 24px)}
@@ -1133,7 +1133,7 @@ <h3>v3.0.0 (2022-11-01)</h3>
11331133
</div>
11341134
</div>
11351135
<div id="footer"></div>
1136-
<script src="js/shared.js?v=20260319"></script>
1136+
<script src="js/shared.js?v=20260319b"></script>
11371137
<script>
11381138
document.getElementById('nav').innerHTML = navHTML('docs');
11391139
document.getElementById('footer').innerHTML = footerHTML();
@@ -1178,6 +1178,6 @@ <h3>v3.0.0 (2022-11-01)</h3>
11781178
if (currentLang !== 'zh') setLang(currentLang);
11791179
</script>
11801180
<script>if('serviceWorker' in navigator){navigator.serviceWorker.register('sw.js')}</script>
1181-
<script src="js/search.js?v=20260319"></script>
1181+
<script src="js/search.js?v=20260319b"></script>
11821182
</body>
11831183
</html>

0 commit comments

Comments
 (0)