@slashgear/gdpr-cookie-scanner 3.6.0 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +44 -0
- package/CLAUDE.md +12 -1
- package/NEXT_STEPS.md +37 -3
- package/README.md +23 -0
- package/dist/analyzers/colour.d.ts +36 -0
- package/dist/analyzers/colour.d.ts.map +1 -0
- package/dist/analyzers/colour.js +75 -0
- package/dist/analyzers/colour.js.map +1 -0
- package/dist/analyzers/compliance.d.ts.map +1 -1
- package/dist/analyzers/compliance.js +24 -6
- package/dist/analyzers/compliance.js.map +1 -1
- package/dist/analyzers/tcf-decoder.d.ts +9 -0
- package/dist/analyzers/tcf-decoder.d.ts.map +1 -0
- package/dist/analyzers/tcf-decoder.js +123 -0
- package/dist/analyzers/tcf-decoder.js.map +1 -0
- package/dist/analyzers/wording.d.ts +1 -0
- package/dist/analyzers/wording.d.ts.map +1 -1
- package/dist/analyzers/wording.js +39 -0
- package/dist/analyzers/wording.js.map +1 -1
- package/dist/report/generator.d.ts +1 -0
- package/dist/report/generator.d.ts.map +1 -1
- package/dist/report/generator.js +71 -1
- package/dist/report/generator.js.map +1 -1
- package/dist/report/html.d.ts.map +1 -1
- package/dist/report/html.js +123 -0
- package/dist/report/html.js.map +1 -1
- package/dist/scanner/consent-modal.d.ts.map +1 -1
- package/dist/scanner/consent-modal.js +4 -2
- package/dist/scanner/consent-modal.js.map +1 -1
- package/dist/scanner/index.d.ts.map +1 -1
- package/dist/scanner/index.js +4 -0
- package/dist/scanner/index.js.map +1 -1
- package/dist/scanner/tcf.d.ts +9 -0
- package/dist/scanner/tcf.d.ts.map +1 -0
- package/dist/scanner/tcf.js +72 -0
- package/dist/scanner/tcf.js.map +1 -0
- package/dist/types.d.ts +26 -0
- package/dist/types.d.ts.map +1 -1
- package/docs/index.html +37 -49
- package/docs/reports/www.arte.tv/after-accept.png +0 -0
- package/docs/reports/www.arte.tv/after-reject.png +0 -0
- package/docs/reports/www.arte.tv/gdpr-report-arte.tv-2026-02-24.html +997 -0
- package/docs/reports/www.deezer.com/after-accept.png +0 -0
- package/docs/reports/www.deezer.com/after-reject.png +0 -0
- package/docs/reports/www.deezer.com/gdpr-report-deezer.com-2026-02-22.html +1667 -0
- package/docs/reports/www.impots.gouv.fr/after-accept.png +0 -0
- package/docs/reports/www.impots.gouv.fr/after-reject.png +0 -0
- package/docs/reports/www.impots.gouv.fr/gdpr-report-impots.gouv.fr-2026-02-22.html +751 -0
- package/docs/reports/www.leboncoin.fr/after-accept.png +0 -0
- package/docs/reports/www.leboncoin.fr/after-reject.png +0 -0
- package/docs/reports/www.leboncoin.fr/gdpr-report-leboncoin.fr-2026-02-22.html +764 -0
- package/docs/reports/www.netflix.com/after-accept.png +0 -0
- package/docs/reports/www.netflix.com/after-reject.png +0 -0
- package/docs/reports/www.netflix.com/gdpr-report-netflix.com-2026-02-23.html +1050 -0
- package/docs/reports/www.radiofrance.fr/after-accept.png +0 -0
- package/docs/reports/www.radiofrance.fr/after-reject.png +0 -0
- package/docs/reports/www.radiofrance.fr/gdpr-report-radiofrance.fr-2026-02-24.html +1145 -0
- package/package.json +1 -1
- package/src/analyzers/colour.ts +89 -0
- package/src/analyzers/compliance.ts +35 -10
- package/src/analyzers/tcf-decoder.ts +130 -0
- package/src/analyzers/wording.ts +44 -0
- package/src/report/generator.ts +83 -1
- package/src/report/html.ts +146 -0
- package/src/scanner/consent-modal.ts +3 -1
- package/src/scanner/index.ts +5 -0
- package/src/scanner/tcf.ts +80 -0
- package/src/types.ts +29 -0
- package/tests/analyzers/colour.test.ts +187 -0
- package/tests/analyzers/compliance.test.ts +102 -0
- package/tests/analyzers/tcf-decoder.test.ts +292 -0
- package/tests/analyzers/wording.test.ts +38 -0
- package/tests/scanner/button-classification.test.ts +32 -0
- package/docs/reports/github.com/after-accept.png +0 -0
- package/docs/reports/github.com/after-reject.png +0 -0
- package/docs/reports/github.com/gdpr-checklist-github.com-2026-02-22.md +0 -44
- package/docs/reports/github.com/gdpr-cookies-github.com-2026-02-22.md +0 -29
- package/docs/reports/github.com/gdpr-report-github.com-2026-02-22.md +0 -102
- package/docs/reports/github.com/gdpr-report-github.com-2026-02-22.pdf +0 -0
- package/docs/reports/gitlab.com/after-accept.png +0 -0
- package/docs/reports/gitlab.com/after-reject.png +0 -0
- package/docs/reports/gitlab.com/gdpr-checklist-gitlab.com-2026-02-22.md +0 -44
- package/docs/reports/gitlab.com/gdpr-cookies-gitlab.com-2026-02-22.md +0 -55
- package/docs/reports/gitlab.com/gdpr-report-gitlab.com-2026-02-22.md +0 -200
- package/docs/reports/gitlab.com/gdpr-report-gitlab.com-2026-02-22.pdf +0 -0
- package/docs/reports/gitlab.com/modal-initial.png +0 -0
- package/docs/reports/npmjs.com/after-accept.png +0 -0
- package/docs/reports/npmjs.com/after-reject.png +0 -0
- package/docs/reports/npmjs.com/gdpr-checklist-npmjs.com-2026-02-22.md +0 -44
- package/docs/reports/npmjs.com/gdpr-cookies-npmjs.com-2026-02-22.md +0 -25
- package/docs/reports/npmjs.com/gdpr-report-npmjs.com-2026-02-22.md +0 -88
- package/docs/reports/npmjs.com/gdpr-report-npmjs.com-2026-02-22.pdf +0 -0
- package/docs/reports/reddit.com/after-accept.png +0 -0
- package/docs/reports/reddit.com/after-reject.png +0 -0
- package/docs/reports/reddit.com/gdpr-checklist-reddit.com-2026-02-22.md +0 -44
- package/docs/reports/reddit.com/gdpr-cookies-reddit.com-2026-02-22.md +0 -33
- package/docs/reports/reddit.com/gdpr-report-reddit.com-2026-02-22.md +0 -148
- package/docs/reports/reddit.com/gdpr-report-reddit.com-2026-02-22.pdf +0 -0
- package/docs/reports/reddit.com/modal-initial.png +0 -0
- package/docs/reports/stackoverflow.com/after-accept.png +0 -0
- package/docs/reports/stackoverflow.com/after-reject.png +0 -0
- package/docs/reports/stackoverflow.com/gdpr-checklist-stackoverflow.com-2026-02-22.md +0 -44
- package/docs/reports/stackoverflow.com/gdpr-cookies-stackoverflow.com-2026-02-22.md +0 -67
- package/docs/reports/stackoverflow.com/gdpr-report-stackoverflow.com-2026-02-22.md +0 -206
- package/docs/reports/stackoverflow.com/gdpr-report-stackoverflow.com-2026-02-22.pdf +0 -0
- package/docs/reports/stackoverflow.com/modal-initial.png +0 -0
- package/docs/reports/www.afp.com/after-accept.png +0 -0
- package/docs/reports/www.afp.com/after-reject.png +0 -0
- package/docs/reports/www.afp.com/gdpr-checklist-afp.com-2026-02-22.md +0 -44
- package/docs/reports/www.afp.com/gdpr-cookies-afp.com-2026-02-22.md +0 -42
- package/docs/reports/www.afp.com/gdpr-report-afp.com-2026-02-22.md +0 -202
- package/docs/reports/www.afp.com/gdpr-report-afp.com-2026-02-22.pdf +0 -0
- package/docs/reports/www.afp.com/modal-initial.png +0 -0
|
@@ -0,0 +1,764 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>GDPR Report — leboncoin.fr</title>
|
|
7
|
+
<style>
|
|
8
|
+
*,
|
|
9
|
+
*::before,
|
|
10
|
+
*::after {
|
|
11
|
+
box-sizing: border-box;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
:root {
|
|
15
|
+
--grade: #dc2626;
|
|
16
|
+
--grade-bg: #fef2f2;
|
|
17
|
+
--surface: #ffffff;
|
|
18
|
+
--bg: #f1f5f9;
|
|
19
|
+
--border: #e2e8f0;
|
|
20
|
+
--text: #0f172a;
|
|
21
|
+
--text-muted: #64748b;
|
|
22
|
+
--critical: #dc2626;
|
|
23
|
+
--critical-bg: #fef2f2;
|
|
24
|
+
--critical-border: #fecaca;
|
|
25
|
+
--warning: #d97706;
|
|
26
|
+
--warning-bg: #fffbeb;
|
|
27
|
+
--warning-border: #fde68a;
|
|
28
|
+
--ok: #16a34a;
|
|
29
|
+
--ok-bg: #f0fdf4;
|
|
30
|
+
--ok-border: #bbf7d0;
|
|
31
|
+
--radius: 10px;
|
|
32
|
+
--shadow: 0 1px 3px rgba(0, 0, 0, 0.08), 0 1px 2px rgba(0, 0, 0, 0.06);
|
|
33
|
+
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07), 0 2px 4px rgba(0, 0, 0, 0.06);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
body {
|
|
37
|
+
margin: 0;
|
|
38
|
+
background: var(--bg);
|
|
39
|
+
color: var(--text);
|
|
40
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
|
|
41
|
+
font-size: 14px;
|
|
42
|
+
line-height: 1.6;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/* ── Layout ── */
|
|
46
|
+
.page {
|
|
47
|
+
max-width: 1000px;
|
|
48
|
+
margin: 0 auto;
|
|
49
|
+
padding: 24px 16px 64px;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* ── Hero ── */
|
|
53
|
+
.hero {
|
|
54
|
+
background: var(--surface);
|
|
55
|
+
border-radius: var(--radius);
|
|
56
|
+
box-shadow: var(--shadow-md);
|
|
57
|
+
padding: 32px 36px;
|
|
58
|
+
display: flex;
|
|
59
|
+
align-items: center;
|
|
60
|
+
gap: 32px;
|
|
61
|
+
margin-bottom: 20px;
|
|
62
|
+
border-top: 4px solid var(--grade);
|
|
63
|
+
}
|
|
64
|
+
.grade-badge {
|
|
65
|
+
flex-shrink: 0;
|
|
66
|
+
width: 80px;
|
|
67
|
+
height: 80px;
|
|
68
|
+
border-radius: 16px;
|
|
69
|
+
background: var(--grade);
|
|
70
|
+
color: #fff;
|
|
71
|
+
font-size: 42px;
|
|
72
|
+
font-weight: 800;
|
|
73
|
+
display: flex;
|
|
74
|
+
align-items: center;
|
|
75
|
+
justify-content: center;
|
|
76
|
+
letter-spacing: -2px;
|
|
77
|
+
}
|
|
78
|
+
.hero-info {
|
|
79
|
+
flex: 1;
|
|
80
|
+
min-width: 0;
|
|
81
|
+
}
|
|
82
|
+
.hero-info h1 {
|
|
83
|
+
margin: 0 0 4px;
|
|
84
|
+
font-size: 22px;
|
|
85
|
+
font-weight: 700;
|
|
86
|
+
color: var(--text);
|
|
87
|
+
white-space: nowrap;
|
|
88
|
+
overflow: hidden;
|
|
89
|
+
text-overflow: ellipsis;
|
|
90
|
+
}
|
|
91
|
+
.hero-meta {
|
|
92
|
+
font-size: 13px;
|
|
93
|
+
color: var(--text-muted);
|
|
94
|
+
margin: 0;
|
|
95
|
+
}
|
|
96
|
+
.hero-score {
|
|
97
|
+
flex-shrink: 0;
|
|
98
|
+
text-align: right;
|
|
99
|
+
}
|
|
100
|
+
.hero-score .score-num {
|
|
101
|
+
font-size: 40px;
|
|
102
|
+
font-weight: 800;
|
|
103
|
+
color: var(--grade);
|
|
104
|
+
line-height: 1;
|
|
105
|
+
}
|
|
106
|
+
.hero-score .score-den {
|
|
107
|
+
font-size: 18px;
|
|
108
|
+
color: var(--text-muted);
|
|
109
|
+
font-weight: 400;
|
|
110
|
+
}
|
|
111
|
+
.hero-score .score-label {
|
|
112
|
+
font-size: 12px;
|
|
113
|
+
color: var(--text-muted);
|
|
114
|
+
margin-top: 4px;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/* ── Score grid ── */
|
|
118
|
+
.score-grid {
|
|
119
|
+
display: grid;
|
|
120
|
+
grid-template-columns: repeat(4, 1fr);
|
|
121
|
+
gap: 12px;
|
|
122
|
+
margin-bottom: 20px;
|
|
123
|
+
}
|
|
124
|
+
@media (max-width: 640px) {
|
|
125
|
+
.score-grid {
|
|
126
|
+
grid-template-columns: repeat(2, 1fr);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
.score-card {
|
|
130
|
+
background: var(--surface);
|
|
131
|
+
border-radius: var(--radius);
|
|
132
|
+
padding: 16px 18px;
|
|
133
|
+
box-shadow: var(--shadow);
|
|
134
|
+
}
|
|
135
|
+
.score-card-label {
|
|
136
|
+
font-size: 11px;
|
|
137
|
+
font-weight: 600;
|
|
138
|
+
text-transform: uppercase;
|
|
139
|
+
letter-spacing: 0.05em;
|
|
140
|
+
color: var(--text-muted);
|
|
141
|
+
margin-bottom: 8px;
|
|
142
|
+
}
|
|
143
|
+
.score-card-value {
|
|
144
|
+
font-size: 22px;
|
|
145
|
+
font-weight: 700;
|
|
146
|
+
color: var(--text);
|
|
147
|
+
margin-bottom: 8px;
|
|
148
|
+
}
|
|
149
|
+
.score-card-value span {
|
|
150
|
+
font-size: 14px;
|
|
151
|
+
font-weight: 400;
|
|
152
|
+
color: var(--text-muted);
|
|
153
|
+
}
|
|
154
|
+
.progress-track {
|
|
155
|
+
height: 6px;
|
|
156
|
+
background: var(--border);
|
|
157
|
+
border-radius: 3px;
|
|
158
|
+
overflow: hidden;
|
|
159
|
+
}
|
|
160
|
+
.progress-fill {
|
|
161
|
+
height: 100%;
|
|
162
|
+
border-radius: 3px;
|
|
163
|
+
background: var(--grade-color, #64748b);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/* ── Section ── */
|
|
167
|
+
.section {
|
|
168
|
+
background: var(--surface);
|
|
169
|
+
border-radius: var(--radius);
|
|
170
|
+
box-shadow: var(--shadow);
|
|
171
|
+
margin-bottom: 16px;
|
|
172
|
+
overflow: hidden;
|
|
173
|
+
}
|
|
174
|
+
.section-header {
|
|
175
|
+
padding: 16px 20px;
|
|
176
|
+
border-bottom: 1px solid var(--border);
|
|
177
|
+
display: flex;
|
|
178
|
+
align-items: center;
|
|
179
|
+
gap: 10px;
|
|
180
|
+
}
|
|
181
|
+
.section-header h2 {
|
|
182
|
+
margin: 0;
|
|
183
|
+
font-size: 15px;
|
|
184
|
+
font-weight: 600;
|
|
185
|
+
color: var(--text);
|
|
186
|
+
}
|
|
187
|
+
.section-body {
|
|
188
|
+
padding: 20px;
|
|
189
|
+
}
|
|
190
|
+
.section-body.no-pad {
|
|
191
|
+
padding: 0;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/* ── Badges ── */
|
|
195
|
+
.badge {
|
|
196
|
+
display: inline-flex;
|
|
197
|
+
align-items: center;
|
|
198
|
+
gap: 4px;
|
|
199
|
+
padding: 2px 8px;
|
|
200
|
+
border-radius: 99px;
|
|
201
|
+
font-size: 11px;
|
|
202
|
+
font-weight: 600;
|
|
203
|
+
}
|
|
204
|
+
.badge-critical {
|
|
205
|
+
background: var(--critical-bg);
|
|
206
|
+
color: var(--critical);
|
|
207
|
+
border: 1px solid var(--critical-border);
|
|
208
|
+
}
|
|
209
|
+
.badge-warning {
|
|
210
|
+
background: var(--warning-bg);
|
|
211
|
+
color: var(--warning);
|
|
212
|
+
border: 1px solid var(--warning-border);
|
|
213
|
+
}
|
|
214
|
+
.badge-ok {
|
|
215
|
+
background: var(--ok-bg);
|
|
216
|
+
color: var(--ok);
|
|
217
|
+
border: 1px solid var(--ok-border);
|
|
218
|
+
}
|
|
219
|
+
.badge-muted {
|
|
220
|
+
background: var(--bg);
|
|
221
|
+
color: var(--text-muted);
|
|
222
|
+
border: 1px solid var(--border);
|
|
223
|
+
}
|
|
224
|
+
.count-badge {
|
|
225
|
+
background: var(--bg);
|
|
226
|
+
color: var(--text-muted);
|
|
227
|
+
font-size: 12px;
|
|
228
|
+
font-weight: 600;
|
|
229
|
+
padding: 1px 8px;
|
|
230
|
+
border-radius: 99px;
|
|
231
|
+
margin-left: auto;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/* ── Issue cards ── */
|
|
235
|
+
.issue-list {
|
|
236
|
+
display: flex;
|
|
237
|
+
flex-direction: column;
|
|
238
|
+
gap: 10px;
|
|
239
|
+
}
|
|
240
|
+
.issue-card {
|
|
241
|
+
border-radius: 8px;
|
|
242
|
+
padding: 14px 16px;
|
|
243
|
+
border: 1px solid;
|
|
244
|
+
}
|
|
245
|
+
.issue-card.critical {
|
|
246
|
+
background: var(--critical-bg);
|
|
247
|
+
border-color: var(--critical-border);
|
|
248
|
+
}
|
|
249
|
+
.issue-card.warning {
|
|
250
|
+
background: var(--warning-bg);
|
|
251
|
+
border-color: var(--warning-border);
|
|
252
|
+
}
|
|
253
|
+
.issue-title {
|
|
254
|
+
font-size: 13px;
|
|
255
|
+
font-weight: 600;
|
|
256
|
+
margin-bottom: 4px;
|
|
257
|
+
}
|
|
258
|
+
.issue-card.critical .issue-title {
|
|
259
|
+
color: var(--critical);
|
|
260
|
+
}
|
|
261
|
+
.issue-card.warning .issue-title {
|
|
262
|
+
color: var(--warning);
|
|
263
|
+
}
|
|
264
|
+
.issue-evidence {
|
|
265
|
+
font-size: 12px;
|
|
266
|
+
color: var(--text-muted);
|
|
267
|
+
margin: 0;
|
|
268
|
+
}
|
|
269
|
+
.no-issues {
|
|
270
|
+
display: flex;
|
|
271
|
+
align-items: center;
|
|
272
|
+
gap: 8px;
|
|
273
|
+
color: var(--ok);
|
|
274
|
+
font-weight: 500;
|
|
275
|
+
font-size: 14px;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/* ── Tables ── */
|
|
279
|
+
.data-table {
|
|
280
|
+
width: 100%;
|
|
281
|
+
border-collapse: collapse;
|
|
282
|
+
font-size: 13px;
|
|
283
|
+
}
|
|
284
|
+
.data-table th {
|
|
285
|
+
background: var(--bg);
|
|
286
|
+
padding: 10px 14px;
|
|
287
|
+
text-align: left;
|
|
288
|
+
font-size: 11px;
|
|
289
|
+
font-weight: 600;
|
|
290
|
+
text-transform: uppercase;
|
|
291
|
+
letter-spacing: 0.04em;
|
|
292
|
+
color: var(--text-muted);
|
|
293
|
+
border-bottom: 1px solid var(--border);
|
|
294
|
+
white-space: nowrap;
|
|
295
|
+
}
|
|
296
|
+
.data-table td {
|
|
297
|
+
padding: 10px 14px;
|
|
298
|
+
border-bottom: 1px solid var(--border);
|
|
299
|
+
vertical-align: top;
|
|
300
|
+
}
|
|
301
|
+
.data-table tr:last-child td {
|
|
302
|
+
border-bottom: none;
|
|
303
|
+
}
|
|
304
|
+
.data-table tr:hover td {
|
|
305
|
+
background: #fafafa;
|
|
306
|
+
}
|
|
307
|
+
code {
|
|
308
|
+
font-family: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
|
|
309
|
+
font-size: 12px;
|
|
310
|
+
background: var(--bg);
|
|
311
|
+
padding: 1px 6px;
|
|
312
|
+
border-radius: 4px;
|
|
313
|
+
border: 1px solid var(--border);
|
|
314
|
+
}
|
|
315
|
+
.empty-state {
|
|
316
|
+
text-align: center;
|
|
317
|
+
padding: 32px;
|
|
318
|
+
color: var(--text-muted);
|
|
319
|
+
font-size: 13px;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/* ── Checklist status ── */
|
|
323
|
+
.status-ok {
|
|
324
|
+
color: var(--ok);
|
|
325
|
+
font-weight: 600;
|
|
326
|
+
}
|
|
327
|
+
.status-ko {
|
|
328
|
+
color: var(--critical);
|
|
329
|
+
font-weight: 600;
|
|
330
|
+
}
|
|
331
|
+
.status-warn {
|
|
332
|
+
color: var(--warning);
|
|
333
|
+
font-weight: 600;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/* ── Info grid ── */
|
|
337
|
+
.info-grid {
|
|
338
|
+
display: grid;
|
|
339
|
+
grid-template-columns: 1fr 1fr;
|
|
340
|
+
gap: 12px;
|
|
341
|
+
}
|
|
342
|
+
@media (max-width: 640px) {
|
|
343
|
+
.info-grid {
|
|
344
|
+
grid-template-columns: 1fr;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
.info-item {
|
|
348
|
+
}
|
|
349
|
+
.info-label {
|
|
350
|
+
font-size: 11px;
|
|
351
|
+
font-weight: 600;
|
|
352
|
+
text-transform: uppercase;
|
|
353
|
+
letter-spacing: 0.04em;
|
|
354
|
+
color: var(--text-muted);
|
|
355
|
+
margin-bottom: 2px;
|
|
356
|
+
}
|
|
357
|
+
.info-value {
|
|
358
|
+
font-size: 13px;
|
|
359
|
+
color: var(--text);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/* ── Buttons table ── */
|
|
363
|
+
.btn-chip {
|
|
364
|
+
display: inline-block;
|
|
365
|
+
padding: 2px 10px;
|
|
366
|
+
border-radius: 4px;
|
|
367
|
+
font-size: 12px;
|
|
368
|
+
font-weight: 600;
|
|
369
|
+
}
|
|
370
|
+
.btn-chip.accept {
|
|
371
|
+
background: #dcfce7;
|
|
372
|
+
color: #166534;
|
|
373
|
+
}
|
|
374
|
+
.btn-chip.reject {
|
|
375
|
+
background: #fee2e2;
|
|
376
|
+
color: #991b1b;
|
|
377
|
+
}
|
|
378
|
+
.btn-chip.preferences {
|
|
379
|
+
background: #dbeafe;
|
|
380
|
+
color: #1e40af;
|
|
381
|
+
}
|
|
382
|
+
.btn-chip.unknown,
|
|
383
|
+
.btn-chip.close {
|
|
384
|
+
background: var(--bg);
|
|
385
|
+
color: var(--text-muted);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/* ── Recommendations ── */
|
|
389
|
+
.rec-list {
|
|
390
|
+
list-style: none;
|
|
391
|
+
margin: 0;
|
|
392
|
+
padding: 0;
|
|
393
|
+
display: flex;
|
|
394
|
+
flex-direction: column;
|
|
395
|
+
gap: 10px;
|
|
396
|
+
}
|
|
397
|
+
.rec-item {
|
|
398
|
+
display: flex;
|
|
399
|
+
gap: 12px;
|
|
400
|
+
padding: 12px 14px;
|
|
401
|
+
background: #f8fafc;
|
|
402
|
+
border-radius: 8px;
|
|
403
|
+
border: 1px solid var(--border);
|
|
404
|
+
font-size: 13px;
|
|
405
|
+
}
|
|
406
|
+
.rec-num {
|
|
407
|
+
flex-shrink: 0;
|
|
408
|
+
width: 24px;
|
|
409
|
+
height: 24px;
|
|
410
|
+
border-radius: 50%;
|
|
411
|
+
background: var(--text);
|
|
412
|
+
color: #fff;
|
|
413
|
+
font-size: 12px;
|
|
414
|
+
font-weight: 700;
|
|
415
|
+
display: flex;
|
|
416
|
+
align-items: center;
|
|
417
|
+
justify-content: center;
|
|
418
|
+
margin-top: 1px;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/* ── Footer ── */
|
|
422
|
+
.footer {
|
|
423
|
+
text-align: center;
|
|
424
|
+
margin-top: 40px;
|
|
425
|
+
font-size: 12px;
|
|
426
|
+
color: var(--text-muted);
|
|
427
|
+
}
|
|
428
|
+
.footer a {
|
|
429
|
+
color: var(--text-muted);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
@media print {
|
|
433
|
+
body {
|
|
434
|
+
background: #fff;
|
|
435
|
+
}
|
|
436
|
+
.section {
|
|
437
|
+
box-shadow: none;
|
|
438
|
+
border: 1px solid var(--border);
|
|
439
|
+
}
|
|
440
|
+
.page {
|
|
441
|
+
padding: 0;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
</style>
|
|
445
|
+
</head>
|
|
446
|
+
<body>
|
|
447
|
+
<div class="page">
|
|
448
|
+
<div class="hero">
|
|
449
|
+
<div class="grade-badge" style="background: #dc2626">F</div>
|
|
450
|
+
<div class="hero-info">
|
|
451
|
+
<h1>leboncoin.fr</h1>
|
|
452
|
+
<p class="hero-meta">Scanned on 22 February 2026 at 22:06 · 6.8s</p>
|
|
453
|
+
</div>
|
|
454
|
+
<div class="hero-score">
|
|
455
|
+
<div>
|
|
456
|
+
<span class="score-num" style="color: #dc2626">25</span
|
|
457
|
+
><span class="score-den">/100</span>
|
|
458
|
+
</div>
|
|
459
|
+
<div class="score-label">Compliance score</div>
|
|
460
|
+
</div>
|
|
461
|
+
</div>
|
|
462
|
+
|
|
463
|
+
<div class="score-grid">
|
|
464
|
+
<div class="score-card">
|
|
465
|
+
<div class="score-card-label">Consent validity</div>
|
|
466
|
+
<div class="score-card-value">0<span>/25</span></div>
|
|
467
|
+
<div class="progress-track">
|
|
468
|
+
<div class="progress-fill" style="width: 0%; background: #dc2626"></div>
|
|
469
|
+
</div>
|
|
470
|
+
</div>
|
|
471
|
+
<div class="score-card">
|
|
472
|
+
<div class="score-card-label">Easy refusal</div>
|
|
473
|
+
<div class="score-card-value">0<span>/25</span></div>
|
|
474
|
+
<div class="progress-track">
|
|
475
|
+
<div class="progress-fill" style="width: 0%; background: #dc2626"></div>
|
|
476
|
+
</div>
|
|
477
|
+
</div>
|
|
478
|
+
<div class="score-card">
|
|
479
|
+
<div class="score-card-label">Transparency</div>
|
|
480
|
+
<div class="score-card-value">0<span>/25</span></div>
|
|
481
|
+
<div class="progress-track">
|
|
482
|
+
<div class="progress-fill" style="width: 0%; background: #dc2626"></div>
|
|
483
|
+
</div>
|
|
484
|
+
</div>
|
|
485
|
+
<div class="score-card">
|
|
486
|
+
<div class="score-card-label">Cookie behavior</div>
|
|
487
|
+
<div class="score-card-value">25<span>/25</span></div>
|
|
488
|
+
<div class="progress-track">
|
|
489
|
+
<div class="progress-fill" style="width: 100%; background: #16a34a"></div>
|
|
490
|
+
</div>
|
|
491
|
+
</div>
|
|
492
|
+
</div>
|
|
493
|
+
|
|
494
|
+
<div class="section">
|
|
495
|
+
<div class="section-header">
|
|
496
|
+
<h2>Issues</h2>
|
|
497
|
+
<span class="count-badge">2</span>
|
|
498
|
+
<span class="badge badge-critical">1 critical</span>
|
|
499
|
+
<span class="badge badge-warning">1 warning</span>
|
|
500
|
+
</div>
|
|
501
|
+
<div class="section-body">
|
|
502
|
+
<div class="issue-list">
|
|
503
|
+
<div class="issue-card critical">
|
|
504
|
+
<div class="issue-title">No cookie consent modal detected</div>
|
|
505
|
+
<p class="issue-evidence">
|
|
506
|
+
A consent mechanism is required before depositing non-essential cookies
|
|
507
|
+
</p>
|
|
508
|
+
</div>
|
|
509
|
+
<div class="issue-card warning">
|
|
510
|
+
<div class="issue-title">No privacy policy link found on the page</div>
|
|
511
|
+
<p class="issue-evidence">
|
|
512
|
+
A privacy policy must be accessible from every page (GDPR Art. 13)
|
|
513
|
+
</p>
|
|
514
|
+
</div>
|
|
515
|
+
</div>
|
|
516
|
+
</div>
|
|
517
|
+
</div>
|
|
518
|
+
|
|
519
|
+
<div class="section">
|
|
520
|
+
<div class="section-header"><h2>Consent modal</h2></div>
|
|
521
|
+
<div class="section-body">
|
|
522
|
+
<span class="badge badge-critical">Not detected</span>
|
|
523
|
+
<p style="margin: 12px 0 0; color: var(--text-muted); font-size: 13px">
|
|
524
|
+
No consent banner was found on the page.
|
|
525
|
+
</p>
|
|
526
|
+
</div>
|
|
527
|
+
</div>
|
|
528
|
+
|
|
529
|
+
<div class="section">
|
|
530
|
+
<div class="section-header"><h2>Cookies</h2></div>
|
|
531
|
+
<div class="section-body">
|
|
532
|
+
<div style="margin-bottom: 24px">
|
|
533
|
+
<div
|
|
534
|
+
style="
|
|
535
|
+
font-size: 12px;
|
|
536
|
+
font-weight: 600;
|
|
537
|
+
text-transform: uppercase;
|
|
538
|
+
letter-spacing: 0.04em;
|
|
539
|
+
color: var(--text-muted);
|
|
540
|
+
margin-bottom: 8px;
|
|
541
|
+
display: flex;
|
|
542
|
+
align-items: center;
|
|
543
|
+
gap: 8px;
|
|
544
|
+
"
|
|
545
|
+
>
|
|
546
|
+
Before interaction
|
|
547
|
+
<span class="count-badge">1</span>
|
|
548
|
+
</div>
|
|
549
|
+
<table class="data-table">
|
|
550
|
+
<thead>
|
|
551
|
+
<tr>
|
|
552
|
+
<th>Name</th>
|
|
553
|
+
<th>Domain</th>
|
|
554
|
+
<th>Category</th>
|
|
555
|
+
<th>Expiry</th>
|
|
556
|
+
<th>Consent</th>
|
|
557
|
+
</tr>
|
|
558
|
+
</thead>
|
|
559
|
+
<tbody>
|
|
560
|
+
<tr>
|
|
561
|
+
<td><code>datadome</code></td>
|
|
562
|
+
<td style="color: var(--text-muted)">.leboncoin.fr</td>
|
|
563
|
+
<td><span class="badge badge-muted">unknown</span></td>
|
|
564
|
+
<td style="color: var(--text-muted)">12mo</td>
|
|
565
|
+
<td><span class="badge badge-muted">No</span></td>
|
|
566
|
+
</tr>
|
|
567
|
+
</tbody>
|
|
568
|
+
</table>
|
|
569
|
+
</div>
|
|
570
|
+
<div style="margin-bottom: 24px">
|
|
571
|
+
<div
|
|
572
|
+
style="
|
|
573
|
+
font-size: 12px;
|
|
574
|
+
font-weight: 600;
|
|
575
|
+
text-transform: uppercase;
|
|
576
|
+
letter-spacing: 0.04em;
|
|
577
|
+
color: var(--text-muted);
|
|
578
|
+
margin-bottom: 8px;
|
|
579
|
+
display: flex;
|
|
580
|
+
align-items: center;
|
|
581
|
+
gap: 8px;
|
|
582
|
+
"
|
|
583
|
+
>
|
|
584
|
+
After reject
|
|
585
|
+
<span class="count-badge">0</span>
|
|
586
|
+
</div>
|
|
587
|
+
<p class="empty-state">No cookies detected.</p>
|
|
588
|
+
</div>
|
|
589
|
+
<div style="margin-bottom: 24px">
|
|
590
|
+
<div
|
|
591
|
+
style="
|
|
592
|
+
font-size: 12px;
|
|
593
|
+
font-weight: 600;
|
|
594
|
+
text-transform: uppercase;
|
|
595
|
+
letter-spacing: 0.04em;
|
|
596
|
+
color: var(--text-muted);
|
|
597
|
+
margin-bottom: 8px;
|
|
598
|
+
display: flex;
|
|
599
|
+
align-items: center;
|
|
600
|
+
gap: 8px;
|
|
601
|
+
"
|
|
602
|
+
>
|
|
603
|
+
After accept
|
|
604
|
+
<span class="count-badge">0</span>
|
|
605
|
+
</div>
|
|
606
|
+
<p class="empty-state">No cookies detected.</p>
|
|
607
|
+
</div>
|
|
608
|
+
</div>
|
|
609
|
+
</div>
|
|
610
|
+
|
|
611
|
+
<div class="section">
|
|
612
|
+
<div class="section-header"><h2>Network trackers</h2></div>
|
|
613
|
+
<div class="section-body">
|
|
614
|
+
<div class="no-issues">✓ No network tracker detected</div>
|
|
615
|
+
</div>
|
|
616
|
+
</div>
|
|
617
|
+
|
|
618
|
+
<div class="section">
|
|
619
|
+
<div class="section-header">
|
|
620
|
+
<h2>Recommendations</h2>
|
|
621
|
+
<span class="count-badge">3</span>
|
|
622
|
+
</div>
|
|
623
|
+
<div class="section-body">
|
|
624
|
+
<ul class="rec-list">
|
|
625
|
+
<li class="rec-item">
|
|
626
|
+
<span class="rec-num">1</span>
|
|
627
|
+
<span
|
|
628
|
+
>Deploy a CMP solution (Axeptio, Didomi, OneTrust, Cookiebot) that displays a
|
|
629
|
+
consent modal before any non-essential cookie.</span
|
|
630
|
+
>
|
|
631
|
+
</li>
|
|
632
|
+
<li class="rec-item">
|
|
633
|
+
<span class="rec-num">2</span>
|
|
634
|
+
<span
|
|
635
|
+
>Add a "Reject all" button at the first layer of the modal, requiring no
|
|
636
|
+
more clicks than "Accept all" (CNIL 2022).</span
|
|
637
|
+
>
|
|
638
|
+
</li>
|
|
639
|
+
<li class="rec-item">
|
|
640
|
+
<span class="rec-num">3</span>
|
|
641
|
+
<span
|
|
642
|
+
>Complete the modal information: processing purposes, identity of sub-processors,
|
|
643
|
+
retention period, right to withdraw.</span
|
|
644
|
+
>
|
|
645
|
+
</li>
|
|
646
|
+
</ul>
|
|
647
|
+
</div>
|
|
648
|
+
</div>
|
|
649
|
+
|
|
650
|
+
<div class="section">
|
|
651
|
+
<div class="section-header">
|
|
652
|
+
<h2>Compliance checklist</h2>
|
|
653
|
+
<span class="count-badge">12 rules</span>
|
|
654
|
+
<span class="badge badge-ok">5 ✓</span>
|
|
655
|
+
<span class="badge badge-critical">6 ✗</span>
|
|
656
|
+
<span class="badge badge-warning">1 ⚠</span>
|
|
657
|
+
</div>
|
|
658
|
+
<div class="section-body no-pad">
|
|
659
|
+
<table class="data-table">
|
|
660
|
+
<thead>
|
|
661
|
+
<tr>
|
|
662
|
+
<th>Category</th>
|
|
663
|
+
<th>Rule</th>
|
|
664
|
+
<th>Status</th>
|
|
665
|
+
<th>Detail</th>
|
|
666
|
+
</tr>
|
|
667
|
+
</thead>
|
|
668
|
+
<tbody>
|
|
669
|
+
<tr>
|
|
670
|
+
<td
|
|
671
|
+
rowspan="3"
|
|
672
|
+
style="font-weight: 600; vertical-align: top; background: var(--bg)"
|
|
673
|
+
>
|
|
674
|
+
Consent
|
|
675
|
+
</td>
|
|
676
|
+
<td>Consent modal detected</td>
|
|
677
|
+
<td><span class="status-ko">✗ Non-compliant</span></td>
|
|
678
|
+
<td style="color: var(--text-muted); font-size: 12px">No consent banner found</td>
|
|
679
|
+
</tr>
|
|
680
|
+
<tr>
|
|
681
|
+
<td>No pre-ticked checkboxes</td>
|
|
682
|
+
<td><span class="status-ok">✓ Compliant</span></td>
|
|
683
|
+
<td style="color: var(--text-muted); font-size: 12px">None detected</td>
|
|
684
|
+
</tr>
|
|
685
|
+
<tr>
|
|
686
|
+
<td>Unambiguous accept label</td>
|
|
687
|
+
<td><span class="status-ok">✓ Compliant</span></td>
|
|
688
|
+
<td style="color: var(--text-muted); font-size: 12px">No accept button</td>
|
|
689
|
+
</tr>
|
|
690
|
+
<tr>
|
|
691
|
+
<td
|
|
692
|
+
rowspan="3"
|
|
693
|
+
style="font-weight: 600; vertical-align: top; background: var(--bg)"
|
|
694
|
+
>
|
|
695
|
+
Easy refusal
|
|
696
|
+
</td>
|
|
697
|
+
<td>Reject button at first layer</td>
|
|
698
|
+
<td><span class="status-ko">✗ Non-compliant</span></td>
|
|
699
|
+
<td style="color: var(--text-muted); font-size: 12px">Not found</td>
|
|
700
|
+
</tr>
|
|
701
|
+
<tr>
|
|
702
|
+
<td>Reject ≤ clicks than accept</td>
|
|
703
|
+
<td><span class="status-ko">✗ Non-compliant</span></td>
|
|
704
|
+
<td style="color: var(--text-muted); font-size: 12px">Cannot verify</td>
|
|
705
|
+
</tr>
|
|
706
|
+
<tr>
|
|
707
|
+
<td>Button size symmetry</td>
|
|
708
|
+
<td><span class="status-ko">✗ Non-compliant</span></td>
|
|
709
|
+
<td style="color: var(--text-muted); font-size: 12px">Comparable sizes</td>
|
|
710
|
+
</tr>
|
|
711
|
+
<tr>
|
|
712
|
+
<td
|
|
713
|
+
rowspan="3"
|
|
714
|
+
style="font-weight: 600; vertical-align: top; background: var(--bg)"
|
|
715
|
+
>
|
|
716
|
+
Transparency
|
|
717
|
+
</td>
|
|
718
|
+
<td>Granular controls available</td>
|
|
719
|
+
<td><span class="status-ko">✗ Non-compliant</span></td>
|
|
720
|
+
<td style="color: var(--text-muted); font-size: 12px">No granular controls</td>
|
|
721
|
+
</tr>
|
|
722
|
+
<tr>
|
|
723
|
+
<td>Privacy policy in modal</td>
|
|
724
|
+
<td><span class="status-ko">✗ Non-compliant</span></td>
|
|
725
|
+
<td style="color: var(--text-muted); font-size: 12px">Not found</td>
|
|
726
|
+
</tr>
|
|
727
|
+
<tr>
|
|
728
|
+
<td>Privacy policy on page</td>
|
|
729
|
+
<td><span class="status-warn">⚠ Warning</span></td>
|
|
730
|
+
<td style="color: var(--text-muted); font-size: 12px">Not found</td>
|
|
731
|
+
</tr>
|
|
732
|
+
<tr>
|
|
733
|
+
<td
|
|
734
|
+
rowspan="3"
|
|
735
|
+
style="font-weight: 600; vertical-align: top; background: var(--bg)"
|
|
736
|
+
>
|
|
737
|
+
Cookie behavior
|
|
738
|
+
</td>
|
|
739
|
+
<td>No non-essential cookie before consent</td>
|
|
740
|
+
<td><span class="status-ok">✓ Compliant</span></td>
|
|
741
|
+
<td style="color: var(--text-muted); font-size: 12px">None</td>
|
|
742
|
+
</tr>
|
|
743
|
+
<tr>
|
|
744
|
+
<td>Non-essential cookies removed after reject</td>
|
|
745
|
+
<td><span class="status-ok">✓ Compliant</span></td>
|
|
746
|
+
<td style="color: var(--text-muted); font-size: 12px">Correctly removed</td>
|
|
747
|
+
</tr>
|
|
748
|
+
<tr>
|
|
749
|
+
<td>No tracker before consent</td>
|
|
750
|
+
<td><span class="status-ok">✓ Compliant</span></td>
|
|
751
|
+
<td style="color: var(--text-muted); font-size: 12px">None</td>
|
|
752
|
+
</tr>
|
|
753
|
+
</tbody>
|
|
754
|
+
</table>
|
|
755
|
+
</div>
|
|
756
|
+
</div>
|
|
757
|
+
|
|
758
|
+
<div class="footer">
|
|
759
|
+
Generated by <a href="https://github.com/Slashgear/gdpr-report">gdpr-cookie-scanner</a>
|
|
760
|
+
on 22 February 2026 at 22:06
|
|
761
|
+
</div>
|
|
762
|
+
</div>
|
|
763
|
+
</body>
|
|
764
|
+
</html>
|