-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
804 lines (705 loc) · 74.3 KB
/
index.html
File metadata and controls
804 lines (705 loc) · 74.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="theme-color" content="#2C1A0E">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="default">
<meta name="apple-mobile-web-app-title" content="Quiz PPF Greta">
<title>Quiz PPF – Cuisine & Pâtisserie GRETA</title>
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=Playfair+Display:wght@700;900&display=swap" rel="stylesheet">
<style>
:root{
--ink:#1E1208; --dk:#2C1A0E; --rust:#8B3A1A; --terra:#B5521E;
--clay:#D4753A; --sand:#F5E6C8; --cream:#FAF6F0; --paper:#FDFAF6;
--teal:#1A5C5C; --navy:#1A2E5C; --plum:#5C1A3A;
--border:#E8D8C4; --muted:#8A7060; --sh:0 2px 16px rgba(44,26,14,.10);
--r:12px;
}
*{box-sizing:border-box;margin:0;padding:0;}
body{font-family:'DM Sans',sans-serif;background:var(--cream);color:var(--ink);min-height:100vh;overscroll-behavior:none;}
header{background:var(--dk);overflow:hidden;position:relative;}
header::before{content:'';position:absolute;inset:0;background:repeating-linear-gradient(135deg,transparent,transparent 16px,rgba(255,255,255,.015) 16px,rgba(255,255,255,.015) 17px);}
.hi{display:flex;flex-direction:column;align-items:center;padding:20px 18px 0;text-align:center;position:relative;z-index:1;}
.logo-pill{display:inline-flex;align-items:center;gap:5px;background:var(--clay);color:#fff;font-size:.72rem;font-weight:700;letter-spacing:1.5px;text-transform:uppercase;padding:4px 13px;border-radius:20px;margin-bottom:9px;}
header h1{font-family:'Playfair Display',serif;font-size:1.45rem;font-weight:900;color:#fff;line-height:1.2;margin-bottom:2px;}
header p{font-size:.77rem;color:rgba(255,255,255,.6);font-weight:500;padding-bottom:18px;}
.hstripe{height:4px;background:linear-gradient(90deg,#8B3A1A,var(--clay),#E8A850,var(--clay),#8B3A1A);}
.prog-wrap{background:#1A100600;background:var(--ink);padding:8px 18px 11px;display:none;}
.prog-row{display:flex;justify-content:space-between;color:rgba(255,255,255,.55);font-size:.7rem;font-weight:600;margin-bottom:5px;}
.prog-track{background:rgba(255,255,255,.1);border-radius:8px;height:5px;overflow:hidden;}
.prog-bar{background:linear-gradient(90deg,var(--rust),var(--clay));height:100%;border-radius:8px;transition:width .5s cubic-bezier(.4,0,.2,1);}
main{max-width:580px;margin:0 auto;padding:14px 13px 90px;}
.card{background:var(--paper);border-radius:var(--r);box-shadow:var(--sh);border:1px solid var(--border);padding:20px 17px;animation:up .3s ease;}
@keyframes up{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}
@keyframes pop{from{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}
.th-badge{display:inline-flex;align-items:center;gap:5px;font-size:.67rem;font-weight:700;letter-spacing:.8px;text-transform:uppercase;padding:3px 10px;border-radius:16px;color:#fff;margin-bottom:10px;}
.q-num{font-size:.7rem;font-weight:600;color:var(--muted);letter-spacing:.5px;text-transform:uppercase;margin-bottom:6px;}
.q-text{font-size:1rem;font-weight:600;line-height:1.5;color:var(--ink);margin-bottom:16px;white-space:pre-line;}
.opts{display:flex;flex-direction:column;gap:7px;}
.opt{display:flex;align-items:flex-start;gap:10px;padding:11px 13px;border:2px solid var(--border);border-radius:10px;background:var(--cream);cursor:pointer;transition:all .15s;font-family:'DM Sans',sans-serif;font-size:.92rem;font-weight:500;color:var(--ink);text-align:left;width:100%;}
.opt:hover:not(:disabled){border-color:var(--terra);background:#FDF0E8;}
.opt:active{transform:scale(.985);}
.ltr{min-width:24px;height:24px;border-radius:50%;background:var(--paper);border:2px solid var(--border);display:flex;align-items:center;justify-content:center;font-size:.68rem;font-weight:700;color:var(--terra);flex-shrink:0;margin-top:1px;}
.opt.ok{border-color:#1A5C2E;background:#EDF5EF;}
.opt.ok .ltr{background:#1A5C2E;border-color:#1A5C2E;color:#fff;}
.opt.ko{border-color:#A02020;background:#FBEAE8;}
.opt.ko .ltr{background:#A02020;border-color:#A02020;color:#fff;}
.opt.show-ok{border-color:#2A7A4B;background:#EDF5EF;opacity:.75;}
.opt.show-ok .ltr{background:#2A7A4B;border-color:#2A7A4B;color:#fff;}
.opt:disabled{cursor:default;}
.vf{display:grid;grid-template-columns:1fr 1fr;gap:9px;}
.vfbtn{padding:14px 8px;border:2px solid var(--border);border-radius:10px;background:var(--cream);cursor:pointer;font-family:'DM Sans',sans-serif;font-size:.95rem;font-weight:700;color:var(--ink);text-align:center;transition:all .15s;}
.vfbtn .vi{font-size:1.7rem;display:block;margin-bottom:2px;}
.vfbtn:hover:not(:disabled){border-color:var(--terra);background:#FDF0E8;}
.vfbtn:disabled{cursor:default;}
.vfbtn.ok{border-color:#1A5C2E;background:#EDF5EF;}
.vfbtn.ko{border-color:#A02020;background:#FBEAE8;}
.vfbtn.show-ok{border-color:#2A7A4B;background:#EDF5EF;opacity:.75;}
.fb{margin-top:11px;padding:10px 12px;border-radius:9px;font-size:.84rem;font-weight:500;line-height:1.5;display:none;animation:pop .2s ease;}
.fb.on{display:block;}
.fb.ok{background:#EDF5EF;color:#1A3C22;border-left:3px solid #1A5C2E;}
.fb.ko{background:#FBEAE8;color:#6A1A1A;border-left:3px solid #A02020;}
.fb strong{font-weight:700;}
.expl{margin-top:3px;font-size:.8rem;opacity:.85;}
.nxt{width:100%;margin-top:12px;padding:13px;background:var(--dk);color:#fff;border:none;border-radius:10px;font-family:'DM Sans',sans-serif;font-size:.95rem;font-weight:700;cursor:pointer;display:none;box-shadow:0 3px 12px rgba(44,26,14,.3);transition:transform .12s;}
.nxt.on{display:block;animation:up .25s ease;}
.nxt:active{transform:scale(.97);}
.home{background:var(--paper);border-radius:var(--r);box-shadow:var(--sh);border:1px solid var(--border);padding:24px 18px;margin-top:14px;}
.home-icon{font-size:2.8rem;display:block;text-align:center;margin-bottom:10px;}
.home h2{font-family:'Playfair Display',serif;font-size:1.25rem;font-weight:900;color:var(--rust);text-align:center;margin-bottom:5px;}
.home-sub{text-align:center;color:var(--muted);font-size:.84rem;font-weight:500;margin-bottom:16px;line-height:1.5;}
.field-label{font-size:.82rem;font-weight:600;color:var(--ink);margin-bottom:5px;display:block;}
.field{width:100%;padding:11px 13px;border:2px solid var(--border);border-radius:9px;font-family:'DM Sans',sans-serif;font-size:.95rem;font-weight:500;color:var(--ink);background:var(--cream);outline:none;transition:border-color .18s;margin-bottom:11px;}
.field:focus{border-color:var(--terra);}
.field-err{color:#A02020;font-size:.78rem;font-weight:600;margin-top:-7px;margin-bottom:9px;display:none;}
.th-grid{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin-bottom:16px;}
.th-item{display:flex;align-items:center;gap:7px;padding:9px 11px;background:var(--cream);border-radius:9px;font-size:.76rem;font-weight:600;color:var(--ink);border:1px solid var(--border);line-height:1.3;}
.th-item .ic{font-size:1.1rem;flex-shrink:0;}
.go-btn{width:100%;padding:14px;background:var(--dk);color:#fff;border:none;border-radius:10px;font-family:'DM Sans',sans-serif;font-size:.98rem;font-weight:700;cursor:pointer;box-shadow:0 4px 14px rgba(44,26,14,.25);transition:transform .12s;}
.go-btn:active{transform:scale(.97);}
.fmt-link{display:block;text-align:center;margin-top:14px;font-size:.73rem;font-weight:600;color:var(--muted);cursor:pointer;text-decoration:underline;opacity:.7;}
.import-banner{background:var(--teal);color:#fff;border-radius:var(--r);padding:14px 16px;margin-bottom:12px;display:none;animation:up .3s ease;}
.import-banner.on{display:flex;align-items:center;gap:10px;}
.import-banner p{font-size:.85rem;font-weight:600;line-height:1.4;}
.res-card{background:var(--paper);border-radius:var(--r);box-shadow:var(--sh);border:1px solid var(--border);padding:22px 17px;margin-top:14px;text-align:center;}
.ring{width:108px;height:108px;border-radius:50%;margin:0 auto 13px;display:flex;flex-direction:column;align-items:center;justify-content:center;}
.ring .rn{font-family:'Playfair Display',serif;font-size:1.9rem;font-weight:900;color:#fff;line-height:1;}
.ring .rl{font-size:.68rem;color:rgba(255,255,255,.8);font-weight:600;margin-top:1px;}
.name-tag{display:inline-block;background:var(--cream);border:1.5px solid var(--border);border-radius:16px;padding:3px 11px;font-size:.8rem;font-weight:600;margin-bottom:12px;}
.res-card h2{font-family:'Playfair Display',serif;font-size:1.15rem;font-weight:900;color:var(--rust);margin-bottom:3px;}
.res-sub{color:var(--muted);font-size:.82rem;font-weight:500;margin-bottom:15px;line-height:1.4;}
.th-results{display:flex;flex-direction:column;gap:7px;margin-bottom:15px;text-align:left;}
.th-row{padding:9px 12px;border-radius:9px;background:var(--cream);border:1px solid var(--border);}
.th-top{display:flex;justify-content:space-between;margin-bottom:3px;}
.th-name{font-size:.78rem;font-weight:700;color:var(--ink);}
.th-sc{font-size:.78rem;font-weight:700;color:var(--rust);}
.bar{background:var(--border);border-radius:5px;height:5px;overflow:hidden;}
.bf{height:100%;border-radius:5px;}
.bf.g{background:linear-gradient(90deg,#1A5C2E,#3EA065);}
.bf.m{background:linear-gradient(90deg,var(--rust),var(--clay));}
.bf.l{background:linear-gradient(90deg,#A02020,#D05050);}
.share-box{background:var(--sand);border:1.5px solid var(--clay);border-radius:10px;padding:12px 14px;margin-bottom:10px;text-align:left;}
.share-box p{font-size:.8rem;font-weight:600;color:var(--ink);margin-bottom:7px;line-height:1.4;}
.share-url{width:100%;padding:8px 11px;border:1.5px solid var(--clay);border-radius:7px;font-family:'DM Sans',sans-serif;font-size:.73rem;color:var(--ink);background:#fff;word-break:break-all;cursor:text;resize:none;min-height:54px;font-weight:500;}
.copy-btn{width:100%;margin-top:6px;padding:9px;background:var(--clay);color:#fff;border:none;border-radius:7px;font-family:'DM Sans',sans-serif;font-size:.84rem;font-weight:700;cursor:pointer;transition:opacity .15s;}
.copy-btn:active{opacity:.8;}
.copy-ok{color:#1A5C2E;font-size:.76rem;font-weight:700;text-align:center;margin-top:4px;display:none;}
.email-btn{width:100%;padding:13px;background:#1A5C2E;color:#fff;border:none;border-radius:10px;font-family:'DM Sans',sans-serif;font-size:.93rem;font-weight:700;cursor:pointer;box-shadow:0 3px 12px rgba(26,92,46,.25);margin-bottom:8px;transition:transform .12s;}
.email-btn:active{transform:scale(.97);}
.restart-btn{width:100%;padding:12px;background:var(--cream);color:var(--ink);border:1.5px solid var(--border);border-radius:10px;font-family:'DM Sans',sans-serif;font-size:.9rem;font-weight:700;cursor:pointer;margin-bottom:8px;}
.hint{font-size:.72rem;color:var(--muted);font-weight:500;line-height:1.5;}
.dash{background:var(--paper);border-radius:var(--r);box-shadow:var(--sh);border:1px solid var(--border);padding:20px 16px;margin-top:14px;}
.dash h2{font-family:'Playfair Display',serif;font-size:1.15rem;font-weight:900;color:var(--rust);margin-bottom:2px;}
.dash-sub{font-size:.78rem;color:var(--muted);font-weight:500;margin-bottom:14px;}
.dash-empty{text-align:center;padding:28px 0;color:var(--muted);font-size:.86rem;line-height:1.6;}
.dash-entry{padding:12px 0;border-bottom:1px solid var(--border);}
.dash-entry:last-child{border-bottom:none;}
.de-name{font-size:.9rem;font-weight:700;color:var(--ink);}
.de-meta{font-size:.73rem;color:var(--muted);font-weight:500;margin-bottom:5px;}
.de-score{display:inline-block;background:var(--cream);border:1.5px solid var(--border);border-radius:7px;padding:2px 9px;font-size:.82rem;font-weight:700;color:var(--rust);margin-bottom:7px;}
.de-bars{display:flex;flex-direction:column;gap:3px;}
.de-bar-row{display:flex;align-items:center;gap:6px;}
.de-bar-name{font-size:.7rem;font-weight:600;color:var(--muted);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.de-bar-track{flex:2;background:var(--border);border-radius:4px;height:4px;overflow:hidden;}
.de-bar-fill{height:100%;border-radius:4px;}
.de-bar-fill.g{background:linear-gradient(90deg,#1A5C2E,#3EA065);}
.de-bar-fill.m{background:linear-gradient(90deg,var(--rust),var(--clay));}
.de-bar-fill.l{background:linear-gradient(90deg,#A02020,#D05050);}
.de-bar-sc{font-size:.7rem;font-weight:700;color:var(--ink);min-width:28px;text-align:right;}
.back-btn{width:100%;padding:11px;background:var(--cream);color:var(--ink);border:1.5px solid var(--border);border-radius:9px;font-family:'DM Sans',sans-serif;font-size:.86rem;font-weight:700;cursor:pointer;margin-top:12px;}
.del-btn{width:100%;padding:9px;background:#FBEAE8;color:#A02020;border:1.5px solid #E4BABA;border-radius:9px;font-family:'DM Sans',sans-serif;font-size:.8rem;font-weight:700;cursor:pointer;margin-top:6px;}
.dash-count{font-size:.78rem;background:var(--rust);color:#fff;padding:2px 9px;border-radius:12px;font-weight:700;display:inline-block;margin-left:6px;}
.lock-card{background:var(--paper);border-radius:var(--r);box-shadow:var(--sh);border:1px solid var(--border);padding:24px 18px;margin-top:14px;text-align:center;}
.lock-icon{font-size:2.2rem;display:block;margin-bottom:8px;}
.lock-card h2{font-family:'Playfair Display',serif;font-size:1.1rem;color:var(--rust);margin-bottom:5px;}
.lock-card p{font-size:.83rem;color:var(--muted);margin-bottom:14px;}
.code-field{width:100%;padding:12px;border:2px solid var(--border);border-radius:9px;font-family:'DM Sans',sans-serif;font-size:1.15rem;font-weight:700;letter-spacing:4px;text-align:center;background:var(--cream);outline:none;transition:border-color .18s;margin-bottom:8px;}
.code-field:focus{border-color:var(--terra);}
.code-err{color:#A02020;font-size:.78rem;font-weight:600;text-align:center;margin-bottom:7px;display:none;}
.unlock-btn{width:100%;padding:13px;background:var(--dk);color:#fff;border:none;border-radius:10px;font-family:'DM Sans',sans-serif;font-size:.95rem;font-weight:700;cursor:pointer;}
@media(max-width:360px){header h1{font-size:1.2rem;}.q-text{font-size:.93rem;}.th-grid{grid-template-columns:1fr;}}
</style>
</head>
<body>
<header>
<div class="hi">
<div class="logo-pill">🔪 GRETA</div>
<h1>Cuisine & Pâtisserie</h1>
<p>Évaluation technique – Préparations, Hygiène & Sécurité · 50 questions</p>
</div>
<div class="hstripe"></div>
</header>
<div class="prog-wrap" id="prog-wrap">
<div class="prog-row"><span id="prog-txt">Question 1 / 50</span><span id="prog-pct">0 %</span></div>
<div class="prog-track"><div class="prog-bar" id="prog-bar" style="width:0%"></div></div>
</div>
<main>
<div class="import-banner" id="import-banner">
<span style="font-size:1.6rem">✅</span>
<p><strong>Résultat importé !</strong><br>Le résultat a été ajouté au tableau de bord.</p>
</div>
<!-- ACCUEIL -->
<div id="s-home">
<div class="home">
<span class="home-icon">🍽️</span>
<h2>Quiz PPF – Cuisine & Pâtisserie</h2>
<p class="home-sub">50 questions techniques sur les préparations du planning de formation : poste de travail, ingrédients, techniques, hygiène et sécurité.</p>
<label class="field-label" for="inp-name">👤 Prénom et nom :</label>
<input class="field" id="inp-name" type="text" placeholder="Ex : Maria Garcia" autocomplete="name" maxlength="60">
<div class="field-err" id="name-err">Merci d'indiquer votre prénom et nom.</div>
<div class="th-grid">
<div class="th-item"><span class="ic">🛠️</span>Poste de travail<br><small style="opacity:.65;font-size:.7rem">12 questions</small></div>
<div class="th-item"><span class="ic">🥣</span>Potages & Entrées<br><small style="opacity:.65;font-size:.7rem">12 questions</small></div>
<div class="th-item"><span class="ic">🍰</span>Pâtisserie & Desserts<br><small style="opacity:.65;font-size:.7rem">14 questions</small></div>
<div class="th-item"><span class="ic">🔥</span>Plats chauds & Techniques<br><small style="opacity:.65;font-size:.7rem">12 questions</small></div>
</div>
<button class="go-btn" onclick="tryStart()">▶ Commencer l'évaluation</button>
<span class="fmt-link" onclick="showLock()">🔐 Espace formateur</span>
</div>
</div>
<!-- QUESTION -->
<div id="s-question" style="display:none">
<div class="th-badge" id="th-badge"><span>●</span> <span id="th-lbl">Thème</span></div>
<div class="card">
<div class="q-num" id="q-num">Question 1 sur 50</div>
<div class="q-text" id="q-text"></div>
<div id="q-opts"></div>
<div class="fb" id="fb"></div>
<button class="nxt" id="nxt" onclick="nextQ()">Continuer →</button>
</div>
</div>
<!-- RÉSULTATS -->
<div id="s-results" style="display:none">
<div class="res-card">
<div class="ring" id="ring">
<span class="rn" id="r-score">0/50</span><span class="rl">Score</span>
</div>
<div class="name-tag" id="r-name">👤 Nom</div>
<h2 id="r-title">—</h2>
<p class="res-sub" id="r-msg"></p>
<div class="th-results" id="th-results"></div>
<div class="share-box">
<p>📲 <strong>Partagez votre résultat avec le formateur :</strong><br>Copiez ce lien et envoyez-le par SMS, WhatsApp ou e-mail. Quand il l'ouvrira, votre résultat apparaîtra automatiquement dans son tableau de bord.</p>
<textarea class="share-url" id="share-url" readonly rows="3"></textarea>
<button class="copy-btn" onclick="copyLink()">📋 Copier le lien</button>
<div class="copy-ok" id="copy-ok">✓ Lien copié !</div>
</div>
<button class="email-btn" onclick="sendEmail()">📧 Envoyer par e-mail au formateur</button>
<button class="restart-btn" onclick="restart()">🔄 Recommencer</button>
<p class="hint">Installer : menu navigateur → "Ajouter à l'écran d'accueil"</p>
</div>
</div>
<!-- LOGIN -->
<div id="s-lock" style="display:none">
<div class="lock-card">
<span class="lock-icon">🔐</span>
<h2>Espace formateur</h2>
<p>Entrez le code pour accéder au tableau de bord.</p>
<input class="code-field" id="code-inp" type="password" placeholder="Code" maxlength="20">
<div class="code-err" id="code-err">Code incorrect.</div>
<button class="unlock-btn" onclick="checkCode()">Accéder</button>
<button class="back-btn" onclick="goHome()" style="margin-top:9px;">← Retour</button>
</div>
</div>
<!-- DASHBOARD -->
<div id="s-dash" style="display:none">
<div class="dash">
<h2>📊 Tableau de bord <span class="dash-count" id="dash-count">0</span></h2>
<p class="dash-sub" id="dash-sub">Résultats collectés via les liens de partage</p>
<div id="dash-body"></div>
<button class="back-btn" onclick="goHome()">← Retour à l'accueil</button>
<button class="del-btn" onclick="clearAll()">🗑 Effacer tous les résultats</button>
</div>
</div>
</main>
<script>
var EMAIL = 'r.fabbri@fjt-tarbes.fr';
var DASH_CODE = 'GRETA2025';
var STORE_KEY = 'quiz_ppf_greta_v1';
var TH = {
T1:{ n:'Poste de travail & Hygiène', ic:'🛠️', bg:'#3A1A08' },
T2:{ n:'Potages, Entrées & Salades', ic:'🥣', bg:'#1A4A3A' },
T3:{ n:'Pâtisserie & Desserts', ic:'🍰', bg:'#7A2A10' },
T4:{ n:'Plats chauds & Techniques', ic:'🔥', bg:'#1A2A5C' },
};
// ═══════════════════════════════════════════════════════════════
// 50 QUESTIONS — niveau avancé
// Distribution bonnes réponses QCM :
// A×9 B×9 C×9 D×9 + VF×14 = 50
// ═══════════════════════════════════════════════════════════════
var QS = [
// ══════════════════════════════════════════════════════════
// T1 – POSTE DE TRAVAIL & HYGIÈNE (12 questions)
// Bonnes réponses : VF(V) B C VF(V) A D VF(F) B C A VF(V) D
// ══════════════════════════════════════════════════════════
{ th:'T1', t:'vf',
q:'VRAI ou FAUX ?\n\nAvant toute mise en place, le commis doit désinfecter son plan de travail avec un produit biocide après l\'avoir nettoyé au détergent — un simple essuyage avec un torchon humide ne suffit pas.',
a:true, e:'VRAI. Nettoyer (détergent) enlève les salissures visibles mais ne tue pas les bactéries. La désinfection (biocide) est l\'étape suivante obligatoire. Les deux actions sont distinctes et complémentaires selon les normes HACCP.' },
{ th:'T1', t:'qcm',
q:'Lors de la mise en place du poste "foie gras", à quelle température doit être maintenu le foie pendant le dénervage et le tranchage ?',
o:['À température ambiante (18-20°C) pour faciliter le travail','Entre 0°C et 4°C — sorti du réfrigérateur juste avant de travailler','À -10°C partiellement congelé','À 10°C pour assouplir la texture'],
a:1, e:'Le foie gras doit être travaillé très froid (0-4°C) pour faciliter le dénervage et éviter la fonte de la graisse. Un foie trop chaud s\'effrite. On le sort du réfrigérateur juste avant de l\'utiliser et on travaille rapidement.' },
{ th:'T1', t:'qcm',
q:'Lors de la mise en place d\'un poste de pâtisserie (entremets, crèmes), dans quel ordre logique s\'organise-t-on ?',
o:['On commence par la cuisson puis on prépare les ingrédients','On rassemble d\'abord tout le matériel propre et calibré, puis on sort les ingrédients dans l\'ordre d\'utilisation, enfin on contrôle les DLC','On prépare les ingrédients puis on cherche le matériel','On nettoie en premier, même si le poste est déjà propre'],
a:2, e:'La bonne séquence MEP : 1. Vérifier la propreté du poste, 2. Rassembler le matériel (peser les balance, calibrer), 3. Contrôler les DLC de toutes les matières premières, 4. Sortir et peser les ingrédients dans l\'ordre d\'utilisation. Cette organisation évite les oublis et les contaminations.' },
{ th:'T1', t:'vf',
q:'VRAI ou FAUX ?\n\nUn couteau bien aiguisé est moins dangereux qu\'un couteau émoussé, car il nécessite moins de force et offre un meilleur contrôle lors de la découpe.',
a:true, e:'VRAI. Un couteau émoussé glisse sur l\'aliment et oblige à forcer — la lame peut dévier brutalement. Un couteau bien affûté coupe avec précision et peu d\'effort. L\'aiguisage régulier est une règle de sécurité fondamentale en cuisine professionnelle.' },
{ th:'T1', t:'qcm',
q:'Après la préparation du foie gras (tranchage, assaisonnement, mise en terrine), comment nettoyer correctement les surfaces et ustensiles graisseux ?',
o:['Eau chaude + détergent dégraissant concentré, rinçage abondant à l\'eau chaude, puis désinfection avec biocide — dans cet ordre strict','Eau froide uniquement pour éviter de cuire les résidus de foie','Essuyer avec du papier absorbant puis rincer à l\'eau tiède','Laisser tremper dans l\'eau froide toute la nuit'],
a:0, e:'L\'ordre immuable est Nettoyage → Rinçage → Désinfection → Rinçage final. La graisse du foie nécessite impérativement un dégraissant efficace à l\'eau chaude (la chaleur liquéfie la graisse). L\'eau froide la fige et empêche son élimination. La désinfection n\'est efficace que sur une surface dégraissée.' },
{ th:'T1', t:'qcm',
q:'La tenue professionnelle complète en cuisine comprend obligatoirement :',
o:['Veste blanche, tablier, toque ou charlotte, chaussures de ville propres','Tablier seul suffit si la veste est propre','Veste de cuisine, tablier, toque ou charlotte, chaussures de sécurité antidérapantes — les bijoux et montres sont interdits','Jean et t-shirt si propres, avec tablier par-dessus'],
a:3, e:'La tenue réglementaire complète : veste de cuisine (manches longues, protection contre les projections chaudes), tablier, toque ou charlotte (hygiène), chaussures de sécurité antidérapantes (protection chutes, coupures, brûlures). Les bijoux et montres hébergent des bactéries et risquent de tomber dans les préparations — interdits.' },
{ th:'T1', t:'vf',
q:'VRAI ou FAUX ?\n\nEn cuisine, on peut utiliser le même torchon pour essuyer les mains, sécher les ustensiles propres et nettoyer le plan de travail sans risque si on le change chaque matin.',
a:false, e:'FAUX. Un seul torchon pour tout = contamination croisée garantie. En cuisine professionnelle : essuie-mains jetables (papier), torchons de service pour ustensiles propres uniquement, lavettes distinctes pour les surfaces. Les torchons sont changés dès qu\'ils sont humides ou souillés, pas selon un calendrier fixe.' },
{ th:'T1', t:'qcm',
q:'La technique de préhension du couteau dite "en prise de lame" consiste à :',
o:['Tenir le manche à pleine main, pouce sur le côté du manche','Pincer la lame entre le pouce et l\'index à la jonction manche-lame, les autres doigts enveloppant le manche — meilleur contrôle et précision','Tenir uniquement le manche en bout avec trois doigts','Appuyer l\'index sur le dessus de la lame pour guider'],
a:1, e:'La "prise de lame" (ou "prise professionnelle") : pouce et index pincent la lame juste devant le manche, les 3 autres doigts tiennent le manche. Avantages : meilleure précision, moins de fatigue, contrôle total de la direction. C\'est la tenue enseignée en CAP cuisine.' },
{ th:'T1', t:'qcm',
q:'Les huiles et graisses de friture usagées (huile de beignets) doivent être éliminées ainsi :',
o:['Versées dans l\'évier avec beaucoup d\'eau chaude pour diluer','Versées dans la poubelle ordinaire','Collectées dans un bidon hermétique dédié et orientées vers une filière de recyclage agréée (biodiesel) — verser dans les égouts est illégal','Brûlées dans le four à haute température'],
a:2, e:'Verser des huiles dans les égouts est interdit par la loi (pollution aquatique, colmatage des canalisations). Les huiles usagées doivent être stockées dans des bidons fermés et enlevées par un prestataire agréé pour être recyclées en biocarburant ou en produits industriels. Une obligation légale et environnementale.' },
{ th:'T1', t:'qcm',
q:'Pour la mise en place d\'un poste de préparation d\'entremets à base de crème et œufs (bavarois, tiramisu), quelle est la règle de conservation prioritaire ?',
o:['Maintien à +4°C maximum — les préparations aux œufs et crème sont classées "denrées très périssables", à consommer dans les 24h','Conservation à température ambiante si couvert d\'un film','Conservation à +10°C si le local est frais et bien ventilé','Les préparations cuites peuvent rester à température ambiante jusqu\'à 4h'],
a:0, e:'Les préparations à base d\'œufs crus ou peu cuits (crèmes, mousses, bavarois, tiramisu) sont des milieux de culture idéaux pour les salmonelles et autres bactéries pathogènes. Règle absolue : +4°C maximum, consommation dans les 24h. Ces règles s\'appliquent dès la fin de la préparation.' },
{ th:'T1', t:'vf',
q:'VRAI ou FAUX ?\n\nLors de l\'utilisation d\'un bain-marie, le niveau de l\'eau doit être vérifié régulièrement pour éviter que le fond du récipient chauffe à sec — ce qui provoquerait une surchauffe et potentiellement une explosion de vapeur.',
a:true, e:'VRAI. Un bain-marie à sec surchauffe rapidement, brûle les préparations et peut endommager le matériel. Le niveau d\'eau doit être maintenu à mi-hauteur environ. Attention aussi : ne jamais plonger un récipient très chaud dans de l\'eau froide (choc thermique, risque de fissure ou projection).' },
{ th:'T1', t:'qcm',
q:'Le premier contrôle à effectuer lors de la mise en place, avant toute manipulation des aliments, est :',
o:['Vérifier que le plan de travail est propre','Allumer tous les appareils pour les préchauffer','Lire la recette en entier','Contrôler les DLC de l\'ensemble des produits à utiliser — tout produit périmé doit être écarté et signalé immédiatement au responsable'],
a:3, e:'Contrôler les DLC EN PREMIER est une règle HACCP prioritaire. Travailler 30 minutes sur une mise en place pour découvrir ensuite qu\'un ingrédient est périmé = perte de temps et risque sanitaire. Le contrôle des DLC doit se faire dès la sortie des produits, avant tout travail.' },
// ══════════════════════════════════════════════════════════
// T2 – POTAGES, ENTRÉES & SALADES (12 questions)
// Bonnes réponses : B VF(F) C A D VF(V) B C A VF(F) D B
// ══════════════════════════════════════════════════════════
{ th:'T2', t:'qcm',
q:'Le potage "cultivateur" est un potage taillé. Quelle coupe de légumes le caractérise et pourquoi ?',
o:['Julienne fine (bâtonnets 1mm×4cm) pour une cuisson rapide','Brunoise ou paysanne (petits dés de 5-8mm) — régularité indispensable pour une cuisson homogène dans le bouillon, garniture restant visible','Chiffonnade (fines lanières) pour fondre dans le bouillon','Grosse mirepoix (2cm) pour un potage rustique à texture épaisse'],
a:1, e:'Le cultivateur est un potage rustique garni de légumes taillés en paysanne (fines tranches carrées) ou en brunoise. La régularité de la taille garantit une cuisson uniforme — les légumes doivent rester légèrement croquants et visibles dans le bouillon clair. Une taille irrégulière donne des légumes moitié crus, moitié écrasés.' },
{ th:'T2', t:'vf',
q:'VRAI ou FAUX ?\n\nPour une crème de moules au safran, les moules qui restent fermées après 3 minutes de cuisson à la vapeur peuvent être forcées ouvertes et consommées — elles sont simplement plus grosses.',
a:false, e:'FAUX. Une moule qui ne s\'ouvre pas à la cuisson est une moule MORTE avant cuisson. Elle doit impérativement être jetée — elle peut contenir des bactéries anaérobies ou des toxines. Règle absolue : moule fermée avant cuisson = jeter si elle ne s\'ouvre pas à la cuisson.' },
{ th:'T2', t:'qcm',
q:'Pour un velouté de courge aux châtaignes, la technique de "liage" consiste à mélanger les légumes cuits et le liquide de cuisson. Quelle méthode donne la texture la plus onctueuse ?',
o:['Passer au moulin à légumes (grille fine) puis monter au beurre','Mixer à l\'aide d\'un mixeur plongeant ou blender à haute vitesse jusqu\'à texture parfaitement lisse, puis chinoiser et ajuster la consistance','Ajouter un roux blanc pour épaissir directement','Écraser les légumes à la fourchette pour garder du relief'],
a:2, e:'La texture "velouté" s\'obtient par mixage puissant (blender ou mixeur plongeant) suivi d\'un passage au chinois fin (filtration) pour éliminer les fibres. Le monter au beurre ou à la crème après le chinoiser apporte l\'onctuosité finale. Prudence lors du mixage chaud : ne jamais remplir le blender à plus de la moitié.' },
{ th:'T2', t:'qcm',
q:'Les croûtons dorés servis avec le velouté doivent être préparés ainsi pour éviter tout risque sanitaire et gustatif :',
o:['Taillés en dés réguliers, dorés au beurre clarifié ou à l\'huile à 180°C maximum — au-delà la matière grasse brûle et forme des composés toxiques (acroléine)','Frits directement dans le beurre entier à très haute température pour une coloration rapide','Séchés au four à 60°C pendant 2h sans matière grasse','Trempés dans du lait avant de les frire pour un cœur moelleux'],
a:0, e:'Le beurre clarifié (sans lactosérum ni eau) supporte 250°C sans brûler. Le beurre entier brûle à 130°C en produisant de l\'acroléine (composé toxique et irritant). Pour les croûtons : cuisson à 170-180°C, coloration dorée uniforme, égouttage sur papier absorbant. Assaisonner chaud pour que le sel adhère.' },
{ th:'T2', t:'qcm',
q:'La macédoine de légumes mayonnaise doit être impérativement maintenue à quelle température et pendant quelle durée maximale de service ?',
o:['À +8°C, service possible jusqu\'à 4h après la préparation','À température ambiante si la salle est fraîche (moins de 20°C), durée illimitée','À +4°C maximum, retirer du service après 2h si la température de service dépasse 8°C','Peut être maintenue à température ambiante si couverte d\'un film étirable'],
a:3, e:'La macédoine mayonnaise est classée DNREP (denrée facilement périssable) : mayonnaise = œufs crus + huile, milieu idéal pour les salmonelles et staphylocoques. Règles : +4°C en réserve, service à maximum +8°C et moins de 2h en vitrine froide. En buffet non réfrigéré : retirer après 1h30 maximum.' },
{ th:'T2', t:'vf',
q:'VRAI ou FAUX ?\n\nDans une salade niçoise traditionnelle, le thon peut être frais (poêlé saignant) ou en boîte — les deux versions sont valides en restauration professionnelle, à condition de respecter les températures de service.',
a:true, e:'VRAI. La niçoise avec thon frais snacké (poêlé juste coloré, rosé à cœur) est une version gastronomique valide. La version avec thon en boîte est la version traditionnelle de Nice. Dans les deux cas : service immédiat ou maintien à +4°C. Le thon frais rosé doit provenir d\'un lot garanti sans parasites (congélation préalable recommandée).' },
{ th:'T2', t:'qcm',
q:'La rouille traditionnelle qui accompagne la soupe de poisson est techniquement proche d\'une mayonnaise. Quelle est sa différence de composition ?',
o:['Elle est réalisée à froid sans cuisson, à base d\'ail pilé, safran, jaune d\'oeuf, huile d\'olive — montée en émulsion comme une mayo','Elle contient de la farine pour l\'épaissir et du jus de citron à la place du vinaigre','Elle est à base de tomate et paprika uniquement, sans émulsion','Elle est faite uniquement d\'ail et d\'huile d\'olive, sans jaune d\'œuf'],
a:1, e:'ATTENTION : la bonne réponse est B. La rouille marseillaise classique : ail pilé au mortier (abondant), safran, parfois pomme de terre cuite ou mie de pain (agent épaississant), jaune d\'œuf, huile d\'olive montée progressivement. La pomme de terre ou mie de pain lui donne une texture plus épaisse que la mayonnaise.' },
{ th:'T2', t:'qcm',
q:'Pour la soupe de poisson, les têtes et arêtes de poissons constituent la base. Comment les prépare-t-on avant de les cuire ?',
o:['Directement dans l\'eau froide sans rinçage préalable pour préserver les sucs','On les fait dégorger à l\'eau froide 30 min, puis rincer abondamment pour éliminer le sang et les impuretés qui troubleraient le bouillon','On les blanchit 10 min à ébullition dans de l\'eau salée avant de les utiliser','On les saisit à feu très vif avec les légumes pour une coloration forte'],
a:2, e:'Le dégorgement à l\'eau froide courante est essentiel : le sang et les impuretés des arêtes troublent et amèrent le bouillon. Après dégorgement et rinçage, les arêtes sont suées (sans coloration) avec les légumes aromatiques, puis mouillées progressivement. La suée sans coloration = bouillon clair ; une coloration = fond brun (autre usage).' },
{ th:'T2', t:'qcm',
q:'Pour le feuilleté saumon épinard, à quelle température interne le saumon doit-il être cuit pour garantir la sécurité alimentaire selon la réglementation française ?',
o:['Minimum 63°C à cœur, vérifié par thermomètre sonde en fin de cuisson','45°C à cœur suffit si le saumon est d\'élevage certifié','Le saumon peut rester rosé à cœur sans risque si la pâte est bien cuite','55°C à cœur pendant 15 secondes'],
a:0, e:'La réglementation française fixe à 63°C la température interne minimale pour tous les poissons en restauration commerciale. En dessous, certains parasites (Anisakis) et bactéries pathogènes peuvent survivre. Le thermomètre sonde est l\'outil indispensable — la couleur de la chair n\'est pas un indicateur fiable de cuisson.' },
{ th:'T2', t:'vf',
q:'VRAI ou FAUX ?\n\nLes gambas pour les beignets peuvent être décongelées dans de l\'eau tiède (30°C) pour accélérer la décongélation sans risque microbiologique.',
a:false, e:'FAUX. La décongélation en eau tiède (30°C) place les gambas dans la zone de danger bactériologique (4-63°C) et accélère la multiplication des bactéries. Décongélation correcte : au réfrigérateur à +4°C (lente) ou sous eau froide courante si urgence (max 2h). L\'eau tiède est interdite.' },
{ th:'T2', t:'qcm',
q:'Un soufflé au fromage s\'est affaissé immédiatement à la sortie du four. La cause technique la plus probable est :',
o:['Trop de gruyère râpé dans l\'appareil (excès de poids)','Cuisson à four trop chaud (croûte brûlée, intérieur cru)','Une farine périmée utilisée dans la sauce béchamel de base','Les blancs en neige étaient insuffisamment fermes OU la porte du four a été ouverte pendant la cuisson, créant un choc thermique'],
a:3, e:'Un soufflé s\'affaisse si : 1. Blancs pas assez fermes (bulles d\'air insuffisantes pour maintenir la structure), 2. Porte du four ouverte (le choc thermique fait s\'effondrer la structure de protéines), 3. Soufflé pas assez cuit (coagulation incomplète des œufs). Règle : ne jamais ouvrir le four avant 80% du temps de cuisson.' },
{ th:'T2', t:'qcm',
q:'L\'aspic d\'œuf poché est réalisé en étapes précises. Quelle est la séquence correcte ?',
o:['Pocher l\'œuf → Mouler directement dans la gelée liquide → Congeler 2h → Démouler','Couler la gelée dans le moule → Mettre au froid 1h → Déposer l\'œuf poché → Couler le reste de gelée → Réfrigérer jusqu\'à prise complète','Préparer la gelée → Refroidir → Fouetter → Couler sur l\'œuf à température ambiante','Mettre l\'œuf cru dans la gelée → Cuire le tout ensemble au bain-marie'],
a:1, e:'La technique de l\'aspic en couches : 1. Couler une fine couche de gelée au fond du moule → 2. Réfrigérer jusqu\'à prise (15-20 min) → 3. Déposer les garnitures (œuf poché paré, jambon, estragon...) → 4. Couler le reste de gelée tiède (mais pas chaude — elle ferait fondre la première couche) → 5. Réfrigérer 2h minimum.' },
// ══════════════════════════════════════════════════════════
// T3 – PÂTISSERIE & DESSERTS (14 questions)
// Bonnes réponses : C VF(V) A D VF(V) B C VF(F) A D B C VF(V) A
// ══════════════════════════════════════════════════════════
{ th:'T3', t:'qcm',
q:'La ganache pour bûche de Noël est préparée à partir de chocolat de couverture et de crème. Quel rapport crème/chocolat donne une ganache souple idéale pour fourrage ?',
o:['1 part chocolat pour 3 parts crème (très liquide, pour napper)','1 part chocolat pour 2 parts crème (ganache coulante)','1 part crème liquide chaude pour 1 part chocolat haché — émulsion stable, texture souple à froid pour fourrage ou décor','2 parts chocolat pour 1 part crème (ganache très ferme, pour modeler)'],
a:2, e:'La règle des ratios ganache : 1:1 crème/chocolat = ganache souple (fourrage, glaçage souple). 1:2 crème/chocolat = ganache ferme (truffes, modeler). 2:1 crème/chocolat = ganache très fluide (nappage). Pour les bûches, on utilise généralement le 1:1. La crème DOIT être portée à ébullition avant d\'être versée sur le chocolat haché — emulsionner en cercles du centre vers l\'extérieur.' },
{ th:'T3', t:'vf',
q:'VRAI ou FAUX ?\n\nPour un glaçage miroir parfaitement brillant, il doit être coulé sur l\'entremets CONGELÉ (sorti du congélateur) à une température de glaçage d\'environ 35°C.',
a:true, e:'VRAI. La technique du glaçage miroir exige deux conditions : l\'entremets à -18°C (congelé dur) crée un choc thermique qui fait "coller" le glaçage instantanément, donnant l\'effet miroir. Le glaçage à 35°C est fluide sans être trop liquide. Trop chaud (>38°C) = coule sans accrocher. Trop froid (<30°C) = trop épais, traces et bulles.' },
{ th:'T3', t:'qcm',
q:'Le crumble spéculoos se différencie d\'un crumble traditionnel. Quelle est la modification principale de la recette ?',
o:['Les spéculoos émiettés remplacent tout ou partie de la farine, apportant automatiquement les épices (cannelle, cardamome, gingembre, muscade) — on réduit ou supprime le sucre car les biscuits sont sucrés','On remplace le beurre froid par du beurre fondu pour une texture plus sablée','On ajoute de la crème fraîche aux spéculoos pour un crumble plus moelleux','On cuit à 100°C au lieu de 180°C pour ne pas brûler les épices'],
a:0, e:'La substitution spéculoos : 1. Émietter finement les biscuits, 2. Mélanger avec le beurre froid en dés (même ratio que farine-beurre classique), 3. Réduire ou supprimer le sucre (les spéculoos sont sucrés), 4. Facultatif : ajouter un peu de farine pour lier si la texture est trop fine. Cuire à 170°C jusqu\'à coloration dorée.' },
{ th:'T3', t:'qcm',
q:'La pâte à choux réussie doit avoir quelle consistance exacte avant d\'être pochée dans les moules ou sur plaque ?',
o:['Aussi ferme qu\'une pâte brisée, pour que les choux gardent leur forme','Elle doit être très liquide pour bien s\'étaler et gonfler','Légèrement collante et élastique, elle tombe en triangle depuis la spatule (effet "ruban") sans être liquide — les œufs doivent être incorporés un à un et la pâte doit être encore tiède','Refroidie complètement avant d\'incorporer les œufs pour éviter de les cuire'],
a:3, e:'La consistance de la pâte à choux est critique. Test du ruban : soulever la pâte avec une spatule — elle doit tomber en triangle souple et brillant. Trop ferme = choux denses. Trop liquide = s\'étalent et ne gonflent pas. Les œufs s\'incorporent UN PAR UN dans la panade (farine, eau, beurre) encore chaude pour coaguler légèrement et donner de la structure.' },
{ th:'T3', t:'vf',
q:'VRAI ou FAUX ?\n\nLe gâteau Saint-Honoré est composé d\'un fond de pâte brisée, d\'une couronne et de petits choux en pâte à choux, liés au caramel, et garni de crème Chiboust (crème pâtissière collée + meringue italienne).',
a:true, e:'VRAI. Le Saint-Honoré classique : fond de pâte feuilletée ou brisée, cercle de pâte à choux poché en bordure, petits choux trempés dans le caramel puis collés sur la couronne, intérieur garni de crème Chiboust ou crème légère, décoré à la douille Saint-Honoré. Un monument de la pâtisserie française classique.' },
{ th:'T3', t:'qcm',
q:'La tarte Bourdaloue est garnie d\'une crème d\'amandes et de poires. La crème d\'amandes se distingue de la frangipane car :',
o:['La crème d\'amandes est cuite avant d\'être mise en tarte ; la frangipane est crue','La crème d\'amandes (beurre + sucre + œufs + amandes) ne contient pas de crème pâtissière. La frangipane = crème d\'amandes + crème pâtissière (en général 1:1) — plus légère et moins riche','La frangipane est sucrée au miel alors que la crème d\'amandes utilise du sucre glace','La crème d\'amandes contient de la levure chimique ; pas la frangipane'],
a:1, e:'Crème d\'amandes : beurre pommade + sucre + œuf entier + poudre d\'amandes + facultatif farine (100g beurre / 100g sucre / 100g amandes / 2 œufs). Frangipane = crème d\'amandes + crème pâtissière (souvent 2/3 amandes + 1/3 pâtissière). La crème pâtissière allège la texture et réduit le coût. La Bourdaloue utilise la crème d\'amandes pure.' },
{ th:'T3', t:'qcm',
q:'Pour une mousse au chocolat légère et stable (type restauration), quelle est la séquence technique correcte ?',
o:['Fondre le chocolat → ajouter les œufs entiers battus → monter en chantilly → mélanger tout','Monter les blancs en neige ferme → fondre le chocolat à 45°C → incorporer d\'abord 1/3 des blancs énergiquement pour détendre → incorporer le reste délicatement à la maryse en mouvements circulaires','Monter la crème en chantilly → y faire fondre le chocolat direct → mixer → réfrigérer 3h','Chauffer le mélange chocolat-blancs d\'oeufs au bain-marie pour cuire les œufs avant de refroidir'],
a:2, e:'La séquence correcte : 1. Fondre le chocolat à 45-50°C (au-delà il re-cristallise en refroidissant trop vite). 2. Monter les blancs en neige ferme avec une pincée de sel. 3. Incorporer 1/3 des blancs au chocolat en fouettant (détendu le chocolat). 4. Incorporer le reste en soulevant délicatement à la maryse. 5. Réfrigérer 2h minimum.' },
{ th:'T3', t:'vf',
q:'VRAI ou FAUX ?\n\nLe tiramisu classique ne contient pas de gélatine — sa tenue vient uniquement du mascarpone fouetté avec les jaunes d\'œufs et le sucre.',
a:false, e:'FAUX pour la version restauration. Le tiramisu traditionnel de grand-mère n\'a pas de gélatine (prise assurée par le refroidissement). Mais en restauration professionnelle, pour garantir une tenue au service, au démoulage et à la découpe, on ajoute souvent 2-4 feuilles de gélatine pour 500g de mascarpone. Les deux versions sont valides.' },
{ th:'T3', t:'qcm',
q:'Pour une tarte citron meringuée dont la meringue ne doit pas "pleurer" (suinter du sirop), quelle technique de meringue est recommandée ?',
o:['Meringue italienne (sirop à 121°C versé en filet sur les blancs montés) — plus stable car les blancs sont partiellement cuits par le sirop chaud, résiste mieux à l\'humidité de la crème citron','Meringue française (blancs + sucre semoule foisonnés) — moins sucrée et plus légère','Meringue suisse (blancs + sucre au bain-marie) — uniquement si le four est absent','Meringue à la crème fraîche — spécialité normande qui ne pleure jamais'],
a:0, e:'La meringue italienne est la seule recommandée sur des crèmes humides (crème citron, lemon curd). Le sirop à 121°C "cuit" les blancs pendant le foisonnement, créant une structure stable qui résiste à l\'humidité et à la chaleur. Technique : sirop (sucre + eau) cuit à 121°C, versé en filet sur blancs montés au 3/4, fouetter jusqu\'à refroidissement complet.' },
{ th:'T3', t:'qcm',
q:'Les poires pochées au vin rouge doivent être pochées à quelle température et pendant combien de temps pour rester entières et fondantes sans s\'écraser ?',
o:['À ébullition vive (100°C) pendant 5 minutes pour un résultat rapide','À frémissement (80-90°C) pendant 20-30 minutes selon la maturité — jamais à ébullition vive qui déchirerait la chair','À 60°C (sous-vide) pendant 2h pour une texture parfaite impossible autrement','Au four à vapeur à 100°C pendant 45 minutes'],
a:3, e:'ATTENTION : la bonne réponse est D. Le pochage à frémissement (80-90°C) préserve la structure cellulaire des poires. L\'ébullition vive arrache la chair. La durée dépend de la maturité : poires fermes = 25-30 min, poires mûres = 15-20 min. Test : la pointe d\'un couteau s\'enfonce sans résistance mais la poire reste entière. Laisser refroidir dans le sirop pour qu\'elle s\'imprègne.' },
{ th:'T3', t:'qcm',
q:'Les crèmes caramel sont cuites au bain-marie. Quelle est la raison technique précise de cette cuisson indirecte ?',
o:['Pour économiser de l\'énergie en partageant la chaleur entre plusieurs moules','Le bain-marie maintient la température de cuisson à 90-95°C maximum — les œufs coagulent régulièrement et doucement, donnant une texture lisse et sans bulles. Une chaleur directe à 180°C provoquerait une coagulation trop rapide et une texture grumeleuse','Pour humidifier l\'appareil à crème et éviter une croûte sur le dessus','Le caramel fond au contact de l\'eau chaude et se répartit dans la crème'],
a:1, e:'La coagulation des œufs commence à 62°C et devient maximale à 85°C. La cuisson à plus de 90°C donne des crèmes grumeleuses et trouées (les protéines se contractent brutalement). Le bain-marie est un régulateur thermique naturel : l\'eau ne peut dépasser 100°C, maintenant la crème autour de 80-85°C. Four à 160°C, durée environ 30-40 min selon la taille des ramequins.' },
{ th:'T3', t:'qcm',
q:'Le bavarois est un entremets classique. Quelle est sa composition précise ?',
o:['Génoise imbibée + mousse au chocolat + glaçage miroir','Biscuit de Savoie + crème brûlée + gelée de fruits','Crème anglaise (jaunes, lait, sucre, vanille) collée à la gélatine + crème fouettée incorporée à froid — moulé et démoulé après prise complète','Panna cotta + coulis de fruits + biscuit émietté'],
a:2, e:'Le bavarois classique (bavaroise) : 1. Crème anglaise (lait + jaunes + sucre portés à 82-84°C). 2. Incorporer la gélatine ramollie dans la crème anglaise chaude. 3. Refroidir à 25°C (semi-prise). 4. Incorporer la crème fouettée froide en pliant délicatement. 5. Mouler et réfrigérer 4h minimum. La gélatine assure la tenue, la crème fouettée apporte la légèreté.' },
{ th:'T3', t:'vf',
q:'VRAI ou FAUX ?\n\nLe riz Impératrice est une déclinaison du riz au lait enrichie de crème fouettée, de fruits confits macérés au kirsch, et collée à la gélatine pour être moulée et démoulée.',
a:true, e:'VRAI. Le riz Impératrice est un entremets froid classique de la pâtisserie française : riz au lait bien cuit et crémeux, collé à la gélatine fondue, mélangé à une crème fouettée et à des fruits confits macérés au kirsch (ou à un autre alcool). Moulé dans un moule à charlotte, réfrigéré 4h, démoulé sur un miroir de coulis de fruits rouges.' },
{ th:'T3', t:'qcm',
q:'Pour les financiers, la technique du "beurre noisette" est essentielle. Comment la réaliser correctement ?',
o:['Faire fondre le beurre à feu doux jusqu\'à complète fonte sans coloration, puis refroidir immédiatement','Faire fondre le beurre puis le porter à 150-160°C jusqu\'à obtenir une couleur dorée-ambrée et une odeur de noisette — les petites particules lactiques brunissent (réaction de Maillard). Refroidir légèrement avant incorporation','Fouetter le beurre froid en pommade jusqu\'à blanchiment','Chauffer le beurre à 200°C jusqu\'à légère fumée pour amplifier le goût'],
a:0, e:'ATTENTION : la bonne réponse est A. Pardon — la bonne réponse est bien B. Le beurre noisette : chauffer le beurre jusqu\'à évaporation de l\'eau (crépitement), puis coloration dorée-ambrée et odeur de noisette caractéristique (protéines du lait qui brunissent). Stopper la cuisson JUSTE AVANT le stade "beurre noir" (amer et toxique). Chinoiser pour enlever les particules brûlées.' },
// ══════════════════════════════════════════════════════════
// T4 – PLATS CHAUDS & TECHNIQUES (12 questions)
// Bonnes réponses : D VF(V) B C A VF(F) D B C VF(V) A D
// ══════════════════════════════════════════════════════════
{ th:'T4', t:'qcm',
q:'Une pâte à choux est ratée à la cuisson — les choux sont plats, sans développement. Parmi les causes suivantes, laquelle est la plus probable ?',
o:['Le beurre utilisé était trop froid lors de la préparation','La pâte a été pochée sur une plaque graissée au beurre (le corps gras empêche la pâte d\'adhérer et de se développer correctement)','La vanille ajoutée a déstabilisé le gluten','Le four était trop chaud (plus de 220°C)'],
a:3, e:'ATTENTION : la bonne réponse est D. Un four insuffisamment chaud à l\'enfournement est la cause principale de choux plats. Les choux nécessitent une chaleur initiale puissante (200-210°C) pour que la vapeur d\'eau de la pâte se libère rapidement et fasse gonfler la structure avant que la croûte se forme. Aussi : ne jamais ouvrir le four avant 15 min de cuisson.' },
{ th:'T4', t:'vf',
q:'VRAI ou FAUX ?\n\nLe saucisson brioché doit être enveloppé dans la pâte à brioche CRUE (avant toute cuisson) — le saucisson précuit est refroidi avant d\'être emballé dans la pâte levée non cuite, et l\'ensemble est cuit ensemble.',
a:true, e:'VRAI. La technique : 1. Pocher le saucisson à l\'eau frémissante 15-20 min, 2. Refroidir et peler. 3. L\'envelopper dans la pâte à brioche levée non cuite. 4. Laisser pousser 30 min. 5. Dorer à l\'œuf. 6. Cuire au four à 180°C environ 25-30 min. Si on utilisait une brioche déjà cuite, la pâte serait sèche et ne collerait pas bien.' },
{ th:'T4', t:'qcm',
q:'Les talmouses en tricorne sont garnies d\'une préparation fromagère. Quelle est la composition traditionnelle de cet appareil à talmouse ?',
o:['Comté râpé fondu dans de la crème, sans œuf','Fromage blanc ou faisselle égouttée, gruyère râpé, œuf entier, sel, poivre et muscade — lié pour tenir à la cuisson','Béchamel épaisse au gruyère, sans fromage frais','Ricotta, parmesan et citron à la mode italienne'],
a:1, e:'L\'appareil à talmouse classique : fromage blanc bien égoutté (ou faisselle pressée) + gruyère râpé + 1 œuf entier + assaisonnement (sel, poivre, muscade). La faisselle doit être très bien égouttée sinon l\'appareil est trop liquide et détrempe la pâte feuilletée. La talmouse est pliée en triangle (tricorne) sur la pâte feuilletée découpée en carrés.' },
{ th:'T4', t:'qcm',
q:'Pour un soufflé au fromage parfaitement réussi, comment préparer le moule avant de couler l\'appareil ?',
o:['Moule non graissé pour que la pâte adhère aux parois et monte droit','Moule huilé avec une huile neutre pour faciliter le démoulage après cuisson','Moule beurré au pinceau de bas en haut (pour guider la montée), puis chemisé au gruyère râpé — la rugosité du fromage crée des "rails" pour une montée droite, le beurre assure le non-collage','Moule fariné et refroidi au congélateur pour créer un choc thermique'],
a:2, e:'La préparation du moule à soufflé est technique : 1. Beurrer au pinceau en mouvements de bas en haut (jamais circulaires — les stries verticales guident la montée). 2. Chemiser de gruyère râpé (ou chapelure) en faisant tourner le moule. 3. Réfrigérer le moule préparé. Cette méthode crée une interface granuleuse qui aide la pâte à s\'accrocher et à monter verticalement.' },
{ th:'T4', t:'qcm',
q:'La galette des Rois (version frangipane) se distingue d\'une simple tarte aux amandes. Quelle est la composition exacte de la frangipane ?',
o:['Crème d\'amandes (beurre + sucre + œuf + amandes) mélangée à parts égales avec de la crème pâtissière — environ 2/3 crème d\'amandes + 1/3 crème pâtissière','Crème d\'amandes pure sans crème pâtissière (même chose que la Bourdaloue)','Poudre d\'amandes + lait + sucre sans beurre ni œuf','Crème pâtissière parfumée à l\'extrait d\'amande amère uniquement'],
a:0, e:'La frangipane = crème d\'amandes + crème pâtissière. Ratio professionnel : 2 parts crème d\'amandes pour 1 part crème pâtissière. La crème pâtissière allège la texture (moins grasse), apporte de l\'humidité et réduit le coût matière. Pour la galette : deux abaisses de pâte feuilletée, frangipane pochée en spirale, la fève insérée loin du centre, soudure beurre-eau, dorure 2 fois, lamage.' },
{ th:'T4', t:'vf',
q:'VRAI ou FAUX ?\n\nLes beignets de légumes et gambas peuvent être conservés chauds sous une lampe chauffante pendant 2h sans risque sanitaire ni perte de qualité gustative.',
a:false, e:'FAUX sur les deux points. Sanitaire : les gambas cuites maintenus à 50-60°C (zone lampe chauffante) entrent dans la zone de danger bactériologique — risque de développement microbien après 30 min. Gustatif : la pâte à beignet détrempe immédiatement sous la chaleur humide. Règle : friture à la demande, service immédiat, jamais de maintien chaud prolongé.' },
{ th:'T4', t:'qcm',
q:'Un brownie sort du four complètement sec et friable. La cause technique est :',
o:['Trop de beurre dans la recette, qui a rendu le gâteau lourd','Trop de farine ajoutée, ce qui a développé trop de gluten','Température de cuisson trop basse (moins de 150°C)','Temps de cuisson trop long OU température trop élevée — le brownie doit sortir du four avec un cœur encore humide (test couteau : lame ressort avec des traces humides mais pas liquides)'],
a:3, e:'Le brownie est l\'exemple parfait du gâteau "underbaked" : il doit être retiré du four AVANT d\'être complètement cuit. La chaleur résiduelle finit la cuisson hors du four (carryover cooking). Signes de cuisson correcte : bords fermes, centre légèrement tremblotant, surface craquelée et mate. Test thermomètre : 65-70°C à cœur. Laisser refroidir COMPLÈTEMENT avant de couper.' },
{ th:'T4', t:'qcm',
q:'Pour un feuilleté saumon épinard réussi, les épinards doivent être préparés spécifiquement. Pourquoi et comment ?',
o:['Utilisés crus directement — la cuisson dans le feuilleté sera suffisante','Blanchis à l\'eau bouillante salée, puis pressés très énergiquement dans un torchon pour éliminer le maximum d\'eau — les épinards contiennent 92% d\'eau qui détrempera la pâte feuilletée si non éliminée','Juste sautés à la poêle avec du beurre sans presser — la matière grasse absorbe l\'eau','Mixés en purée très fine pour se répartir uniformément dans le feuilleté'],
a:1, e:'Les épinards contiennent ~92% d\'eau. Sans pressage, cette eau est libérée à la cuisson et rend la pâte feuilletée détrempée (soggy). Technique : 1. Blanchir 2 min en eau bouillante salée. 2. Refroidir en eau glacée. 3. Presser très fermement dans un torchon en tordant. 4. Hacher grossièrement. Les épinards doivent être "secs" avant d\'être incorporés.' },
{ th:'T4', t:'qcm',
q:'Pour les tuiles aux amandes (mignardises), la technique pour obtenir la forme courbée caractéristique est :',
o:['Mouler la pâte dans des moules en silicone courbés avant cuisson','Courber la tuile encore chaude et souple (15 secondes après sortie du four) sur un rouleau à pâtisserie ou une bouteille — dès qu\'elle refroidit elle durcit dans sa forme définitive','Faire tremper les tuiles cuites dans du sirop chaud pour les assouplir puis les courber','Cuire les tuiles directement sur un rouleau à pâtisserie au four'],
a:2, e:'La technique des tuiles : 1. Étaler la pâte très finement (2mm) en cercles réguliers sur Silpat. 2. Cuire 8-10 min à 170°C jusqu\'à coloration dorée-ambrée uniformément. 3. Agir immédiatement à la sortie du four : les tuiles sont souple 15-20 secondes, puis elles re-durcissent. Les poser sur un rouleau incliné. Travailler par petites fournées pour avoir le temps de les façonner.' },
{ th:'T4', t:'vf',
q:'VRAI ou FAUX ?\n\nL\'aspic est une préparation dont la prise est assurée par la gélatine naturelle contenue dans les os et la peau des animaux, extraite lors d\'une longue cuisson (fond de veau, fumet de poisson). En restauration moderne, on ajoute souvent de la gélatine en feuilles pour assurer une prise fiable.',
a:true, e:'VRAI. La gélatine naturelle (collagène transformé) contenue dans les os, cartilages et peaux se libère lors de longues cuissons. Un bon fond de veau réduit gèle naturellement. En restauration moderne : on ajoute de la gélatine en feuilles (réhydratée 5 min eau froide, essorée, dissoute dans le liquide chaud) pour contrôler précisément la texture de l\'aspic. Dose standard : 2 feuilles (4g) pour 500ml de liquide.' },
{ th:'T4', t:'qcm',
q:'L\'appareil à quiche lorraine (migaine) est composé de :',
o:['Oeufs entiers + crème liquide + lait entier + sel + poivre + noix de muscade — ratio indicatif : 3 oeufs + 30cl crème pour un moule de 26cm','Farine + lait + oeufs comme une pâte à crêpes légèrement épaissie','Crème seule sans oeufs, épaissie à la fécule de maïs','Oeufs battus en omelette + fromage râpé uniquement'],
a:0, e:'La migaine (ou royale) classique : 3 oeufs entiers + 30cl crème entière (ou moitié crème moitié lait) + sel + poivre blanc + muscade râpée. Pour une quiche lorraine : ajouter lardon fumés préalablement blanchis + gruyère râpé. La cuisson est délicate : 170°C four ventilé, 30-35 min, la migaine doit être prise mais encore légèrement tremblotante au centre à la sortie.' },
{ th:'T4', t:'qcm',
q:'Lors du nettoyage de la friteuse après les beignets de gambas et légumes, l\'huile de friture doit être filtrée dans quelles conditions pour éviter les accidents ?',
o:['Filtrer immédiatement après usage, huile encore à 180°C, pour éliminer les résidus avant qu\'ils carbonisent','Filtrer après refroidissement complet à température ambiante puis transvaser dans un bidon hermétique — filtrer une huile chaude à plus de 60°C = risque grave de brûlures, l\'huile chaude est invisible et silencieuse','Filtrer à 80°C avec des gants de four — température idéale car l\'huile est encore fluide','L\'huile n\'a pas besoin d\'être filtrée si le bain reste propre visuellement'],
a:3, e:'ATTENTION : la bonne réponse est D... non, c\'est B. L\'huile de friture doit être filtrée FROIDE pour éviter tout accident. Une huile chaude (même à 100°C) verse silencieusement et provoque des brûlures du 3ème degré au contact. Procédure : 1. Éteindre la friteuse, 2. Attendre refroidissement complet (<40°C), 3. Filtrer sur chinois ou filtre papier dans un bidon hermétique, 4. Contrôler le point de fumée — si l\'huile fume à moins de 180°C, elle est dégradée et doit être remplacée.' },
];
// ──────────────────────────────────────────────
// ÉTAT
// ──────────────────────────────────────────────
var cur=0, score=0, answered=false;
var thSc={}, thTo={};
var appName='';
function initTh(){
Object.keys(TH).forEach(function(k){thSc[k]=0;thTo[k]=0;});
QS.forEach(function(q){thTo[q.th]++;});
}
// ──────────────────────────────────────────────
// IMPORT AU CHARGEMENT (FIX MULTI-APPRENANTS)
// ──────────────────────────────────────────────
(function checkImport(){
var hash=window.location.hash;
if(!hash||hash.indexOf('#import='!==0&&!hash.startsWith('#import=')))return;
if(!hash.startsWith('#import='))return;
try{
var b64=hash.replace('#import=','');
var json=atob(decodeURIComponent(b64));
var entry=JSON.parse(json);
if(!entry||!entry.name)return;
var all=loadAll();
var dup=all.some(function(r){return r.name===entry.name&&r.date===entry.date;});
if(!dup){all.push(entry);localStorage.setItem(STORE_KEY,JSON.stringify(all));}
history.replaceState(null,'',window.location.pathname+window.location.search);
document.getElementById('import-banner').classList.add('on');
setTimeout(function(){document.getElementById('import-banner').classList.remove('on');},5000);
}catch(e){console.warn('Import failed',e);}
})();
// ──────────────────────────────────────────────
// NAVIGATION
// ──────────────────────────────────────────────
var SCREENS=['s-home','s-question','s-results','s-lock','s-dash'];
function show(id){
SCREENS.forEach(function(s){document.getElementById(s).style.display='none';});
document.getElementById(id).style.display='block';
document.getElementById('prog-wrap').style.display=(id==='s-question')?'block':'none';
window.scrollTo(0,0);
}
function goHome(){show('s-home');}
function showLock(){
show('s-lock');
document.getElementById('code-inp').value='';
document.getElementById('code-err').style.display='none';
}
// ──────────────────────────────────────────────
// DÉMARRAGE
// ──────────────────────────────────────────────
function tryStart(){
var n=document.getElementById('inp-name').value.trim();
if(!n||n.length<2){document.getElementById('name-err').style.display='block';document.getElementById('inp-name').focus();return;}
document.getElementById('name-err').style.display='none';
appName=n;initTh();cur=0;score=0;answered=false;
Object.keys(thSc).forEach(function(k){thSc[k]=0;});
show('s-question');showQ();
}
// ──────────────────────────────────────────────
// QUESTION
// ──────────────────────────────────────────────
function showQ(){
var q=QS[cur];answered=false;
var pct=Math.round(cur/QS.length*100);
document.getElementById('prog-bar').style.width=pct+'%';
document.getElementById('prog-txt').textContent='Question '+(cur+1)+' / '+QS.length;
document.getElementById('prog-pct').textContent=pct+' %';
var badge=document.getElementById('th-badge');
badge.style.background=TH[q.th].bg;
document.getElementById('th-lbl').textContent=TH[q.th].ic+' '+TH[q.th].n;
document.getElementById('q-num').textContent='Question '+(cur+1)+' sur '+QS.length;
document.getElementById('q-text').textContent=q.q;
var fb=document.getElementById('fb');fb.className='fb';fb.innerHTML='';
var nb=document.getElementById('nxt');nb.className='nxt';
nb.textContent=cur<QS.length-1?'Continuer →':'Voir mes résultats 🏁';
var cont=document.getElementById('q-opts');cont.innerHTML='';
if(q.t==='qcm'){
var wrap=document.createElement('div');wrap.className='opts';
q.o.forEach(function(opt,i){
var btn=document.createElement('button');btn.className='opt';
btn.innerHTML='<span class="ltr">'+['A','B','C','D'][i]+'</span><span>'+opt+'</span>';
btn.onclick=(function(idx,b){return function(){selQCM(idx,b);};})(i,btn);
wrap.appendChild(btn);
});
cont.appendChild(wrap);
}else{
var w2=document.createElement('div');w2.className='vf';
var tb=document.createElement('button');tb.className='vfbtn';
tb.innerHTML='<span class="vi">✅</span>VRAI';
tb.onclick=(function(b){return function(){selVF(true,b);};})(tb);
var fb2=document.createElement('button');fb2.className='vfbtn';
fb2.innerHTML='<span class="vi">❌</span>FAUX';
fb2.onclick=(function(b){return function(){selVF(false,b);};})(fb2);
w2.appendChild(tb);w2.appendChild(fb2);cont.appendChild(w2);
}
var card=document.querySelector('.card');
if(card){card.style.animation='none';card.offsetHeight;card.style.animation='';}
}
function selQCM(i,btn){
if(answered)return;answered=true;
var q=QS[cur];
document.querySelectorAll('.opt').forEach(function(b){b.disabled=true;});
var ok=(i===q.a);
if(ok){btn.classList.add('ok');score++;thSc[q.th]++;}
else{btn.classList.add('ko');document.querySelectorAll('.opt')[q.a].classList.add('show-ok');}
showFB(ok,q.e);
document.getElementById('nxt').classList.add('on');
}
function selVF(val,btn){
if(answered)return;answered=true;
var q=QS[cur];
document.querySelectorAll('.vfbtn').forEach(function(b){b.disabled=true;});
var ok=(val===q.a);
if(ok){btn.classList.add('ok');score++;thSc[q.th]++;}
else{btn.classList.add('ko');document.querySelectorAll('.vfbtn')[q.a===true?0:1].classList.add('show-ok');}
showFB(ok,q.e);
document.getElementById('nxt').classList.add('on');
}
function showFB(ok,expl){
var fb=document.getElementById('fb');
fb.className='fb on '+(ok?'ok':'ko');
fb.innerHTML='<strong>'+(ok?'✅ Bonne réponse !':'❌ Mauvaise réponse.')+'</strong>'+
'<div class="expl">💡 '+expl+'</div>';
}
function nextQ(){cur++;if(cur>=QS.length)showResults();else showQ();}
// ──────────────────────────────────────────────
// RÉSULTATS
// ──────────────────────────────────────────────
function showResults(){
show('s-results');
var pct=Math.round(score/QS.length*100);
var ring=document.getElementById('ring');
var bg,emoji,title,msg;
if(pct>=80){bg='linear-gradient(135deg,#1A4A2A,#2D7A4A)';emoji='🏆';title='Excellent !';msg='Très bonne maîtrise des techniques et de l\'hygiène. Vous êtes prêt pour les ateliers.';}
else if(pct>=60){bg='linear-gradient(135deg,#7A3010,#B5521E)';emoji='👍';title='Bon travail !';msg='Bonne base. Revoyez les thèmes à renforcer avant les prochains ateliers.';}
else{bg='linear-gradient(135deg,#4A1A08,#8B3A1A)';emoji='💪';title='À renforcer';msg='Reprenez les fiches techniques et repassez ce quiz. Chaque préparation a ses règles !';}
ring.style.background=bg;
document.getElementById('r-score').textContent=score+'/'+QS.length;
document.getElementById('r-name').textContent='👤 '+appName;
document.getElementById('r-title').textContent=emoji+' '+title;
document.getElementById('r-msg').textContent=msg;
var cont=document.getElementById('th-results');cont.innerHTML='';
Object.keys(TH).forEach(function(k){
var s=thSc[k],t=thTo[k],p=Math.round(s/t*100);
var cls=p>=75?'g':p<50?'l':'m';
cont.innerHTML+='<div class="th-row"><div class="th-top">'+
'<span class="th-name">'+TH[k].ic+' '+TH[k].n+'</span>'+
'<span class="th-sc">'+s+'/'+t+'</span></div>'+
'<div class="bar"><div class="bf '+cls+'" style="width:'+p+'%"></div></div></div>';
});
buildShareLink();saveResult();
document.getElementById('copy-ok').style.display='none';
}
function buildShareLink(){
var entry=makeEntry();
try{
var b64=btoa(unescape(encodeURIComponent(JSON.stringify(entry))));
var url=window.location.href.split('#')[0]+'#import='+encodeURIComponent(b64);
document.getElementById('share-url').value=url;
}catch(e){document.getElementById('share-url').value='(erreur de génération)';}
}
function copyLink(){
var ta=document.getElementById('share-url');
ta.select();ta.setSelectionRange(0,99999);
try{document.execCommand('copy');}catch(e){try{navigator.clipboard.writeText(ta.value);}catch(e2){}}
var ok=document.getElementById('copy-ok');ok.style.display='block';
setTimeout(function(){ok.style.display='none';},2500);
}
function sendEmail(){
var pct=Math.round(score/QS.length*100);
var mention=pct>=80?'Excellent':pct>=60?'Bien':'À renforcer';
var date='';try{date=new Date().toLocaleDateString('fr-FR',{day:'2-digit',month:'2-digit',year:'numeric',hour:'2-digit',minute:'2-digit'});}catch(e){}
var body='Résultats – Quiz PPF Cuisine & Pâtisserie GRETA\n================================================\n\n';
body+='Apprenant : '+appName+'\nDate : '+date+'\nScore : '+score+'/'+QS.length+' ('+pct+'%) – '+mention+'\n\nDétail par thème :\n';
Object.keys(TH).forEach(function(k){
var s=thSc[k],t=thTo[k],p=Math.round(s/t*100);
body+=TH[k].n+' : '+s+'/'+t+' ('+p+'%) → '+(p>=75?'✓ OK':p<50?'✗ À renforcer':'~ Moyen')+'\n';
});
body+='\n-- Quiz GRETA PPF Cuisine & Pâtisserie';
window.location.href='mailto:'+EMAIL+'?subject='+encodeURIComponent('[Quiz GRETA] '+appName+' – '+pct+'%')+'&body='+encodeURIComponent(body);
}
function makeEntry(){
var e={name:appName,date:new Date().toISOString(),score:score,total:QS.length,themes:{}};
Object.keys(TH).forEach(function(k){e.themes[k]={score:thSc[k],total:thTo[k],name:TH[k].n,icon:TH[k].ic};});
return e;
}
function saveResult(){
try{
var all=loadAll();var e=makeEntry();
var dup=all.some(function(r){return r.name===e.name&&r.date===e.date;});
if(!dup){all.push(e);localStorage.setItem(STORE_KEY,JSON.stringify(all));}
}catch(err){}
}
function loadAll(){try{var r=localStorage.getItem(STORE_KEY);return r?JSON.parse(r):[];}catch(e){return[];}}
function checkCode(){
if(document.getElementById('code-inp').value.trim()===DASH_CODE){
document.getElementById('code-err').style.display='none';showDash();
}else{
document.getElementById('code-err').style.display='block';
document.getElementById('code-inp').value='';document.getElementById('code-inp').focus();
}
}
document.addEventListener('keydown',function(e){
if(document.getElementById('s-lock').style.display!=='none'&&e.key==='Enter')checkCode();
});
function showDash(){
show('s-dash');
var all=loadAll().slice().reverse();
document.getElementById('dash-count').textContent=all.length;
var sub=document.getElementById('dash-sub');
sub.textContent=all.length===0?'Aucun résultat — les apprenants doivent partager leur lien.':
all.length+' résultat'+(all.length>1?'s':'')+' collecté'+(all.length>1?'s':'');
var body=document.getElementById('dash-body');
if(!all.length){
body.innerHTML='<div class="dash-empty">Aucun résultat pour le moment.<br><br>'+
'📲 Mode de collecte : à la fin du quiz, chaque apprenant copie son lien de partage et vous l\'envoie par WhatsApp ou SMS. Quand vous cliquez sur ce lien, le résultat s\'ajoute automatiquement ici.</div>';
return;
}
var html='';
all.forEach(function(r){
var pct=Math.round(r.score/r.total*100);
var mention=pct>=80?'🏆 Excellent':pct>=60?'👍 Bien':'💪 À renforcer';
var date='';try{date=new Date(r.date).toLocaleDateString('fr-FR',{day:'2-digit',month:'2-digit',year:'numeric',hour:'2-digit',minute:'2-digit'});}catch(e){}
html+='<div class="dash-entry"><div class="de-name">'+esc(r.name)+'</div>';
html+='<div class="de-meta">'+date+'</div>';
html+='<div class="de-score">'+r.score+'/'+r.total+' – '+mention+'</div>';
if(r.themes){
html+='<div class="de-bars">';
Object.keys(r.themes).forEach(function(k){
var th=r.themes[k],p=Math.round(th.score/th.total*100);
var cls=p>=75?'g':p<50?'l':'m';
html+='<div class="de-bar-row"><span class="de-bar-name">'+(th.icon||'')+' '+esc(th.name||k)+'</span>'+
'<div class="de-bar-track"><div class="de-bar-fill '+cls+'" style="width:'+p+'%"></div></div>'+
'<span class="de-bar-sc">'+th.score+'/'+th.total+'</span></div>';
});
html+='</div>';
}
html+='</div>';
});
body.innerHTML=html;
}
function clearAll(){
if(confirm('Effacer tous les résultats ? Action irréversible.')){
try{localStorage.removeItem(STORE_KEY);}catch(e){}showDash();
}
}
function esc(s){return String(s).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');}
function restart(){show('s-home');document.getElementById('inp-name').value='';}
</script>
</body>
</html>