Repository navigation
Expand file tree
/
Copy pathindex.html
More file actions
468 lines (467 loc) · 23.5 KB
/
Copy pathindex.html
File metadata and controls
468 lines (467 loc) · 23.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta content="width=device-width, initial-scale=1" name="viewport"/>
<meta content="eMuleBB publishes CI-gated Rust nightly builds for beta testing and maintains the stable MFC 0.7.x Windows client." name="description"/>
<meta content="index,follow" name="robots"/>
<meta content="eMuleBB" name="author"/>
<meta content="eMuleBB | Rust nightly builds and stable MFC client" property="og:title"/>
<meta content="eMuleBB publishes CI-gated Rust nightly builds for beta testing and maintains the stable MFC 0.7.x Windows client." property="og:description"/>
<meta content="website" property="og:type"/>
<meta content="https://emulebb.github.io/" property="og:url"/>
<meta content="eMule broadband edition" property="og:site_name"/>
<meta content="summary" name="twitter:card"/>
<link href="https://emulebb.github.io/" rel="canonical"/>
<link href="https://emulebb.github.io/sitemap.xml" rel="sitemap" type="application/xml"/><link href="https://emulebb.github.io/" hreflang="en" rel="alternate"/><link href="https://emulebb.github.io/ar-ae/" hreflang="ar-AE" rel="alternate"/><link href="https://emulebb.github.io/eu/" hreflang="eu" rel="alternate"/><link href="https://emulebb.github.io/bg/" hreflang="bg" rel="alternate"/><link href="https://emulebb.github.io/ca/" hreflang="ca" rel="alternate"/><link href="https://emulebb.github.io/cs/" hreflang="cs" rel="alternate"/><link href="https://emulebb.github.io/da/" hreflang="da" rel="alternate"/><link href="https://emulebb.github.io/el/" hreflang="el" rel="alternate"/><link href="https://emulebb.github.io/es/" hreflang="es" rel="alternate"/><link href="https://emulebb.github.io/ast/" hreflang="ast" rel="alternate"/><link href="https://emulebb.github.io/et/" hreflang="et" rel="alternate"/><link href="https://emulebb.github.io/fa/" hreflang="fa" rel="alternate"/><link href="https://emulebb.github.io/fi/" hreflang="fi" rel="alternate"/><link href="https://emulebb.github.io/br/" hreflang="br" rel="alternate"/><link href="https://emulebb.github.io/pt-br/" hreflang="pt-BR" rel="alternate"/><link href="https://emulebb.github.io/pt-pt/" hreflang="pt-PT" rel="alternate"/><link href="https://emulebb.github.io/gl/" hreflang="gl" rel="alternate"/><link href="https://emulebb.github.io/he/" hreflang="he" rel="alternate"/><link href="https://emulebb.github.io/hu/" hreflang="hu" rel="alternate"/><link href="https://emulebb.github.io/it/" hreflang="it" rel="alternate"/><link href="https://emulebb.github.io/ja/" hreflang="ja" rel="alternate"/><link href="https://emulebb.github.io/ko/" hreflang="ko" rel="alternate"/><link href="https://emulebb.github.io/lt/" hreflang="lt" rel="alternate"/><link href="https://emulebb.github.io/lv/" hreflang="lv" rel="alternate"/><link href="https://emulebb.github.io/mt/" hreflang="mt" rel="alternate"/><link href="https://emulebb.github.io/nb/" hreflang="nb" rel="alternate"/><link href="https://emulebb.github.io/ru/" hreflang="ru" rel="alternate"/><link href="https://emulebb.github.io/de/" hreflang="de" rel="alternate"/><link href="https://emulebb.github.io/fr/" hreflang="fr" rel="alternate"/><link href="https://emulebb.github.io/pl/" hreflang="pl" rel="alternate"/><link href="https://emulebb.github.io/nl/" hreflang="nl" rel="alternate"/><link href="https://emulebb.github.io/nn/" hreflang="nn" rel="alternate"/><link href="https://emulebb.github.io/ro/" hreflang="ro" rel="alternate"/><link href="https://emulebb.github.io/sl/" hreflang="sl" rel="alternate"/><link href="https://emulebb.github.io/sq/" hreflang="sq" rel="alternate"/><link href="https://emulebb.github.io/sv/" hreflang="sv" rel="alternate"/><link href="https://emulebb.github.io/tr/" hreflang="tr" rel="alternate"/><link href="https://emulebb.github.io/uk/" hreflang="uk" rel="alternate"/><link href="https://emulebb.github.io/ug-cn/" hreflang="ug-CN" rel="alternate"/><link href="https://emulebb.github.io/ca-valencia/" hreflang="ca-ES-valencia" rel="alternate"/><link href="https://emulebb.github.io/ca-valencia-racv/" hreflang="ca-ES-valencia-x-racv" rel="alternate"/><link href="https://emulebb.github.io/vi/" hreflang="vi" rel="alternate"/><link href="https://emulebb.github.io/zh-cn/" hreflang="zh-CN" rel="alternate"/><link href="https://emulebb.github.io/zh-tw/" hreflang="zh-TW" rel="alternate"/><link href="https://emulebb.github.io/" hreflang="x-default" rel="alternate"/>
<link href="assets/brand/emulebb-favicon.ico" rel="icon" type="image/x-icon"/>
<title>eMuleBB | Rust nightly builds and stable MFC client</title>
<link href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.classless.min.css" rel="stylesheet"/>
<link href="styles.css" rel="stylesheet"/>
<style>
.install-command {
width: min(100%, 980px);
display: grid;
gap: 12px;
margin-top: 18px;
padding: 16px;
border: 1px solid rgba(21, 24, 29, 0.16);
border-radius: 8px;
background: #ffffff;
box-shadow: 0 10px 26px rgba(28, 32, 36, 0.08);
}
.install-command-header {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 12px;
align-items: center;
}
.install-command-code {
min-width: 0;
max-width: 100%;
margin: 0;
overflow-x: auto;
border: 1px solid rgba(14, 111, 118, 0.22);
border-radius: 8px;
background: #eef3f5;
}
.install-command-code code {
display: block;
width: 100%;
padding: 12px;
border: 0;
background: transparent;
white-space: nowrap;
}
</style>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-8G02C2WFEB"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-8G02C2WFEB');
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "eMule broadband edition",
"alternateName": "eMuleBB",
"applicationCategory": "FileSharingApplication",
"operatingSystem": ["Windows", "Linux", "macOS"],
"url": "https://emulebb.github.io/",
"codeRepository": [
"https://github.com/emulebb/emulebb-rust",
"https://github.com/emulebb/emulebb"
],
"description": "eMuleBB publishes CI-gated nightly builds of its Rust eD2K/Kad client in beta and maintains the stable eMuleBB MFC 0.7.x Windows client."
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "eMule broadband edition",
"alternateName": ["eMuleBB", "emulebb"],
"url": "https://emulebb.github.io/"
}
</script>
</head>
<body>
<header class="site-header">
<a aria-label="eMule broadband edition home" class="brand" href="#top">
<img alt="eMuleBB broadband edition" class="brand-logo" decoding="async" height="160" src="assets/brand/emulebb-broadband-edition-logo.png" width="151"/>
</a>
<button aria-controls="primary-nav" aria-expanded="false" aria-label="Open primary navigation" class="menu-toggle" type="button">
<span class="menu-toggle-label">Menu</span>
</button>
<nav aria-label="Primary navigation" id="primary-nav">
<a href="#why">Why</a>
<a href="#features">Features</a>
<a class="nav-download" href="#install">Download</a>
<a href="#docs">Guide</a>
<a href="#team">Team</a>
<a href="#repos">Repos</a>
<a href="https://emulebb.github.io/faq/">FAQ</a>
</nav>
</header>
<main id="top">
<section class="hero">
<div class="hero-copy">
<p class="eyebrow">Two public eD2K/Kad client lanes</p>
<h1>Rust is in beta with nightly builds. MFC is the stable maintenance line.</h1>
<p class="lead">emulebb-rust is in beta. CI-gated nightly builds from main are the current public testing channel. eMuleBB MFC 0.7.3 remains the stable Windows release.</p>
<div aria-label="Project links" class="actions">
<a class="button primary" href="https://github.com/emulebb/emulebb-rust/releases">Get Rust nightlies</a>
<a class="button secondary" href="https://github.com/emulebb/emulebb-rust/blob/main/CONTRIBUTING.md">Contribute</a>
</div>
<div aria-label="Stable alternative" class="release-links">
<span>Stable alternative</span>
<a href="https://github.com/emulebb/emulebb/releases/tag/emulebb-v0.7.3">MFC 0.7.3 stable</a>
</div>
</div>
<aside aria-label="eMuleBB product summary" class="hero-panel">
<p class="panel-kicker">Current posture</p>
<h2>One active beta, one maintained stable client</h2>
<p>Rust moves forward as a best-effort, spare-time project, and contributors are welcome. The MFC line stays published and maintained without a broad feature or architecture roadmap.</p>
<ul class="signal-list">
<li>CI-gated nightly builds from main</li>
<li>Windows, Linux, and macOS packages</li>
<li>SHA-256 checksums and provenance attestations</li>
<li>Best-effort development</li>
<li>Contributors welcome</li>
<li>MFC 0.7.3 stable</li>
<li>MFC 0.7.x long-term maintenance</li>
<li>qBittorrentBB paused</li>
<li>aMuTorrent frozen</li>
<li>TrackMuleBB archived</li>
<li>Native Windows VPN work deprioritized</li>
</ul>
</aside>
</section>
<section class="testing-callout install-callout" id="install">
<div>
<p class="eyebrow">Public download channels</p>
<h2>Test Rust nightlies or use the stable MFC 0.7.3 client.</h2>
<p>Rust nightlies are CI-gated builds from <code>main</code>. Development is best-effort and spare-time, and <a href="https://github.com/emulebb/emulebb-rust/blob/main/CONTRIBUTING.md">contributors are welcome</a>. MFC 0.7.3 remains the stable Windows release.</p>
<div aria-label="Historical MFC 0.7.3 suite bundle" class="install-command">
<div class="install-command-header">
<strong>Historical MFC 0.7.3 suite bundle</strong>
<button class="copy-command" data-copy-error="Select and copy" data-copy-label="Copy" data-copy-success="Copied" data-copy-text="irm https://emulebb.github.io/install.ps1 | iex" type="button">Copy</button>
</div>
<pre class="install-command-code"><code>irm https://emulebb.github.io/install.ps1 | iex</code></pre>
</div>
<p class="install-standalone">The one-line installer is retained for the shipped MFC 0.7.3 suite artifact; it is not an active cross-client roadmap.</p>
</div>
<div class="testing-actions">
<a href="https://github.com/emulebb/emulebb-rust/releases">Get Rust nightlies</a>
<a href="https://github.com/emulebb/emulebb/releases/tag/emulebb-v0.7.3">Open MFC 0.7.3</a>
</div>
</section>
<section class="intro">
<p><strong>eMuleBB</strong> now has two clear public entry points: the <strong>Rust nightly beta channel</strong> and the stable <strong>MFC 0.7.x</strong> Windows client. Rust development happens when maintainer time allows, and <a href="https://github.com/emulebb/emulebb-rust/blob/main/CONTRIBUTING.md">contributors are very welcome</a>. Other repositories are supporting harnesses, reference forks, paused experiments, or release history—not additional active products.</p>
</section>
<section class="section motivation" id="why">
<div class="section-heading">
<p class="eyebrow">Lifecycle</p>
<h2>A smaller, explicit product portfolio</h2>
</div>
<div aria-label="eMuleBB motivation" class="motivation-grid">
<article>
<span>Active</span>
<h3>Rust nightly beta channel</h3>
<p>CI-gated nightlies from <code>main</code> are the current public testing builds for Windows, Linux, and macOS.</p>
</article>
<article>
<span>Stable</span>
<h3>eMuleBB MFC</h3>
<p>The published 0.7.3 Windows client continues as a long-term 0.7.x maintenance line for bugs and bounded low-risk changes.</p>
</article>
<article>
<span>Community</span>
<h3>Contributors are welcome</h3>
<p>Rust development is best-effort and spare-time. Read the <a href="https://github.com/emulebb/emulebb-rust/blob/main/CONTRIBUTING.md">contributing guide</a> to help with code, tests, documentation, or validation.</p>
</article>
</div>
</section>
<section class="section" id="features">
<div class="section-heading">
<p class="eyebrow">Stable MFC capabilities</p>
<h2>What the maintained MFC client already provides</h2>
<p>These are shipped 0.7.3 capabilities, not a promise of renewed broad MFC development. Maintenance remains compatibility- and risk-bounded.</p>
</div>
<div aria-label="eMule broadband feature groups" class="feature-table">
<article>
<span>Sharing and upload</span>
<h3>Broadband upload control</h3>
<p>Bounded slot targets, weak-slot recycling, ratio readouts, and seeding controls keep fast upload links useful without changing the eD2K upload protocol.</p>
</article>
<article>
<span>Network control</span>
<h3>Binding, NAT, and exposure policy</h3>
<p>Interface-aware binding, UPnP/NAT mapping validation, HTTPS, allowed-IP rules, and separate WebServer bind settings keep remote surfaces explicit and testable. Binding is not a VPN kill switch.</p>
</article>
<article>
<span>Performance and scale</span>
<h3>Modern defaults for large sessions</h3>
<p>Higher socket buffers, queue/source limits, file buffering, timeout defaults, recursive share sync, startup cache work, and long-path guidance target current Windows systems and large libraries.</p>
</article>
<article>
<span>Classic network</span>
<h3>eD2K and Kad stay first</h3>
<p>Server, global, and Kad search remain the native foundation, with Kad identity tracking, bad-node handling, cleanup, and timing work kept inside compatibility boundaries.</p>
</article>
<article>
<span>Automation</span>
<h3>REST and controller workflows</h3>
<p>Authenticated JSON endpoints cover transfers, searches, shared files, servers, Kad, logs, categories, uploads, statistics, preferences, and controlled shutdown from trusted local tools.</p>
</article>
<article>
<span>Testing and release discipline</span>
<h3>Evidence before labels</h3>
<p><code>0.7.3</code> is published with GitHub Actions packaging, manifests, SHA-256 evidence, SPDX SBOMs, diagnostics assets, and bootstrapper hash evidence.</p>
</article>
</div>
</section>
<section class="section docs" id="docs">
<div class="section-heading">
<p class="eyebrow">Documentation</p>
<h2>Guides, API, and release notes</h2>
<p>Start with setup, then use the product and integration guides for the operating model, controller workflows, and release evidence.</p>
</div>
<div class="guide-grid guide-compact">
<article>
<span>01</span>
<h3>Start with Rust nightlies</h3>
<p>Use the <a href="https://github.com/emulebb/emulebb-rust/releases">current nightly prereleases</a> for beta testing, verify <code>SHA256SUMS</code>, and report reproducible issues in emulebb-rust.</p>
</article>
<article>
<span>02</span>
<h3>Contribute to the active lane</h3>
<p>The project advances when maintainer and contributor time allows. The <a href="https://github.com/emulebb/emulebb-rust/blob/main/CONTRIBUTING.md">contributing guide</a> covers code, tests, documentation, and validation.</p>
</article>
<article>
<span>03</span>
<h3>Use MFC for the stable Windows lane</h3>
<p>Version 0.7.3 remains the supported stable package while 0.7.x receives maintenance fixes.</p>
</article>
</div>
<div class="automation-copy docs-automation">
<p>The stable MFC client retains its authenticated <code>/api/v1</code> automation surface. Controller forks and qBittorrent-compatible experiments are not forward product priorities.</p>
<ul aria-label="REST API areas" class="api-list">
<li>Transfers</li>
<li>Searches</li>
<li>Servers</li>
<li>Kad</li>
<li>Shared files</li>
<li>Uploads</li>
<li>Categories</li>
<li>Logs</li>
<li>Statistics</li>
<li>Preferences</li>
</ul>
</div>
<div class="doc-list">
<a href="https://emulebb.github.io/emulebb-tooling/active/PRODUCT-PORTFOLIO/">
<strong>Product portfolio</strong>
<span>Current lifecycle and support status for every eMuleBB repository.</span>
</a>
<a href="https://emulebb.github.io/emulebb-tooling/reference/ROADMAP-SUMMARY/">
<strong>eMuleBB Roadmap</strong>
<span>Active Rust beta work, MFC maintenance, and bounded supporting lanes.</span>
</a>
<a href="https://emulebb.github.io/emulebb-tooling/reference/GUIDE-EMULEBB/">
<strong>MFC product guide</strong>
<span>Setup, tuning, automation, release-aware use, testing, and SBOM evidence.</span>
</a>
<a href="https://emulebb.github.io/emulebb-tooling/reference/GUIDE-SETUP/">
<strong>Setup guide</strong>
<span>Install model, first-run profile behavior, and practical startup notes.</span>
</a>
<a href="https://emulebb.github.io/emulebb-tooling/active/RELEASE-0.7.3/">
<strong>0.7.3 release dashboard</strong>
<span>Current RC gates, automated test evidence, SBOM/package proof, and readiness rules.</span>
</a>
</div>
</section>
<section class="section team" id="team">
<div class="section-heading">
<p class="eyebrow">Project lore</p>
<h2>The mule team behind the P2P workshop</h2>
</div>
<div aria-label="The mule team behind the P2P workshop" class="team-grid">
<article>
<img alt="Cartoon mule carrying an upload arrow and a clipboard." class="team-image" decoding="async" height="160" loading="lazy" src="assets/team/upload-mule.png" width="160"/>
<span>01</span>
<h3>Upload Mule Wrangler</h3>
<p>Keeps broadband upload slots from kicking the stable door down, then nudges the slow ones back into line with a very official clipboard.</p>
</article>
<article>
<img alt="Cartoon mule carrying connected Kad nodes across a trail." class="team-image" decoding="async" height="160" loading="lazy" src="assets/team/kad-trail-mule.png" width="160"/>
<span>02</span>
<h3>Kad Trail Mule</h3>
<p>Carries bootstrap nodes, routing tables, and stubborn eD2K/Kad folklore across rough network terrain without dropping the protocol map.</p>
</article>
<article>
<img alt="Cartoon mule hauling release packages and checks." class="team-image" decoding="async" height="160" loading="lazy" src="assets/team/release-pack-mule.png" width="160"/>
<span>03</span>
<h3>Release Pack Mule</h3>
<p>Hauls packages, hashes, SBOMs, logs, live checks, and just enough attitude through the gate before anything gets called ready.</p>
</article>
</div>
</section>
<section class="section release" id="release">
<div class="section-heading">
<p class="eyebrow">Published releases</p>
<h2>Use the release that matches the lane</h2>
</div>
<div aria-label="eMuleBB release proof" class="release-grid">
<article>
<span></span>
<strong>Rust nightly builds</strong>
<p>CI-passed <code>main</code> commits publish immutable nightly prereleases with native packages, <code>SHA256SUMS</code>, provenance attestations, and a retained history of the newest 14 builds.</p>
</article>
<article>
<span></span>
<strong>MFC 0.7.3</strong>
<p>The stable Windows package remains published with manifests, hashes, SBOMs, and diagnostics assets.</p>
</article>
<article>
<span></span>
<strong>Historical Suite bundle</strong>
<p>The MFC 0.7.3 release keeps its suite installer and aMuTorrent artifact. “Suite” describes that shipped bundle, not an active umbrella roadmap.</p>
</article>
<article>
<span></span>
<strong>Evidence stays lane-specific</strong>
<p>Capabilities, platform support, and network-safety claims must be proven by the repository and release that owns them.</p>
</article>
</div>
</section>
<section class="section repos" id="repos">
<div class="section-heading">
<p class="eyebrow">eMuleBB ecosystem</p>
<h2>Primary repositories</h2>
</div>
<div class="repo-list">
<a href="https://github.com/emulebb/emulebb-rust">
<strong>emulebb-rust</strong>
<span>active beta and current product-development lane</span>
</a>
<a href="https://github.com/emulebb/emulebb">
<strong>emulebb</strong>
<span>stable 0.7.x Windows client in long-term maintenance</span>
</a>
<a href="https://github.com/emulebb/emulebb-tooling">
<strong>emulebb-tooling</strong>
<span>roadmap, backlog, policy, audits, and reference docs</span>
</a>
<a href="https://github.com/emulebb/emulebb-build">
<strong>emulebb-build</strong>
<span>build, validation, and release orchestration</span>
</a>
<a href="https://github.com/emulebb/emulebb-build-tests">
<strong>emulebb-build-tests</strong>
<span>native, Python, UI, REST, and live E2E tests</span>
</a>
<a href="https://github.com/emulebb/goed2k-server">
<strong>goed2k-server</strong>
<span>fixed-purpose eD2K harness server with no product evolution planned</span>
</a>
<a href="https://github.com/emulebb/ed2k-server">
<strong>ed2k-server</strong>
<span>reference fork for analysis and possible upstream contributions</span>
</a>
<a href="https://github.com/emulebb/amule">
<strong>aMule Windows builds</strong>
<span>Windows build and validation track for aMule users</span>
</a>
<a href="https://github.com/emulebb/amutorrent">
<strong>amutorrent</strong>
<span>frozen controller fork retained with the MFC 0.7.3 history</span>
</a>
<a href="https://github.com/emulebb/qbittorrentbb">
<strong>qbittorrentbb</strong>
<span>paused BitTorrent experiment retained for reference</span>
</a>
</div>
</section>
</main>
<footer>
<span>eMule broadband edition</span>
<div aria-label="Footer links" class="footer-links">
<a href="languages/">Languages</a>
<a href="https://github.com/emulebb">GitHub</a>
<a href="https://discord.gg/uWQa9g37">Discord</a>
</div>
</footer>
<script>
(function () {
var button = document.querySelector(".menu-toggle");
var nav = document.getElementById("primary-nav");
if (!button || !nav) {
return;
}
function setOpen(open) {
nav.classList.toggle("is-open", open);
button.setAttribute("aria-expanded", String(open));
button.setAttribute("aria-label", open ? "Close primary navigation" : "Open primary navigation");
}
setOpen(false);
button.addEventListener("click", function () {
setOpen(button.getAttribute("aria-expanded") !== "true");
});
nav.addEventListener("click", function (event) {
if (event.target && event.target.closest("a")) {
setOpen(false);
}
});
})();
(function () {
var buttons = document.querySelectorAll(".copy-command");
if (!buttons.length) {
return;
}
function fallbackCopy(text) {
var textarea = document.createElement("textarea");
textarea.value = text;
textarea.setAttribute("readonly", "");
textarea.style.position = "fixed";
textarea.style.left = "-9999px";
document.body.appendChild(textarea);
textarea.select();
try {
return document.execCommand("copy");
} finally {
document.body.removeChild(textarea);
}
}
buttons.forEach(function (button) {
var label = button.getAttribute("data-copy-label") || button.textContent;
var success = button.getAttribute("data-copy-success") || label;
var error = button.getAttribute("data-copy-error") || label;
button.addEventListener("click", function () {
var text = button.getAttribute("data-copy-text") || "";
var copied = navigator.clipboard && window.isSecureContext
? navigator.clipboard.writeText(text).then(function () { return true; }, function () { return fallbackCopy(text); })
: Promise.resolve(fallbackCopy(text));
copied.then(function (ok) {
if (!ok) {
throw new Error("copy failed");
}
button.textContent = success;
window.setTimeout(function () {
button.textContent = label;
}, 1600);
}).catch(function () {
button.textContent = error;
window.setTimeout(function () {
button.textContent = label;
}, 2200);
});
});
});
})();
</script>
</body>
</html>