From c978a5aac115b924bc513f018c2b9a102310a4b2 Mon Sep 17 00:00:00 2001 From: Vincent Vanwaelscappel Date: Wed, 16 Aug 2023 14:00:26 +0200 Subject: [PATCH] wip #6195 @0.5 --- .idea/.gitignore | 8 + .idea/misc.xml | 7 + animations/NOK.json | 1 + animations/OK.json | 1 + js/quiz.animations.js | 37 ++ js/quiz.js | 356 +++++++++++++++++++ js/quiz.question.js | 37 ++ js/quiz.resize.js | 14 + js/quiz.score.js | 153 ++++++++ js/quiz.scorm.js | 7 + style/001-global-variables.sass | 0 style/002-item-variables.sass | 1 + style/003-reset.sass | 51 +++ style/004-mixins.sass | 49 +++ style/005-utilities.sass | 12 + style/100-global.sass | 86 +++++ style/101-header-footer.sass | 57 +++ style/102-intro.sass | 16 + style/103-question-multiple.sass | 40 +++ style/104-animations.sass | 22 ++ style/105-outro.sass | 147 ++++++++ style/106-question-draganddrop.sass | 94 +++++ style/style.sass | 12 + views/footer.blade.php | 21 ++ views/header_question.blade.php | 12 + views/header_title.blade.php | 4 + views/index.blade.php | 32 ++ views/screens/intro.blade.php | 16 + views/screens/outro.blade.php | 59 +++ views/screens/question_draganddrop.blade.php | 50 +++ views/screens/question_multiple.blade.php | 22 ++ views/sprite.blade.php | 47 +++ 32 files changed, 1471 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/misc.xml create mode 100644 animations/NOK.json create mode 100644 animations/OK.json create mode 100644 js/quiz.animations.js create mode 100644 js/quiz.js create mode 100644 js/quiz.question.js create mode 100644 js/quiz.resize.js create mode 100644 js/quiz.score.js create mode 100644 js/quiz.scorm.js create mode 100644 style/001-global-variables.sass create mode 100644 style/002-item-variables.sass create mode 100644 style/003-reset.sass create mode 100644 style/004-mixins.sass create mode 100644 style/005-utilities.sass create mode 100644 style/100-global.sass create mode 100644 style/101-header-footer.sass create mode 100644 style/102-intro.sass create mode 100644 style/103-question-multiple.sass create mode 100644 style/104-animations.sass create mode 100644 style/105-outro.sass create mode 100644 style/106-question-draganddrop.sass create mode 100644 style/style.sass create mode 100644 views/footer.blade.php create mode 100644 views/header_question.blade.php create mode 100644 views/header_title.blade.php create mode 100644 views/index.blade.php create mode 100644 views/screens/intro.blade.php create mode 100644 views/screens/outro.blade.php create mode 100644 views/screens/question_draganddrop.blade.php create mode 100644 views/screens/question_multiple.blade.php create mode 100644 views/sprite.blade.php diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..ceefc72 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/animations/NOK.json b/animations/NOK.json new file mode 100644 index 0000000..b006dd0 --- /dev/null +++ b/animations/NOK.json @@ -0,0 +1 @@ +{"v":"5.9.0","fr":60,"ip":0,"op":310,"w":500,"h":500,"nm":"WRONG_anim","ddd":0,"assets":[],"fonts":{"list":[{"origin":3,"fPath":"images/font_0","fClass":"","fFamily":"Source Sans Pro","fWeight":"","fStyle":"SemiBold","fName":"SourceSansPro-SemiBold","ascent":70.599365234375}]},"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Nul 1","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[0.626,0.626,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.155,0.155,0]},"t":20,"s":[85,85,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.501,0.501,0.333],"y":[0.189,0.189,0]},"t":110,"s":[90,90,100]},{"t":170,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":296,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Calque de forme 1","parent":4,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[82.25,82.25,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-32.25,-32.312],[32,31.938],[32.25,-31.812],[-32,32.438]],"c":false},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.623528992896,0.992156982422,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":12,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Contour 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Forme 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0]},{"t":110,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Réduire les tracés 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[1],"y":[0]},"t":266,"s":[100]},{"t":296,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Réduire les tracés 2","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":40,"op":296,"st":40,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"VALIDATE_X Silhouettes","parent":4,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[82.25,82.25,0],"ix":2,"l":2},"a":{"a":0,"k":[35.605,35.605,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-26.87,-35.355],[35.355,26.87],[26.87,35.355],[-35.355,-26.87]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[35.605,35.606],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Groupe 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-35.355,26.87],[26.87,-35.355],[35.355,-26.87],[-26.871,35.355]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[35.605,35.605],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Groupe 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":40,"op":296,"st":40,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"VALIDATE_CIRCLEW Silhouettes","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[82.25,82.25,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.576,0.576,0.333],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":20,"s":[100,100,100]},{"i":{"x":[0.973,0.973,0.667],"y":[1.001,1.001,1]},"o":{"x":[0.813,0.813,0.333],"y":[0,0,0]},"t":274,"s":[100,100,100]},{"t":296,"s":[0,0,100]}],"ix":6,"l":2,"x":"var $bm_rt;\nvar n, n, t, t, v, amp, freq, decay;\n$bm_rt = n = 0;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = t = 0;\n} else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n}\nif (n > 0 && t < 1) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n amp = 0.03;\n freq = 3;\n decay = 10;\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n} else {\n $bm_rt = value;\n}"}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-45.287,0],[0,-45.287],[45.287,0],[0,45.287]],"o":[[45.287,0],[0,45.287],[-45.287,0],[0,-45.287]],"v":[[0,-82],[82,0],[0,82],[-82,0]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.815686334348,0.086274509804,0.486274539723,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[82.25,82.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Groupe 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":296,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"VALIDATE_CIRCLE2 Silhouettes","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[82.25,82.25,0],"ix":2,"l":2},"a":{"a":0,"k":[90.25,90.25,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.552,0.552,0.333],"y":[0,0,0]},"t":16,"s":[89,89,100]},{"t":28,"s":[100,100,100]}],"ix":6,"l":2,"x":"var $bm_rt;\nvar n, n, t, t, v, amp, freq, decay;\n$bm_rt = n = 0;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = t = 0;\n} else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n}\nif (n > 0 && t < 1) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n amp = 0.03;\n freq = 3;\n decay = 10;\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n} else {\n $bm_rt = value;\n}"}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-49.706],[49.706,0],[0,49.706],[-49.706,0]],"o":[[0,49.706],[-49.706,0],[0,-49.706],[49.706,0]],"v":[[90,0],[0,90],[-90,0],[0,-90]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[90.25,90.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Groupe 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":16,"op":296,"st":-4,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"VALIDATE_CIRCLE2 Silhouettes 2","parent":5,"sr":1,"ks":{"o":{"a":0,"k":72,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":28,"s":[90.25,90.25,0],"to":[0,2.5,0],"ti":[0,-2.5,0]},{"i":{"x":0,"y":0},"o":{"x":0.333,"y":0.333},"t":108,"s":[90.25,105.25,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":252,"s":[90.25,105.25,0],"to":[0,-2.5,0],"ti":[0,2.5,0]},{"t":292,"s":[90.25,90.25,0]}],"ix":2,"l":2},"a":{"a":0,"k":[90.25,90.25,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2,"x":"var $bm_rt;\nvar n, n, t, t, v, amp, freq, decay;\n$bm_rt = n = 0;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = t = 0;\n} else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n}\nif (n > 0 && t < 1) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n amp = 0.03;\n freq = 3;\n decay = 10;\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n} else {\n $bm_rt = value;\n}"}},"ao":0,"ef":[{"ty":29,"nm":"Flou gaussien","np":5,"mn":"ADBE Gaussian Blur 2","ix":1,"en":1,"ef":[{"ty":0,"nm":"Flou","mn":"ADBE Gaussian Blur 2-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[150]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[1],"y":[0]},"t":252,"s":[150]},{"t":292,"s":[0]}],"ix":1}},{"ty":7,"nm":"Dimensions de flou","mn":"ADBE Gaussian Blur 2-0002","ix":2,"v":{"a":0,"k":1,"ix":2}},{"ty":7,"nm":"Recopier les pixels du contour","mn":"ADBE Gaussian Blur 2-0003","ix":3,"v":{"a":0,"k":0,"ix":3}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-49.706],[49.706,0],[0,49.706],[-49.706,0]],"o":[[0,49.706],[-49.706,0],[0,-49.706],[49.706,0]],"v":[[90,0],[0,90],[-90,0],[0,-90]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.815686334348,0.086274509804,0.486274539723,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[90.25,90.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Groupe 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":16,"op":292,"st":-4,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"VALIDATE_CIRCLE3 Silhouettes 2","parent":9,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[181,181,0],"ix":2,"l":2},"a":{"a":0,"k":[181,181,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-98.583],[98.583,0],[0,98.583],[-98.583,0]],"o":[[0,98.583],[-98.583,0],[0,-98.583],[98.583,0]],"v":[[178.5,0],[0,178.5],[-178.5,0],[0,-178.5]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[181,181],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Groupe 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":292,"st":20,"bm":0},{"ddd":0,"ind":8,"ty":5,"nm":"$text","parent":4,"tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":40,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":83.338,"ix":3},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":20,"s":[137.873]},{"t":80,"s":[207.41]}],"ix":4}},"a":{"a":0,"k":[0.5,-5.463,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"t":{"d":{"k":[{"s":{"s":25,"f":"SourceSansPro-SemiBold","t":"$text","ca":0,"j":2,"tr":20,"lh":30.0000019073486,"ls":0,"fc":[1,1,1]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":20,"op":292,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"VALIDATE_CIRCLE3 Silhouettes","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[82.25,82.25,0],"ix":2,"l":2},"a":{"a":0,"k":[181,181,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.177,0.177,0.333],"y":[0.291,0.291,0]},"t":24,"s":[50,50,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":106,"s":[100,100,100]},{"i":{"x":[0.836,0.836,0.667],"y":[-0.528,-0.528,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":232,"s":[100,100,100]},{"t":292,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-98.583],[98.583,0],[0,98.583],[-98.583,0]],"o":[[0,98.583],[-98.583,0],[0,-98.583],[98.583,0]],"v":[[178.5,0],[0,178.5],[-178.5,0],[0,-178.5]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Contour 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[181,181],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Groupe 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":26,"op":292,"st":26,"bm":0}],"markers":[]} diff --git a/animations/OK.json b/animations/OK.json new file mode 100644 index 0000000..e4e2c07 --- /dev/null +++ b/animations/OK.json @@ -0,0 +1 @@ +{"v":"5.9.0","fr":30,"ip":0,"op":160,"w":500,"h":500,"nm":"VALIDATE_anim","ddd":0,"assets":[],"fonts":{"list":[{"origin":3,"fPath":"images/font_0","fClass":"","fFamily":"Source Sans Pro","fWeight":"","fStyle":"SemiBold","fName":"SourceSansPro-SemiBold","ascent":70.599365234375}]},"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Nul 1","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[0.667,0.667,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":10,"s":[85,85,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.501,0.501,0.333],"y":[0.189,0.189,0]},"t":50,"s":[90,90,100]},{"t":80,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":148,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Calque de forme 1","parent":4,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[80.25,82.25,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-42,-10.25],[-8.75,23],[45.375,-31.25]],"c":false},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.623528992896,0.992156982422,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":13,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Contour 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Forme 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":50,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[1],"y":[0]},"t":133,"s":[100]},{"t":148,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Réduire les tracés 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":20,"op":148,"st":20,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"VALIDATE_V Silhouettes","parent":4,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[82.211,81.147,0],"ix":2,"l":2},"a":{"a":0,"k":[46.212,32.777,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[37.477,-32.527],[-10.606,15.556],[-37.476,-11.314],[-45.962,-2.829],[-10.606,32.527],[45.962,-24.042]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[46.212,32.777],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Groupe 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":148,"st":20,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"VALIDATE_CIRCLE1 Silhouettes","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[82.25,82.25,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1]},"o":{"x":[0.576,0.576,0.333],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":10,"s":[100,100,100]},{"i":{"x":[0.973,0.973,0.667],"y":[1.001,1.001,1]},"o":{"x":[0.813,0.813,0.333],"y":[0,0,0]},"t":137,"s":[100,100,100]},{"t":148,"s":[0,0,100]}],"ix":6,"l":2,"x":"var $bm_rt;\nvar n, n, t, t, v, amp, freq, decay;\n$bm_rt = n = 0;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = t = 0;\n} else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n}\nif (n > 0 && t < 1) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n amp = 0.03;\n freq = 3;\n decay = 10;\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n} else {\n $bm_rt = value;\n}"}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-45.287],[45.287,0],[0,45.287],[-45.287,0]],"o":[[0,45.287],[-45.287,0],[0,-45.287],[45.287,0]],"v":[[82,0],[0,82],[-82,0],[0,-82]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.086274509804,0.749019607843,0.749019607843,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[82.25,82.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Groupe 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":148,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"VALIDATE_CIRCLE2 Silhouettes","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[82.25,82.25,0],"ix":2,"l":2},"a":{"a":0,"k":[90.25,90.25,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,1.189]},"o":{"x":[0.552,0.552,0.333],"y":[0,0,0]},"t":8,"s":[89,89,100]},{"t":14,"s":[100,100,100]}],"ix":6,"l":2,"x":"var $bm_rt;\nvar n, n, t, t, v, amp, freq, decay;\n$bm_rt = n = 0;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = t = 0;\n} else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n}\nif (n > 0 && t < 1) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n amp = 0.03;\n freq = 3;\n decay = 10;\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n} else {\n $bm_rt = value;\n}"}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-49.706],[49.706,0],[0,49.706],[-49.706,0]],"o":[[0,49.706],[-49.706,0],[0,-49.706],[49.706,0]],"v":[[90,0],[0,90],[-90,0],[0,-90]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[90.25,90.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Groupe 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":8,"op":148,"st":-2,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"VALIDATE_CIRCLE2 Silhouettes 2","parent":5,"sr":1,"ks":{"o":{"a":0,"k":72,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[90.25,90.25,0],"to":[0,2.5,0],"ti":[0,-2.5,0]},{"i":{"x":0,"y":0},"o":{"x":0.333,"y":0.333},"t":54,"s":[90.25,105.25,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":126,"s":[90.25,105.25,0],"to":[0,-2.5,0],"ti":[0,2.5,0]},{"t":146,"s":[90.25,90.25,0]}],"ix":2,"l":2},"a":{"a":0,"k":[90.25,90.25,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2,"x":"var $bm_rt;\nvar n, n, t, t, v, amp, freq, decay;\n$bm_rt = n = 0;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = t = 0;\n} else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n}\nif (n > 0 && t < 1) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n amp = 0.03;\n freq = 3;\n decay = 10;\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n} else {\n $bm_rt = value;\n}"}},"ao":0,"ef":[{"ty":29,"nm":"Flou gaussien","np":5,"mn":"ADBE Gaussian Blur 2","ix":1,"en":1,"ef":[{"ty":0,"nm":"Flou","mn":"ADBE Gaussian Blur 2-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":54,"s":[150]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[1],"y":[0]},"t":126,"s":[150]},{"t":146,"s":[0]}],"ix":1}},{"ty":7,"nm":"Dimensions de flou","mn":"ADBE Gaussian Blur 2-0002","ix":2,"v":{"a":0,"k":1,"ix":2}},{"ty":7,"nm":"Recopier les pixels du contour","mn":"ADBE Gaussian Blur 2-0003","ix":3,"v":{"a":0,"k":0,"ix":3}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-49.706],[49.706,0],[0,49.706],[-49.706,0]],"o":[[0,49.706],[-49.706,0],[0,-49.706],[49.706,0]],"v":[[90,0],[0,90],[-90,0],[0,-90]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.086274509804,0.749019607843,0.749019607843,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[90.25,90.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Groupe 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":8,"op":146,"st":-2,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"VALIDATE_CIRCLE3 Silhouettes 2","parent":9,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[181,181,0],"ix":2,"l":2},"a":{"a":0,"k":[181,181,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-98.583],[98.583,0],[0,98.583],[-98.583,0]],"o":[[0,98.583],[-98.583,0],[0,-98.583],[98.583,0]],"v":[[178.5,0],[0,178.5],[-178.5,0],[0,-178.5]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fond 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[181,181],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Groupe 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":146,"st":10,"bm":0},{"ddd":0,"ind":8,"ty":5,"nm":"$text","parent":4,"tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":20,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":83.338,"ix":3},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[137.873]},{"t":40,"s":[207.41]}],"ix":4}},"a":{"a":0,"k":[0.5,-5.463,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"t":{"d":{"k":[{"s":{"s":25,"f":"SourceSansPro-SemiBold","t":"$text","ca":0,"j":2,"tr":20,"lh":30.0000019073486,"ls":0,"fc":[1,1,1]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":10,"op":146,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"VALIDATE_CIRCLE3 Silhouettes","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[82.25,82.25,0],"ix":2,"l":2},"a":{"a":0,"k":[181,181,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.177,0.177,0.333],"y":[0.291,0.291,0]},"t":12,"s":[50,50,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":53,"s":[100,100,100]},{"i":{"x":[0.836,0.836,0.667],"y":[-0.528,-0.528,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":116,"s":[100,100,100]},{"t":146,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-98.583],[98.583,0],[0,98.583],[-98.583,0]],"o":[[0,98.583],[-98.583,0],[0,-98.583],[98.583,0]],"v":[[178.5,0],[0,178.5],[-178.5,0],[0,-178.5]],"c":true},"ix":2},"nm":"Tracé 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Contour 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[181,181],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformer "}],"nm":"Groupe 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":13,"op":146,"st":13,"bm":0}],"markers":[]} diff --git a/js/quiz.animations.js b/js/quiz.animations.js new file mode 100644 index 0000000..d43a719 --- /dev/null +++ b/js/quiz.animations.js @@ -0,0 +1,37 @@ +const lottie = require("lottie-web"); +const $ = require("cash-dom"); + + +function QuizAnimations(quiz) { + this.quiz = quiz; +} + +QuizAnimations.prototype = { + // Load the animation "name" in container + load: function (name, container, replace) { + let json = this.quiz.data.animations[name]; + if (json) { + for (const k in replace) { + json = json.replace(new RegExp(k, 'g'), replace[k]); + } + lottie.loadAnimation({ + container: $(container).get(0), + renderer: 'svg', + loop: false, + autoplay: true, + animationData: JSON.parse(json), + }); + } + }, + + triggeredBtn: function() { + /*$(document).on("mousedown", ".btn", function() { + gsap.to($(this), { scale: .9, duration: 0.3 }); + }).on("mouseup", ".btn", function() { + gsap.to($(this), { scale: 1, duration: 0.3 }); + })*/ + } +} + + +module.exports = QuizAnimations; diff --git a/js/quiz.js b/js/quiz.js new file mode 100644 index 0000000..b99daff --- /dev/null +++ b/js/quiz.js @@ -0,0 +1,356 @@ +import $ from "cash-dom"; +import gsap from "gsap"; +import { MotionPathPlugin } from "gsap/MotionPathPlugin.js"; +import {CubeSCORM} from '/application/resources/scorm/scorm'; +import lottie from "lottie-web"; +import SplitType from 'split-type' +import SimpleBar from 'simplebar' +import 'simplebar/dist/simplebar.css' +import Handlebars from "handlebars"; + +import QuizResize from "./quiz.resize"; +import QuizAnimations from "./quiz.animations"; +import QuizScore from './quiz.score'; +import QuizScorm from './quiz.scorm'; +import QuizQuestion from './quiz.question'; + +window.cubeSCORM = new CubeSCORM(); +window.$ = window.jQuery = $; + +window.key = require('keymaster-reloaded'); + +import ResizeObserver from 'resize-observer-polyfill'; +window.ResizeObserver = ResizeObserver; + +function Quiz() { +} + +Quiz.prototype = { + init: function () { + let $this = this; + + // Initialisation des modules + this.animations = new QuizAnimations(this); + this.score=new QuizScore(this); + this.scorm=new QuizScorm(this); + this.resize = new QuizResize(this); + this.question = new QuizQuestion(this); + + // Ici seront injectées dans this.data toutes les données du quiz et du thème pour qu'elles soient disponibles + // dans l'object à tout moment + this.data = data; + this.responses = [] + + console.log(this.data); + // ICI tout commence vraiment + console.log(this.data.theme) + + this.timeoutAnimation = false + + // commencer + $(document).on("click", "#start", function() { + $this.start() + }) + + // + $("#quiz").css("background-image","url("+this.data.theme.backgroundImage+")") + + // La fonction resize est appelée à chaque fois qu'un resize de la fenêtre survient (et à l'init de l'app) + $(window).on('resize', function () { + $this.quizResize(); + }); + this.quizResize(); + + //animer le texte d'intro + let title = new SplitType("#welcome h2", { types: 'words, chars' }) + let text = new SplitType("#welcome p", { types: 'words, chars' }) + gsap.from(title.words, { + opacity: 0, + y: 20, + duration: 1, + stagger: 0.05, + onStart: () => { + $(title.elements).removeClass("none") + } + }) + gsap.to(text.words, { + opacity: 1, + y: 0, + duration: 1, + ease: "power1.inOut", + stagger: { + amount: 0.2 + }, + onStart: () => { + $(text.elements).removeClass("none") + } + }) + + // Préparer les réponses du joueur dans l'objet this.responses + // à chaque fois que le formulaire change de valeur + $(document).on("change", ".active-screen form", function(e) { + $this.responses = [] + $(this).find("input:checked").each(function() { + $this.responses.push(parseInt($(this).val())) + }); + }) + + // Passer à la page suivante + // Valider les réponses + $(document).on("click", ".next .action", function () { + let responses = $this.responses + $this.next(responses); + $this.responses = [] + }) + key('space', function (e){ + e.preventDefault() + $this.next(); + }) + + // Réinitialiser les réponses + $(document).on("click", ".btn.reset", function() { + $this.resetForm() + }) + key('r', function (e){ + e.preventDefault() + $this.resetForm() + }) + + if(key.isPressed('R')) { + alert('r') + } + + $(document).on("mousedown", ".btn", function() { + gsap.to($(this), { scale: .95, duration: .2, ease: "back.inOut" }); + }).on("mouseup", ".btn", function() { + gsap.to($(this), { scale: 1, duration: .2 }); + }) + + // + this.activeNav() + }, + + start: function() { + const $this = this + gsap.timeline().to("#welcome-screen", { + opacity: 0, + onComplete: function() { + let responses = $this.responses + $this.next(responses); + $("#welcome-screen").removeClass("next active-screen").addClass("none").next(".container-screen").removeClass("none").addClass("next active-screen") + } + }) + }, + + updateIcons: function () { + $("[data-icon]").each(function () { + var iconId = 'quiz-' + $(this).data('icon'); + // L'icône est déjà en place + if ($(this).children('svg.' + iconId).length) { + return; + } + // Si une autre icône est présente, on la supprime + $(this).children('svg.svg-icon').remove(); + // Puis on ajoute l'icône + var icon = getSpriteIcon(iconId); + if ($(this).is('[data-icon-prepend]')) { + $(this).prepend(icon); + } else { + $(this).append(icon); + } + }); + }, + + quizResize: function () { + this.updateIcons(); + this.resize.resize(); + }, + + next: function (responses) { + // on arrête l'animation si le joueur passe à la question suivante + this.stopAnimationValidation() + + let status = quiz.score.questionStatus + let currentPosition = quiz.score.lastAnsweredQuestion + 1 + + const $el = $(".active-screen .btn.action") + + quiz.score.updateScore() + // if form exist and responses are validated + // dont miss to add this second condition + if($(".active-screen form").length > 0) { + if(status.length > 0) { + if(status[this.question.currentPosition()].ok === "not answered") { + this.validateResponse(responses); + this.updateBtnValidation("validated") + return false + } + } + } + + $el.parents(".container-screen").addClass("none").removeClass("next active-screen").next(".container-screen").removeClass("none").addClass("next active-screen") + this.resetForm() + // on incrémente de 1 la position actuelle de la question (qui commence à l'index zero) + // pour récupérer le premier enfant de la nav + this.activeNav( (parseInt(this.question.currentPosition())+1) ) + this.updateBtnValidation() + // si c'est la dernière question a été validée alors on affiche le résultat au prochain screen + if(this.question.last(currentPosition)) { + this.result() + } + }, + + // marque page automatique + // si le joueur recharge la page, le rediriger là où il en était + setDisplay: function() { + const currentQuestion = quiz.score.lastAnsweredQuestion + 1, + questions = this.quiz.questions + + if(questions.length > 0) { + if (quiz.score.lastAnsweredQuestion > -1 && questions.length <= currentQuestion) { + // + } + } + }, + + resetForm: () => { + $("form").find("input").prop("checked", false) + }, + + updateBtnValidation: function(status) { + let $btnAction = $(".footer-question .action"), + validationText = $btnAction.data("validation-text"), + continueText = $btnAction.data("continue-text") + + $btnAction.find('.text').text(status === "validated" ? continueText : validationText) + }, + + validateResponse: function(responses) { + const form = $(".active-screen form") + const activeScreen = $(".active-screen") + const position = activeScreen.data("position") + + if(form) { + if(form.length > 0) { + let validated = quiz.score.setAnswer(position,responses); + if(validated.ok === "ok") { + this.animationValidation("OK") + }else { + this.animationValidation("NOK") + } + this.resultAfterValidation(validated.status[position].answers) + } + return false + } + }, + + activeNav: function(position = 1) { + const questionStatus = quiz.score.questionStatus + const lastAnsweredQuestion = quiz.score.lastAnsweredQuestion + if($(".active-screen").find(".progress-item").length > 0) { + let $el = $(".progress-container .progress-item:nth-child(" + position + ")") + + $(".progress-container .progress-item").removeClass("active") + $el.addClass("active") + + let n = (lastAnsweredQuestion + 1) + let $_el = $(".progress-container .progress-item:nth-child(" + n + ")") + + if (lastAnsweredQuestion > -1) { + if (questionStatus[lastAnsweredQuestion].ok === 'ok') { + $_el.addClass("ok") + } + if (questionStatus[lastAnsweredQuestion].ok === 'nok') { + $_el.addClass("nok") + } + } + } + }, + + animationValidation: function(status) { + let selector = $("#anim") + let text = status === "NOK" ? "Not quite" : "Perfect" + let $this = this + this.animations.load(status, selector, {'\\$text': text}); + selector.addClass("active") + this.timeoutAnimation = setTimeout(function(e){ + $this.stopAnimationValidation() + }, 10000) + }, + + stopAnimationValidation: function() { + $("#anim").removeClass("active").empty() + if(this.timeoutAnimation) + clearTimeout(this.timeoutAnimation) + }, + + resultAfterValidation: function(datas) { + for(let k in datas) { + let n = (parseInt(k) + 1) + let icon = getSpriteIcon("quiz-ok") + let $el = $(".active-screen .question-multiple .list-item:nth-of-type("+n+") label") + $el.addClass(datas[k]) + if(datas[k] === "nok") { + icon = getSpriteIcon("quiz-wrong") + } + if(datas[k] !== "neutral") { + $el.find(".access").addClass(datas[k]).html(icon) + } + } + }, + + result: function() { + let maxScore = quiz.score.maxScore, + score = quiz.score.score + + let status = quiz.score.questionStatus + let reviewList = this.question.getAll(); + + const counter = $("#progress-counter") + if(score < (maxScore / 2)) { + counter.addClass("nok") + }else if(score >= (maxScore / 2)) { + counter.addClass("ok") + } + + reviewList = reviewList.map((c,i) => { + return { + 'question': c['question'], + 'answers': c['answers'].filter((c) => { + return c['correct'] === 1 + }), + 'status': status[i].ok + } + }) + let $ul = $("#answers-list") + + $("[id^=score-]").text(score) + $("[id^=maxScore-]").text(maxScore) + + // + // HANDLEBARS TEMPLATING + // + // on applique une incrementation de +1 + // utilisé pour la numérotation des questions + Handlebars.registerHelper("inc", (value) => { return parseInt(value) + 1; }); + + // on envoie le html avec les nouvelles données + const source = $("#template-answers-review").html(); + const template = Handlebars.compile(source); + const html = template({reviewList: reviewList}); + $ul.html(html) + + // mise en place de la scrollbar personnalisé + // https://github.com/Grsmto/simplebar/tree/master/packages/simplebar + const simpleBar = new SimpleBar($ul.get(0)) + }, + + restart: function() { + + } +} + +$(function () { + window.quiz = new Quiz(); + window.quiz.init(); +}); diff --git a/js/quiz.question.js b/js/quiz.question.js new file mode 100644 index 0000000..f659d07 --- /dev/null +++ b/js/quiz.question.js @@ -0,0 +1,37 @@ +var QuizQuestion = function(quiz) { + this.quiz = quiz; + this.init(); +} + +QuizQuestion.prototype = { + init: function(){ + + }, + + getAll: function() { + return this.quiz.data.questions + }, + + byPosition: function(pos) { + return this.quiz.data.questions[parseInt(pos)] + }, + + currentPosition: function() { + return $(document).find(".active-screen").data("position"); + }, + + current: function() { + let currentPosition = this.currentPosition() + return this.byPosition(currentPosition) + }, + + last: function(position) { + return this.quiz.data.questions.length === parseInt(position) + }, + + getFormData: function(responses) { + // + }, +} + +module.exports = QuizQuestion; diff --git a/js/quiz.resize.js b/js/quiz.resize.js new file mode 100644 index 0000000..b68ab5a --- /dev/null +++ b/js/quiz.resize.js @@ -0,0 +1,14 @@ +function QuizResize(quiz) { + this.quiz = quiz; +} + +QuizResize.prototype = { + resize: function () { + this.ww = $(window).width(); + this.hh = $(window).height(); + + // Exécuter ici toutes opérations qui doivent intervenir lorsque la fenêtre est redimensionnée par le système ou l'utilisateur + }, +} + +module.exports = QuizResize; diff --git a/js/quiz.score.js b/js/quiz.score.js new file mode 100644 index 0000000..b336788 --- /dev/null +++ b/js/quiz.score.js @@ -0,0 +1,153 @@ +const $ = require("cash-dom"); + +function QuizScore(quiz) { + this.quiz = quiz; + this.logQuestions = []; + // Le score global du quiz + this.score = 0; + this.maxScore = 0; + this.questionStatus = []; + this.answers = []; + this.lastAnsweredQuestion = -1; + this.init(); +} + +QuizScore.prototype = { + init: function () { + + }, + + /** + * + * @param questionIndex integer + * @param answers array + * @returns {{ok, status: []}} + */ + setAnswer: function (questionIndex, answers) { + this.lastAnsweredQuestion = questionIndex; + this.answers[questionIndex] = answers; + this.updateScore(); + return { + ok: this.questionStatus[questionIndex].ok, + score: this.score, + maxScore: this.maxScore, + status: this.questionStatus + }; + }, + + checkQuestion: function (questionIndex) { + let question = this.quiz.data.questions[questionIndex]; + + let a = []; + let ok = 'ok'; + let count = question.count_for_score; + let log = { + 'count': count, + }; + + let answersStatus = []; + let userAnswers = this.answers[questionIndex]; + let min_score = 0; + let this_score = 0; + if (userAnswers === undefined || userAnswers === null) { + ok = 'not answered'; + } else { + let $this = this; + if (question.type === 'multiple') { + // Le score de la question + min_score = this.getMinScore(question); + this_score = 0; + for (let answerIndex in question.answers) { + answerIndex = parseInt(answerIndex); + const answer = question.answers[answerIndex]; + + let checkedByUser = userAnswers.indexOf(answerIndex) >= 0; + if (parseInt(answer.correct) === 1) { + if (checkedByUser) { + // C'est une bonne réponse et elle a été cochée par l'utilisateur + this_score += answer.score; + answersStatus[answerIndex] = 'ok'; + } else { + // C'est une bonne réponse, mais elle n'a pas été cochée par l'utilisateur + answersStatus[answerIndex] = 'missed'; + } + } else { + if (checkedByUser) { + // C'est une mauvaise réponse et elle a été cochée par l'utilisateur + this_score -= answer.score; + answersStatus[answerIndex] = 'nok'; + } else { + // C'est une bonne réponse et elle n'a pas été cochée par l'utilisateur + answersStatus[answerIndex] = 'neutral'; + } + } + } + ok = this_score >= min_score ? 'ok' : 'nok'; + + log.answer = a; + } else { + log.answer = $(this).find('input,textarea,select').val(); + } + } + + if (!count) { + ok = 'ok'; + } + + this.questionStatus[questionIndex] = { + ok: ok, + answers: answersStatus, + // dbg_min_score: min_score, + // dbg_this_score: this_score + }; + + if (count) { + this.maxScore++; + if (ok == 'ok') { + this.score++; + log.score = 1; + } else { + log.score = 0; + } + } else { + log.score = 0; + } + this.logQuestions[questionIndex] = log; + }, + + getMinScore: function (question) { + // Le score minimal est le score que l'utilisateur doit atteindre sur une question pour que sa réponse soit considérée + let min_score = parseInt(question.min_score); + if (min_score === 0) { + min_score = 0; + for (const answerIndex in question.answers) { + const answer = question.answers[answerIndex]; + if (answer.correct === 1) { + min_score += answer.score; + } + } + } + return min_score; + }, + + updateScore: function () { + this.maxScore = 0; + this.score = 0; + this.logQuestions = []; + + for (const qn in this.quiz.data.questions) { + this.checkQuestion(qn); + } + + let state = { + q: this.lastAnsweredQuestion + 1, a: this.answers + }; + + if (cubeSCORM.SCORM) { + cubeSCORM.setSCORMLocation(state); + } + }, +}; + +module.exports = QuizScore; + diff --git a/js/quiz.scorm.js b/js/quiz.scorm.js new file mode 100644 index 0000000..b5e5570 --- /dev/null +++ b/js/quiz.scorm.js @@ -0,0 +1,7 @@ +function QuizScorm(quiz) { + this.quiz = quiz; +} + +QuizScorm.prototype = {}; + +module.exports = QuizScorm; diff --git a/style/001-global-variables.sass b/style/001-global-variables.sass new file mode 100644 index 0000000..e69de29 diff --git a/style/002-item-variables.sass b/style/002-item-variables.sass new file mode 100644 index 0000000..9e5f8fc --- /dev/null +++ b/style/002-item-variables.sass @@ -0,0 +1 @@ +// Do not edit this file, quiz variables will be populated at compile time diff --git a/style/003-reset.sass b/style/003-reset.sass new file mode 100644 index 0000000..45897f9 --- /dev/null +++ b/style/003-reset.sass @@ -0,0 +1,51 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) */ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video, main + margin: 0 + padding: 0 + border: 0 + font-size: 100% + font: inherit + vertical-align: baseline + box-sizing: border-box + + +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section, main + display: block + + +body + line-height: 1 + + +ol, ul + list-style: none + + +blockquote, q + quotes: none + +blockquote:before, blockquote:after, +q:before, q:after + content: '' + content: none + +table + border-collapse: collapse + border-spacing: 0 diff --git a/style/004-mixins.sass b/style/004-mixins.sass new file mode 100644 index 0000000..bd8e37f --- /dev/null +++ b/style/004-mixins.sass @@ -0,0 +1,49 @@ +@mixin above($min-width) + @media (min-width: $min-width) + @content + + +@mixin below($max-width) + @media (max-width: $max-width) + @content + + +@mixin breakpoint($breakpoint, $direction: min) + $breakpoint-values: map-get($breakpoints, $breakpoint) + $breakpoint: map-get($breakpoint-values, $direction) + @media (#{$direction}-width: $breakpoint) + @content + + +@mixin opacity($opacity, $rule: background-color, $color: $texts-color) + #{$rule}: rgba($color,$opacity) + + +@mixin flex-config($justify-content: false, $flex: false, $flex-direction: false, $align-items: false) + display: flex + + @if $justify-content != false + justify-content: $justify-content + + @if $flex != false + flex: $flex + + @if $flex-direction != false + flex-direction: $flex-direction + + @if $align-items != false + align-items: $align-items + + +@mixin font-size($size) + font-size: #{$size}px + line-height: map-get($fonts-size,$size) + + +@mixin padding-container() + padding: 16px + +breakpoint(md) + padding: 24px + +@mixin radius($size) + border-radius: $size diff --git a/style/005-utilities.sass b/style/005-utilities.sass new file mode 100644 index 0000000..adc845c --- /dev/null +++ b/style/005-utilities.sass @@ -0,0 +1,12 @@ +.radius + border-radius: 16px + +.relative + position: relative + +.none + display: none !important + +\:root + --space-21-66: clamp(1.31rem, calc(0.29rem + 5.11vw), 4.13rem) + diff --git a/style/100-global.sass b/style/100-global.sass new file mode 100644 index 0000000..763a60d --- /dev/null +++ b/style/100-global.sass @@ -0,0 +1,86 @@ +@import 005-utilities + +body + background-color: $neutral-color + font-family: $font + color: $texts-color + +[data-icon] svg + height: 20px + +.container + +flex-config(center,false,false,center) + min-height: 100vh + +#quiz + width: 100% + max-width: 1200px + min-height: 680px + margin: 0 auto + padding: 24px 24px + position: relative + +.btn + padding: 0 12px + text-align: center + font-size: 20px + border: none + cursor: pointer + display: inline-block + height: 58px + +flex-config(center,false,false,center) + @extend .radius + +font-size(20) + &.primary + background: radial-gradient(at 16% 6px, rgb(255, 102, 186) -7%, #D0167C 74%) + box-shadow: 0 4px 6px rgba(0,0,0,.2) + &.secondary + +opacity(.16) + padding-left: 22px + &.reset + max-width: 144px + &.info + max-width: 177px + +.access + width: 34px + height: 34px + border-radius: 4px + +font-size(16) + +opacity(.16) + text-transform: uppercase + margin-left: 16px + +flex-config(center,false,false,center) + border: 0 + &.space + width: 70px + &.infos + width: 40px + &.ok + +opacity(.24, background-color, $ok-color) + + &.ok, + &.missed + svg + color: $ok-color + &.nok + +opacity(.24, background-color, $nok-color) + svg + color: $nok-color + &.ok, + &.nok, + &.missed + svg + width: 15px + height: 15px + +.screen + position: relative + z-index: 1 + &-image + position: absolute + top: 0 + left: 0 + height: 100% + width: 100% + z-index: 0 diff --git a/style/101-header-footer.sass b/style/101-header-footer.sass new file mode 100644 index 0000000..d4a269e --- /dev/null +++ b/style/101-header-footer.sass @@ -0,0 +1,57 @@ +header, +footer + position: relative + +header + z-index: 1 + +#title + height: 80px + +flex-config(space-between,false,row,center) + margin-top: -24px + +#logo + height: 40px + filter: brightness(10) + +.header-question + text-align: center + .abovetitle + +font-size(16) + .progress-container + margin: 6px 0 16px + +flex-config(center,false,false,center) + .progress-item + width: 16px + height: 4px + border-radius: 100px + +opacity(.16) + display: inline-flex + transition: background-color .3s + &:not(:last-of-type) + margin-right: 7px + &.active + background-color: $texts-color + &.ok + background-color: $ok-color + &.nok + background-color: $nok-color + h1 + +font-size(24) + +.footer + position: absolute + bottom: 0 + left: 0 + width: 100% + z-index: 2 + +flex-config(space-between,false,row,center) + +padding-container() + + .btn.primary + width: 100% + max-width: 400px + position: absolute + left: 50% + bottom: 24px + transform: translateX(-50%) diff --git a/style/102-intro.sass b/style/102-intro.sass new file mode 100644 index 0000000..f6d3b32 --- /dev/null +++ b/style/102-intro.sass @@ -0,0 +1,16 @@ +#welcome + max-width: 590px + margin: 0 auto + top: 160px + h2 + margin: 0 0 12px + +font-size(20) + clip-path: polygon(0 0, 100% 0, 100% 100%, 0% 100%) + + p + +font-size(16) + clip-path: polygon(0 0, 100% 0, 100% 100%, 0% 100%) + + .word + opacity: 0 + transform: translateY(100px) diff --git a/style/103-question-multiple.sass b/style/103-question-multiple.sass new file mode 100644 index 0000000..fed8e2e --- /dev/null +++ b/style/103-question-multiple.sass @@ -0,0 +1,40 @@ +.screen.question-multiple + top: 93px + .list + display: grid + grid-template-columns: repeat(2, 1fr) + grid-gap: 16px + &-item + label + width: 100% + height: 58px + @extend .radius + +opacity(.80,background-color,$neutral-color) + +flex-config(space-between,false,false,center) + padding: 0 16px + cursor: pointer + border: 2px solid rgba($texts-color, .24) + position: relative + overflow: hidden + &:after + content: "" + width: 100% + height: 100% + position: absolute + top: 0 + left: 0 + transition: background-color .1s ease-out + &.ok:after, + &.missed:after + // + +opacity(.24,background-color,$ok-color) + * + z-index: 1 + + input:checked+label + border-color: $texts-color + transition: border-color .1s ease-out + &:after + +opacity(.16) + &.nok:after + background: transparent diff --git a/style/104-animations.sass b/style/104-animations.sass new file mode 100644 index 0000000..4ef9ee3 --- /dev/null +++ b/style/104-animations.sass @@ -0,0 +1,22 @@ +#anim + position: absolute + top: 50% + left: 50% + transform: translate(-50%,-50%) + z-index: 1 + width: 100% + height: 100% + +opacity(.4, background-color, $neutral-color) + backdrop-filter: blur(4px) + // règle ie > 9 à tester + // filter:progid:DXImageTransform.Microsoft.Blur(PixelRadius='3') + opacity: 0 + visibility: hidden + transition: all 1s + svg + position: relative + z-index: 1 + &.active + visibility: visible + opacity: 1 + transition: all 1s diff --git a/style/105-outro.sass b/style/105-outro.sass new file mode 100644 index 0000000..0438c0e --- /dev/null +++ b/style/105-outro.sass @@ -0,0 +1,147 @@ +.score + height: 576px //680(hauteur de base) - 80(hauteur du header) - 24(padding inférieure) + +opacity(.48,background-color,$neutral-color) + border-radius: 40px + overflow: hidden + +flex-config(false,false,row,stretch) + + .subtitle + +opacity(.8,color,$texts-color) + + &-content + flex: 1 + padding: 24px + position: relative + h1 + +font-size(40) + margin-bottom: 9px + .subtitle + +font-size(16) + + &-content-wrapper + +flex-config(false,false,false,center) + position: relative + top: var(--space-21-66) + left: var(--space-21-66) + + &-counter + height: 0 + padding-bottom: 31% + width: 31% + max-width: 210px + position: relative + +font-size(80) + margin-right: 60px + + #progress-counter + width: 100% + height: 100% + position: absolute + top: 0 + left: 0 + border-radius: 100px + background: transparent + +flex-config(center,false,false,center) + &.nok * + color: $nok-color + &.ok * + color: $ok-color + + svg + overflow: visible + width: calc(100% - 12px) + height: calc(100% - 12px) + transform: rotate(-90deg) + position: absolute + circle + stroke-width: 12px + circle:not(#progress-circle) + +opacity(.16,color,$texts-color) + circle#progress-circle + transition: stroke-dashoffset 0.5s ease-in-out + + &-answers-review + width: 36.11111% + background-color: $neutral-color + padding: 24px 24px 0 + position: relative + h2 + +font-size(24) + margin-bottom: 5px + .subtitle + +font-size(16) + margin-bottom: 22px + + &:after + content: "" + width: 100% + height: 80px + position: absolute + bottom: 0 + left: 0 + background: linear-gradient(to bottom,transparent, rgba($neutral-color,.8)) + + #answers-list + height: 85% + padding-right: 24px + .item + padding-left: 20px + margin-bottom: 22px + position: relative + * + +font-size(14) + &:after + content: "" + width: 12px + height: 12px + position: absolute + left: 0 + top: 4px + border-radius: 20px + &.ok + // + &:after + background-color: $ok-color + .position + color: $ok-color + &.nok + // + &:after + background-color: $nok-color + .position + color: $nok-color + + .question + margin-bottom: 2px + + .answer + +opacity(.8,color,$texts-color) + + + footer + position: absolute + width: calc(100% - 48px) + bottom: 24px + .restart-sentence + margin-bottom: 14px + .controls + +flex-config(space-between) + + + // SimpleBar personalisation + .simplebar-wrapper + height: 100% + .simplebar-track + +opacity(.08,background-color,$texts-color) + border-radius: 20px + &.simplebar-vertical + height: 93% + width: 5px + .simplebar-scrollbar::before + background-color: #77679f + opacity: 1 !important + width: 3px + top: 1px + bottom: 1px + left: 1px + right: 1px diff --git a/style/106-question-draganddrop.sass b/style/106-question-draganddrop.sass new file mode 100644 index 0000000..9d599e9 --- /dev/null +++ b/style/106-question-draganddrop.sass @@ -0,0 +1,94 @@ +.container-screen.question-draganddrop + .screen-image + width: auto + img + height: 100% + &.zone-1 + .zone-content + left: 24px + &.zone-2 + left: initial + right: 0 + .zone-content + right: 24px + .zone-content + position: absolute + top: 50% + transform: translateY(-50%) + width: 100% + max-width: 180px + .text + margin-bottom: 21px + + form + +opacity(.08,background-color,$texts-color) + +radius(16px) + padding: 8px + border: 1px dashed rgba($texts-color,.4) + .slot + width: 100% + height: 51px + border: 1px solid rgba($texts-color,.24) + +radius(8px) + + .screen + +flex-config(center, false, false, center) + margin-top: 92px + .list + position: relative + width: 100% + max-width: 368px + height: 225px + margin: 0 16px + &-item + position: absolute + width: 100% + height: 100% + +radius(16px) + &:nth-child(1) + background-color: $neutral-color + z-index: 4 + border: 2px solid $texts-color + padding: 20px + &:nth-child(2) + opacity: .64 + +opacity(.8,background-color,$neutral-color) + transform: scale(.9) + z-index: 3 + top: 32px + &:nth-child(3) + opacity: .4 + +opacity(.8,background-color,$neutral-color) + transform: scale(.81) + z-index: 2 + top: 61px + &:nth-child(4) + opacity: .16 + +opacity(.8,background-color,$neutral-color) + transform: scale(0.72) + z-index: 1 + top: 91px + &:not(:nth-child(-n+4)) // on cache les items à partir du 5ème + opacity: 0 + visibility: hidden + + + .controls + width: 124px + padding: 12px 0 + +font-size(20) + +opacity(.16,background-color,$texts-color) + border-radius: 16px + text-align: center + &.left .access + transform: rotate(-90deg) + &.right .access + transform: rotate(90deg) + p + margin-bottom: 5px + .access + margin: 0 auto + span + display: flex + svg + color: $texts-color diff --git a/style/style.sass b/style/style.sass new file mode 100644 index 0000000..b3a649c --- /dev/null +++ b/style/style.sass @@ -0,0 +1,12 @@ +@import 001-global-variables +@import 002-item-variables +@import 003-reset +@import 004-mixins + +@import 100-global +@import 101-header-footer +@import 102-intro +@import 103-question-multiple +@import 104-animations +@import 105-outro +@import 106-question-draganddrop diff --git a/views/footer.blade.php b/views/footer.blade.php new file mode 100644 index 0000000..a4de04a --- /dev/null +++ b/views/footer.blade.php @@ -0,0 +1,21 @@ + diff --git a/views/header_question.blade.php b/views/header_question.blade.php new file mode 100644 index 0000000..dda7f1f --- /dev/null +++ b/views/header_question.blade.php @@ -0,0 +1,12 @@ +
+

{{ __('Question').' '.($position+1).'/'.$max }}

+
+ @for($i = 0; $i < $max; $i++) + + @endfor +
+

{{$data['question']}}

+ @if($data['type'] === "draganddrop") +

Use arrow keys to move the cards to the corresponding zone

+ @endif +
diff --git a/views/header_title.blade.php b/views/header_title.blade.php new file mode 100644 index 0000000..38bd053 --- /dev/null +++ b/views/header_title.blade.php @@ -0,0 +1,4 @@ +
+

{{$data->title}}

+ +
diff --git a/views/index.blade.php b/views/index.blade.php new file mode 100644 index 0000000..a01d88a --- /dev/null +++ b/views/index.blade.php @@ -0,0 +1,32 @@ + + + + + + + + + {{$data->title}} + + + +@include("quizv2.sprite") +@php + $totalQuestion = sizeof($data->questions); + $alphabet = range('A', 'Z'); +@endphp +
+
+ @if($data->intro_enable) + @include('quizv2.screens.intro', ['data'=> $data]) + @endif + @foreach($data->questions as $key => $question) + @include('quizv2.screens.question_'.$question['type'], ['theme' => $data->theme, 'data'=> $question, 'max' => $totalQuestion, 'position' => $key, 'alphabet' => $alphabet]) + @endforeach + @include('quizv2.screens.outro', ['data'=> $data]) +
+
+
+ + + diff --git a/views/screens/intro.blade.php b/views/screens/intro.blade.php new file mode 100644 index 0000000..291f435 --- /dev/null +++ b/views/screens/intro.blade.php @@ -0,0 +1,16 @@ +@php + $absPath = \App\Models\Quiz::find($data->id)->getPreviewURL(); +@endphp + diff --git a/views/screens/outro.blade.php b/views/screens/outro.blade.php new file mode 100644 index 0000000..f2d6868 --- /dev/null +++ b/views/screens/outro.blade.php @@ -0,0 +1,59 @@ +
+ @include('quizv2.header_title', ['data', $data]) +
+
+
+
+
+ 0/0 + + + + +
+
+
+

Congratulation!

+

You have completed the quiz
with + correct answers out of

+
+
+ +
+
+

Answers review

+

Review your answers before you go

+
    + @verbatim + + @endverbatim +
+
+
+
diff --git a/views/screens/question_draganddrop.blade.php b/views/screens/question_draganddrop.blade.php new file mode 100644 index 0000000..2052723 --- /dev/null +++ b/views/screens/question_draganddrop.blade.php @@ -0,0 +1,50 @@ +
+
+ +
+
+

Zone 1

+

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh

+
+
+ @foreach($data['answers'] as $key => $answer) +
+
+ @endforeach +
+
+
+ @include('quizv2.header_question', ['data' => $data, 'max' => $max, 'position' => $position]) +
+
+

Move left

+ +
+
    + @foreach($data['answers'] as $key => $answer) +
  • + {{$answer['answer']}} +
  • + @endforeach +
+
+

Move right

+ +
+
+
+ +
+
+

Zone 1

+

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh

+
+
+ @foreach($data['answers'] as $key => $answer) +
+ @endforeach +
+
+
+ @include('quizv2.footer', ['data' => $data, 'reset' => true, 'text' => 'Validate answer', 'info' => true]) +
diff --git a/views/screens/question_multiple.blade.php b/views/screens/question_multiple.blade.php new file mode 100644 index 0000000..6357f48 --- /dev/null +++ b/views/screens/question_multiple.blade.php @@ -0,0 +1,22 @@ +
+ @include('quizv2.header_question', ['data' => $data, 'max' => $max, 'position' => $position]) +
+
+
    + @foreach($data['answers'] as $key => $answer) +
  • + + +
  • + @endforeach +
+
+
+
+ +
+ @include('quizv2.footer', ['data' => $data, 'reset' => true, 'text' => 'Validate answer', 'info' => true]) +
diff --git a/views/sprite.blade.php b/views/sprite.blade.php new file mode 100644 index 0000000..29cc129 --- /dev/null +++ b/views/sprite.blade.php @@ -0,0 +1,47 @@ +{{-- + +Downloaded from https://toolbox.fluidbook.com/tool-sprite/9/download +Edit here : https://toolbox.fluidbook.com/tool-sprite/9/edit + +--}} + -- 2.39.5