Spaces:
Running
Running
moxhi 3cf7c8d
Browse files- about.html +5 -5
- assets/{about-B7a9U0xY.css → about-BRw9WSHl.css} +1 -1
- assets/board-DQggw35t.js +2 -2
- assets/{main-B62RFlGb.js → main-7NfjLVBQ.js} +0 -0
- board.html +3 -3
- index.html +1 -1
- sw.js +21 -5
about.html
CHANGED
|
@@ -73,13 +73,13 @@
|
|
| 73 |
]
|
| 74 |
}
|
| 75 |
</script>
|
| 76 |
-
<link rel="stylesheet" crossorigin href="/assets/about-
|
| 77 |
</head>
|
| 78 |
<body>
|
| 79 |
<a class="skip-link" href="#noi-dung">Bỏ qua điều hướng</a>
|
| 80 |
<div class="about-page">
|
| 81 |
<header class="site-nav">
|
| 82 |
-
<a class="wordmark" href="/" aria-label="Mặc Hi — mở máy dịch">
|
| 83 |
<svg class="wordmark__seal" viewBox="0 0 64 64" aria-hidden="true">
|
| 84 |
<rect class="wordmark__field" x="1.5" y="1.5" width="61" height="61" rx="7" />
|
| 85 |
<rect class="wordmark__rule" x="5" y="5" width="54" height="54" rx="4" />
|
|
@@ -92,7 +92,7 @@
|
|
| 92 |
</span>
|
| 93 |
</a>
|
| 94 |
<nav class="primary-nav" aria-label="Điều hướng chính">
|
| 95 |
-
<a href="/">Mở máy dịch</a>
|
| 96 |
<a href="/board">Bảng tốc độ</a>
|
| 97 |
</nav>
|
| 98 |
</header>
|
|
@@ -283,7 +283,7 @@
|
|
| 283 |
<p class="eyebrow">Sẵn sàng đọc</p>
|
| 284 |
<h2 id="closing-title">Mở máy dịch, chọn mô hình và bắt đầu.</h2>
|
| 285 |
<nav class="closing__links" aria-label="Tiếp tục với Mặc Hi">
|
| 286 |
-
<a class="route-link route-link--primary" href="/">Mở máy dịch <span aria-hidden="true">→</span></a>
|
| 287 |
<a class="route-link" href="/board">Xem bảng tốc độ <span aria-hidden="true">→</span></a>
|
| 288 |
</nav>
|
| 289 |
</section>
|
|
@@ -292,7 +292,7 @@
|
|
| 292 |
<footer class="site-footer">
|
| 293 |
<p>Mặc Hi · dịch truyện Trung–Việt trên thiết bị</p>
|
| 294 |
<nav aria-label="Điều hướng cuối trang">
|
| 295 |
-
<a href="/">Máy dịch</a>
|
| 296 |
<a href="/board">Bảng tốc độ</a>
|
| 297 |
</nav>
|
| 298 |
</footer>
|
|
|
|
| 73 |
]
|
| 74 |
}
|
| 75 |
</script>
|
| 76 |
+
<link rel="stylesheet" crossorigin href="/assets/about-BRw9WSHl.css">
|
| 77 |
</head>
|
| 78 |
<body>
|
| 79 |
<a class="skip-link" href="#noi-dung">Bỏ qua điều hướng</a>
|
| 80 |
<div class="about-page">
|
| 81 |
<header class="site-nav">
|
| 82 |
+
<a class="wordmark" href="/index.html" aria-label="Mặc Hi — mở máy dịch">
|
| 83 |
<svg class="wordmark__seal" viewBox="0 0 64 64" aria-hidden="true">
|
| 84 |
<rect class="wordmark__field" x="1.5" y="1.5" width="61" height="61" rx="7" />
|
| 85 |
<rect class="wordmark__rule" x="5" y="5" width="54" height="54" rx="4" />
|
|
|
|
| 92 |
</span>
|
| 93 |
</a>
|
| 94 |
<nav class="primary-nav" aria-label="Điều hướng chính">
|
| 95 |
+
<a href="/index.html">Mở máy dịch</a>
|
| 96 |
<a href="/board">Bảng tốc độ</a>
|
| 97 |
</nav>
|
| 98 |
</header>
|
|
|
|
| 283 |
<p class="eyebrow">Sẵn sàng đọc</p>
|
| 284 |
<h2 id="closing-title">Mở máy dịch, chọn mô hình và bắt đầu.</h2>
|
| 285 |
<nav class="closing__links" aria-label="Tiếp tục với Mặc Hi">
|
| 286 |
+
<a class="route-link route-link--primary" href="/index.html">Mở máy dịch <span aria-hidden="true">→</span></a>
|
| 287 |
<a class="route-link" href="/board">Xem bảng tốc độ <span aria-hidden="true">→</span></a>
|
| 288 |
</nav>
|
| 289 |
</section>
|
|
|
|
| 292 |
<footer class="site-footer">
|
| 293 |
<p>Mặc Hi · dịch truyện Trung–Việt trên thiết bị</p>
|
| 294 |
<nav aria-label="Điều hướng cuối trang">
|
| 295 |
+
<a href="/index.html">Máy dịch</a>
|
| 296 |
<a href="/board">Bảng tốc độ</a>
|
| 297 |
</nav>
|
| 298 |
</footer>
|
assets/{about-B7a9U0xY.css → about-BRw9WSHl.css}
RENAMED
|
@@ -1 +1 @@
|
|
| 1 |
-
:root{--color-paper: oklch(95% .018 80);--color-paper-raised: oklch(92% .022 78);--color-paper-deep: oklch(88% .026 76);--color-ink: oklch(25% .014 35);--color-ink-soft: oklch(40% .018 45);--color-muted: oklch(52% .022 55);--color-rule: oklch(76% .025 74);--color-rule-soft: oklch(86% .022 76);--color-accent: oklch(50% .16 29);--color-accent-dark: oklch(43% .15 29);--color-accent-ink: oklch(96% .014 78);--color-link: oklch(48% .09 340);--color-moss: oklch(52% .045 145);--color-focus: oklch(54% .2 29);--font-display: "Playfair Display", Georgia, "Times New Roman", serif;--font-body: "Times New Roman", "Noto Serif", Tinos, serif;--font-ui: var(--font-body);--space-1: .25rem;--space-2: .5rem;--space-3: .75rem;--space-4: 1rem;--space-5: 1.25rem;--space-6: 1.5rem;--space-8: 2rem;--space-10: 2.5rem;--space-12: 3rem;--space-16: 4rem;--space-20: 5rem;--space-24: 6rem;--text-xs: .75rem;--text-sm: .875rem;--text-code: .9375rem;--text-body: 1.0625rem;--text-wordmark: 1.2rem;--text-subhead: 1.25rem;--text-seal: 1.4375rem;--text-lead: clamp(1.2rem, 1.05rem + .75vw, 1.55rem);--text-section: clamp(1.75rem, 1.4rem + 1.5vw, 2.75rem);--text-display: clamp(2.75rem, 1.8rem + 4.5vw, 6.25rem);--ease-out: cubic-bezier(.16, 1, .3, 1);--ease-in: cubic-bezier(.7, 0, .84, 0);--ease-in-out: cubic-bezier(.65, 0, .35, 1);--dur-short: .18s;--dur-press: .1s;--rule-hairline: 1px;--rule-seal: 1.5px;--rule-focus: 2px;--rule-underline-offset: .125rem;--radius-sm: .25rem;--radius-pill: 999px;--layout-max: 72rem;--measure-copy: 62ch;--measure-lead: 50ch}@font-face{font-family:Playfair Display;font-style:normal;font-weight:600 700;font-display:swap;src:url(/assets/playfair-vietnamese-Cabi7G8-.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Playfair Display;font-style:normal;font-weight:600 700;font-display:swap;src:url(/assets/playfair-latin-BOwq7MWX.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}*{box-sizing:border-box}html,body{margin:0;padding:0;overflow-x:clip}body{min-height:100dvh;color:var(--color-ink);background:var(--color-paper);font-family:var(--font-body);font-size:var(--text-body);line-height:1.67}::selection{color:var(--color-accent-ink);background:var(--color-accent)}a{color:inherit}code,kbd{font-family:var(--font-ui);font-size:var(--text-code)}kbd{padding-inline:var(--space-1);border:var(--rule-hairline) solid var(--color-rule);border-radius:var(--radius-sm);background:var(--color-paper-raised)}.skip-link{position:absolute;z-index:1;inset-block-start:var(--space-2);inset-inline-start:-999rem;min-height:var(--space-12);padding:var(--space-2) var(--space-4);color:var(--color-accent-ink);background:var(--color-accent);font-family:var(--font-ui);font-size:var(--text-sm);font-weight:700;line-height:2;text-decoration:none;white-space:nowrap}.skip-link:focus{inset-inline-start:var(--space-4)}.about-page{width:100%;max-width:var(--layout-max);min-height:100dvh;margin-inline:auto;padding-inline:clamp(var(--space-4),4vw,var(--space-16))}.site-nav{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-3) var(--space-6);padding-block:var(--space-5);border-block-end:var(--rule-hairline) solid var(--color-rule)}.wordmark{display:inline-flex;align-items:center;gap:var(--space-3);min-height:var(--space-12);line-height:1;text-decoration:none;white-space:nowrap}.wordmark__seal{width:var(--space-12);height:var(--space-12);flex:none}.wordmark__field{fill:var(--color-accent)}.wordmark__rule{fill:none;stroke:var(--color-accent-ink);stroke-width:var(--rule-seal);opacity:.55}.wordmark__seal text{fill:var(--color-accent-ink);font-family:var(--font-body);font-size:var(--text-seal)}.wordmark__text{display:grid;line-height:1.05}.wordmark__text strong{font-family:var(--font-display);font-size:var(--text-wordmark);font-weight:700}.wordmark__text span{color:var(--color-muted);font-size:var(--text-xs);letter-spacing:.16em}.primary-nav{display:flex;width:100%;align-items:center;gap:var(--space-6)}.primary-nav a,.site-footer a{display:inline-flex;align-items:center;min-height:var(--space-12);color:var(--color-ink-soft);font-family:var(--font-ui);font-size:var(--text-sm);font-weight:650;line-height:1;text-decoration-line:underline;text-decoration-color:var(--color-rule);text-decoration-thickness:var(--rule-hairline);text-underline-offset:var(--rule-underline-offset);white-space:nowrap}.hero{max-width:var(--measure-copy);padding-block:var(--space-12) var(--space-16)}.eyebrow,.chapter__kicker{margin:0;color:var(--color-accent-dark);font-family:var(--font-ui);font-size:var(--text-xs);font-weight:750;letter-spacing:.12em;line-height:1.4;text-transform:uppercase}.hero h1{max-width:11ch;min-width:0;margin:var(--space-4) 0 var(--space-6);overflow-wrap:anywhere;font-family:var(--font-display);font-size:var(--text-display);font-style:normal;font-weight:700;letter-spacing:-.035em;line-height:.99}.hero__lead{max-width:var(--measure-lead);margin:0;color:var(--color-ink-soft);font-size:var(--text-lead);line-height:1.5}.hero__promise{max-width:var(--measure-copy);margin:var(--space-8) 0 0;padding-inline-start:var(--space-5);border-inline-start:var(--rule-seal) solid var(--color-accent);color:var(--color-ink-soft)}.hero__promise strong{color:var(--color-ink)}.guide{border-block-start:var(--rule-hairline) solid var(--color-rule)}.chapter{padding-block:var(--space-16);border-block-end:var(--rule-hairline) solid var(--color-rule-soft)}.chapter--models{padding-block-end:var(--space-20)}.chapter--compact{padding-block-start:var(--space-12)}.chapter__heading{display:block;margin-block-end:var(--space-8)}.chapter__marker{display:inline-block;width:fit-content;margin-block-end:var(--space-3);padding-block-start:var(--space-2);border-block-start:var(--rule-seal) solid var(--color-accent);color:var(--color-muted);font-family:var(--font-ui);font-size:var(--text-xs);font-variant-numeric:tabular-nums;font-weight:700;letter-spacing:.1em}.chapter h2,.closing h2{max-width:18ch;min-width:0;margin:var(--space-2) 0 0;overflow-wrap:anywhere;font-family:var(--font-display);font-size:var(--text-section);font-style:normal;font-weight:700;letter-spacing:-.02em;line-height:1.12}.chapter__body{max-width:var(--measure-copy);color:var(--color-ink-soft)}.chapter__body>p:first-child{margin-block-start:0}.chapter__body>p:last-child{margin-block-end:0}.chapter__body strong,.chapter__body b{color:var(--color-ink)}.steps{margin:0;padding:0;list-style:none}.steps li{display:grid;grid-template-columns:var(--space-8) minmax(0,1fr);gap:var(--space-4);padding-block:var(--space-5);border-block-start:var(--rule-hairline) solid var(--color-rule-soft)}.steps li:last-child{border-block-end:var(--rule-hairline) solid var(--color-rule-soft)}.steps p{margin:0}.steps__number{color:var(--color-accent-dark);font-family:var(--font-display);font-size:var(--text-subhead);font-variant-numeric:tabular-nums;font-weight:700}.model-table{width:100%;margin-block:var(--space-8);border-collapse:collapse;color:var(--color-ink-soft);font-variant-numeric:tabular-nums}.model-table thead{position:absolute;width:var(--rule-hairline);height:var(--rule-hairline);overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}.model-table,.model-table tbody,.model-table tr,.model-table th,.model-table td{display:block}.model-table tr{padding-block:var(--space-4);border-block-start:var(--rule-hairline) solid var(--color-rule)}.model-table tbody tr:last-child{border-block-end:var(--rule-hairline) solid var(--color-rule)}.model-table th,.model-table td{display:grid;grid-template-columns:minmax(6.5rem,.42fr) minmax(0,1fr);gap:var(--space-4);padding-block:var(--space-2);text-align:start;vertical-align:top}.model-table th{color:var(--color-ink)}.model-table [data-label]:before{content:attr(data-label);color:var(--color-muted);font-family:var(--font-ui);font-size:var(--text-xs);font-weight:700;letter-spacing:.04em;text-transform:uppercase}.resource-links,.closing__links{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-3) var(--space-6)}.resource-links a{display:inline-flex;align-items:center;min-height:var(--space-12);color:var(--color-link);font-family:var(--font-ui);font-size:var(--text-sm);font-weight:700;line-height:1;text-decoration-thickness:var(--rule-hairline);text-underline-offset:var(--rule-underline-offset);white-space:nowrap}.term-examples{margin-block:var(--space-8);border-block:var(--rule-hairline) solid var(--color-rule)}.term-examples>div{display:grid;grid-template-columns:minmax(5rem,.32fr) minmax(0,1fr);gap:var(--space-4);padding-block:var(--space-4)}.term-examples>div+div{border-block-start:var(--rule-hairline) solid var(--color-rule-soft)}.term-examples dt{color:var(--color-ink);font-size:var(--text-subhead);font-weight:700}.term-examples dd{margin:0;color:var(--color-ink)}.term-examples dd span{margin-inline-end:var(--space-2);color:var(--color-accent-dark)}.term-examples small{display:block;color:var(--color-muted);font-family:var(--font-ui);font-size:var(--text-xs)}.inline-heading{font-weight:700}.prose-list p{margin:0;padding-block:var(--space-4);border-block-start:var(--rule-hairline) solid var(--color-rule-soft)}.prose-list p:last-child{border-block-end:var(--rule-hairline) solid var(--color-rule-soft)}.faq section{padding-block:var(--space-5);border-block-start:var(--rule-hairline) solid var(--color-rule-soft)}.faq section:last-child{border-block-end:var(--rule-hairline) solid var(--color-rule-soft)}.faq h3{margin:0 0 var(--space-2);color:var(--color-ink);font-family:var(--font-body);font-size:var(--text-subhead);font-style:normal;line-height:1.35}.faq p{margin:0}.closing{max-width:var(--measure-copy);padding-block:var(--space-20)}.closing h2{margin-block-end:var(--space-8)}.route-link{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-2);min-height:var(--space-12);padding-inline:var(--space-5);border:var(--rule-hairline) solid var(--color-rule);border-radius:var(--radius-sm);color:var(--color-ink);font-family:var(--font-ui);font-size:var(--text-sm);font-weight:750;line-height:1;text-decoration:none;white-space:nowrap}.route-link--primary{border-color:var(--color-accent);color:var(--color-accent-ink);background:var(--color-accent)}.site-footer{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2) var(--space-8);padding-block:var(--space-5);border-block-start:var(--rule-hairline) solid var(--color-rule);color:var(--color-muted);font-family:var(--font-ui);font-size:var(--text-sm)}.site-footer p{width:100%;margin:0}.site-footer nav{display:flex;align-items:center;gap:var(--space-6)}a:focus-visible{outline:var(--rule-focus) solid var(--color-focus);outline-offset:var(--space-1)}@media(hover:hover)and (pointer:fine){.primary-nav a:hover,.site-footer a:hover,.resource-links a:hover{color:var(--color-accent-dark);text-decoration-color:var(--color-accent)}.wordmark:hover{color:var(--color-accent-dark)}.route-link:hover{border-color:var(--color-ink);color:var(--color-accent-ink);background:var(--color-ink)}.route-link--primary:hover{border-color:var(--color-accent-dark);background:var(--color-accent-dark)}}.primary-nav a:active,.site-footer a:active,.resource-links a:active,.wordmark:active{color:var(--color-accent-dark)}.route-link:active{border-color:var(--color-accent-dark);color:var(--color-accent-ink);background:var(--color-accent-dark)}a[aria-disabled=true]{border-color:var(--color-rule-soft);color:var(--color-muted);background:var(--color-paper-raised);cursor:not-allowed;opacity:.55;pointer-events:none}.skip-link:active{background:var(--color-accent-dark)}@media(min-width:40rem){.site-nav{flex-wrap:nowrap}.primary-nav{width:auto;margin-inline-start:auto}.model-table{display:table}.model-table thead{position:static;display:table-header-group;width:auto;height:auto;overflow:visible;clip:auto;clip-path:none;white-space:normal}.model-table tbody{display:table-row-group}.model-table tr{display:table-row;padding-block:0}.model-table th,.model-table td{display:table-cell;padding:var(--space-4) var(--space-4) var(--space-4) 0}.model-table [data-label]:before{content:none}.site-footer p{width:auto}.site-footer nav{margin-inline-start:auto}}@media(min-width:60rem){.hero{padding-block:var(--space-16) var(--space-24)}.chapter{padding-block:var(--space-20)}.chapter--models{padding-block-end:var(--space-24)}.chapter__body{margin-inline-start:calc(var(--space-16) + var(--space-5))}}@media(pointer:coarse){.primary-nav a,.resource-links a,.route-link,.site-footer a{min-height:var(--space-12)}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}}
|
|
|
|
| 1 |
+
:root{--color-paper: oklch(95% .018 80);--color-paper-raised: oklch(92% .022 78);--color-paper-deep: oklch(88% .026 76);--color-ink: oklch(25% .014 35);--color-ink-soft: oklch(40% .018 45);--color-muted: oklch(52% .022 55);--color-rule: oklch(76% .025 74);--color-rule-soft: oklch(86% .022 76);--color-accent: oklch(50% .16 29);--color-accent-dark: oklch(43% .15 29);--color-accent-ink: oklch(96% .014 78);--color-link: oklch(48% .09 340);--color-moss: oklch(52% .045 145);--color-focus: oklch(54% .2 29);--font-display: "Playfair Display", Georgia, "Times New Roman", serif;--font-body: "Times New Roman", "Noto Serif", Tinos, serif;--font-ui: var(--font-body);--space-1: .25rem;--space-2: .5rem;--space-3: .75rem;--space-4: 1rem;--space-5: 1.25rem;--space-6: 1.5rem;--space-8: 2rem;--space-10: 2.5rem;--space-12: 3rem;--space-16: 4rem;--space-20: 5rem;--space-24: 6rem;--text-xs: .75rem;--text-sm: .875rem;--text-code: .9375rem;--text-body: 1.0625rem;--text-wordmark: 1.2rem;--text-subhead: 1.25rem;--text-seal: 1.4375rem;--text-lead: clamp(1.2rem, 1.05rem + .75vw, 1.55rem);--text-section: clamp(1.75rem, 1.4rem + 1.5vw, 2.75rem);--text-display: clamp(2.75rem, 1.8rem + 4.5vw, 6.25rem);--ease-out: cubic-bezier(.16, 1, .3, 1);--ease-in: cubic-bezier(.7, 0, .84, 0);--ease-in-out: cubic-bezier(.65, 0, .35, 1);--dur-short: .18s;--dur-press: .1s;--rule-hairline: 1px;--rule-seal: 1.5px;--rule-focus: 2px;--rule-underline-offset: .125rem;--radius-sm: .25rem;--radius-pill: 999px;--layout-max: 60rem;--measure-copy: 62ch;--measure-lead: 50ch}@font-face{font-family:Playfair Display;font-style:normal;font-weight:600 700;font-display:swap;src:url(/assets/playfair-vietnamese-Cabi7G8-.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Playfair Display;font-style:normal;font-weight:600 700;font-display:swap;src:url(/assets/playfair-latin-BOwq7MWX.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}*{box-sizing:border-box}html,body{margin:0;padding:0;overflow-x:clip}body{min-height:100dvh;color:var(--color-ink);background:var(--color-paper);font-family:var(--font-body);font-size:var(--text-body);line-height:1.67}::selection{color:var(--color-accent-ink);background:var(--color-accent)}a{color:inherit}code,kbd{font-family:var(--font-ui);font-size:var(--text-code)}kbd{padding-inline:var(--space-1);border:var(--rule-hairline) solid var(--color-rule);border-radius:var(--radius-sm);background:var(--color-paper-raised)}.skip-link{position:absolute;z-index:1;inset-block-start:var(--space-2);inset-inline-start:-999rem;min-height:var(--space-12);padding:var(--space-2) var(--space-4);color:var(--color-accent-ink);background:var(--color-accent);font-family:var(--font-ui);font-size:var(--text-sm);font-weight:700;line-height:2;text-decoration:none;white-space:nowrap}.skip-link:focus{inset-inline-start:var(--space-4)}.about-page{width:100%;max-width:var(--layout-max);min-height:100dvh;margin-inline:auto;padding-inline:clamp(var(--space-4),4vw,var(--space-16))}.site-nav{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-3) var(--space-6);padding-block:var(--space-5);border-block-end:var(--rule-hairline) solid var(--color-rule)}.wordmark{display:inline-flex;align-items:center;gap:var(--space-3);min-height:var(--space-12);line-height:1;text-decoration:none;white-space:nowrap}.wordmark__seal{width:var(--space-12);height:var(--space-12);flex:none}.wordmark__field{fill:var(--color-accent)}.wordmark__rule{fill:none;stroke:var(--color-accent-ink);stroke-width:var(--rule-seal);opacity:.55}.wordmark__seal text{fill:var(--color-accent-ink);font-family:var(--font-body);font-size:var(--text-seal)}.wordmark__text{display:grid;line-height:1.05}.wordmark__text strong{font-family:var(--font-display);font-size:var(--text-wordmark);font-weight:700}.wordmark__text span{color:var(--color-muted);font-size:var(--text-xs);letter-spacing:.16em}.primary-nav{display:flex;width:100%;align-items:center;gap:var(--space-6)}.primary-nav a,.site-footer a{display:inline-flex;align-items:center;min-height:var(--space-12);color:var(--color-ink-soft);font-family:var(--font-ui);font-size:var(--text-sm);font-weight:650;line-height:1;text-decoration-line:underline;text-decoration-color:var(--color-rule);text-decoration-thickness:var(--rule-hairline);text-underline-offset:var(--rule-underline-offset);white-space:nowrap}.hero{max-width:var(--measure-copy);padding-block:var(--space-12) var(--space-16)}.eyebrow,.chapter__kicker{margin:0;color:var(--color-accent-dark);font-family:var(--font-ui);font-size:var(--text-xs);font-weight:750;letter-spacing:.12em;line-height:1.4;text-transform:uppercase}.hero h1{max-width:11ch;min-width:0;margin:var(--space-4) 0 var(--space-6);overflow-wrap:anywhere;font-family:var(--font-display);font-size:var(--text-display);font-style:normal;font-weight:700;letter-spacing:-.035em;line-height:.99}.hero__lead{max-width:var(--measure-lead);margin:0;color:var(--color-ink-soft);font-size:var(--text-lead);line-height:1.5}.hero__promise{max-width:var(--measure-copy);margin:var(--space-8) 0 0;padding-inline-start:var(--space-5);border-inline-start:var(--rule-seal) solid var(--color-accent);color:var(--color-ink-soft)}.hero__promise strong{color:var(--color-ink)}.guide{border-block-start:var(--rule-hairline) solid var(--color-rule)}.chapter{padding-block:var(--space-16);border-block-end:var(--rule-hairline) solid var(--color-rule-soft)}.chapter--models{padding-block-end:var(--space-20)}.chapter--compact{padding-block-start:var(--space-12)}.chapter__heading{display:block;margin-block-end:var(--space-8)}.chapter__marker{display:inline-block;width:fit-content;margin-block-end:var(--space-3);padding-block-start:var(--space-2);border-block-start:var(--rule-seal) solid var(--color-accent);color:var(--color-muted);font-family:var(--font-ui);font-size:var(--text-xs);font-variant-numeric:tabular-nums;font-weight:700;letter-spacing:.1em}.chapter h2,.closing h2{max-width:18ch;min-width:0;margin:var(--space-2) 0 0;overflow-wrap:anywhere;text-wrap:balance;font-family:var(--font-display);font-size:var(--text-section);font-style:normal;font-weight:700;letter-spacing:-.02em;line-height:1.12}.chapter__body{max-width:var(--measure-copy);color:var(--color-ink-soft)}.chapter__body>p:first-child{margin-block-start:0}.chapter__body>p:last-child{margin-block-end:0}.chapter__body strong,.chapter__body b{color:var(--color-ink)}.steps{margin:0;padding:0;list-style:none}.steps li{display:grid;grid-template-columns:var(--space-8) minmax(0,1fr);gap:var(--space-4);padding-block:var(--space-5);border-block-start:var(--rule-hairline) solid var(--color-rule-soft)}.steps li:last-child{border-block-end:var(--rule-hairline) solid var(--color-rule-soft)}.steps p{margin:0}.steps__number{color:var(--color-accent-dark);font-family:var(--font-display);font-size:var(--text-subhead);font-variant-numeric:tabular-nums;font-weight:700}.model-table{width:100%;margin-block:var(--space-8);border-collapse:collapse;color:var(--color-ink-soft);font-variant-numeric:tabular-nums}.model-table thead{position:absolute;width:var(--rule-hairline);height:var(--rule-hairline);overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}.model-table,.model-table tbody,.model-table tr,.model-table th,.model-table td{display:block}.model-table tr{padding-block:var(--space-4);border-block-start:var(--rule-hairline) solid var(--color-rule)}.model-table tbody tr:last-child{border-block-end:var(--rule-hairline) solid var(--color-rule)}.model-table th,.model-table td{display:grid;grid-template-columns:minmax(6.5rem,.42fr) minmax(0,1fr);gap:var(--space-4);padding-block:var(--space-2);text-align:start;vertical-align:top}.model-table th{color:var(--color-ink)}.model-table [data-label]:before{content:attr(data-label);color:var(--color-muted);font-family:var(--font-ui);font-size:var(--text-xs);font-weight:700;letter-spacing:.04em;text-transform:uppercase}.resource-links,.closing__links{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-3) var(--space-6)}.resource-links a{display:inline-flex;align-items:center;min-height:var(--space-12);color:var(--color-link);font-family:var(--font-ui);font-size:var(--text-sm);font-weight:700;line-height:1;text-decoration-thickness:var(--rule-hairline);text-underline-offset:var(--rule-underline-offset);white-space:nowrap}.term-examples{margin-block:var(--space-8);border-block:var(--rule-hairline) solid var(--color-rule)}.term-examples>div{display:grid;grid-template-columns:minmax(5rem,.32fr) minmax(0,1fr);gap:var(--space-4);padding-block:var(--space-4)}.term-examples>div+div{border-block-start:var(--rule-hairline) solid var(--color-rule-soft)}.term-examples dt{color:var(--color-ink);font-size:var(--text-subhead);font-weight:700}.term-examples dd{margin:0;color:var(--color-ink)}.term-examples dd span{margin-inline-end:var(--space-2);color:var(--color-accent-dark)}.term-examples small{display:block;color:var(--color-muted);font-family:var(--font-ui);font-size:var(--text-xs)}.inline-heading{font-weight:700}.prose-list p{margin:0;padding-block:var(--space-4);border-block-start:var(--rule-hairline) solid var(--color-rule-soft)}.prose-list p:last-child{border-block-end:var(--rule-hairline) solid var(--color-rule-soft)}.faq section{padding-block:var(--space-5);border-block-start:var(--rule-hairline) solid var(--color-rule-soft)}.faq section:last-child{border-block-end:var(--rule-hairline) solid var(--color-rule-soft)}.faq h3{margin:0 0 var(--space-2);color:var(--color-ink);font-family:var(--font-body);font-size:var(--text-subhead);font-style:normal;line-height:1.35}.faq p{margin:0}.closing{max-width:var(--measure-copy);padding-block:var(--space-20)}.closing h2{margin-block-end:var(--space-8)}.route-link{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-2);min-height:var(--space-12);padding-inline:var(--space-5);border:var(--rule-hairline) solid var(--color-rule);border-radius:var(--radius-sm);color:var(--color-ink);font-family:var(--font-ui);font-size:var(--text-sm);font-weight:750;line-height:1;text-decoration:none;white-space:nowrap}.route-link--primary{border-color:var(--color-accent);color:var(--color-accent-ink);background:var(--color-accent)}.site-footer{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2) var(--space-8);padding-block:var(--space-5);border-block-start:var(--rule-hairline) solid var(--color-rule);color:var(--color-muted);font-family:var(--font-ui);font-size:var(--text-sm)}.site-footer p{width:100%;margin:0}.site-footer nav{display:flex;align-items:center;gap:var(--space-6)}a:focus-visible{outline:var(--rule-focus) solid var(--color-focus);outline-offset:var(--space-1)}@media(hover:hover)and (pointer:fine){.primary-nav a:hover,.site-footer a:hover,.resource-links a:hover{color:var(--color-accent-dark);text-decoration-color:var(--color-accent)}.wordmark:hover{color:var(--color-accent-dark)}.route-link:hover{border-color:var(--color-ink);color:var(--color-accent-ink);background:var(--color-ink)}.route-link--primary:hover{border-color:var(--color-accent-dark);background:var(--color-accent-dark)}}.primary-nav a:active,.site-footer a:active,.resource-links a:active,.wordmark:active{color:var(--color-accent-dark)}.route-link:active{border-color:var(--color-accent-dark);color:var(--color-accent-ink);background:var(--color-accent-dark)}a[aria-disabled=true]{border-color:var(--color-rule-soft);color:var(--color-muted);background:var(--color-paper-raised);cursor:not-allowed;opacity:.55;pointer-events:none}.skip-link:active{background:var(--color-accent-dark)}@media(min-width:40rem){.site-nav{flex-wrap:nowrap}.primary-nav{width:auto;margin-inline-start:auto}.model-table{display:table}.model-table thead{position:static;display:table-header-group;width:auto;height:auto;overflow:visible;clip:auto;clip-path:none;white-space:normal}.model-table tbody{display:table-row-group}.model-table tr{display:table-row;padding-block:0}.model-table th,.model-table td{display:table-cell;padding:var(--space-4) var(--space-4) var(--space-4) 0}.model-table [data-label]:before{content:none}.model-table th[scope=row],.model-table td:last-child{white-space:nowrap}.site-footer p{width:auto}.site-footer nav{margin-inline-start:auto}}@media(min-width:60rem){.hero{padding-block:var(--space-16) var(--space-24)}.chapter{padding-block:var(--space-20)}.chapter--models{padding-block-end:var(--space-24)}.chapter__body{margin-inline-start:calc(var(--space-16) + var(--space-5))}}@media(pointer:coarse){.primary-nav a,.resource-links a,.route-link,.site-footer a{min-height:var(--space-12)}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}}
|
assets/board-DQggw35t.js
CHANGED
|
@@ -2,7 +2,7 @@ import"./modulepreload-polyfill-B5Qt9EMX.js";import{M as k,p as H,a as O,b as M,
|
|
| 2 |
<div class="hero-lead">
|
| 3 |
<p class="figure"><b class="fig-num"${s?` data-tick="${Number(e.weekBest)}"`:""}>${s?m(e.weekBest):"—"}</b><span class="fig-unit">tok/giây</span></p>
|
| 4 |
<p class="qualifier">${s?"Tốc độ nhanh nhất cộng đồng đo được bảy ngày qua — ẩn danh, ngay trong trình duyệt.":"Bảy ngày qua chưa có lượt gửi nào — bảng chờ số đo đầu tiên."}</p>
|
| 5 |
-
<p class="hero-cta"><a class="cta-chip" href="/">Dịch & gửi benchmark</a></p>
|
| 6 |
</div>
|
| 7 |
<div class="substats">
|
| 8 |
<div class="substat"><b>${d(e.submissions)}</b><span>lượt gửi</span></div>
|
|
@@ -51,7 +51,7 @@ import"./modulepreload-polyfill-B5Qt9EMX.js";import{M as k,p as H,a as O,b as M,
|
|
| 51 |
<p>Chưa có lượt gửi nào.</p>
|
| 52 |
<p class="sub">Dịch xong một văn bản rồi bấm <b>Gửi benchmark</b> —
|
| 53 |
thiết bị của bạn sẽ xuất hiện ở đây.</p>
|
| 54 |
-
<a class="cta-chip" href="/">Dịch & gửi benchmark</a>
|
| 55 |
</div>`}function ee(e){return`<div class="state error">
|
| 56 |
<p>Không tải được bảng xếp hạng <span class="detail">(${i(e)})</span>.</p>
|
| 57 |
<button type="button" class="ghost" data-act="retry">Thử lại</button>
|
|
|
|
| 2 |
<div class="hero-lead">
|
| 3 |
<p class="figure"><b class="fig-num"${s?` data-tick="${Number(e.weekBest)}"`:""}>${s?m(e.weekBest):"—"}</b><span class="fig-unit">tok/giây</span></p>
|
| 4 |
<p class="qualifier">${s?"Tốc độ nhanh nhất cộng đồng đo được bảy ngày qua — ẩn danh, ngay trong trình duyệt.":"Bảy ngày qua chưa có lượt gửi nào — bảng chờ số đo đầu tiên."}</p>
|
| 5 |
+
<p class="hero-cta"><a class="cta-chip" href="/index.html">Dịch & gửi benchmark</a></p>
|
| 6 |
</div>
|
| 7 |
<div class="substats">
|
| 8 |
<div class="substat"><b>${d(e.submissions)}</b><span>lượt gửi</span></div>
|
|
|
|
| 51 |
<p>Chưa có lượt gửi nào.</p>
|
| 52 |
<p class="sub">Dịch xong một văn bản rồi bấm <b>Gửi benchmark</b> —
|
| 53 |
thiết bị của bạn sẽ xuất hiện ở đây.</p>
|
| 54 |
+
<a class="cta-chip" href="/index.html">Dịch & gửi benchmark</a>
|
| 55 |
</div>`}function ee(e){return`<div class="state error">
|
| 56 |
<p>Không tải được bảng xếp hạng <span class="detail">(${i(e)})</span>.</p>
|
| 57 |
<button type="button" class="ghost" data-act="retry">Thử lại</button>
|
assets/{main-B62RFlGb.js → main-7NfjLVBQ.js}
RENAMED
|
The diff for this file is too large to render.
See raw diff
|
|
|
board.html
CHANGED
|
@@ -136,8 +136,8 @@
|
|
| 136 |
<g class="qi qi-r2"><circle class="qi-halo" r="4"/><circle class="qi-core" r="1.9"/></g>
|
| 137 |
<g class="qi qi-r3"><circle class="qi-halo" r="4"/><circle class="qi-core" r="1.9"/></g>
|
| 138 |
</svg>
|
| 139 |
-
<p class="mast-line"><a href="/">Mặc Hi 墨曦</a> · <span>benchmark cộng đồng</span> · <span>ẩn danh</span></p>
|
| 140 |
-
<a class="sealink" href="/" aria-label="Về trang dịch Mặc Hi">
|
| 141 |
<svg class="seal" viewBox="0 0 64 64" role="img" aria-label="Ấn 墨曦">
|
| 142 |
<rect x="1.5" y="1.5" width="61" height="61" rx="7" fill="var(--seal)"/>
|
| 143 |
<rect x="5" y="5" width="54" height="54" rx="4" fill="none" stroke="rgba(244,238,227,.55)" stroke-width="1.5"/>
|
|
@@ -328,7 +328,7 @@
|
|
| 328 |
</svg>
|
| 329 |
<p class="colophon">Chỉ số hiệu năng ẩn danh — văn bản dịch không bao giờ rời thiết bị
|
| 330 |
của bạn. Số liệu tổng hợp phía máy chủ, làm mới 5 phút một lần.
|
| 331 |
-
<a href="/">← Về trang dịch</a></p>
|
| 332 |
</footer>
|
| 333 |
</div>
|
| 334 |
</body>
|
|
|
|
| 136 |
<g class="qi qi-r2"><circle class="qi-halo" r="4"/><circle class="qi-core" r="1.9"/></g>
|
| 137 |
<g class="qi qi-r3"><circle class="qi-halo" r="4"/><circle class="qi-core" r="1.9"/></g>
|
| 138 |
</svg>
|
| 139 |
+
<p class="mast-line"><a href="/index.html">Mặc Hi 墨曦</a> · <span>benchmark cộng đồng</span> · <span>ẩn danh</span></p>
|
| 140 |
+
<a class="sealink" href="/index.html" aria-label="Về trang dịch Mặc Hi">
|
| 141 |
<svg class="seal" viewBox="0 0 64 64" role="img" aria-label="Ấn 墨曦">
|
| 142 |
<rect x="1.5" y="1.5" width="61" height="61" rx="7" fill="var(--seal)"/>
|
| 143 |
<rect x="5" y="5" width="54" height="54" rx="4" fill="none" stroke="rgba(244,238,227,.55)" stroke-width="1.5"/>
|
|
|
|
| 328 |
</svg>
|
| 329 |
<p class="colophon">Chỉ số hiệu năng ẩn danh — văn bản dịch không bao giờ rời thiết bị
|
| 330 |
của bạn. Số liệu tổng hợp phía máy chủ, làm mới 5 phút một lần.
|
| 331 |
+
<a href="/index.html">← Về trang dịch</a></p>
|
| 332 |
</footer>
|
| 333 |
</div>
|
| 334 |
</body>
|
index.html
CHANGED
|
@@ -67,7 +67,7 @@
|
|
| 67 |
]
|
| 68 |
}
|
| 69 |
</script>
|
| 70 |
-
<script type="module" crossorigin src="/assets/main-
|
| 71 |
<link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-B5Qt9EMX.js">
|
| 72 |
<link rel="modulepreload" crossorigin href="/assets/preload-helper-DiAwoGSG.js">
|
| 73 |
<link rel="modulepreload" crossorigin href="/assets/models-QsPq0tJ5.js">
|
|
|
|
| 67 |
]
|
| 68 |
}
|
| 69 |
</script>
|
| 70 |
+
<script type="module" crossorigin src="/assets/main-7NfjLVBQ.js"></script>
|
| 71 |
<link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-B5Qt9EMX.js">
|
| 72 |
<link rel="modulepreload" crossorigin href="/assets/preload-helper-DiAwoGSG.js">
|
| 73 |
<link rel="modulepreload" crossorigin href="/assets/models-QsPq0tJ5.js">
|
sw.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
-
// Service worker TEMPLATE — deploy_pages.mjs stamps
|
| 2 |
-
// ["/","/about.html","/board.html","/manifest.webmanifest","/icon-192.png","/assets/main-
|
| 3 |
//
|
| 4 |
// Cache layers (all same-origin GET only):
|
| 5 |
// moxhi-shell-<build> app shell: precached index + hashed /assets/*
|
|
@@ -12,9 +12,9 @@
|
|
| 12 |
// them in its own Cache Storage bucket (content-addressed names).
|
| 13 |
/* global self, caches, fetch, location */
|
| 14 |
|
| 15 |
-
const SHELL = 'moxhi-shell-
|
| 16 |
const DATA = 'moxhi-data-v1';
|
| 17 |
-
const PRECACHE = ["/","/about.html","/board.html","/manifest.webmanifest","/icon-192.png","/assets/main-
|
| 18 |
// Model/data files the app fetches during startup — often BEFORE this SW has
|
| 19 |
// claimed the page on its very first visit, so runtime caching would miss
|
| 20 |
// them and the first offline reload would fail engine init. Precache them
|
|
@@ -46,6 +46,10 @@ self.addEventListener('install', (event) => {
|
|
| 46 |
const res = await fetch(url, REVALIDATE);
|
| 47 |
if (res.ok) await data.put(url, res);
|
| 48 |
}));
|
|
|
|
|
|
|
|
|
|
|
|
|
| 49 |
})());
|
| 50 |
});
|
| 51 |
|
|
@@ -77,7 +81,19 @@ async function networkFirst(req, cacheName, fallbackUrl) {
|
|
| 77 |
const cache = await caches.open(cacheName);
|
| 78 |
try {
|
| 79 |
// fetch(req, init) throws on navigate-mode Requests — pass the URL then.
|
| 80 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 81 |
if (res.ok) await cache.put(req, res.clone());
|
| 82 |
return res;
|
| 83 |
} catch (err) {
|
|
|
|
| 1 |
+
// Service worker TEMPLATE — deploy_pages.mjs stamps 3cf7c8d and
|
| 2 |
+
// ["/","/about.html","/board.html","/manifest.webmanifest","/icon-192.png","/assets/main-7NfjLVBQ.js","/assets/modulepreload-polyfill-B5Qt9EMX.js","/assets/preload-helper-DiAwoGSG.js","/assets/models-QsPq0tJ5.js","/assets/main-BfS_mgCl.css","/assets/about-BRw9WSHl.css","/assets/board-DQggw35t.js","/assets/board-DFM1bO4t.css","/assets/playfair-vietnamese-Cabi7G8-.woff2","/assets/playfair-latin-BOwq7MWX.woff2"] and writes the result to dist/sw.js. Never served in dev.
|
| 3 |
//
|
| 4 |
// Cache layers (all same-origin GET only):
|
| 5 |
// moxhi-shell-<build> app shell: precached index + hashed /assets/*
|
|
|
|
| 12 |
// them in its own Cache Storage bucket (content-addressed names).
|
| 13 |
/* global self, caches, fetch, location */
|
| 14 |
|
| 15 |
+
const SHELL = 'moxhi-shell-3cf7c8d';
|
| 16 |
const DATA = 'moxhi-data-v1';
|
| 17 |
+
const PRECACHE = ["/","/about.html","/board.html","/manifest.webmanifest","/icon-192.png","/assets/main-7NfjLVBQ.js","/assets/modulepreload-polyfill-B5Qt9EMX.js","/assets/preload-helper-DiAwoGSG.js","/assets/models-QsPq0tJ5.js","/assets/main-BfS_mgCl.css","/assets/about-BRw9WSHl.css","/assets/board-DQggw35t.js","/assets/board-DFM1bO4t.css","/assets/playfair-vietnamese-Cabi7G8-.woff2","/assets/playfair-latin-BOwq7MWX.woff2"];
|
| 18 |
// Model/data files the app fetches during startup — often BEFORE this SW has
|
| 19 |
// claimed the page on its very first visit, so runtime caching would miss
|
| 20 |
// them and the first offline reload would fail engine init. Precache them
|
|
|
|
| 46 |
const res = await fetch(url, REVALIDATE);
|
| 47 |
if (res.ok) await data.put(url, res);
|
| 48 |
}));
|
| 49 |
+
// Activate only after the all-or-nothing shell precache succeeds. This
|
| 50 |
+
// also lets clients escape an older worker whose HF root navigation was
|
| 51 |
+
// stranded by the host's / -> /index.html redirect.
|
| 52 |
+
await self.skipWaiting();
|
| 53 |
})());
|
| 54 |
});
|
| 55 |
|
|
|
|
| 81 |
const cache = await caches.open(cacheName);
|
| 82 |
try {
|
| 83 |
// fetch(req, init) throws on navigate-mode Requests — pass the URL then.
|
| 84 |
+
let res = await fetch(req.mode === 'navigate' ? req.url : req, REVALIDATE);
|
| 85 |
+
// HF Static Spaces redirects / to /index.html. A service worker cannot
|
| 86 |
+
// return that redirected Response to a controlled navigation: Chrome
|
| 87 |
+
// rejects it with net::ERR_FAILED. Re-wrap the final 200 body so the
|
| 88 |
+
// response is no longer marked redirected before caching/returning it.
|
| 89 |
+
if (req.mode === 'navigate' && res.redirected) {
|
| 90 |
+
const body = await res.blob();
|
| 91 |
+
res = new Response(body, {
|
| 92 |
+
status: res.status,
|
| 93 |
+
statusText: res.statusText,
|
| 94 |
+
headers: res.headers,
|
| 95 |
+
});
|
| 96 |
+
}
|
| 97 |
if (res.ok) await cache.put(req, res.clone());
|
| 98 |
return res;
|
| 99 |
} catch (err) {
|