Repository navigation
Expand file tree
/
Copy pathworkshop-completion.js
More file actions
54 lines (48 loc) · 1.93 KB
/
Copy pathworkshop-completion.js
File metadata and controls
54 lines (48 loc) · 1.93 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
(function (root, factory) {
const api = factory();
if (typeof module === 'object' && module.exports) {
module.exports = api;
}
root.WorkshopCompletion = api;
}(typeof globalThis !== 'undefined' ? globalThis : this, function () {
'use strict';
function createCelebration(window, document) {
const celebrated = new Set();
const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)');
let overlay;
let cleanupTimer;
function clear() {
window.clearTimeout(cleanupTimer);
overlay?.remove();
overlay = undefined;
reducedMotion.removeEventListener('change', clear);
}
function show(step) {
if (step.kind !== 'completion' || celebrated.has(step.id)) {
return;
}
celebrated.add(step.id);
if (reducedMotion.matches) {
return;
}
clear();
overlay = document.createElement('div');
overlay.className = 'completion-confetti';
overlay.setAttribute('aria-hidden', 'true');
for (let index = 0; index < 64; index++) {
const piece = document.createElement('span');
piece.style.left = `${Math.random() * 100}%`;
piece.style.setProperty('--drift', `${(Math.random() - 0.5) * 240}px`);
piece.style.setProperty('--delay', `${Math.random() * 350}ms`);
piece.style.setProperty('--turn', `${(Math.random() - 0.5) * 1080}deg`);
overlay.append(piece);
}
document.body.append(overlay);
reducedMotion.addEventListener('change', clear);
cleanupTimer = window.setTimeout(clear, 3500);
}
window.addEventListener('pagehide', clear);
return Object.freeze({ show, clear });
}
return Object.freeze({ createCelebration });
}));