@slashgear/gdpr-cookie-scanner 3.7.0 → 3.8.1

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.
Files changed (86) hide show
  1. package/.dockerignore +3 -0
  2. package/.gitattributes +1 -0
  3. package/.github/workflows/website.yml +80 -0
  4. package/CHANGELOG.md +33 -0
  5. package/CONTRIBUTING.md +32 -4
  6. package/dist/report/generator.d.ts.map +1 -1
  7. package/dist/report/generator.js +9 -4
  8. package/dist/report/generator.js.map +1 -1
  9. package/dist/report/html.js +12 -3
  10. package/dist/report/html.js.map +1 -1
  11. package/dist/scanner/consent-modal.d.ts.map +1 -1
  12. package/dist/scanner/consent-modal.js +17 -5
  13. package/dist/scanner/consent-modal.js.map +1 -1
  14. package/dist/scanner/index.d.ts.map +1 -1
  15. package/dist/scanner/index.js +12 -2
  16. package/dist/scanner/index.js.map +1 -1
  17. package/package.json +7 -3
  18. package/pnpm-workspace.yaml +3 -0
  19. package/scripts/build-showcase.mjs +113 -0
  20. package/src/report/generator.ts +10 -4
  21. package/src/report/html.ts +13 -3
  22. package/src/scanner/consent-modal.ts +16 -5
  23. package/src/scanner/index.ts +12 -2
  24. package/tests/analyzers/compliance.test.ts +49 -0
  25. package/website/Dockerfile +55 -0
  26. package/website/node_modules/.bin/oxfmt +21 -0
  27. package/website/node_modules/.bin/oxlint +21 -0
  28. package/website/node_modules/.bin/tsc +21 -0
  29. package/website/node_modules/.bin/tsserver +21 -0
  30. package/website/node_modules/.bin/tsx +21 -0
  31. package/website/package.json +29 -0
  32. package/{docs → website/public}/index.html +70 -20
  33. package/website/public/reports/www.20minutes.fr/after-accept.png +3 -0
  34. package/website/public/reports/www.20minutes.fr/after-reject.png +3 -0
  35. package/{docs/reports/www.leboncoin.fr/gdpr-report-leboncoin.fr-2026-02-22.html → website/public/reports/www.20minutes.fr/gdpr-report-20minutes.fr-2026-02-22.html} +194 -51
  36. package/website/public/reports/www.20minutes.fr/modal-initial.png +3 -0
  37. package/website/public/reports/www.arte.tv/after-accept.png +3 -0
  38. package/website/public/reports/www.arte.tv/after-reject.png +3 -0
  39. package/{docs → website/public}/reports/www.arte.tv/gdpr-report-arte.tv-2026-02-24.html +1 -0
  40. package/website/public/reports/www.arte.tv/modal-initial.png +3 -0
  41. package/website/public/reports/www.backmarket.fr/after-accept.png +3 -0
  42. package/website/public/reports/www.backmarket.fr/after-reject.png +3 -0
  43. package/website/public/reports/www.backmarket.fr/gdpr-report-backmarket.fr-2026-02-24.html +1530 -0
  44. package/website/public/reports/www.backmarket.fr/modal-initial.png +3 -0
  45. package/website/public/reports/www.deezer.com/after-accept.png +3 -0
  46. package/website/public/reports/www.deezer.com/after-reject.png +3 -0
  47. package/{docs → website/public}/reports/www.deezer.com/gdpr-report-deezer.com-2026-02-22.html +1 -0
  48. package/website/public/reports/www.deezer.com/modal-initial.png +3 -0
  49. package/website/public/reports/www.france.tv/after-accept.png +3 -0
  50. package/website/public/reports/www.france.tv/after-reject.png +3 -0
  51. package/website/public/reports/www.france.tv/gdpr-report-france.tv-2026-02-23.html +977 -0
  52. package/website/public/reports/www.france.tv/modal-initial.png +3 -0
  53. package/website/public/reports/www.m6.fr/after-accept.png +3 -0
  54. package/website/public/reports/www.m6.fr/after-reject.png +3 -0
  55. package/website/public/reports/www.m6.fr/gdpr-report-m6.fr-2026-02-28.html +1862 -0
  56. package/website/public/reports/www.m6.fr/modal-initial.png +3 -0
  57. package/website/public/reports/www.netflix.com/after-accept.png +3 -0
  58. package/website/public/reports/www.netflix.com/after-reject.png +3 -0
  59. package/{docs → website/public}/reports/www.netflix.com/gdpr-report-netflix.com-2026-02-23.html +1 -0
  60. package/website/public/reports/www.netflix.com/modal-initial.png +3 -0
  61. package/website/public/reports/www.radiofrance.fr/after-accept.png +3 -0
  62. package/website/public/reports/www.radiofrance.fr/after-reject.png +3 -0
  63. package/{docs → website/public}/reports/www.radiofrance.fr/gdpr-report-radiofrance.fr-2026-02-24.html +1 -0
  64. package/website/public/reports/www.radiofrance.fr/modal-initial.png +3 -0
  65. package/website/public/reports/www.tf1.fr/after-accept.png +3 -0
  66. package/website/public/reports/www.tf1.fr/after-reject.png +3 -0
  67. package/website/public/reports/www.tf1.fr/gdpr-report-tf1.fr-2026-02-23.html +1512 -0
  68. package/website/public/reports/www.tf1.fr/modal-initial.png +3 -0
  69. package/website/src/index.ts +15 -0
  70. package/website/src/security.ts +26 -0
  71. package/website/tsconfig.json +14 -0
  72. package/.github/workflows/pages.yml +0 -40
  73. package/docs/reports/www.arte.tv/after-accept.png +0 -0
  74. package/docs/reports/www.arte.tv/after-reject.png +0 -0
  75. package/docs/reports/www.deezer.com/after-accept.png +0 -0
  76. package/docs/reports/www.deezer.com/after-reject.png +0 -0
  77. package/docs/reports/www.impots.gouv.fr/after-accept.png +0 -0
  78. package/docs/reports/www.impots.gouv.fr/after-reject.png +0 -0
  79. package/docs/reports/www.impots.gouv.fr/gdpr-report-impots.gouv.fr-2026-02-22.html +0 -751
  80. package/docs/reports/www.leboncoin.fr/after-accept.png +0 -0
  81. package/docs/reports/www.leboncoin.fr/after-reject.png +0 -0
  82. package/docs/reports/www.netflix.com/after-accept.png +0 -0
  83. package/docs/reports/www.netflix.com/after-reject.png +0 -0
  84. package/docs/reports/www.radiofrance.fr/after-accept.png +0 -0
  85. package/docs/reports/www.radiofrance.fr/after-reject.png +0 -0
  86. /package/{docs → website/public}/style.css +0 -0
@@ -0,0 +1,1862 @@
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 — m6.fr</title>
7
+ <style>
8
+ *,
9
+ *::before,
10
+ *::after {
11
+ box-sizing: border-box;
12
+ }
13
+
14
+ :root {
15
+ --grade: #ca8a04;
16
+ --grade-bg: #fefce8;
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
+ .cookie-name {
316
+ display: inline-block;
317
+ max-width: 220px;
318
+ overflow: hidden;
319
+ text-overflow: ellipsis;
320
+ white-space: nowrap;
321
+ vertical-align: bottom;
322
+ }
323
+ .empty-state {
324
+ text-align: center;
325
+ padding: 32px;
326
+ color: var(--text-muted);
327
+ font-size: 13px;
328
+ }
329
+
330
+ /* ── Checklist status ── */
331
+ .status-ok {
332
+ color: var(--ok);
333
+ font-weight: 600;
334
+ }
335
+ .status-ko {
336
+ color: var(--critical);
337
+ font-weight: 600;
338
+ }
339
+ .status-warn {
340
+ color: var(--warning);
341
+ font-weight: 600;
342
+ }
343
+
344
+ /* ── Info grid ── */
345
+ .info-grid {
346
+ display: grid;
347
+ grid-template-columns: 1fr 1fr;
348
+ gap: 12px;
349
+ }
350
+ @media (max-width: 640px) {
351
+ .info-grid {
352
+ grid-template-columns: 1fr;
353
+ }
354
+ }
355
+ .info-item {
356
+ }
357
+ .info-label {
358
+ font-size: 11px;
359
+ font-weight: 600;
360
+ text-transform: uppercase;
361
+ letter-spacing: 0.04em;
362
+ color: var(--text-muted);
363
+ margin-bottom: 2px;
364
+ }
365
+ .info-value {
366
+ font-size: 13px;
367
+ color: var(--text);
368
+ }
369
+
370
+ /* ── Buttons table ── */
371
+ .btn-chip {
372
+ display: inline-block;
373
+ padding: 2px 10px;
374
+ border-radius: 4px;
375
+ font-size: 12px;
376
+ font-weight: 600;
377
+ }
378
+ .btn-chip.accept {
379
+ background: #dcfce7;
380
+ color: #166534;
381
+ }
382
+ .btn-chip.reject {
383
+ background: #fee2e2;
384
+ color: #991b1b;
385
+ }
386
+ .btn-chip.preferences {
387
+ background: #dbeafe;
388
+ color: #1e40af;
389
+ }
390
+ .btn-chip.unknown,
391
+ .btn-chip.close {
392
+ background: var(--bg);
393
+ color: var(--text-muted);
394
+ }
395
+
396
+ /* ── Modal screenshot ── */
397
+ .modal-screenshot {
398
+ display: block;
399
+ max-width: 100%;
400
+ max-height: 420px;
401
+ object-fit: contain;
402
+ border-radius: 8px;
403
+ border: 1px solid var(--border);
404
+ box-shadow: var(--shadow-md);
405
+ margin-bottom: 20px;
406
+ }
407
+
408
+ /* ── Recommendations ── */
409
+ .rec-list {
410
+ list-style: none;
411
+ margin: 0;
412
+ padding: 0;
413
+ display: flex;
414
+ flex-direction: column;
415
+ gap: 10px;
416
+ }
417
+ .rec-item {
418
+ display: flex;
419
+ gap: 12px;
420
+ padding: 12px 14px;
421
+ background: #f8fafc;
422
+ border-radius: 8px;
423
+ border: 1px solid var(--border);
424
+ font-size: 13px;
425
+ }
426
+ .rec-num {
427
+ flex-shrink: 0;
428
+ width: 24px;
429
+ height: 24px;
430
+ border-radius: 50%;
431
+ background: var(--text);
432
+ color: #fff;
433
+ font-size: 12px;
434
+ font-weight: 700;
435
+ display: flex;
436
+ align-items: center;
437
+ justify-content: center;
438
+ margin-top: 1px;
439
+ }
440
+
441
+ /* ── Footer ── */
442
+ .footer {
443
+ text-align: center;
444
+ margin-top: 40px;
445
+ font-size: 12px;
446
+ color: var(--text-muted);
447
+ }
448
+ .footer a {
449
+ color: var(--text-muted);
450
+ }
451
+
452
+ @media print {
453
+ * {
454
+ -webkit-print-color-adjust: exact;
455
+ print-color-adjust: exact;
456
+ }
457
+ body {
458
+ background: #fff;
459
+ }
460
+ .page {
461
+ padding: 0;
462
+ max-width: 100%;
463
+ }
464
+ .hero {
465
+ box-shadow: none;
466
+ border: 1px solid var(--border);
467
+ margin-bottom: 12px;
468
+ page-break-inside: avoid;
469
+ }
470
+ .score-grid {
471
+ page-break-inside: avoid;
472
+ margin-bottom: 12px;
473
+ }
474
+ .section {
475
+ box-shadow: none;
476
+ border: 1px solid var(--border);
477
+ margin-bottom: 12px;
478
+ page-break-inside: avoid;
479
+ }
480
+ .issue-list {
481
+ page-break-inside: avoid;
482
+ }
483
+ .data-table {
484
+ font-size: 10px;
485
+ page-break-inside: auto;
486
+ }
487
+ .data-table th {
488
+ padding: 5px 8px;
489
+ }
490
+ .data-table td {
491
+ padding: 5px 8px;
492
+ }
493
+ .data-table tr {
494
+ page-break-inside: avoid;
495
+ }
496
+ /* Long values (URLs, cookie names) wrap rather than overflow */
497
+ .data-table td code {
498
+ word-break: break-all;
499
+ white-space: normal;
500
+ }
501
+ .cookie-name {
502
+ max-width: 140px;
503
+ }
504
+ /* Shrink verbose columns to avoid deforming the others */
505
+ .cell-desc {
506
+ font-size: 9px;
507
+ }
508
+ .cell-url {
509
+ font-size: 7.5px;
510
+ }
511
+ .modal-screenshot {
512
+ max-height: 280px;
513
+ }
514
+ .rec-list {
515
+ page-break-inside: avoid;
516
+ }
517
+ /* Sections containing large tables can break across pages */
518
+ .section:has(.data-table) {
519
+ page-break-inside: auto;
520
+ }
521
+ a {
522
+ color: inherit;
523
+ text-decoration: none;
524
+ }
525
+ }
526
+ </style>
527
+ </head>
528
+ <body>
529
+ <div class="page">
530
+ <div class="hero">
531
+ <div class="grade-badge" style="background: #ca8a04">C</div>
532
+ <div class="hero-info">
533
+ <h1>m6.fr</h1>
534
+ <p class="hero-meta">Scanned on 28 February 2026 at 16:00 · 15.8s</p>
535
+ </div>
536
+ <div class="hero-score">
537
+ <div>
538
+ <span class="score-num" style="color: #ca8a04">58</span
539
+ ><span class="score-den">/100</span>
540
+ </div>
541
+ <div class="score-label">Compliance score</div>
542
+ </div>
543
+ </div>
544
+
545
+ <div class="score-grid">
546
+ <div class="score-card">
547
+ <div class="score-card-label">Consent validity</div>
548
+ <div class="score-card-value">20<span>/25</span></div>
549
+ <div class="progress-track">
550
+ <div class="progress-fill" style="width: 80%; background: #16a34a"></div>
551
+ </div>
552
+ </div>
553
+ <div class="score-card">
554
+ <div class="score-card-label">Easy refusal</div>
555
+ <div class="score-card-value">25<span>/25</span></div>
556
+ <div class="progress-track">
557
+ <div class="progress-fill" style="width: 100%; background: #16a34a"></div>
558
+ </div>
559
+ </div>
560
+ <div class="score-card">
561
+ <div class="score-card-label">Transparency</div>
562
+ <div class="score-card-value">12<span>/25</span></div>
563
+ <div class="progress-track">
564
+ <div class="progress-fill" style="width: 48%; background: #ea580c"></div>
565
+ </div>
566
+ </div>
567
+ <div class="score-card">
568
+ <div class="score-card-label">Cookie behavior</div>
569
+ <div class="score-card-value">1<span>/25</span></div>
570
+ <div class="progress-track">
571
+ <div class="progress-fill" style="width: 4%; background: #dc2626"></div>
572
+ </div>
573
+ </div>
574
+ </div>
575
+
576
+ <div class="section">
577
+ <div class="section-header">
578
+ <h2>Issues</h2>
579
+ <span class="count-badge">4</span>
580
+ <span class="badge badge-critical">3 critical</span>
581
+ <span class="badge badge-warning">1 warning</span>
582
+ </div>
583
+ <div class="section-body">
584
+ <div class="issue-list">
585
+ <div class="issue-card critical">
586
+ <div class="issue-title">
587
+ 2 non-essential cookie(s) deposited before any interaction
588
+ </div>
589
+ <p class="issue-evidence">gmid (unknown), ucid (unknown)</p>
590
+ </div>
591
+ <div class="issue-card critical">
592
+ <div class="issue-title">2 non-essential cookie(s) persist after rejection</div>
593
+ <p class="issue-evidence">gmid (unknown), ucid (unknown)</p>
594
+ </div>
595
+ <div class="issue-card critical">
596
+ <div class="issue-title">8 tracker request(s) fired before any consent</div>
597
+ <p class="issue-evidence">
598
+ Google Tag Services, Google DoubleClick, Google AdSense, Facebook SDK
599
+ </p>
600
+ </div>
601
+ <div class="issue-card warning">
602
+ <div class="issue-title">Missing required information: &quot;purposes&quot;</div>
603
+ <p class="issue-evidence">The consent text does not mention purposes</p>
604
+ </div>
605
+ </div>
606
+ </div>
607
+ </div>
608
+
609
+ <div class="section">
610
+ <div class="section-header">
611
+ <h2>Consent modal</h2>
612
+ <span class="badge badge-ok">Detected</span>
613
+ </div>
614
+ <div class="section-body">
615
+ <img src="modal-initial.png" alt="Consent modal screenshot" class="modal-screenshot" />
616
+ <div class="info-grid" style="margin-bottom: 20px">
617
+ <div class="info-item">
618
+ <div class="info-label">Selector</div>
619
+ <div class="info-value"><code>.didomi-popup-container</code></div>
620
+ </div>
621
+ <div class="info-item">
622
+ <div class="info-label">Granular controls</div>
623
+ <div class="info-value"><span class="status-warn">✗ No</span></div>
624
+ </div>
625
+ <div class="info-item">
626
+ <div class="info-label">Privacy policy link</div>
627
+ <div class="info-value">
628
+ <a
629
+ href="https://www.m6.fr/politique-de-confidentialite/cookies-partenaires"
630
+ target="_blank"
631
+ rel="noopener"
632
+ >https://www.m6.fr/politique-de-confidentialite/cookies-partenaires</a
633
+ >
634
+ </div>
635
+ </div>
636
+ <div class="info-item">
637
+ <div class="info-label">Pre-ticked checkboxes</div>
638
+ <div class="info-value"><span class="status-ok">✓ None</span></div>
639
+ </div>
640
+ </div>
641
+ <div
642
+ style="
643
+ font-size: 12px;
644
+ font-weight: 600;
645
+ text-transform: uppercase;
646
+ letter-spacing: 0.04em;
647
+ color: var(--text-muted);
648
+ margin-bottom: 8px;
649
+ "
650
+ >
651
+ Buttons
652
+ </div>
653
+ <table class="data-table">
654
+ <thead>
655
+ <tr>
656
+ <th>Type</th>
657
+ <th>Label</th>
658
+ <th>Font size</th>
659
+ <th>Contrast</th>
660
+ <th>Clicks</th>
661
+ </tr>
662
+ </thead>
663
+ <tbody>
664
+ <tr>
665
+ <td><span class="btn-chip reject">reject</span></td>
666
+ <td>Continuer sans accepter →</td>
667
+ <td>—</td>
668
+ <td>21:1</td>
669
+ <td>1</td>
670
+ </tr>
671
+ <tr>
672
+ <td><span class="btn-chip unknown">unknown</span></td>
673
+ <td>des tiers</td>
674
+ <td>15px</td>
675
+ <td>21:1</td>
676
+ <td>1</td>
677
+ </tr>
678
+ <tr>
679
+ <td><span class="btn-chip unknown">unknown</span></td>
680
+ <td>tiers</td>
681
+ <td>15px</td>
682
+ <td>21:1</td>
683
+ <td>1</td>
684
+ </tr>
685
+ <tr>
686
+ <td><span class="btn-chip unknown">unknown</span></td>
687
+ <td>Voir nos 119 partenaires</td>
688
+ <td>15px</td>
689
+ <td>21:1</td>
690
+ <td>1</td>
691
+ </tr>
692
+ <tr>
693
+ <td><span class="btn-chip unknown">unknown</span></td>
694
+ <td>PARAMETRER MES CHOIX</td>
695
+ <td>16px</td>
696
+ <td>1.66:1</td>
697
+ <td>1</td>
698
+ </tr>
699
+ <tr>
700
+ <td><span class="btn-chip accept">accept</span></td>
701
+ <td>TOUT ACCEPTER</td>
702
+ <td>16px</td>
703
+ <td>12.63:1</td>
704
+ <td>1</td>
705
+ </tr>
706
+ </tbody>
707
+ </table>
708
+ </div>
709
+ </div>
710
+
711
+ <div class="section">
712
+ <div class="section-header"><h2>Cookies</h2></div>
713
+ <div class="section-body">
714
+ <div style="margin-bottom: 24px">
715
+ <div
716
+ style="
717
+ font-size: 12px;
718
+ font-weight: 600;
719
+ text-transform: uppercase;
720
+ letter-spacing: 0.04em;
721
+ color: var(--text-muted);
722
+ margin-bottom: 8px;
723
+ display: flex;
724
+ align-items: center;
725
+ gap: 8px;
726
+ "
727
+ >
728
+ Before interaction
729
+ <span class="count-badge">6</span>
730
+ <span class="badge badge-critical">2 non-essential</span>
731
+ </div>
732
+ <table class="data-table">
733
+ <thead>
734
+ <tr>
735
+ <th>Name</th>
736
+ <th>Domain</th>
737
+ <th>Category</th>
738
+ <th>Description</th>
739
+ <th>Expiry</th>
740
+ <th>Consent</th>
741
+ </tr>
742
+ </thead>
743
+ <tbody>
744
+ <tr>
745
+ <td><code class="cookie-name" title="didomi_token">didomi_token</code></td>
746
+ <td style="color: var(--text-muted)">.m6.fr</td>
747
+ <td><span class="badge badge-muted">strictly-necessary</span></td>
748
+ <td class="cell-desc">
749
+ <span title="Didomi — https://privacy.console.didomi.io/"
750
+ >This cookie contains consent information for personalized purposes and for
751
+ personalized partners, as well as information specific to Didomi (e.g. user
752
+ ID).</span
753
+ >
754
+ </td>
755
+ <td style="color: var(--text-muted)">6mo</td>
756
+ <td><span class="badge badge-muted">No</span></td>
757
+ </tr>
758
+ <tr>
759
+ <td><code class="cookie-name" title="gig_canary">gig_canary</code></td>
760
+ <td style="color: var(--text-muted)">cdns.eu1.gigya.com</td>
761
+ <td><span class="badge badge-muted">unknown</span></td>
762
+ <td class="cell-desc">
763
+ <span title="SAP — https://www.sap.com/privacy"
764
+ >Indicates whether the client is using the canary version of the WebSDK.</span
765
+ >
766
+ </td>
767
+ <td style="color: var(--text-muted)">< 1 day</td>
768
+ <td><span class="badge badge-muted">No</span></td>
769
+ </tr>
770
+ <tr>
771
+ <td><code class="cookie-name" title="gmid">gmid</code></td>
772
+ <td style="color: var(--text-muted)">.login-gigya.m6.fr</td>
773
+ <td><span class="badge badge-muted">unknown</span></td>
774
+ <td class="cell-desc">
775
+ <span title="SAP — https://www.sap.com/privacy">User cookie.</span>
776
+ </td>
777
+ <td style="color: var(--text-muted)">12mo</td>
778
+ <td><span class="badge badge-warning">Required</span></td>
779
+ </tr>
780
+ <tr>
781
+ <td><code class="cookie-name" title="ucid">ucid</code></td>
782
+ <td style="color: var(--text-muted)">.login-gigya.m6.fr</td>
783
+ <td><span class="badge badge-muted">unknown</span></td>
784
+ <td class="cell-desc">
785
+ <span title="SAP — https://www.sap.com/privacy"
786
+ >Unique computer identifier used for generating reports, and used by the Web
787
+ SDK to get saved response.</span
788
+ >
789
+ </td>
790
+ <td style="color: var(--text-muted)">12mo</td>
791
+ <td><span class="badge badge-warning">Required</span></td>
792
+ </tr>
793
+ <tr>
794
+ <td><code class="cookie-name" title="hasGmid">hasGmid</code></td>
795
+ <td style="color: var(--text-muted)">.login-gigya.m6.fr</td>
796
+ <td><span class="badge badge-muted">unknown</span></td>
797
+ <td class="cell-desc">
798
+ <span title="SAP — https://www.sap.com/privacy"
799
+ >Internal cookie for the Web SDK</span
800
+ >
801
+ </td>
802
+ <td style="color: var(--text-muted)">6mo</td>
803
+ <td><span class="badge badge-muted">No</span></td>
804
+ </tr>
805
+ <tr>
806
+ <td>
807
+ <code
808
+ class="cookie-name"
809
+ title="gig_bootstrap_3_hH5KBv25qZTd_sURpixbQW6a4OsiIzIEF2Ei_2H7TXTGLJb_1Hr4THKZianCQhWK"
810
+ >gig_bootstrap_3_hH5KBv25qZTd_sURpixbQW6a4OsiIzIEF2Ei_2H7TXTGLJb_1Hr4THKZianCQhWK</code
811
+ >
812
+ </td>
813
+ <td style="color: var(--text-muted)">.m6.fr</td>
814
+ <td><span class="badge badge-muted">unknown</span></td>
815
+ <td class="cell-desc">
816
+ <span title="SAP — https://www.sap.com/privacy"
817
+ >If declined, user may be intermittently logged out.</span
818
+ >
819
+ </td>
820
+ <td style="color: var(--text-muted)">12mo</td>
821
+ <td><span class="badge badge-muted">No</span></td>
822
+ </tr>
823
+ </tbody>
824
+ </table>
825
+ </div>
826
+ <div style="margin-bottom: 24px">
827
+ <div
828
+ style="
829
+ font-size: 12px;
830
+ font-weight: 600;
831
+ text-transform: uppercase;
832
+ letter-spacing: 0.04em;
833
+ color: var(--text-muted);
834
+ margin-bottom: 8px;
835
+ display: flex;
836
+ align-items: center;
837
+ gap: 8px;
838
+ "
839
+ >
840
+ After reject
841
+ <span class="count-badge">7</span>
842
+
843
+ <span class="badge badge-critical">2 non-essential</span>
844
+ </div>
845
+ <table class="data-table">
846
+ <thead>
847
+ <tr>
848
+ <th>Name</th>
849
+ <th>Domain</th>
850
+ <th>Category</th>
851
+ <th>Description</th>
852
+ <th>Expiry</th>
853
+ <th>Consent</th>
854
+ </tr>
855
+ </thead>
856
+ <tbody>
857
+ <tr>
858
+ <td><code class="cookie-name" title="gig_canary">gig_canary</code></td>
859
+ <td style="color: var(--text-muted)">cdns.eu1.gigya.com</td>
860
+ <td><span class="badge badge-muted">unknown</span></td>
861
+ <td class="cell-desc">
862
+ <span title="SAP — https://www.sap.com/privacy"
863
+ >Indicates whether the client is using the canary version of the WebSDK.</span
864
+ >
865
+ </td>
866
+ <td style="color: var(--text-muted)">< 1 day</td>
867
+ <td><span class="badge badge-muted">No</span></td>
868
+ </tr>
869
+ <tr>
870
+ <td><code class="cookie-name" title="gmid">gmid</code></td>
871
+ <td style="color: var(--text-muted)">.login-gigya.m6.fr</td>
872
+ <td><span class="badge badge-muted">unknown</span></td>
873
+ <td class="cell-desc">
874
+ <span title="SAP — https://www.sap.com/privacy">User cookie.</span>
875
+ </td>
876
+ <td style="color: var(--text-muted)">12mo</td>
877
+ <td><span class="badge badge-warning">Required</span></td>
878
+ </tr>
879
+ <tr>
880
+ <td><code class="cookie-name" title="ucid">ucid</code></td>
881
+ <td style="color: var(--text-muted)">.login-gigya.m6.fr</td>
882
+ <td><span class="badge badge-muted">unknown</span></td>
883
+ <td class="cell-desc">
884
+ <span title="SAP — https://www.sap.com/privacy"
885
+ >Unique computer identifier used for generating reports, and used by the Web
886
+ SDK to get saved response.</span
887
+ >
888
+ </td>
889
+ <td style="color: var(--text-muted)">12mo</td>
890
+ <td><span class="badge badge-warning">Required</span></td>
891
+ </tr>
892
+ <tr>
893
+ <td><code class="cookie-name" title="hasGmid">hasGmid</code></td>
894
+ <td style="color: var(--text-muted)">.login-gigya.m6.fr</td>
895
+ <td><span class="badge badge-muted">unknown</span></td>
896
+ <td class="cell-desc">
897
+ <span title="SAP — https://www.sap.com/privacy"
898
+ >Internal cookie for the Web SDK</span
899
+ >
900
+ </td>
901
+ <td style="color: var(--text-muted)">6mo</td>
902
+ <td><span class="badge badge-muted">No</span></td>
903
+ </tr>
904
+ <tr>
905
+ <td>
906
+ <code
907
+ class="cookie-name"
908
+ title="gig_bootstrap_3_hH5KBv25qZTd_sURpixbQW6a4OsiIzIEF2Ei_2H7TXTGLJb_1Hr4THKZianCQhWK"
909
+ >gig_bootstrap_3_hH5KBv25qZTd_sURpixbQW6a4OsiIzIEF2Ei_2H7TXTGLJb_1Hr4THKZianCQhWK</code
910
+ >
911
+ </td>
912
+ <td style="color: var(--text-muted)">.m6.fr</td>
913
+ <td><span class="badge badge-muted">unknown</span></td>
914
+ <td class="cell-desc">
915
+ <span title="SAP — https://www.sap.com/privacy"
916
+ >If declined, user may be intermittently logged out.</span
917
+ >
918
+ </td>
919
+ <td style="color: var(--text-muted)">12mo</td>
920
+ <td><span class="badge badge-muted">No</span></td>
921
+ </tr>
922
+ <tr>
923
+ <td><code class="cookie-name" title="didomi_token">didomi_token</code></td>
924
+ <td style="color: var(--text-muted)">.m6.fr</td>
925
+ <td><span class="badge badge-muted">strictly-necessary</span></td>
926
+ <td class="cell-desc">
927
+ <span title="Didomi — https://privacy.console.didomi.io/"
928
+ >This cookie contains consent information for personalized purposes and for
929
+ personalized partners, as well as information specific to Didomi (e.g. user
930
+ ID).</span
931
+ >
932
+ </td>
933
+ <td style="color: var(--text-muted)">6mo</td>
934
+ <td><span class="badge badge-muted">No</span></td>
935
+ </tr>
936
+ <tr>
937
+ <td><code class="cookie-name" title="euconsent-v2">euconsent-v2</code></td>
938
+ <td style="color: var(--text-muted)">.m6.fr</td>
939
+ <td><span class="badge badge-muted">unknown</span></td>
940
+ <td class="cell-desc">
941
+ <span title="Didomi — https://privacy.console.didomi.io/"
942
+ >This cookie contains the chain of consent for the IAB's Transparency and
943
+ consent framework as well as the consent information for all IAB standards
944
+ (partners and purposes).</span
945
+ >
946
+ </td>
947
+ <td style="color: var(--text-muted)">6mo</td>
948
+ <td><span class="badge badge-muted">No</span></td>
949
+ </tr>
950
+ </tbody>
951
+ </table>
952
+ </div>
953
+ <div style="margin-bottom: 24px">
954
+ <div
955
+ style="
956
+ font-size: 12px;
957
+ font-weight: 600;
958
+ text-transform: uppercase;
959
+ letter-spacing: 0.04em;
960
+ color: var(--text-muted);
961
+ margin-bottom: 8px;
962
+ display: flex;
963
+ align-items: center;
964
+ gap: 8px;
965
+ "
966
+ >
967
+ After accept
968
+ <span class="count-badge">13</span>
969
+ </div>
970
+ <table class="data-table">
971
+ <thead>
972
+ <tr>
973
+ <th>Name</th>
974
+ <th>Domain</th>
975
+ <th>Category</th>
976
+ <th>Description</th>
977
+ <th>Expiry</th>
978
+ <th>Consent</th>
979
+ </tr>
980
+ </thead>
981
+ <tbody>
982
+ <tr>
983
+ <td><code class="cookie-name" title="gig_canary">gig_canary</code></td>
984
+ <td style="color: var(--text-muted)">cdns.eu1.gigya.com</td>
985
+ <td><span class="badge badge-muted">unknown</span></td>
986
+ <td class="cell-desc">
987
+ <span title="SAP — https://www.sap.com/privacy"
988
+ >Indicates whether the client is using the canary version of the WebSDK.</span
989
+ >
990
+ </td>
991
+ <td style="color: var(--text-muted)">< 1 day</td>
992
+ <td><span class="badge badge-muted">No</span></td>
993
+ </tr>
994
+ <tr>
995
+ <td><code class="cookie-name" title="gmid">gmid</code></td>
996
+ <td style="color: var(--text-muted)">.login-gigya.m6.fr</td>
997
+ <td><span class="badge badge-muted">unknown</span></td>
998
+ <td class="cell-desc">
999
+ <span title="SAP — https://www.sap.com/privacy">User cookie.</span>
1000
+ </td>
1001
+ <td style="color: var(--text-muted)">12mo</td>
1002
+ <td><span class="badge badge-warning">Required</span></td>
1003
+ </tr>
1004
+ <tr>
1005
+ <td><code class="cookie-name" title="ucid">ucid</code></td>
1006
+ <td style="color: var(--text-muted)">.login-gigya.m6.fr</td>
1007
+ <td><span class="badge badge-muted">unknown</span></td>
1008
+ <td class="cell-desc">
1009
+ <span title="SAP — https://www.sap.com/privacy"
1010
+ >Unique computer identifier used for generating reports, and used by the Web
1011
+ SDK to get saved response.</span
1012
+ >
1013
+ </td>
1014
+ <td style="color: var(--text-muted)">12mo</td>
1015
+ <td><span class="badge badge-warning">Required</span></td>
1016
+ </tr>
1017
+ <tr>
1018
+ <td><code class="cookie-name" title="hasGmid">hasGmid</code></td>
1019
+ <td style="color: var(--text-muted)">.login-gigya.m6.fr</td>
1020
+ <td><span class="badge badge-muted">unknown</span></td>
1021
+ <td class="cell-desc">
1022
+ <span title="SAP — https://www.sap.com/privacy"
1023
+ >Internal cookie for the Web SDK</span
1024
+ >
1025
+ </td>
1026
+ <td style="color: var(--text-muted)">6mo</td>
1027
+ <td><span class="badge badge-muted">No</span></td>
1028
+ </tr>
1029
+ <tr>
1030
+ <td>
1031
+ <code
1032
+ class="cookie-name"
1033
+ title="gig_bootstrap_3_hH5KBv25qZTd_sURpixbQW6a4OsiIzIEF2Ei_2H7TXTGLJb_1Hr4THKZianCQhWK"
1034
+ >gig_bootstrap_3_hH5KBv25qZTd_sURpixbQW6a4OsiIzIEF2Ei_2H7TXTGLJb_1Hr4THKZianCQhWK</code
1035
+ >
1036
+ </td>
1037
+ <td style="color: var(--text-muted)">.m6.fr</td>
1038
+ <td><span class="badge badge-muted">unknown</span></td>
1039
+ <td class="cell-desc">
1040
+ <span title="SAP — https://www.sap.com/privacy"
1041
+ >If declined, user may be intermittently logged out.</span
1042
+ >
1043
+ </td>
1044
+ <td style="color: var(--text-muted)">12mo</td>
1045
+ <td><span class="badge badge-muted">No</span></td>
1046
+ </tr>
1047
+ <tr>
1048
+ <td><code class="cookie-name" title="didomi_token">didomi_token</code></td>
1049
+ <td style="color: var(--text-muted)">.m6.fr</td>
1050
+ <td><span class="badge badge-muted">strictly-necessary</span></td>
1051
+ <td class="cell-desc">
1052
+ <span title="Didomi — https://privacy.console.didomi.io/"
1053
+ >This cookie contains consent information for personalized purposes and for
1054
+ personalized partners, as well as information specific to Didomi (e.g. user
1055
+ ID).</span
1056
+ >
1057
+ </td>
1058
+ <td style="color: var(--text-muted)">6mo</td>
1059
+ <td><span class="badge badge-muted">No</span></td>
1060
+ </tr>
1061
+ <tr>
1062
+ <td><code class="cookie-name" title="euconsent-v2">euconsent-v2</code></td>
1063
+ <td style="color: var(--text-muted)">.m6.fr</td>
1064
+ <td><span class="badge badge-muted">unknown</span></td>
1065
+ <td class="cell-desc">
1066
+ <span title="Didomi — https://privacy.console.didomi.io/"
1067
+ >This cookie contains the chain of consent for the IAB's Transparency and
1068
+ consent framework as well as the consent information for all IAB standards
1069
+ (partners and purposes).</span
1070
+ >
1071
+ </td>
1072
+ <td style="color: var(--text-muted)">6mo</td>
1073
+ <td><span class="badge badge-muted">No</span></td>
1074
+ </tr>
1075
+ <tr>
1076
+ <td><code class="cookie-name" title="test_cookie">test_cookie</code></td>
1077
+ <td style="color: var(--text-muted)">.doubleclick.net</td>
1078
+ <td><span class="badge badge-muted">unknown</span></td>
1079
+ <td class="cell-desc">
1080
+ <span title="Google — https://business.safety.google/privacy/"
1081
+ >This cookie is set by DoubleClick (which is owned by Google) to determine if
1082
+ the website visitor's browser supports cookies.</span
1083
+ >
1084
+ </td>
1085
+ <td style="color: var(--text-muted)">< 1 day</td>
1086
+ <td><span class="badge badge-muted">No</span></td>
1087
+ </tr>
1088
+ <tr>
1089
+ <td><code class="cookie-name" title="__gads">__gads</code></td>
1090
+ <td style="color: var(--text-muted)">.m6.fr</td>
1091
+ <td><span class="badge badge-muted">advertising</span></td>
1092
+ <td class="cell-desc">
1093
+ <span title="Google — https://business.safety.google/privacy/"
1094
+ >This cookie is used by Google for a variety of purposes (e.g., ensuring
1095
+ Frequency Caps work correctly). It includes AdSense if you have AdSense
1096
+ enabled. This cookie is associated with the DoubleClick for Publishers service
1097
+ from Google. Its purpose is to monitor the showing of advertisements on the
1098
+ site, for which the owner may earn some revenue. The main purpose of this
1099
+ cookie is targeting/advertising.</span
1100
+ >
1101
+ </td>
1102
+ <td style="color: var(--text-muted)">13mo</td>
1103
+ <td><span class="badge badge-warning">Required</span></td>
1104
+ </tr>
1105
+ <tr>
1106
+ <td><code class="cookie-name" title="__gpi">__gpi</code></td>
1107
+ <td style="color: var(--text-muted)">.m6.fr</td>
1108
+ <td><span class="badge badge-muted">advertising</span></td>
1109
+ <td class="cell-desc">
1110
+ <span title="Google — https://business.safety.google/privacy/"
1111
+ >Collects information on user behaviour on multiple websites. This information
1112
+ is used in order to optimize the relevance of advertisement on the
1113
+ website.</span
1114
+ >
1115
+ </td>
1116
+ <td style="color: var(--text-muted)">13mo</td>
1117
+ <td><span class="badge badge-warning">Required</span></td>
1118
+ </tr>
1119
+ <tr>
1120
+ <td><code class="cookie-name" title="__eoi">__eoi</code></td>
1121
+ <td style="color: var(--text-muted)">.m6.fr</td>
1122
+ <td><span class="badge badge-muted">unknown</span></td>
1123
+ <td class="cell-desc">
1124
+ <span title="Google — https://business.safety.google/privacy/"
1125
+ >This cookie is used for security authenticate users, prevent fraud, and
1126
+ protect users as they interact with a service.</span
1127
+ >
1128
+ </td>
1129
+ <td style="color: var(--text-muted)">6mo</td>
1130
+ <td><span class="badge badge-muted">No</span></td>
1131
+ </tr>
1132
+ <tr>
1133
+ <td><code class="cookie-name" title="_fbp">_fbp</code></td>
1134
+ <td style="color: var(--text-muted)">.m6.fr</td>
1135
+ <td><span class="badge badge-muted">advertising</span></td>
1136
+ <td class="cell-desc">
1137
+ <span title="Facebook — https://www.facebook.com/about/privacy/"
1138
+ >Used by Facebook to deliver a series of advertisement products such as real
1139
+ time bidding from third party advertisers</span
1140
+ >
1141
+ </td>
1142
+ <td style="color: var(--text-muted)">3mo</td>
1143
+ <td><span class="badge badge-warning">Required</span></td>
1144
+ </tr>
1145
+ <tr>
1146
+ <td><code class="cookie-name" title="dicbo_id">dicbo_id</code></td>
1147
+ <td style="color: var(--text-muted)">www.m6.fr</td>
1148
+ <td><span class="badge badge-muted">unknown</span></td>
1149
+ <td class="cell-desc">
1150
+ <span title="Outbrain — https://www.outbrain.com/privacy/"
1151
+ >Collects statistics concerning the visitors' use of the website and its
1152
+ general functionality. This is used to optimize and compile reports on the
1153
+ website for comparison through a third party analysis service.</span
1154
+ >
1155
+ </td>
1156
+ <td style="color: var(--text-muted)">< 1 day</td>
1157
+ <td><span class="badge badge-muted">No</span></td>
1158
+ </tr>
1159
+ </tbody>
1160
+ </table>
1161
+ </div>
1162
+ </div>
1163
+ </div>
1164
+
1165
+ <div class="section">
1166
+ <div class="section-header">
1167
+ <h2>Network trackers</h2>
1168
+ <span class="count-badge">37</span>
1169
+ <span class="badge badge-critical">8 before consent</span>
1170
+ </div>
1171
+ <div class="section-body no-pad">
1172
+ <table class="data-table">
1173
+ <thead>
1174
+ <tr>
1175
+ <th>Tracker</th>
1176
+ <th>Category</th>
1177
+ <th>Phase</th>
1178
+ <th>URL</th>
1179
+ </tr>
1180
+ </thead>
1181
+ <tbody>
1182
+ <tr>
1183
+ <td>Google Tag Services</td>
1184
+ <td><span class="badge badge-muted">advertising</span></td>
1185
+ <td><span class="badge badge-critical">before consent</span></td>
1186
+ <td
1187
+ class="cell-url"
1188
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1189
+ >
1190
+ <code>https://www.googletagservices.com/tag/js/gpt.js</code>
1191
+ </td>
1192
+ </tr>
1193
+ <tr>
1194
+ <td>Google DoubleClick</td>
1195
+ <td><span class="badge badge-muted">advertising</span></td>
1196
+ <td><span class="badge badge-critical">before consent</span></td>
1197
+ <td
1198
+ class="cell-url"
1199
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1200
+ >
1201
+ <code>https://securepubads.g.doubleclick.net/pagead/managed/js/gpt/m20260…</code>
1202
+ </td>
1203
+ </tr>
1204
+ <tr>
1205
+ <td>Google DoubleClick</td>
1206
+ <td><span class="badge badge-muted">advertising</span></td>
1207
+ <td><span class="badge badge-critical">before consent</span></td>
1208
+ <td
1209
+ class="cell-url"
1210
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1211
+ >
1212
+ <code>https://securepubads.g.doubleclick.net/pagead/managed/dict/m2026022…</code>
1213
+ </td>
1214
+ </tr>
1215
+ <tr>
1216
+ <td>Google AdSense</td>
1217
+ <td><span class="badge badge-muted">advertising</span></td>
1218
+ <td><span class="badge badge-critical">before consent</span></td>
1219
+ <td
1220
+ class="cell-url"
1221
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1222
+ >
1223
+ <code>https://pagead2.googlesyndication.com/pagead/js/rum.js</code>
1224
+ </td>
1225
+ </tr>
1226
+ <tr>
1227
+ <td>Google AdSense</td>
1228
+ <td><span class="badge badge-muted">advertising</span></td>
1229
+ <td><span class="badge badge-critical">before consent</span></td>
1230
+ <td
1231
+ class="cell-url"
1232
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1233
+ >
1234
+ <code
1235
+ >https://pagead2.googlesyndication.com/pagead/gen_204?id=ama_stats&amp;s…</code
1236
+ >
1237
+ </td>
1238
+ </tr>
1239
+ <tr>
1240
+ <td>Facebook SDK</td>
1241
+ <td><span class="badge badge-muted">social</span></td>
1242
+ <td><span class="badge badge-critical">before consent</span></td>
1243
+ <td
1244
+ class="cell-url"
1245
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1246
+ >
1247
+ <code>https://connect.facebook.net/fr_FR/sdk.js</code>
1248
+ </td>
1249
+ </tr>
1250
+ <tr>
1251
+ <td>Facebook SDK</td>
1252
+ <td><span class="badge badge-muted">social</span></td>
1253
+ <td><span class="badge badge-critical">before consent</span></td>
1254
+ <td
1255
+ class="cell-url"
1256
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1257
+ >
1258
+ <code>https://connect.facebook.net/fr_FR/sdk.js?hash=1d43b1045098adf3ab81…</code>
1259
+ </td>
1260
+ </tr>
1261
+ <tr>
1262
+ <td>Google AdSense</td>
1263
+ <td><span class="badge badge-muted">advertising</span></td>
1264
+ <td><span class="badge badge-critical">before consent</span></td>
1265
+ <td
1266
+ class="cell-url"
1267
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1268
+ >
1269
+ <code>https://pagead2.googlesyndication.com/pagead/ping?e=1</code>
1270
+ </td>
1271
+ </tr>
1272
+ <tr>
1273
+ <td>Google AdSense</td>
1274
+ <td><span class="badge badge-muted">advertising</span></td>
1275
+ <td><span class="badge badge-muted">after-reject</span></td>
1276
+ <td
1277
+ class="cell-url"
1278
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1279
+ >
1280
+ <code>https://pagead2.googlesyndication.com/gampad/ads?pvsid=762805352401…</code>
1281
+ </td>
1282
+ </tr>
1283
+ <tr>
1284
+ <td>Google AdSense</td>
1285
+ <td><span class="badge badge-muted">advertising</span></td>
1286
+ <td><span class="badge badge-muted">after-reject</span></td>
1287
+ <td
1288
+ class="cell-url"
1289
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1290
+ >
1291
+ <code>https://pagead2.googlesyndication.com/gampad/ads?pvsid=762805352401…</code>
1292
+ </td>
1293
+ </tr>
1294
+ <tr>
1295
+ <td>Google AdSense</td>
1296
+ <td><span class="badge badge-muted">advertising</span></td>
1297
+ <td><span class="badge badge-muted">after-reject</span></td>
1298
+ <td
1299
+ class="cell-url"
1300
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1301
+ >
1302
+ <code>https://4a1e3b07473ddec5fc49fc6f8d362ece.safeframe.googlesyndicatio…</code>
1303
+ </td>
1304
+ </tr>
1305
+ <tr>
1306
+ <td>Tracking Pixel</td>
1307
+ <td><span class="badge badge-muted">pixel</span></td>
1308
+ <td><span class="badge badge-muted">after-reject</span></td>
1309
+ <td
1310
+ class="cell-url"
1311
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1312
+ >
1313
+ <code>https://collect.tealiumiq.com/event</code>
1314
+ </td>
1315
+ </tr>
1316
+ <tr>
1317
+ <td>Tracking Pixel</td>
1318
+ <td><span class="badge badge-muted">pixel</span></td>
1319
+ <td><span class="badge badge-muted">after-reject</span></td>
1320
+ <td
1321
+ class="cell-url"
1322
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1323
+ >
1324
+ <code>https://collect.tealiumiq.com/event</code>
1325
+ </td>
1326
+ </tr>
1327
+ <tr>
1328
+ <td>Tracking Pixel</td>
1329
+ <td><span class="badge badge-muted">pixel</span></td>
1330
+ <td><span class="badge badge-muted">after-reject</span></td>
1331
+ <td
1332
+ class="cell-url"
1333
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1334
+ >
1335
+ <code>https://collect.tealiumiq.com/event</code>
1336
+ </td>
1337
+ </tr>
1338
+ <tr>
1339
+ <td>Google AdSense</td>
1340
+ <td><span class="badge badge-muted">advertising</span></td>
1341
+ <td><span class="badge badge-muted">after-reject</span></td>
1342
+ <td
1343
+ class="cell-url"
1344
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1345
+ >
1346
+ <code>https://pagead2.googlesyndication.com/bg/7-JEQqPqQyEGd3nK0JmL7-npQZ…</code>
1347
+ </td>
1348
+ </tr>
1349
+ <tr>
1350
+ <td>Google Tag Services</td>
1351
+ <td><span class="badge badge-muted">advertising</span></td>
1352
+ <td><span class="badge badge-muted">after-accept</span></td>
1353
+ <td
1354
+ class="cell-url"
1355
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1356
+ >
1357
+ <code>https://www.googletagservices.com/tag/js/gpt.js</code>
1358
+ </td>
1359
+ </tr>
1360
+ <tr>
1361
+ <td>Google DoubleClick</td>
1362
+ <td><span class="badge badge-muted">advertising</span></td>
1363
+ <td><span class="badge badge-muted">after-accept</span></td>
1364
+ <td
1365
+ class="cell-url"
1366
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1367
+ >
1368
+ <code>https://securepubads.g.doubleclick.net/pagead/managed/js/gpt/m20260…</code>
1369
+ </td>
1370
+ </tr>
1371
+ <tr>
1372
+ <td>Google DoubleClick</td>
1373
+ <td><span class="badge badge-muted">advertising</span></td>
1374
+ <td><span class="badge badge-muted">after-accept</span></td>
1375
+ <td
1376
+ class="cell-url"
1377
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1378
+ >
1379
+ <code>https://securepubads.g.doubleclick.net/pagead/managed/dict/m2026022…</code>
1380
+ </td>
1381
+ </tr>
1382
+ <tr>
1383
+ <td>Facebook SDK</td>
1384
+ <td><span class="badge badge-muted">social</span></td>
1385
+ <td><span class="badge badge-muted">after-accept</span></td>
1386
+ <td
1387
+ class="cell-url"
1388
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1389
+ >
1390
+ <code>https://connect.facebook.net/fr_FR/sdk.js</code>
1391
+ </td>
1392
+ </tr>
1393
+ <tr>
1394
+ <td>Facebook SDK</td>
1395
+ <td><span class="badge badge-muted">social</span></td>
1396
+ <td><span class="badge badge-muted">after-accept</span></td>
1397
+ <td
1398
+ class="cell-url"
1399
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1400
+ >
1401
+ <code>https://connect.facebook.net/fr_FR/sdk.js?hash=1d43b1045098adf3ab81…</code>
1402
+ </td>
1403
+ </tr>
1404
+ <tr>
1405
+ <td>Google AdSense</td>
1406
+ <td><span class="badge badge-muted">advertising</span></td>
1407
+ <td><span class="badge badge-muted">after-accept</span></td>
1408
+ <td
1409
+ class="cell-url"
1410
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1411
+ >
1412
+ <code>https://pagead2.googlesyndication.com/pagead/ping?e=1</code>
1413
+ </td>
1414
+ </tr>
1415
+ <tr>
1416
+ <td>Google DoubleClick</td>
1417
+ <td><span class="badge badge-muted">advertising</span></td>
1418
+ <td><span class="badge badge-muted">after-accept</span></td>
1419
+ <td
1420
+ class="cell-url"
1421
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1422
+ >
1423
+ <code>https://cm.g.doubleclick.net/partnerpixels?gdpr_consent=CQgVeAAQgVe…</code>
1424
+ </td>
1425
+ </tr>
1426
+ <tr>
1427
+ <td>Google DoubleClick</td>
1428
+ <td><span class="badge badge-muted">advertising</span></td>
1429
+ <td><span class="badge badge-muted">after-accept</span></td>
1430
+ <td
1431
+ class="cell-url"
1432
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1433
+ >
1434
+ <code>https://securepubads.g.doubleclick.net/gampad/ads?pvsid=15503692787…</code>
1435
+ </td>
1436
+ </tr>
1437
+ <tr>
1438
+ <td>Google DoubleClick</td>
1439
+ <td><span class="badge badge-muted">advertising</span></td>
1440
+ <td><span class="badge badge-muted">after-accept</span></td>
1441
+ <td
1442
+ class="cell-url"
1443
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1444
+ >
1445
+ <code>https://securepubads.g.doubleclick.net/gampad/ads?pvsid=15503692787…</code>
1446
+ </td>
1447
+ </tr>
1448
+ <tr>
1449
+ <td>Google AdSense</td>
1450
+ <td><span class="badge badge-muted">advertising</span></td>
1451
+ <td><span class="badge badge-muted">after-accept</span></td>
1452
+ <td
1453
+ class="cell-url"
1454
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1455
+ >
1456
+ <code>https://a8e9d96076a113cd5b9a721e0f16f85d.safeframe.googlesyndicatio…</code>
1457
+ </td>
1458
+ </tr>
1459
+ <tr>
1460
+ <td>Outbrain</td>
1461
+ <td><span class="badge badge-muted">advertising</span></td>
1462
+ <td><span class="badge badge-muted">after-accept</span></td>
1463
+ <td
1464
+ class="cell-url"
1465
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1466
+ >
1467
+ <code>https://amplify.outbrain.com/cp/obtp.js</code>
1468
+ </td>
1469
+ </tr>
1470
+ <tr>
1471
+ <td>Facebook SDK</td>
1472
+ <td><span class="badge badge-muted">social</span></td>
1473
+ <td><span class="badge badge-muted">after-accept</span></td>
1474
+ <td
1475
+ class="cell-url"
1476
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1477
+ >
1478
+ <code>https://connect.facebook.net/en_US/fbevents.js</code>
1479
+ </td>
1480
+ </tr>
1481
+ <tr>
1482
+ <td>Tracking Pixel</td>
1483
+ <td><span class="badge badge-muted">pixel</span></td>
1484
+ <td><span class="badge badge-muted">after-accept</span></td>
1485
+ <td
1486
+ class="cell-url"
1487
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1488
+ >
1489
+ <code>https://collect.tealiumiq.com/event</code>
1490
+ </td>
1491
+ </tr>
1492
+ <tr>
1493
+ <td>Tracking Pixel</td>
1494
+ <td><span class="badge badge-muted">pixel</span></td>
1495
+ <td><span class="badge badge-muted">after-accept</span></td>
1496
+ <td
1497
+ class="cell-url"
1498
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1499
+ >
1500
+ <code>https://collect.tealiumiq.com/event</code>
1501
+ </td>
1502
+ </tr>
1503
+ <tr>
1504
+ <td>Tracking Pixel</td>
1505
+ <td><span class="badge badge-muted">pixel</span></td>
1506
+ <td><span class="badge badge-muted">after-accept</span></td>
1507
+ <td
1508
+ class="cell-url"
1509
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1510
+ >
1511
+ <code>https://collect.tealiumiq.com/event</code>
1512
+ </td>
1513
+ </tr>
1514
+ <tr>
1515
+ <td>Google AdSense</td>
1516
+ <td><span class="badge badge-muted">advertising</span></td>
1517
+ <td><span class="badge badge-muted">after-accept</span></td>
1518
+ <td
1519
+ class="cell-url"
1520
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1521
+ >
1522
+ <code>https://pagead2.googlesyndication.com/bg/7-JEQqPqQyEGd3nK0JmL7-npQZ…</code>
1523
+ </td>
1524
+ </tr>
1525
+ <tr>
1526
+ <td>Outbrain</td>
1527
+ <td><span class="badge badge-muted">advertising</span></td>
1528
+ <td><span class="badge badge-muted">after-accept</span></td>
1529
+ <td
1530
+ class="cell-url"
1531
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1532
+ >
1533
+ <code>https://wave.outbrain.com/mtWavesBundler/handler/00244a93dd4b6c51b6…</code>
1534
+ </td>
1535
+ </tr>
1536
+ <tr>
1537
+ <td>Outbrain</td>
1538
+ <td><span class="badge badge-muted">advertising</span></td>
1539
+ <td><span class="badge badge-muted">after-accept</span></td>
1540
+ <td
1541
+ class="cell-url"
1542
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1543
+ >
1544
+ <code>https://amplify.outbrain.com/topics</code>
1545
+ </td>
1546
+ </tr>
1547
+ <tr>
1548
+ <td>Outbrain</td>
1549
+ <td><span class="badge badge-muted">advertising</span></td>
1550
+ <td><span class="badge badge-muted">after-accept</span></td>
1551
+ <td
1552
+ class="cell-url"
1553
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1554
+ >
1555
+ <code
1556
+ >https://tr.outbrain.com/unifiedPixel?au=false&amp;bust=0028185788252543…</code
1557
+ >
1558
+ </td>
1559
+ </tr>
1560
+ <tr>
1561
+ <td>Outbrain</td>
1562
+ <td><span class="badge badge-muted">advertising</span></td>
1563
+ <td><span class="badge badge-muted">after-accept</span></td>
1564
+ <td
1565
+ class="cell-url"
1566
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1567
+ >
1568
+ <code>https://tr.outbrain.com/cachedClickId?marketerId=00244a93dd4b6c51b6…</code>
1569
+ </td>
1570
+ </tr>
1571
+ <tr>
1572
+ <td>Facebook SDK</td>
1573
+ <td><span class="badge badge-muted">social</span></td>
1574
+ <td><span class="badge badge-muted">after-accept</span></td>
1575
+ <td
1576
+ class="cell-url"
1577
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1578
+ >
1579
+ <code>https://connect.facebook.net/signals/config/1660821730768627?v=2.9.…</code>
1580
+ </td>
1581
+ </tr>
1582
+ <tr>
1583
+ <td>Google AdSense</td>
1584
+ <td><span class="badge badge-muted">advertising</span></td>
1585
+ <td><span class="badge badge-muted">after-accept</span></td>
1586
+ <td
1587
+ class="cell-url"
1588
+ style="font-size: 11px; color: var(--text-muted); word-break: break-all"
1589
+ >
1590
+ <code
1591
+ >https://pagead2.googlesyndication.com/pagead/sodar?id=sodar2&amp;v=252&amp;…</code
1592
+ >
1593
+ </td>
1594
+ </tr>
1595
+ </tbody>
1596
+ </table>
1597
+ </div>
1598
+ </div>
1599
+
1600
+ <div class="section">
1601
+ <div class="section-header">
1602
+ <h2>IAB TCF</h2>
1603
+ <span class="badge badge-ok">TCF v2</span>
1604
+ <span class="badge badge-muted">CMP 7</span>
1605
+ </div>
1606
+ <div class="section-body">
1607
+ <p
1608
+ style="margin: 0 0 16px; font-size: 12px; color: var(--text-muted); font-style: italic"
1609
+ >
1610
+ Informational only — does not affect the compliance score.
1611
+ </p>
1612
+ <table class="data-table">
1613
+ <thead>
1614
+ <tr>
1615
+ <th>Property</th>
1616
+ <th>Value</th>
1617
+ </tr>
1618
+ </thead>
1619
+ <tbody>
1620
+ <tr>
1621
+ <td style="font-weight: 500; width: 40%">CMP API (<code>__tcfapi</code>)</td>
1622
+ <td><span class="status-ok">✓ Present</span></td>
1623
+ </tr>
1624
+ <tr>
1625
+ <td style="font-weight: 500; width: 40%">
1626
+ Locator frame (<code>__tcfapiLocator</code>)
1627
+ </td>
1628
+ <td><span class="status-ok">✓ Present</span></td>
1629
+ </tr>
1630
+ <tr>
1631
+ <td style="font-weight: 500; width: 40%">Consent string cookie</td>
1632
+ <td><span style="color: var(--text-muted)">—</span></td>
1633
+ </tr>
1634
+ <tr>
1635
+ <td style="font-weight: 500; width: 40%">CMP ID</td>
1636
+ <td>7</td>
1637
+ </tr>
1638
+ </tbody>
1639
+ </table>
1640
+ <div style="margin-top: 20px">
1641
+ <div
1642
+ style="
1643
+ font-size: 12px;
1644
+ font-weight: 600;
1645
+ text-transform: uppercase;
1646
+ letter-spacing: 0.04em;
1647
+ color: var(--text-muted);
1648
+ margin-bottom: 8px;
1649
+ "
1650
+ >
1651
+ Decoded consent string
1652
+ </div>
1653
+ <table class="data-table">
1654
+ <thead>
1655
+ <tr>
1656
+ <th>Field</th>
1657
+ <th>Value</th>
1658
+ </tr>
1659
+ </thead>
1660
+ <tbody>
1661
+ <tr>
1662
+ <td style="font-weight: 500; width: 40%">Version</td>
1663
+ <td>TCF v2</td>
1664
+ </tr>
1665
+ <tr>
1666
+ <td style="font-weight: 500; width: 40%">Created</td>
1667
+ <td>2026-02-28</td>
1668
+ </tr>
1669
+ <tr>
1670
+ <td style="font-weight: 500; width: 40%">Last updated</td>
1671
+ <td>2026-02-28</td>
1672
+ </tr>
1673
+ <tr>
1674
+ <td style="font-weight: 500; width: 40%">CMP ID</td>
1675
+ <td>7</td>
1676
+ </tr>
1677
+ <tr>
1678
+ <td style="font-weight: 500; width: 40%">CMP version</td>
1679
+ <td>1</td>
1680
+ </tr>
1681
+ <tr>
1682
+ <td style="font-weight: 500; width: 40%">Consent language</td>
1683
+ <td>EN</td>
1684
+ </tr>
1685
+ <tr>
1686
+ <td style="font-weight: 500; width: 40%">Vendor list version</td>
1687
+ <td>147</td>
1688
+ </tr>
1689
+ <tr>
1690
+ <td style="font-weight: 500; width: 40%">TCF policy version</td>
1691
+ <td>5</td>
1692
+ </tr>
1693
+ <tr>
1694
+ <td style="font-weight: 500; width: 40%">Service specific</td>
1695
+ <td>Yes</td>
1696
+ </tr>
1697
+ <tr>
1698
+ <td style="font-weight: 500; width: 40%">Publisher country</td>
1699
+ <td>AA</td>
1700
+ </tr>
1701
+ </tbody>
1702
+ </table>
1703
+ </div>
1704
+ <p style="margin-top: 16px; font-size: 13px; color: var(--text-muted)">
1705
+ No purposes with explicit consent.
1706
+ </p>
1707
+ </div>
1708
+ </div>
1709
+
1710
+ <div class="section">
1711
+ <div class="section-header">
1712
+ <h2>Recommendations</h2>
1713
+ <span class="count-badge">3</span>
1714
+ </div>
1715
+ <div class="section-body">
1716
+ <ul class="rec-list">
1717
+ <li class="rec-item">
1718
+ <span class="rec-num">1</span>
1719
+ <span
1720
+ >Do not set any non-essential cookie before consent. Gate the initialisation of
1721
+ third-party scripts on the acceptance callback.</span
1722
+ >
1723
+ </li>
1724
+ <li class="rec-item">
1725
+ <span class="rec-num">2</span>
1726
+ <span
1727
+ >Complete the modal information: processing purposes, identity of sub-processors,
1728
+ retention period, right to withdraw.</span
1729
+ >
1730
+ </li>
1731
+ <li class="rec-item">
1732
+ <span class="rec-num">3</span>
1733
+ <span
1734
+ >Remove or block non-essential cookies after rejection, and verify consent handling
1735
+ server-side.</span
1736
+ >
1737
+ </li>
1738
+ </ul>
1739
+ </div>
1740
+ </div>
1741
+
1742
+ <div class="section">
1743
+ <div class="section-header">
1744
+ <h2>Compliance checklist</h2>
1745
+ <span class="count-badge">12 rules</span>
1746
+ <span class="badge badge-ok">8 ✓</span>
1747
+ <span class="badge badge-critical">3 ✗</span>
1748
+ <span class="badge badge-warning">1 ⚠</span>
1749
+ </div>
1750
+ <div class="section-body no-pad">
1751
+ <table class="data-table">
1752
+ <thead>
1753
+ <tr>
1754
+ <th>Category</th>
1755
+ <th>Rule</th>
1756
+ <th>Status</th>
1757
+ <th>Detail</th>
1758
+ </tr>
1759
+ </thead>
1760
+ <tbody>
1761
+ <tr>
1762
+ <td
1763
+ rowspan="3"
1764
+ style="font-weight: 600; vertical-align: top; background: var(--bg)"
1765
+ >
1766
+ Consent
1767
+ </td>
1768
+ <td>Consent modal detected</td>
1769
+ <td><span class="status-ok">✓ Compliant</span></td>
1770
+ <td style="color: var(--text-muted); font-size: 12px">
1771
+ Detected (.didomi-popup-container)
1772
+ </td>
1773
+ </tr>
1774
+ <tr>
1775
+ <td>No pre-ticked checkboxes</td>
1776
+ <td><span class="status-ok">✓ Compliant</span></td>
1777
+ <td style="color: var(--text-muted); font-size: 12px">None detected</td>
1778
+ </tr>
1779
+ <tr>
1780
+ <td>Unambiguous accept label</td>
1781
+ <td><span class="status-ok">✓ Compliant</span></td>
1782
+ <td style="color: var(--text-muted); font-size: 12px">TOUT ACCEPTER</td>
1783
+ </tr>
1784
+ <tr>
1785
+ <td
1786
+ rowspan="3"
1787
+ style="font-weight: 600; vertical-align: top; background: var(--bg)"
1788
+ >
1789
+ Easy refusal
1790
+ </td>
1791
+ <td>Reject button at first layer</td>
1792
+ <td><span class="status-ok">✓ Compliant</span></td>
1793
+ <td style="color: var(--text-muted); font-size: 12px">Continuer sans accepter →</td>
1794
+ </tr>
1795
+ <tr>
1796
+ <td>Reject ≤ clicks than accept</td>
1797
+ <td><span class="status-ok">✓ Compliant</span></td>
1798
+ <td style="color: var(--text-muted); font-size: 12px">Accept: 1 · Reject: 1</td>
1799
+ </tr>
1800
+ <tr>
1801
+ <td>Button size symmetry</td>
1802
+ <td><span class="status-ok">✓ Compliant</span></td>
1803
+ <td style="color: var(--text-muted); font-size: 12px">Comparable sizes</td>
1804
+ </tr>
1805
+ <tr>
1806
+ <td
1807
+ rowspan="3"
1808
+ style="font-weight: 600; vertical-align: top; background: var(--bg)"
1809
+ >
1810
+ Transparency
1811
+ </td>
1812
+ <td>Granular controls available</td>
1813
+ <td><span class="status-warn">⚠ Warning</span></td>
1814
+ <td style="color: var(--text-muted); font-size: 12px">No granular controls</td>
1815
+ </tr>
1816
+ <tr>
1817
+ <td>Privacy policy in modal</td>
1818
+ <td><span class="status-ok">✓ Compliant</span></td>
1819
+ <td style="color: var(--text-muted); font-size: 12px">
1820
+ https://www.m6.fr/politique-de-confidentialite/cookies-partenaires
1821
+ </td>
1822
+ </tr>
1823
+ <tr>
1824
+ <td>Privacy policy on page</td>
1825
+ <td><span class="status-ok">✓ Compliant</span></td>
1826
+ <td style="color: var(--text-muted); font-size: 12px">
1827
+ https://www.m6.fr/politique-de-confidentialite/cookies-partenaires
1828
+ </td>
1829
+ </tr>
1830
+ <tr>
1831
+ <td
1832
+ rowspan="3"
1833
+ style="font-weight: 600; vertical-align: top; background: var(--bg)"
1834
+ >
1835
+ Cookie behavior
1836
+ </td>
1837
+ <td>No non-essential cookie before consent</td>
1838
+ <td><span class="status-ko">✗ Non-compliant</span></td>
1839
+ <td style="color: var(--text-muted); font-size: 12px">2: gmid, ucid</td>
1840
+ </tr>
1841
+ <tr>
1842
+ <td>Non-essential cookies removed after reject</td>
1843
+ <td><span class="status-ko">✗ Non-compliant</span></td>
1844
+ <td style="color: var(--text-muted); font-size: 12px">2 persisting</td>
1845
+ </tr>
1846
+ <tr>
1847
+ <td>No tracker before consent</td>
1848
+ <td><span class="status-ko">✗ Non-compliant</span></td>
1849
+ <td style="color: var(--text-muted); font-size: 12px">8 tracker(s)</td>
1850
+ </tr>
1851
+ </tbody>
1852
+ </table>
1853
+ </div>
1854
+ </div>
1855
+
1856
+ <div class="footer">
1857
+ Generated by <a href="https://github.com/Slashgear/gdpr-report">gdpr-cookie-scanner</a>
1858
+ on 28 February 2026 at 16:00
1859
+ </div>
1860
+ </div>
1861
+ </body>
1862
+ </html>