-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.js
More file actions
101 lines (78 loc) · 3.12 KB
/
app.js
File metadata and controls
101 lines (78 loc) · 3.12 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
let criticalCSS = '';
document.getElementById('extractForm').addEventListener('submit', async (e) => {
e.preventDefault();
const url = document.getElementById('url').value;
const width = parseInt(document.getElementById('width').value);
const height = parseInt(document.getElementById('height').value);
await extractCriticalCSS(url, width, height);
});
document.getElementById('downloadBtn').addEventListener('click', () => {
downloadCSS();
});
async function extractCriticalCSS(url, width, height) {
const extractBtn = document.getElementById('extractBtn');
const status = document.getElementById('status');
const progress = document.getElementById('progress');
const results = document.getElementById('results');
extractBtn.disabled = true;
status.className = 'status';
results.classList.remove('show');
progress.classList.add('show');
try {
updateProgress(20, 'Envoi de la requête au serveur...');
const response = await fetch('/api/extract', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ url, width, height })
});
if (!response.ok) {
throw new Error(`Erreur HTTP: ${response.status}`);
}
updateProgress(100, 'Extraction terminée!');
const data = await response.json();
criticalCSS = data.css;
showResults(data);
status.textContent = '✅ CSS critique extrait avec succès!';
status.className = 'status success show';
} catch (error) {
console.error('Erreur:', error);
status.textContent = `❌ Erreur: ${error.message}`;
status.className = 'status error show';
} finally {
extractBtn.disabled = false;
progress.classList.remove('show');
}
}
function updateProgress(percent, text) {
document.getElementById('progressFill').style.width = percent + '%';
document.getElementById('progressText').textContent = text;
}
function showResults(data) {
const results = document.getElementById('results');
const sizeKB = (data.css.length / 1024).toFixed(2);
const reduction = data.originalSize > 0
? ((1 - data.css.length / data.originalSize) * 100).toFixed(2)
: 0;
document.getElementById('cssSize').textContent = sizeKB + ' KB';
document.getElementById('reduction').textContent = reduction + '%';
document.getElementById('rulesCount').textContent = data.rulesCount || countRules(data.css);
const preview = document.getElementById('preview');
preview.textContent = data.css.substring(0, 5000) + (data.css.length > 5000 ? '\n\n... (tronqué)' : '');
results.classList.add('show');
}
function countRules(css) {
return (css.match(/\{/g) || []).length;
}
function downloadCSS() {
const blob = new Blob([criticalCSS], { type: 'text/css' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'critical.css';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
}