-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
466 lines (465 loc) · 22.9 KB
/
Copy pathindex.html
File metadata and controls
466 lines (465 loc) · 22.9 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
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta content="width=device-width, initial-scale=1" name="viewport"/>
<meta content="eMuleBB publishes an active experimental Rust beta 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 beta and stable MFC client" property="og:title"/>
<meta content="eMuleBB publishes an active experimental Rust beta 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 beta 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 develops an experimental eD2K/Kad client in Rust 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 the active beta. MFC is the stable maintenance line.</h1>
<p class="lead">emulebb-rust 0.1.0-beta.1 is published for experimental testing. eMuleBB MFC 0.7.3 remains the stable Windows release and receives bugs and bounded low-risk improvements.</p>
<div aria-label="Project links" class="actions">
<a class="button primary" href="https://github.com/emulebb/emulebb-rust/releases/tag/rust-v0.1.0-beta.1">Try Rust beta</a>
<a class="button secondary" href="https://github.com/emulebb/emulebb/releases/tag/emulebb-v0.7.3">MFC 0.7.3</a>
</div>
<div aria-label="Download releases" class="release-links">
<span>Download releases</span>
<a href="https://github.com/emulebb/emulebb-rust/releases/tag/rust-v0.1.0-beta.1">Rust 0.1.0-beta.1</a>
<a href="https://github.com/emulebb/emulebb/releases/tag/emulebb-v0.7.3">MFC 0.7.3</a>
</div>
</div>
<aside aria-label="eMuleBB product summary" class="hero-panel">
<p class="panel-kicker">Current posture</p>
<h2>One active experiment, one maintained stable client</h2>
<p>New product development belongs to the Rust lane. The MFC line stays published and maintained without a broad feature or architecture roadmap.</p>
<ul class="signal-list">
<li>Rust 0.1.0-beta.1 published</li>
<li>Experimental, not production-ready</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">Published releases</p>
<h2>Try the Rust beta or use the stable MFC 0.7.3 client.</h2>
<p>Rust is the active experimental product lane and is not yet production-ready. MFC 0.7.3 remains the stable Windows release and continues on a long-term maintenance track.</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/tag/rust-v0.1.0-beta.1">Open Rust beta</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 active experimental <strong>Rust beta</strong> and the stable <strong>MFC 0.7.x</strong> Windows client. 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>emulebb-rust</h3>
<p>The published beta is the only active product-development lane. It is experimental and not yet production-ready.</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>Reference</span>
<h3>Experiments stay labeled</h3>
<p>qBittorrentBB is paused, aMuTorrent is frozen, TrackMuleBB is archived, and the server forks have bounded harness or reference roles.</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 the Rust beta</h3>
<p>Use the published beta for experimental testing and report reproducible issues in emulebb-rust.</p>
</article>
<article>
<span>02</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>
<article>
<span>03</span>
<h3>Check repository lifecycle first</h3>
<p>The product portfolio and roadmap identify which repositories are active, maintained, frozen, paused, archived, harness-only, or reference-only.</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 0.1.0-beta.1</strong>
<p>The first public Rust beta is available for experimental testing. It is the active development lane, but it is not production-ready.</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 experimental 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>