@vue-skuilder/platform-ui 0.2.26 → 0.2.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{About-Cbh4d2en.js → About-Cr-gVLN3.js} +2 -2
- package/dist/assets/{About-Cbh4d2en.js.map → About-Cr-gVLN3.js.map} +1 -1
- package/dist/assets/AdminDashboard-Tu5cntiN.js +2 -0
- package/dist/assets/AdminDashboard-Tu5cntiN.js.map +1 -0
- package/dist/assets/AdminDashboard-fWfBatiA.css +1 -0
- package/dist/assets/AdminLearner-DKV-rmzE.js +2 -0
- package/dist/assets/AdminLearner-DKV-rmzE.js.map +1 -0
- package/dist/assets/{ClassroomCtrlPanel-qTZ4-_Qj.js → ClassroomCtrlPanel-BlIKf9Ec.js} +2 -2
- package/dist/assets/{ClassroomCtrlPanel-qTZ4-_Qj.js.map → ClassroomCtrlPanel-BlIKf9Ec.js.map} +1 -1
- package/dist/assets/{Classrooms-Bs9idBBc.js → Classrooms-CUHpCVyZ.js} +3 -3
- package/dist/assets/{Classrooms-Bs9idBBc.js.map → Classrooms-CUHpCVyZ.js.map} +1 -1
- package/dist/assets/CourseRouter-CmWQVX3p.js +7 -0
- package/dist/assets/{CourseRouter-COWEp3J8.js.map → CourseRouter-CmWQVX3p.js.map} +1 -1
- package/dist/assets/CourseWare-BTFRjgBR-DCGIN7hI.js +3 -0
- package/dist/assets/{CourseWare-BTFRjgBR-BtoyyUaA.js.map → CourseWare-BTFRjgBR-DCGIN7hI.js.map} +1 -1
- package/dist/assets/{Courses-BGeDUa_B.js → Courses-D4v2o2EL.js} +3 -3
- package/dist/assets/{Courses-BGeDUa_B.js.map → Courses-D4v2o2EL.js.map} +1 -1
- package/dist/assets/{EloModeration-LGJdnlkx.js → EloModeration-BVRrWLlD.js} +2 -2
- package/dist/assets/{EloModeration-LGJdnlkx.js.map → EloModeration-BVRrWLlD.js.map} +1 -1
- package/dist/assets/{JoinCode-DBoEGv_S.js → JoinCode-tyMSgQmu.js} +2 -2
- package/dist/assets/{JoinCode-DBoEGv_S.js.map → JoinCode-tyMSgQmu.js.map} +1 -1
- package/dist/assets/{NewCourseDialog-CCbEI3IK.js → NewCourseDialog-CskVoqOS.js} +2 -2
- package/dist/assets/{NewCourseDialog-CCbEI3IK.js.map → NewCourseDialog-CskVoqOS.js.map} +1 -1
- package/dist/assets/{ReleaseNotes-CWB3FnDP.js → ReleaseNotes-DeNVWB2D.js} +2 -2
- package/dist/assets/{ReleaseNotes-CWB3FnDP.js.map → ReleaseNotes-DeNVWB2D.js.map} +1 -1
- package/dist/assets/{RequestPasswordReset-DIhIj9-T.js → RequestPasswordReset-8ekUShJq.js} +2 -2
- package/dist/assets/{RequestPasswordReset-DIhIj9-T.js.map → RequestPasswordReset-8ekUShJq.js.map} +1 -1
- package/dist/assets/{ResetPassword-C9wTg7N2.js → ResetPassword-CZVPnMM4.js} +2 -2
- package/dist/assets/{ResetPassword-C9wTg7N2.js.map → ResetPassword-CZVPnMM4.js.map} +1 -1
- package/dist/assets/Study-BdxV-Ilv.js +2 -0
- package/dist/assets/{Study-C48aaEsD.js.map → Study-BdxV-Ilv.js.map} +1 -1
- package/dist/assets/{TagInformation-5WJk5HUd.js → TagInformation-DYyYbYmu.js} +2 -2
- package/dist/assets/{TagInformation-5WJk5HUd.js.map → TagInformation-DYyYbYmu.js.map} +1 -1
- package/dist/assets/{User-Bz1YIJpG.js → User-dB5PO1RG.js} +3 -3
- package/dist/assets/{User-Bz1YIJpG.js.map → User-dB5PO1RG.js.map} +1 -1
- package/dist/assets/{UserStats-BgHdylqF.js → UserStats-uVV3CIXd.js} +2 -2
- package/dist/assets/{UserStats-BgHdylqF.js.map → UserStats-uVV3CIXd.js.map} +1 -1
- package/dist/assets/{VerifyEmail-tn7DWjZd.js → VerifyEmail-Dlm91Y-S.js} +2 -2
- package/dist/assets/{VerifyEmail-tn7DWjZd.js.map → VerifyEmail-Dlm91Y-S.js.map} +1 -1
- package/dist/assets/admin-BNR4JZ2X.js +4 -0
- package/dist/assets/admin-BNR4JZ2X.js.map +1 -0
- package/dist/assets/admin-D-L0jR6i.css +1 -0
- package/dist/assets/{chess-E2uOAyQS-CjZFFUEU.js → chess-E2uOAyQS-CyL0N9F7.js} +3 -3
- package/dist/assets/{chess-E2uOAyQS-CjZFFUEU.js.map → chess-E2uOAyQS-CyL0N9F7.js.map} +1 -1
- package/dist/assets/chess-Lfm7Fsvs-CGl6HDqe.js +1 -0
- package/dist/assets/common-ui.es-DFOzc2ze.js +38 -0
- package/dist/assets/common-ui.es-DFOzc2ze.js.map +1 -0
- package/dist/assets/common-ui.es-e3Go1Szv.js +1 -0
- package/dist/assets/dist-BtPAFjJU.js +1 -0
- package/dist/assets/{dist-DO_oB9R-.js → dist-DDw00TzX.js} +7 -7
- package/dist/assets/{dist-DO_oB9R-.js.map → dist-DDw00TzX.js.map} +1 -1
- package/dist/assets/{dist-BfByiGsi.js → dist-DQUROFxW.js} +4 -4
- package/dist/assets/{dist-BfByiGsi.js.map → dist-DQUROFxW.js.map} +1 -1
- package/dist/assets/dist-DXykAjYp.js +1 -0
- package/dist/assets/edit-ui.es-BUTgY-3X.js +1 -0
- package/dist/assets/edit-ui.es-w6kgjkws.js +36 -0
- package/dist/assets/{edit-ui.es-DPNX25r_.js.map → edit-ui.es-w6kgjkws.js.map} +1 -1
- package/dist/assets/{french-Dk7YG8Td-BzAgKluD.js → french-Dk7YG8Td-Cg49rQNc.js} +2 -2
- package/dist/assets/{french-Dk7YG8Td-BzAgKluD.js.map → french-Dk7YG8Td-Cg49rQNc.js.map} +1 -1
- package/dist/assets/french-evUMlbbq-eazzEipj.js +1 -0
- package/dist/assets/index-oJ86i_Jb.js +4 -0
- package/dist/assets/index-oJ86i_Jb.js.map +1 -0
- package/dist/assets/{math-B4HbgYf6-CTDueFZl.js → math-B4HbgYf6-F4RSa_qw.js} +6 -6
- package/dist/assets/{math-B4HbgYf6-CTDueFZl.js.map → math-B4HbgYf6-F4RSa_qw.js.map} +1 -1
- package/dist/assets/math-DYni7rRl-B9M881Tg.js +1 -0
- package/dist/assets/piano-BN5Btq91-BRTyPgQM.js +1 -0
- package/dist/assets/piano-DF1g6yaX-CBHsd-Bx.js +2 -0
- package/dist/assets/{piano-DF1g6yaX-DQqyYFu3.js.map → piano-DF1g6yaX-CBHsd-Bx.js.map} +1 -1
- package/dist/assets/{pitch-CgGJFkZ1-DHFd5oC5.js → pitch-CgGJFkZ1-mnBGefMf.js} +2 -2
- package/dist/assets/{pitch-CgGJFkZ1-DHFd5oC5.js.map → pitch-CgGJFkZ1-mnBGefMf.js.map} +1 -1
- package/dist/assets/pitch-Dn0iNqiS-B8AXyb7U.js +1 -0
- package/dist/assets/{server-ChswrlW3.js → server-DRRLfaGM.js} +2 -2
- package/dist/assets/{server-ChswrlW3.js.map → server-DRRLfaGM.js.map} +1 -1
- package/dist/assets/{sightsing-BFQ7HRig-Cz0hvcK-.js → sightsing-BFQ7HRig-BJLyffo9.js} +3 -3
- package/dist/assets/{sightsing-BFQ7HRig-Cz0hvcK-.js.map → sightsing-BFQ7HRig-BJLyffo9.js.map} +1 -1
- package/dist/assets/sightsing-CJX3k0Fd-CUYD16hW.js +1 -0
- package/dist/assets/{typing-BevtfWlp-CEwlkfpM.js → typing-BevtfWlp-BhybW0tx.js} +2 -2
- package/dist/assets/{typing-BevtfWlp-CEwlkfpM.js.map → typing-BevtfWlp-BhybW0tx.js.map} +1 -1
- package/dist/assets/typing-k-ojjO7G-DxqrbEGQ.js +1 -0
- package/dist/assets/vue-router-CDq4a4rc.js +2 -0
- package/dist/assets/vue-router-CDq4a4rc.js.map +1 -0
- package/dist/assets/{word-work-BOnRlZgd-hq7vSIPY.js → word-work-BOnRlZgd-BpNUJRLI.js} +2 -2
- package/dist/assets/{word-work-BOnRlZgd-hq7vSIPY.js.map → word-work-BOnRlZgd-BpNUJRLI.js.map} +1 -1
- package/dist/assets/word-work-Dd6tIKrt-B18ud_iH.js +1 -0
- package/dist/assets/{workbox-window.prod.es5-DBwpKi3B.js → workbox-window.prod.es5-r2bRTooK.js} +1 -1
- package/dist/assets/{workbox-window.prod.es5-DBwpKi3B.js.map → workbox-window.prod.es5-r2bRTooK.js.map} +1 -1
- package/dist/index.html +4 -3
- package/dist/sw.js +1 -1
- package/dist/sw.js.map +1 -1
- package/package.json +7 -7
- package/src/router.ts +8 -0
- package/src/views/AdminDashboard.vue +79 -19
- package/src/views/AdminLearner.vue +108 -0
- package/dist/assets/AdminDashboard-1P0YrINL.js +0 -2
- package/dist/assets/AdminDashboard-1P0YrINL.js.map +0 -1
- package/dist/assets/AdminDashboard-CWnC_vEI.css +0 -1
- package/dist/assets/CourseRouter-COWEp3J8.js +0 -7
- package/dist/assets/CourseWare-BTFRjgBR-BtoyyUaA.js +0 -3
- package/dist/assets/Study-C48aaEsD.js +0 -2
- package/dist/assets/chess-Lfm7Fsvs-ByO95MLa.js +0 -1
- package/dist/assets/common-ui.es-DUw6dWa3.js +0 -38
- package/dist/assets/common-ui.es-DUw6dWa3.js.map +0 -1
- package/dist/assets/common-ui.es-Tx9PvNRU.js +0 -1
- package/dist/assets/dist-BxvCddLN.js +0 -1
- package/dist/assets/dist-DrrQdNqf.js +0 -1
- package/dist/assets/edit-ui.es-DPNX25r_.js +0 -36
- package/dist/assets/edit-ui.es-iOIjLjuM.js +0 -1
- package/dist/assets/french-evUMlbbq-BgQA34eY.js +0 -1
- package/dist/assets/index-RjJYO_8m.js +0 -4
- package/dist/assets/index-RjJYO_8m.js.map +0 -1
- package/dist/assets/math-DYni7rRl-DkNo_HJe.js +0 -1
- package/dist/assets/piano-BN5Btq91-CYAp2K4e.js +0 -1
- package/dist/assets/piano-DF1g6yaX-DQqyYFu3.js +0 -2
- package/dist/assets/pitch-Dn0iNqiS-Bop5wffu.js +0 -1
- package/dist/assets/sightsing-CJX3k0Fd-DuH2QH0h.js +0 -1
- package/dist/assets/typing-k-ojjO7G-DXwGpkBj.js +0 -1
- package/dist/assets/word-work-Dd6tIKrt-CYXO9v7a.js +0 -1
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import"./chunk-D6hFPZc3.js";import{$ as e,C as t,D as n,H as r,K as i,Lt as a,S as o,T as s,Vt as c,_ as l,b as u,v as d,y as f}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{
|
|
2
|
-
`);try{e=new Worker(URL.createObjectURL(new Blob([t])))}catch(e){return typeof console.warn==`function`&&console.warn(`🎊 Could not load worker`,e),null}decorate(e)}return e}})(),u={particleCount:50,angle:90,spread:45,startVelocity:45,decay:.9,gravity:1,drift:0,ticks:200,x:.5,y:.5,shapes:[`square`,`circle`],zIndex:100,colors:[`#26ccff`,`#a25afd`,`#ff5e7e`,`#88ff5a`,`#fcff42`,`#ffa62d`,`#ff36ff`],disableForReducedMotion:!1,scalar:1};function convert(e,t){return t?t(e):e}function isOk(e){return e!=null}function prop(e,t,n){return convert(e&&isOk(e[t])?e[t]:u[t],n)}function onlyPositiveInt(e){return e<0?0:Math.floor(e)}function randomInt(e,t){return Math.floor(Math.random()*(t-e))+e}function toDecimal(e){return parseInt(e,16)}function colorsToRgb(e){return e.map(hexToRgb)}function hexToRgb(e){var t=String(e).replace(/[^0-9a-f]/gi,``);return t.length<6&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]),{r:toDecimal(t.substring(0,2)),g:toDecimal(t.substring(2,4)),b:toDecimal(t.substring(4,6))}}function getOrigin(e){var t=prop(e,`origin`,Object);return t.x=prop(t,`x`,Number),t.y=prop(t,`y`,Number),t}function setCanvasWindowSize(e){e.width=document.documentElement.clientWidth,e.height=document.documentElement.clientHeight}function setCanvasRectSize(e){var t=e.getBoundingClientRect();e.width=t.width,e.height=t.height}function getCanvas(e){var t=document.createElement(`canvas`);return t.style.position=`fixed`,t.style.top=`0px`,t.style.left=`0px`,t.style.pointerEvents=`none`,t.style.zIndex=e,t}function ellipse(e,t,n,r,i,a,o,s,c){e.save(),e.translate(t,n),e.rotate(a),e.scale(r,i),e.arc(0,0,1,o,s,c),e.restore()}function randomPhysics(e){var t=e.angle*(Math.PI/180),n=e.spread*(Math.PI/180);return{x:e.x,y:e.y,wobble:Math.random()*10,wobbleSpeed:Math.min(.11,Math.random()*.1+.05),velocity:e.startVelocity*.5+Math.random()*e.startVelocity,angle2D:-t+(.5*n-Math.random()*n),tiltAngle:(Math.random()*.5+.25)*Math.PI,color:e.color,shape:e.shape,tick:0,totalTicks:e.ticks,decay:e.decay,drift:e.drift,random:Math.random()+2,tiltSin:0,tiltCos:0,wobbleX:0,wobbleY:0,gravity:e.gravity*3,ovalScalar:.6,scalar:e.scalar,flat:e.flat}}function updateFetti(e,t){t.x+=Math.cos(t.angle2D)*t.velocity+t.drift,t.y+=Math.sin(t.angle2D)*t.velocity+t.gravity,t.velocity*=t.decay,t.flat?(t.wobble=0,t.wobbleX=t.x+10*t.scalar,t.wobbleY=t.y+10*t.scalar,t.tiltSin=0,t.tiltCos=0,t.random=1):(t.wobble+=t.wobbleSpeed,t.wobbleX=t.x+10*t.scalar*Math.cos(t.wobble),t.wobbleY=t.y+10*t.scalar*Math.sin(t.wobble),t.tiltAngle+=.1,t.tiltSin=Math.sin(t.tiltAngle),t.tiltCos=Math.cos(t.tiltAngle),t.random=Math.random()+2);var n=t.tick++/t.totalTicks,r=t.x+t.random*t.tiltCos,i=t.y+t.random*t.tiltSin,o=t.wobbleX+t.random*t.tiltCos,c=t.wobbleY+t.random*t.tiltSin;if(e.fillStyle=`rgba(`+t.color.r+`, `+t.color.g+`, `+t.color.b+`, `+(1-n)+`)`,e.beginPath(),a&&t.shape.type===`path`&&typeof t.shape.path==`string`&&Array.isArray(t.shape.matrix))e.fill(transformPath2D(t.shape.path,t.shape.matrix,t.x,t.y,Math.abs(o-r)*.1,Math.abs(c-i)*.1,Math.PI/10*t.wobble));else if(t.shape.type===`bitmap`){var l=Math.PI/10*t.wobble,u=Math.abs(o-r)*.1,d=Math.abs(c-i)*.1,f=t.shape.bitmap.width*t.scalar,p=t.shape.bitmap.height*t.scalar,m=new DOMMatrix([Math.cos(l)*u,Math.sin(l)*u,-Math.sin(l)*d,Math.cos(l)*d,t.x,t.y]);m.multiplySelf(new DOMMatrix(t.shape.matrix));var h=e.createPattern(s.transform(t.shape.bitmap),`no-repeat`);h.setTransform(m),e.globalAlpha=1-n,e.fillStyle=h,e.fillRect(t.x-f/2,t.y-p/2,f,p),e.globalAlpha=1}else if(t.shape===`circle`)e.ellipse?e.ellipse(t.x,t.y,Math.abs(o-r)*t.ovalScalar,Math.abs(c-i)*t.ovalScalar,Math.PI/10*t.wobble,0,2*Math.PI):ellipse(e,t.x,t.y,Math.abs(o-r)*t.ovalScalar,Math.abs(c-i)*t.ovalScalar,Math.PI/10*t.wobble,0,2*Math.PI);else if(t.shape===`star`)for(var g=Math.PI/2*3,_=4*t.scalar,v=8*t.scalar,y=t.x,b=t.y,x=5,S=Math.PI/x;x--;)y=t.x+Math.cos(g)*v,b=t.y+Math.sin(g)*v,e.lineTo(y,b),g+=S,y=t.x+Math.cos(g)*_,b=t.y+Math.sin(g)*_,e.lineTo(y,b),g+=S;else e.moveTo(Math.floor(t.x),Math.floor(t.y)),e.lineTo(Math.floor(t.wobbleX),Math.floor(i)),e.lineTo(Math.floor(o),Math.floor(c)),e.lineTo(Math.floor(r),Math.floor(t.wobbleY));return e.closePath(),e.fill(),t.tick<t.totalTicks}function animate(e,t,i,a,o){var l=t.slice(),u=e.getContext(`2d`),d,f,p=promise(function(t){function onDone(){d=f=null,u.clearRect(0,0,a.width,a.height),s.clear(),o(),t()}function update(){n&&!(a.width===r.width&&a.height===r.height)&&(a.width=e.width=r.width,a.height=e.height=r.height),!a.width&&!a.height&&(i(e),a.width=e.width,a.height=e.height),u.clearRect(0,0,a.width,a.height),l=l.filter(function(e){return updateFetti(u,e)}),l.length?d=c.frame(update):onDone()}d=c.frame(update),f=onDone});return{addFettis:function(e){return l=l.concat(e),p},canvas:e,promise:p,reset:function(){d&&c.cancel(d),f&&f()}}}function confettiCannon(t,n){var r=!t,a=!!prop(n||{},`resize`),o=!1,s=prop(n,`disableForReducedMotion`,Boolean),c=i&&prop(n||{},`useWorker`)?l():null,u=r?setCanvasWindowSize:setCanvasRectSize,d=t&&c?!!t.__confetti_initialized:!1,f=typeof matchMedia==`function`&&matchMedia(`(prefers-reduced-motion)`).matches,p;function fireLocal(e,n,r){for(var i=prop(e,`particleCount`,onlyPositiveInt),a=prop(e,`angle`,Number),o=prop(e,`spread`,Number),s=prop(e,`startVelocity`,Number),c=prop(e,`decay`,Number),l=prop(e,`gravity`,Number),d=prop(e,`drift`,Number),f=prop(e,`colors`,colorsToRgb),m=prop(e,`ticks`,Number),h=prop(e,`shapes`),g=prop(e,`scalar`),_=!!prop(e,`flat`),v=getOrigin(e),y=i,b=[],x=t.width*v.x,S=t.height*v.y;y--;)b.push(randomPhysics({x,y:S,angle:a,spread:o,startVelocity:s,color:f[y%f.length],shape:h[randomInt(0,h.length)],ticks:m,decay:c,gravity:l,drift:d,scalar:g,flat:_}));return p?p.addFettis(b):(p=animate(t,b,u,n,r),p.promise)}function fire(n){var i=s||prop(n,`disableForReducedMotion`,Boolean),l=prop(n,`zIndex`,Number);if(i&&f)return promise(function(e){e()});r&&p?t=p.canvas:r&&!t&&(t=getCanvas(l),document.body.appendChild(t)),a&&!d&&u(t);var m={width:t.width,height:t.height};c&&!d&&c.init(t),d=!0,c&&(t.__confetti_initialized=!0);function onResize(){if(c){var e={getBoundingClientRect:function(){if(!r)return t.getBoundingClientRect()}};u(e),c.postMessage({resize:{width:e.width,height:e.height}});return}m.width=m.height=null}function done(){p=null,a&&(o=!1,e.removeEventListener(`resize`,onResize)),r&&t&&(document.body.contains(t)&&document.body.removeChild(t),t=null,d=!1)}return a&&!o&&(o=!0,e.addEventListener(`resize`,onResize,!1)),c?c.fire(n,m,done):fireLocal(n,m,done)}return fire.reset=function(){c&&c.reset(),p&&p.reset()},fire}var d;function getDefaultFire(){return d||(d=confettiCannon(null,{useWorker:!0,resize:!0})),d}function transformPath2D(e,t,n,r,i,a,o){var s=new Path2D(e),c=new Path2D;c.addPath(s,new DOMMatrix(t));var l=new Path2D;return l.addPath(c,new DOMMatrix([Math.cos(o)*i,Math.sin(o)*i,-Math.sin(o)*a,Math.cos(o)*a,n,r])),l}function shapeFromPath(e){if(!a)throw Error(`path confetti are not supported in this browser`);var t,n;typeof e==`string`?t=e:(t=e.path,n=e.matrix);var r=new Path2D(t),i=document.createElement(`canvas`).getContext(`2d`);if(!n){for(var o=1e3,s=o,c=o,l=0,u=0,d,f,p=0;p<o;p+=2)for(var m=0;m<o;m+=2)i.isPointInPath(r,p,m,`nonzero`)&&(s=Math.min(s,p),c=Math.min(c,m),l=Math.max(l,p),u=Math.max(u,m));d=l-s,f=u-c;var h=10,g=Math.min(h/d,h/f);n=[g,0,0,g,-Math.round(d/2+s)*g,-Math.round(f/2+c)*g]}return{type:`path`,path:t,matrix:n}}function shapeFromText(e){var t,n=1,r=`#000000`,i=`"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji", "EmojiOne Color", "Android Emoji", "Twemoji Mozilla", "system emoji", sans-serif`;typeof e==`string`?t=e:(t=e.text,n=`scalar`in e?e.scalar:n,i=`fontFamily`in e?e.fontFamily:i,r=`color`in e?e.color:r);var a=10*n,o=``+a+`px `+i,s=new OffscreenCanvas(a,a),c=s.getContext(`2d`);c.font=o;var l=c.measureText(t),u=Math.ceil(l.actualBoundingBoxRight+l.actualBoundingBoxLeft),d=Math.ceil(l.actualBoundingBoxAscent+l.actualBoundingBoxDescent),f=2,p=l.actualBoundingBoxLeft+f,m=l.actualBoundingBoxAscent+f;u+=f+f,d+=f+f,s=new OffscreenCanvas(u,d),c=s.getContext(`2d`),c.font=o,c.fillStyle=r,c.fillText(t,p,m);var h=1/n;return{type:`bitmap`,bitmap:s.transferToImageBitmap(),matrix:[h,0,0,h,-u*h/2,-d*h/2]}}t.exports=function(){return getDefaultFire().apply(this,arguments)},t.exports.reset=function(){getDefaultFire().reset()},t.exports.create=confettiCannon,t.exports.shapeFromPath=shapeFromPath,t.exports.shapeFromText=shapeFromText})((function(){return typeof window<`u`?window:typeof self<`u`?self:this||{}})(),y,!1);var b=y.exports;y.exports.create;var x=s({name:`UserSettings`,components:{UserTagPreferences:g},props:{username:{type:String,required:!0}},setup(){let e=m(),t=p();return{configStore:e,darkMode:e.config.darkMode,likesConfetti:e.config.likesConfetti,route:t,isNewUser:t.path.endsWith(`new`)}},data(){return{u:{},configLanguages:[{name:`English`,code:`en`},{name:`French`,code:`fr`}],selectedLanguages:[],registeredCourses:[],selectedCourseId:``}},async created(){this.u=await h(),this.configLanguages.forEach(e=>{console.log(`afweatifvwzeatfvwzeta`+e.name)}),await this.loadRegisteredCourses()},methods:{updateDark(){this.configStore.updateDarkMode(this.configStore.config.darkMode)},updateConfetti(){this.configStore.updateLikesConfetti(this.configStore.config.likesConfetti),this.configStore.config.likesConfetti&&b({origin:{x:.5,y:1}})},async loadRegisteredCourses(){try{let e=await this.u.getActiveCourses(),t=_();this.registeredCourses=(await Promise.all(e.map(async e=>{try{return await t.getCourseDB(e.courseID).getCourseConfig()}catch{return{courseID:e.courseID,name:e.courseID}}}))).filter(Boolean)}catch(e){console.error(`Failed to load registered courses:`,e)}},onPreferencesSaved(){console.log(`Preferences saved for course:`,this.selectedCourseId)}}}),S={class:`text-subtitle-1`};function _sfc_render(s,p,m,h,g,_){let v=i(`v-alert`),y=i(`v-checkbox`),b=i(`v-divider`),x=i(`v-list-item`),C=i(`v-select`),w=i(`user-tag-preferences`);return r(),u(`div`,S,[s.isNewUser?(r(),d(v,{key:0,type:`success`,class:`text-subtitle-1`,variant:`tonal`,"prepend-icon":`mdi-check`},{default:e(()=>[o(` Welcome, `+c(s.username)+`! Please take a moment to look through these settings: `,1)]),_:1})):f(``,!0),p[3]||(p[3]=l(`h1`,{class:`text-h3`},`Account Settings`,-1)),p[4]||(p[4]=l(`h2`,{class:`text-h4`},`General:`,-1)),t(y,{modelValue:s.configStore.config.likesConfetti,"onUpdate:modelValue":[p[0]||(p[0]=e=>s.configStore.config.likesConfetti=e),s.updateConfetti],label:`I like confetti`},null,8,[`modelValue`,`onUpdate:modelValue`]),t(y,{modelValue:s.configStore.config.darkMode,"onUpdate:modelValue":[p[1]||(p[1]=e=>s.configStore.config.darkMode=e),s.updateDark],label:`I like the dark`},null,8,[`modelValue`,`onUpdate:modelValue`]),t(b,{class:`my-6`}),p[5]||(p[5]=l(`h2`,{class:`text-h4 mb-4`},`Learning Preferences:`,-1)),p[6]||(p[6]=l(`p`,{class:`text-body-2 text-medium-emphasis mb-4`},`Customize how content is presented in your registered courses.`,-1)),t(C,{modelValue:s.selectedCourseId,"onUpdate:modelValue":p[2]||(p[2]=e=>s.selectedCourseId=e),items:s.registeredCourses,"item-title":`name`,"item-value":`courseID`,label:`Select a course`,variant:`outlined`,density:`comfortable`,class:`mb-4`,style:{"max-width":`400px`}},{item:e(({props:r,item:i})=>[t(x,a(n(r)),{subtitle:e(()=>[o(c(i.raw.courseID),1)]),_:2},1040)]),_:1},8,[`modelValue`,`items`]),s.selectedCourseId?(r(),d(w,{key:1,"course-id":s.selectedCourseId,onPreferencesSaved:s.onPreferencesSaved},null,8,[`course-id`,`onPreferencesSaved`])):f(``,!0)])}var C=v(x,[[`render`,_sfc_render]]);export{C as default};
|
|
3
|
-
//# sourceMappingURL=User-
|
|
1
|
+
import"./chunk-D6hFPZc3.js";import{$ as e,C as t,D as n,H as r,K as i,Lt as a,S as o,T as s,Vt as c,_ as l,b as u,v as d,y as f}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{r as p}from"./vue-router-CDq4a4rc.js";import"./dist-l4NOxAbA.js";import"./MarkdownRenderer-kStoDRNE-HDBFbDeD.js";import{U as m}from"./dist-DDw00TzX.js";import{L as h,b as g,w as _}from"./common-ui.es-DFOzc2ze.js";import{t as v}from"./index-oJ86i_Jb.js";var y={};(function main(e,t,n,r){var i=!!(e.Worker&&e.Blob&&e.Promise&&e.OffscreenCanvas&&e.OffscreenCanvasRenderingContext2D&&e.HTMLCanvasElement&&e.HTMLCanvasElement.prototype.transferControlToOffscreen&&e.URL&&e.URL.createObjectURL),a=typeof Path2D==`function`&&typeof DOMMatrix==`function`,o=(function(){if(!e.OffscreenCanvas)return!1;var t=new OffscreenCanvas(1,1),n=t.getContext(`2d`);n.fillRect(0,0,1,1);var r=t.transferToImageBitmap();try{n.createPattern(r,`no-repeat`)}catch{return!1}return!0})();function noop(){}function promise(n){var r=t.exports.Promise,i=r===void 0?e.Promise:r;return typeof i==`function`?new i(n):(n(noop,noop),null)}var s=(function(e,t){return{transform:function(n){if(e)return n;if(t.has(n))return t.get(n);var r=new OffscreenCanvas(n.width,n.height);return r.getContext(`2d`).drawImage(n,0,0),t.set(n,r),r},clear:function(){t.clear()}}})(o,new Map),c=function(){var e=16,frame,cancel,t={},n=0;return typeof requestAnimationFrame==`function`&&typeof cancelAnimationFrame==`function`?(frame=function(r){var i=Math.random();return t[i]=requestAnimationFrame(function onFrame(a){n===a||n+e-1<a?(n=a,delete t[i],r()):t[i]=requestAnimationFrame(onFrame)}),i},cancel=function(e){t[e]&&cancelAnimationFrame(t[e])}):(frame=function(t){return setTimeout(t,e)},cancel=function(e){return clearTimeout(e)}),{frame,cancel}}(),l=(function(){var e,t,r={};function decorate(e){function execute(t,n){e.postMessage({options:t||{},callback:n})}e.init=function initWorker(t){var n=t.transferControlToOffscreen();e.postMessage({canvas:n},[n])},e.fire=function fireWorker(n,i,a){if(t)return execute(n,null),t;var o=Math.random().toString(36).slice(2);return t=promise(function(i){function workerDone(n){n.data.callback===o&&(delete r[o],e.removeEventListener(`message`,workerDone),t=null,s.clear(),a(),i())}e.addEventListener(`message`,workerDone),execute(n,o),r[o]=workerDone.bind(null,{data:{callback:o}})}),t},e.reset=function resetWorker(){for(var t in e.postMessage({reset:!0}),r)r[t](),delete r[t]}}return function(){if(e)return e;if(!n&&i){var t=[`var CONFETTI, SIZE = {}, module = {};`,`(`+main.toString()+`)(this, module, true, SIZE);`,`onmessage = function(msg) {`,` if (msg.data.options) {`,` CONFETTI(msg.data.options).then(function () {`,` if (msg.data.callback) {`,` postMessage({ callback: msg.data.callback });`,` }`,` });`,` } else if (msg.data.reset) {`,` CONFETTI && CONFETTI.reset();`,` } else if (msg.data.resize) {`,` SIZE.width = msg.data.resize.width;`,` SIZE.height = msg.data.resize.height;`,` } else if (msg.data.canvas) {`,` SIZE.width = msg.data.canvas.width;`,` SIZE.height = msg.data.canvas.height;`,` CONFETTI = module.exports.create(msg.data.canvas);`,` }`,`}`].join(`
|
|
2
|
+
`);try{e=new Worker(URL.createObjectURL(new Blob([t])))}catch(e){return typeof console.warn==`function`&&console.warn(`🎊 Could not load worker`,e),null}decorate(e)}return e}})(),u={particleCount:50,angle:90,spread:45,startVelocity:45,decay:.9,gravity:1,drift:0,ticks:200,x:.5,y:.5,shapes:[`square`,`circle`],zIndex:100,colors:[`#26ccff`,`#a25afd`,`#ff5e7e`,`#88ff5a`,`#fcff42`,`#ffa62d`,`#ff36ff`],disableForReducedMotion:!1,scalar:1};function convert(e,t){return t?t(e):e}function isOk(e){return e!=null}function prop(e,t,n){return convert(e&&isOk(e[t])?e[t]:u[t],n)}function onlyPositiveInt(e){return e<0?0:Math.floor(e)}function randomInt(e,t){return Math.floor(Math.random()*(t-e))+e}function toDecimal(e){return parseInt(e,16)}function colorsToRgb(e){return e.map(hexToRgb)}function hexToRgb(e){var t=String(e).replace(/[^0-9a-f]/gi,``);return t.length<6&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]),{r:toDecimal(t.substring(0,2)),g:toDecimal(t.substring(2,4)),b:toDecimal(t.substring(4,6))}}function getOrigin(e){var t=prop(e,`origin`,Object);return t.x=prop(t,`x`,Number),t.y=prop(t,`y`,Number),t}function setCanvasWindowSize(e){e.width=document.documentElement.clientWidth,e.height=document.documentElement.clientHeight}function setCanvasRectSize(e){var t=e.getBoundingClientRect();e.width=t.width,e.height=t.height}function getCanvas(e){var t=document.createElement(`canvas`);return t.style.position=`fixed`,t.style.top=`0px`,t.style.left=`0px`,t.style.pointerEvents=`none`,t.style.zIndex=e,t}function ellipse(e,t,n,r,i,a,o,s,c){e.save(),e.translate(t,n),e.rotate(a),e.scale(r,i),e.arc(0,0,1,o,s,c),e.restore()}function randomPhysics(e){var t=e.angle*(Math.PI/180),n=e.spread*(Math.PI/180);return{x:e.x,y:e.y,wobble:Math.random()*10,wobbleSpeed:Math.min(.11,Math.random()*.1+.05),velocity:e.startVelocity*.5+Math.random()*e.startVelocity,angle2D:-t+(.5*n-Math.random()*n),tiltAngle:(Math.random()*.5+.25)*Math.PI,color:e.color,shape:e.shape,tick:0,totalTicks:e.ticks,decay:e.decay,drift:e.drift,random:Math.random()+2,tiltSin:0,tiltCos:0,wobbleX:0,wobbleY:0,gravity:e.gravity*3,ovalScalar:.6,scalar:e.scalar,flat:e.flat}}function updateFetti(e,t){t.x+=Math.cos(t.angle2D)*t.velocity+t.drift,t.y+=Math.sin(t.angle2D)*t.velocity+t.gravity,t.velocity*=t.decay,t.flat?(t.wobble=0,t.wobbleX=t.x+10*t.scalar,t.wobbleY=t.y+10*t.scalar,t.tiltSin=0,t.tiltCos=0,t.random=1):(t.wobble+=t.wobbleSpeed,t.wobbleX=t.x+10*t.scalar*Math.cos(t.wobble),t.wobbleY=t.y+10*t.scalar*Math.sin(t.wobble),t.tiltAngle+=.1,t.tiltSin=Math.sin(t.tiltAngle),t.tiltCos=Math.cos(t.tiltAngle),t.random=Math.random()+2);var n=t.tick++/t.totalTicks,r=t.x+t.random*t.tiltCos,i=t.y+t.random*t.tiltSin,o=t.wobbleX+t.random*t.tiltCos,c=t.wobbleY+t.random*t.tiltSin;if(e.fillStyle=`rgba(`+t.color.r+`, `+t.color.g+`, `+t.color.b+`, `+(1-n)+`)`,e.beginPath(),a&&t.shape.type===`path`&&typeof t.shape.path==`string`&&Array.isArray(t.shape.matrix))e.fill(transformPath2D(t.shape.path,t.shape.matrix,t.x,t.y,Math.abs(o-r)*.1,Math.abs(c-i)*.1,Math.PI/10*t.wobble));else if(t.shape.type===`bitmap`){var l=Math.PI/10*t.wobble,u=Math.abs(o-r)*.1,d=Math.abs(c-i)*.1,f=t.shape.bitmap.width*t.scalar,p=t.shape.bitmap.height*t.scalar,m=new DOMMatrix([Math.cos(l)*u,Math.sin(l)*u,-Math.sin(l)*d,Math.cos(l)*d,t.x,t.y]);m.multiplySelf(new DOMMatrix(t.shape.matrix));var h=e.createPattern(s.transform(t.shape.bitmap),`no-repeat`);h.setTransform(m),e.globalAlpha=1-n,e.fillStyle=h,e.fillRect(t.x-f/2,t.y-p/2,f,p),e.globalAlpha=1}else if(t.shape===`circle`)e.ellipse?e.ellipse(t.x,t.y,Math.abs(o-r)*t.ovalScalar,Math.abs(c-i)*t.ovalScalar,Math.PI/10*t.wobble,0,2*Math.PI):ellipse(e,t.x,t.y,Math.abs(o-r)*t.ovalScalar,Math.abs(c-i)*t.ovalScalar,Math.PI/10*t.wobble,0,2*Math.PI);else if(t.shape===`star`)for(var g=Math.PI/2*3,_=4*t.scalar,v=8*t.scalar,y=t.x,b=t.y,x=5,S=Math.PI/x;x--;)y=t.x+Math.cos(g)*v,b=t.y+Math.sin(g)*v,e.lineTo(y,b),g+=S,y=t.x+Math.cos(g)*_,b=t.y+Math.sin(g)*_,e.lineTo(y,b),g+=S;else e.moveTo(Math.floor(t.x),Math.floor(t.y)),e.lineTo(Math.floor(t.wobbleX),Math.floor(i)),e.lineTo(Math.floor(o),Math.floor(c)),e.lineTo(Math.floor(r),Math.floor(t.wobbleY));return e.closePath(),e.fill(),t.tick<t.totalTicks}function animate(e,t,i,a,o){var l=t.slice(),u=e.getContext(`2d`),d,f,p=promise(function(t){function onDone(){d=f=null,u.clearRect(0,0,a.width,a.height),s.clear(),o(),t()}function update(){n&&!(a.width===r.width&&a.height===r.height)&&(a.width=e.width=r.width,a.height=e.height=r.height),!a.width&&!a.height&&(i(e),a.width=e.width,a.height=e.height),u.clearRect(0,0,a.width,a.height),l=l.filter(function(e){return updateFetti(u,e)}),l.length?d=c.frame(update):onDone()}d=c.frame(update),f=onDone});return{addFettis:function(e){return l=l.concat(e),p},canvas:e,promise:p,reset:function(){d&&c.cancel(d),f&&f()}}}function confettiCannon(t,n){var r=!t,a=!!prop(n||{},`resize`),o=!1,s=prop(n,`disableForReducedMotion`,Boolean),c=i&&prop(n||{},`useWorker`)?l():null,u=r?setCanvasWindowSize:setCanvasRectSize,d=t&&c?!!t.__confetti_initialized:!1,f=typeof matchMedia==`function`&&matchMedia(`(prefers-reduced-motion)`).matches,p;function fireLocal(e,n,r){for(var i=prop(e,`particleCount`,onlyPositiveInt),a=prop(e,`angle`,Number),o=prop(e,`spread`,Number),s=prop(e,`startVelocity`,Number),c=prop(e,`decay`,Number),l=prop(e,`gravity`,Number),d=prop(e,`drift`,Number),f=prop(e,`colors`,colorsToRgb),m=prop(e,`ticks`,Number),h=prop(e,`shapes`),g=prop(e,`scalar`),_=!!prop(e,`flat`),v=getOrigin(e),y=i,b=[],x=t.width*v.x,S=t.height*v.y;y--;)b.push(randomPhysics({x,y:S,angle:a,spread:o,startVelocity:s,color:f[y%f.length],shape:h[randomInt(0,h.length)],ticks:m,decay:c,gravity:l,drift:d,scalar:g,flat:_}));return p?p.addFettis(b):(p=animate(t,b,u,n,r),p.promise)}function fire(n){var i=s||prop(n,`disableForReducedMotion`,Boolean),l=prop(n,`zIndex`,Number);if(i&&f)return promise(function(e){e()});r&&p?t=p.canvas:r&&!t&&(t=getCanvas(l),document.body.appendChild(t)),a&&!d&&u(t);var m={width:t.width,height:t.height};c&&!d&&c.init(t),d=!0,c&&(t.__confetti_initialized=!0);function onResize(){if(c){var e={getBoundingClientRect:function(){if(!r)return t.getBoundingClientRect()}};u(e),c.postMessage({resize:{width:e.width,height:e.height}});return}m.width=m.height=null}function done(){p=null,a&&(o=!1,e.removeEventListener(`resize`,onResize)),r&&t&&(document.body.contains(t)&&document.body.removeChild(t),t=null,d=!1)}return a&&!o&&(o=!0,e.addEventListener(`resize`,onResize,!1)),c?c.fire(n,m,done):fireLocal(n,m,done)}return fire.reset=function(){c&&c.reset(),p&&p.reset()},fire}var d;function getDefaultFire(){return d||(d=confettiCannon(null,{useWorker:!0,resize:!0})),d}function transformPath2D(e,t,n,r,i,a,o){var s=new Path2D(e),c=new Path2D;c.addPath(s,new DOMMatrix(t));var l=new Path2D;return l.addPath(c,new DOMMatrix([Math.cos(o)*i,Math.sin(o)*i,-Math.sin(o)*a,Math.cos(o)*a,n,r])),l}function shapeFromPath(e){if(!a)throw Error(`path confetti are not supported in this browser`);var t,n;typeof e==`string`?t=e:(t=e.path,n=e.matrix);var r=new Path2D(t),i=document.createElement(`canvas`).getContext(`2d`);if(!n){for(var o=1e3,s=o,c=o,l=0,u=0,d,f,p=0;p<o;p+=2)for(var m=0;m<o;m+=2)i.isPointInPath(r,p,m,`nonzero`)&&(s=Math.min(s,p),c=Math.min(c,m),l=Math.max(l,p),u=Math.max(u,m));d=l-s,f=u-c;var h=10,g=Math.min(h/d,h/f);n=[g,0,0,g,-Math.round(d/2+s)*g,-Math.round(f/2+c)*g]}return{type:`path`,path:t,matrix:n}}function shapeFromText(e){var t,n=1,r=`#000000`,i=`"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji", "EmojiOne Color", "Android Emoji", "Twemoji Mozilla", "system emoji", sans-serif`;typeof e==`string`?t=e:(t=e.text,n=`scalar`in e?e.scalar:n,i=`fontFamily`in e?e.fontFamily:i,r=`color`in e?e.color:r);var a=10*n,o=``+a+`px `+i,s=new OffscreenCanvas(a,a),c=s.getContext(`2d`);c.font=o;var l=c.measureText(t),u=Math.ceil(l.actualBoundingBoxRight+l.actualBoundingBoxLeft),d=Math.ceil(l.actualBoundingBoxAscent+l.actualBoundingBoxDescent),f=2,p=l.actualBoundingBoxLeft+f,m=l.actualBoundingBoxAscent+f;u+=f+f,d+=f+f,s=new OffscreenCanvas(u,d),c=s.getContext(`2d`),c.font=o,c.fillStyle=r,c.fillText(t,p,m);var h=1/n;return{type:`bitmap`,bitmap:s.transferToImageBitmap(),matrix:[h,0,0,h,-u*h/2,-d*h/2]}}t.exports=function(){return getDefaultFire().apply(this,arguments)},t.exports.reset=function(){getDefaultFire().reset()},t.exports.create=confettiCannon,t.exports.shapeFromPath=shapeFromPath,t.exports.shapeFromText=shapeFromText})((function(){return typeof window<`u`?window:typeof self<`u`?self:this||{}})(),y,!1);var b=y.exports;y.exports.create;var x=s({name:`UserSettings`,components:{UserTagPreferences:g},props:{username:{type:String,required:!0}},setup(){let e=h(),t=p();return{configStore:e,darkMode:e.config.darkMode,likesConfetti:e.config.likesConfetti,route:t,isNewUser:t.path.endsWith(`new`)}},data(){return{u:{},configLanguages:[{name:`English`,code:`en`},{name:`French`,code:`fr`}],selectedLanguages:[],registeredCourses:[],selectedCourseId:``}},async created(){this.u=await _(),this.configLanguages.forEach(e=>{console.log(`afweatifvwzeatfvwzeta`+e.name)}),await this.loadRegisteredCourses()},methods:{updateDark(){this.configStore.updateDarkMode(this.configStore.config.darkMode)},updateConfetti(){this.configStore.updateLikesConfetti(this.configStore.config.likesConfetti),this.configStore.config.likesConfetti&&b({origin:{x:.5,y:1}})},async loadRegisteredCourses(){try{let e=await this.u.getActiveCourses(),t=m();this.registeredCourses=(await Promise.all(e.map(async e=>{try{return await t.getCourseDB(e.courseID).getCourseConfig()}catch{return{courseID:e.courseID,name:e.courseID}}}))).filter(Boolean)}catch(e){console.error(`Failed to load registered courses:`,e)}},onPreferencesSaved(){console.log(`Preferences saved for course:`,this.selectedCourseId)}}}),S={class:`text-subtitle-1`};function _sfc_render(s,p,m,h,g,_){let v=i(`v-alert`),y=i(`v-checkbox`),b=i(`v-divider`),x=i(`v-list-item`),C=i(`v-select`),w=i(`user-tag-preferences`);return r(),u(`div`,S,[s.isNewUser?(r(),d(v,{key:0,type:`success`,class:`text-subtitle-1`,variant:`tonal`,"prepend-icon":`mdi-check`},{default:e(()=>[o(` Welcome, `+c(s.username)+`! Please take a moment to look through these settings: `,1)]),_:1})):f(``,!0),p[3]||(p[3]=l(`h1`,{class:`text-h3`},`Account Settings`,-1)),p[4]||(p[4]=l(`h2`,{class:`text-h4`},`General:`,-1)),t(y,{modelValue:s.configStore.config.likesConfetti,"onUpdate:modelValue":[p[0]||(p[0]=e=>s.configStore.config.likesConfetti=e),s.updateConfetti],label:`I like confetti`},null,8,[`modelValue`,`onUpdate:modelValue`]),t(y,{modelValue:s.configStore.config.darkMode,"onUpdate:modelValue":[p[1]||(p[1]=e=>s.configStore.config.darkMode=e),s.updateDark],label:`I like the dark`},null,8,[`modelValue`,`onUpdate:modelValue`]),t(b,{class:`my-6`}),p[5]||(p[5]=l(`h2`,{class:`text-h4 mb-4`},`Learning Preferences:`,-1)),p[6]||(p[6]=l(`p`,{class:`text-body-2 text-medium-emphasis mb-4`},`Customize how content is presented in your registered courses.`,-1)),t(C,{modelValue:s.selectedCourseId,"onUpdate:modelValue":p[2]||(p[2]=e=>s.selectedCourseId=e),items:s.registeredCourses,"item-title":`name`,"item-value":`courseID`,label:`Select a course`,variant:`outlined`,density:`comfortable`,class:`mb-4`,style:{"max-width":`400px`}},{item:e(({props:r,item:i})=>[t(x,a(n(r)),{subtitle:e(()=>[o(c(i.raw.courseID),1)]),_:2},1040)]),_:1},8,[`modelValue`,`items`]),s.selectedCourseId?(r(),d(w,{key:1,"course-id":s.selectedCourseId,onPreferencesSaved:s.onPreferencesSaved},null,8,[`course-id`,`onPreferencesSaved`])):f(``,!0)])}var C=v(x,[[`render`,_sfc_render]]);export{C as default};
|
|
3
|
+
//# sourceMappingURL=User-dB5PO1RG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"User-Bz1YIJpG.js","names":[],"sources":["../../../../node_modules/canvas-confetti/dist/confetti.module.mjs","../../src/views/User.vue","../../src/views/User.vue"],"sourcesContent":["// canvas-confetti v1.9.3 built on 2024-04-30T22:19:17.794Z\nvar module = {};\n\n// source content\n/* globals Map */\n\n(function main(global, module, isWorker, workerSize) {\n var canUseWorker = !!(\n global.Worker &&\n global.Blob &&\n global.Promise &&\n global.OffscreenCanvas &&\n global.OffscreenCanvasRenderingContext2D &&\n global.HTMLCanvasElement &&\n global.HTMLCanvasElement.prototype.transferControlToOffscreen &&\n global.URL &&\n global.URL.createObjectURL);\n\n var canUsePaths = typeof Path2D === 'function' && typeof DOMMatrix === 'function';\n var canDrawBitmap = (function () {\n // this mostly supports ssr\n if (!global.OffscreenCanvas) {\n return false;\n }\n\n var canvas = new OffscreenCanvas(1, 1);\n var ctx = canvas.getContext('2d');\n ctx.fillRect(0, 0, 1, 1);\n var bitmap = canvas.transferToImageBitmap();\n\n try {\n ctx.createPattern(bitmap, 'no-repeat');\n } catch (e) {\n return false;\n }\n\n return true;\n })();\n\n function noop() {}\n\n // create a promise if it exists, otherwise, just\n // call the function directly\n function promise(func) {\n var ModulePromise = module.exports.Promise;\n var Prom = ModulePromise !== void 0 ? ModulePromise : global.Promise;\n\n if (typeof Prom === 'function') {\n return new Prom(func);\n }\n\n func(noop, noop);\n\n return null;\n }\n\n var bitmapMapper = (function (skipTransform, map) {\n // see https://github.com/catdad/canvas-confetti/issues/209\n // creating canvases is actually pretty expensive, so we should create a\n // 1:1 map for bitmap:canvas, so that we can animate the confetti in\n // a performant manner, but also not store them forever so that we don't\n // have a memory leak\n return {\n transform: function(bitmap) {\n if (skipTransform) {\n return bitmap;\n }\n\n if (map.has(bitmap)) {\n return map.get(bitmap);\n }\n\n var canvas = new OffscreenCanvas(bitmap.width, bitmap.height);\n var ctx = canvas.getContext('2d');\n ctx.drawImage(bitmap, 0, 0);\n\n map.set(bitmap, canvas);\n\n return canvas;\n },\n clear: function () {\n map.clear();\n }\n };\n })(canDrawBitmap, new Map());\n\n var raf = (function () {\n var TIME = Math.floor(1000 / 60);\n var frame, cancel;\n var frames = {};\n var lastFrameTime = 0;\n\n if (typeof requestAnimationFrame === 'function' && typeof cancelAnimationFrame === 'function') {\n frame = function (cb) {\n var id = Math.random();\n\n frames[id] = requestAnimationFrame(function onFrame(time) {\n if (lastFrameTime === time || lastFrameTime + TIME - 1 < time) {\n lastFrameTime = time;\n delete frames[id];\n\n cb();\n } else {\n frames[id] = requestAnimationFrame(onFrame);\n }\n });\n\n return id;\n };\n cancel = function (id) {\n if (frames[id]) {\n cancelAnimationFrame(frames[id]);\n }\n };\n } else {\n frame = function (cb) {\n return setTimeout(cb, TIME);\n };\n cancel = function (timer) {\n return clearTimeout(timer);\n };\n }\n\n return { frame: frame, cancel: cancel };\n }());\n\n var getWorker = (function () {\n var worker;\n var prom;\n var resolves = {};\n\n function decorate(worker) {\n function execute(options, callback) {\n worker.postMessage({ options: options || {}, callback: callback });\n }\n worker.init = function initWorker(canvas) {\n var offscreen = canvas.transferControlToOffscreen();\n worker.postMessage({ canvas: offscreen }, [offscreen]);\n };\n\n worker.fire = function fireWorker(options, size, done) {\n if (prom) {\n execute(options, null);\n return prom;\n }\n\n var id = Math.random().toString(36).slice(2);\n\n prom = promise(function (resolve) {\n function workerDone(msg) {\n if (msg.data.callback !== id) {\n return;\n }\n\n delete resolves[id];\n worker.removeEventListener('message', workerDone);\n\n prom = null;\n\n bitmapMapper.clear();\n\n done();\n resolve();\n }\n\n worker.addEventListener('message', workerDone);\n execute(options, id);\n\n resolves[id] = workerDone.bind(null, { data: { callback: id }});\n });\n\n return prom;\n };\n\n worker.reset = function resetWorker() {\n worker.postMessage({ reset: true });\n\n for (var id in resolves) {\n resolves[id]();\n delete resolves[id];\n }\n };\n }\n\n return function () {\n if (worker) {\n return worker;\n }\n\n if (!isWorker && canUseWorker) {\n var code = [\n 'var CONFETTI, SIZE = {}, module = {};',\n '(' + main.toString() + ')(this, module, true, SIZE);',\n 'onmessage = function(msg) {',\n ' if (msg.data.options) {',\n ' CONFETTI(msg.data.options).then(function () {',\n ' if (msg.data.callback) {',\n ' postMessage({ callback: msg.data.callback });',\n ' }',\n ' });',\n ' } else if (msg.data.reset) {',\n ' CONFETTI && CONFETTI.reset();',\n ' } else if (msg.data.resize) {',\n ' SIZE.width = msg.data.resize.width;',\n ' SIZE.height = msg.data.resize.height;',\n ' } else if (msg.data.canvas) {',\n ' SIZE.width = msg.data.canvas.width;',\n ' SIZE.height = msg.data.canvas.height;',\n ' CONFETTI = module.exports.create(msg.data.canvas);',\n ' }',\n '}',\n ].join('\\n');\n try {\n worker = new Worker(URL.createObjectURL(new Blob([code])));\n } catch (e) {\n // eslint-disable-next-line no-console\n typeof console !== undefined && typeof console.warn === 'function' ? console.warn('🎊 Could not load worker', e) : null;\n\n return null;\n }\n\n decorate(worker);\n }\n\n return worker;\n };\n })();\n\n var defaults = {\n particleCount: 50,\n angle: 90,\n spread: 45,\n startVelocity: 45,\n decay: 0.9,\n gravity: 1,\n drift: 0,\n ticks: 200,\n x: 0.5,\n y: 0.5,\n shapes: ['square', 'circle'],\n zIndex: 100,\n colors: [\n '#26ccff',\n '#a25afd',\n '#ff5e7e',\n '#88ff5a',\n '#fcff42',\n '#ffa62d',\n '#ff36ff'\n ],\n // probably should be true, but back-compat\n disableForReducedMotion: false,\n scalar: 1\n };\n\n function convert(val, transform) {\n return transform ? transform(val) : val;\n }\n\n function isOk(val) {\n return !(val === null || val === undefined);\n }\n\n function prop(options, name, transform) {\n return convert(\n options && isOk(options[name]) ? options[name] : defaults[name],\n transform\n );\n }\n\n function onlyPositiveInt(number){\n return number < 0 ? 0 : Math.floor(number);\n }\n\n function randomInt(min, max) {\n // [min, max)\n return Math.floor(Math.random() * (max - min)) + min;\n }\n\n function toDecimal(str) {\n return parseInt(str, 16);\n }\n\n function colorsToRgb(colors) {\n return colors.map(hexToRgb);\n }\n\n function hexToRgb(str) {\n var val = String(str).replace(/[^0-9a-f]/gi, '');\n\n if (val.length < 6) {\n val = val[0]+val[0]+val[1]+val[1]+val[2]+val[2];\n }\n\n return {\n r: toDecimal(val.substring(0,2)),\n g: toDecimal(val.substring(2,4)),\n b: toDecimal(val.substring(4,6))\n };\n }\n\n function getOrigin(options) {\n var origin = prop(options, 'origin', Object);\n origin.x = prop(origin, 'x', Number);\n origin.y = prop(origin, 'y', Number);\n\n return origin;\n }\n\n function setCanvasWindowSize(canvas) {\n canvas.width = document.documentElement.clientWidth;\n canvas.height = document.documentElement.clientHeight;\n }\n\n function setCanvasRectSize(canvas) {\n var rect = canvas.getBoundingClientRect();\n canvas.width = rect.width;\n canvas.height = rect.height;\n }\n\n function getCanvas(zIndex) {\n var canvas = document.createElement('canvas');\n\n canvas.style.position = 'fixed';\n canvas.style.top = '0px';\n canvas.style.left = '0px';\n canvas.style.pointerEvents = 'none';\n canvas.style.zIndex = zIndex;\n\n return canvas;\n }\n\n function ellipse(context, x, y, radiusX, radiusY, rotation, startAngle, endAngle, antiClockwise) {\n context.save();\n context.translate(x, y);\n context.rotate(rotation);\n context.scale(radiusX, radiusY);\n context.arc(0, 0, 1, startAngle, endAngle, antiClockwise);\n context.restore();\n }\n\n function randomPhysics(opts) {\n var radAngle = opts.angle * (Math.PI / 180);\n var radSpread = opts.spread * (Math.PI / 180);\n\n return {\n x: opts.x,\n y: opts.y,\n wobble: Math.random() * 10,\n wobbleSpeed: Math.min(0.11, Math.random() * 0.1 + 0.05),\n velocity: (opts.startVelocity * 0.5) + (Math.random() * opts.startVelocity),\n angle2D: -radAngle + ((0.5 * radSpread) - (Math.random() * radSpread)),\n tiltAngle: (Math.random() * (0.75 - 0.25) + 0.25) * Math.PI,\n color: opts.color,\n shape: opts.shape,\n tick: 0,\n totalTicks: opts.ticks,\n decay: opts.decay,\n drift: opts.drift,\n random: Math.random() + 2,\n tiltSin: 0,\n tiltCos: 0,\n wobbleX: 0,\n wobbleY: 0,\n gravity: opts.gravity * 3,\n ovalScalar: 0.6,\n scalar: opts.scalar,\n flat: opts.flat\n };\n }\n\n function updateFetti(context, fetti) {\n fetti.x += Math.cos(fetti.angle2D) * fetti.velocity + fetti.drift;\n fetti.y += Math.sin(fetti.angle2D) * fetti.velocity + fetti.gravity;\n fetti.velocity *= fetti.decay;\n\n if (fetti.flat) {\n fetti.wobble = 0;\n fetti.wobbleX = fetti.x + (10 * fetti.scalar);\n fetti.wobbleY = fetti.y + (10 * fetti.scalar);\n\n fetti.tiltSin = 0;\n fetti.tiltCos = 0;\n fetti.random = 1;\n } else {\n fetti.wobble += fetti.wobbleSpeed;\n fetti.wobbleX = fetti.x + ((10 * fetti.scalar) * Math.cos(fetti.wobble));\n fetti.wobbleY = fetti.y + ((10 * fetti.scalar) * Math.sin(fetti.wobble));\n\n fetti.tiltAngle += 0.1;\n fetti.tiltSin = Math.sin(fetti.tiltAngle);\n fetti.tiltCos = Math.cos(fetti.tiltAngle);\n fetti.random = Math.random() + 2;\n }\n\n var progress = (fetti.tick++) / fetti.totalTicks;\n\n var x1 = fetti.x + (fetti.random * fetti.tiltCos);\n var y1 = fetti.y + (fetti.random * fetti.tiltSin);\n var x2 = fetti.wobbleX + (fetti.random * fetti.tiltCos);\n var y2 = fetti.wobbleY + (fetti.random * fetti.tiltSin);\n\n context.fillStyle = 'rgba(' + fetti.color.r + ', ' + fetti.color.g + ', ' + fetti.color.b + ', ' + (1 - progress) + ')';\n\n context.beginPath();\n\n if (canUsePaths && fetti.shape.type === 'path' && typeof fetti.shape.path === 'string' && Array.isArray(fetti.shape.matrix)) {\n context.fill(transformPath2D(\n fetti.shape.path,\n fetti.shape.matrix,\n fetti.x,\n fetti.y,\n Math.abs(x2 - x1) * 0.1,\n Math.abs(y2 - y1) * 0.1,\n Math.PI / 10 * fetti.wobble\n ));\n } else if (fetti.shape.type === 'bitmap') {\n var rotation = Math.PI / 10 * fetti.wobble;\n var scaleX = Math.abs(x2 - x1) * 0.1;\n var scaleY = Math.abs(y2 - y1) * 0.1;\n var width = fetti.shape.bitmap.width * fetti.scalar;\n var height = fetti.shape.bitmap.height * fetti.scalar;\n\n var matrix = new DOMMatrix([\n Math.cos(rotation) * scaleX,\n Math.sin(rotation) * scaleX,\n -Math.sin(rotation) * scaleY,\n Math.cos(rotation) * scaleY,\n fetti.x,\n fetti.y\n ]);\n\n // apply the transform matrix from the confetti shape\n matrix.multiplySelf(new DOMMatrix(fetti.shape.matrix));\n\n var pattern = context.createPattern(bitmapMapper.transform(fetti.shape.bitmap), 'no-repeat');\n pattern.setTransform(matrix);\n\n context.globalAlpha = (1 - progress);\n context.fillStyle = pattern;\n context.fillRect(\n fetti.x - (width / 2),\n fetti.y - (height / 2),\n width,\n height\n );\n context.globalAlpha = 1;\n } else if (fetti.shape === 'circle') {\n context.ellipse ?\n context.ellipse(fetti.x, fetti.y, Math.abs(x2 - x1) * fetti.ovalScalar, Math.abs(y2 - y1) * fetti.ovalScalar, Math.PI / 10 * fetti.wobble, 0, 2 * Math.PI) :\n ellipse(context, fetti.x, fetti.y, Math.abs(x2 - x1) * fetti.ovalScalar, Math.abs(y2 - y1) * fetti.ovalScalar, Math.PI / 10 * fetti.wobble, 0, 2 * Math.PI);\n } else if (fetti.shape === 'star') {\n var rot = Math.PI / 2 * 3;\n var innerRadius = 4 * fetti.scalar;\n var outerRadius = 8 * fetti.scalar;\n var x = fetti.x;\n var y = fetti.y;\n var spikes = 5;\n var step = Math.PI / spikes;\n\n while (spikes--) {\n x = fetti.x + Math.cos(rot) * outerRadius;\n y = fetti.y + Math.sin(rot) * outerRadius;\n context.lineTo(x, y);\n rot += step;\n\n x = fetti.x + Math.cos(rot) * innerRadius;\n y = fetti.y + Math.sin(rot) * innerRadius;\n context.lineTo(x, y);\n rot += step;\n }\n } else {\n context.moveTo(Math.floor(fetti.x), Math.floor(fetti.y));\n context.lineTo(Math.floor(fetti.wobbleX), Math.floor(y1));\n context.lineTo(Math.floor(x2), Math.floor(y2));\n context.lineTo(Math.floor(x1), Math.floor(fetti.wobbleY));\n }\n\n context.closePath();\n context.fill();\n\n return fetti.tick < fetti.totalTicks;\n }\n\n function animate(canvas, fettis, resizer, size, done) {\n var animatingFettis = fettis.slice();\n var context = canvas.getContext('2d');\n var animationFrame;\n var destroy;\n\n var prom = promise(function (resolve) {\n function onDone() {\n animationFrame = destroy = null;\n\n context.clearRect(0, 0, size.width, size.height);\n bitmapMapper.clear();\n\n done();\n resolve();\n }\n\n function update() {\n if (isWorker && !(size.width === workerSize.width && size.height === workerSize.height)) {\n size.width = canvas.width = workerSize.width;\n size.height = canvas.height = workerSize.height;\n }\n\n if (!size.width && !size.height) {\n resizer(canvas);\n size.width = canvas.width;\n size.height = canvas.height;\n }\n\n context.clearRect(0, 0, size.width, size.height);\n\n animatingFettis = animatingFettis.filter(function (fetti) {\n return updateFetti(context, fetti);\n });\n\n if (animatingFettis.length) {\n animationFrame = raf.frame(update);\n } else {\n onDone();\n }\n }\n\n animationFrame = raf.frame(update);\n destroy = onDone;\n });\n\n return {\n addFettis: function (fettis) {\n animatingFettis = animatingFettis.concat(fettis);\n\n return prom;\n },\n canvas: canvas,\n promise: prom,\n reset: function () {\n if (animationFrame) {\n raf.cancel(animationFrame);\n }\n\n if (destroy) {\n destroy();\n }\n }\n };\n }\n\n function confettiCannon(canvas, globalOpts) {\n var isLibCanvas = !canvas;\n var allowResize = !!prop(globalOpts || {}, 'resize');\n var hasResizeEventRegistered = false;\n var globalDisableForReducedMotion = prop(globalOpts, 'disableForReducedMotion', Boolean);\n var shouldUseWorker = canUseWorker && !!prop(globalOpts || {}, 'useWorker');\n var worker = shouldUseWorker ? getWorker() : null;\n var resizer = isLibCanvas ? setCanvasWindowSize : setCanvasRectSize;\n var initialized = (canvas && worker) ? !!canvas.__confetti_initialized : false;\n var preferLessMotion = typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion)').matches;\n var animationObj;\n\n function fireLocal(options, size, done) {\n var particleCount = prop(options, 'particleCount', onlyPositiveInt);\n var angle = prop(options, 'angle', Number);\n var spread = prop(options, 'spread', Number);\n var startVelocity = prop(options, 'startVelocity', Number);\n var decay = prop(options, 'decay', Number);\n var gravity = prop(options, 'gravity', Number);\n var drift = prop(options, 'drift', Number);\n var colors = prop(options, 'colors', colorsToRgb);\n var ticks = prop(options, 'ticks', Number);\n var shapes = prop(options, 'shapes');\n var scalar = prop(options, 'scalar');\n var flat = !!prop(options, 'flat');\n var origin = getOrigin(options);\n\n var temp = particleCount;\n var fettis = [];\n\n var startX = canvas.width * origin.x;\n var startY = canvas.height * origin.y;\n\n while (temp--) {\n fettis.push(\n randomPhysics({\n x: startX,\n y: startY,\n angle: angle,\n spread: spread,\n startVelocity: startVelocity,\n color: colors[temp % colors.length],\n shape: shapes[randomInt(0, shapes.length)],\n ticks: ticks,\n decay: decay,\n gravity: gravity,\n drift: drift,\n scalar: scalar,\n flat: flat\n })\n );\n }\n\n // if we have a previous canvas already animating,\n // add to it\n if (animationObj) {\n return animationObj.addFettis(fettis);\n }\n\n animationObj = animate(canvas, fettis, resizer, size , done);\n\n return animationObj.promise;\n }\n\n function fire(options) {\n var disableForReducedMotion = globalDisableForReducedMotion || prop(options, 'disableForReducedMotion', Boolean);\n var zIndex = prop(options, 'zIndex', Number);\n\n if (disableForReducedMotion && preferLessMotion) {\n return promise(function (resolve) {\n resolve();\n });\n }\n\n if (isLibCanvas && animationObj) {\n // use existing canvas from in-progress animation\n canvas = animationObj.canvas;\n } else if (isLibCanvas && !canvas) {\n // create and initialize a new canvas\n canvas = getCanvas(zIndex);\n document.body.appendChild(canvas);\n }\n\n if (allowResize && !initialized) {\n // initialize the size of a user-supplied canvas\n resizer(canvas);\n }\n\n var size = {\n width: canvas.width,\n height: canvas.height\n };\n\n if (worker && !initialized) {\n worker.init(canvas);\n }\n\n initialized = true;\n\n if (worker) {\n canvas.__confetti_initialized = true;\n }\n\n function onResize() {\n if (worker) {\n // TODO this really shouldn't be immediate, because it is expensive\n var obj = {\n getBoundingClientRect: function () {\n if (!isLibCanvas) {\n return canvas.getBoundingClientRect();\n }\n }\n };\n\n resizer(obj);\n\n worker.postMessage({\n resize: {\n width: obj.width,\n height: obj.height\n }\n });\n return;\n }\n\n // don't actually query the size here, since this\n // can execute frequently and rapidly\n size.width = size.height = null;\n }\n\n function done() {\n animationObj = null;\n\n if (allowResize) {\n hasResizeEventRegistered = false;\n global.removeEventListener('resize', onResize);\n }\n\n if (isLibCanvas && canvas) {\n if (document.body.contains(canvas)) {\n document.body.removeChild(canvas); \n }\n canvas = null;\n initialized = false;\n }\n }\n\n if (allowResize && !hasResizeEventRegistered) {\n hasResizeEventRegistered = true;\n global.addEventListener('resize', onResize, false);\n }\n\n if (worker) {\n return worker.fire(options, size, done);\n }\n\n return fireLocal(options, size, done);\n }\n\n fire.reset = function () {\n if (worker) {\n worker.reset();\n }\n\n if (animationObj) {\n animationObj.reset();\n }\n };\n\n return fire;\n }\n\n // Make default export lazy to defer worker creation until called.\n var defaultFire;\n function getDefaultFire() {\n if (!defaultFire) {\n defaultFire = confettiCannon(null, { useWorker: true, resize: true });\n }\n return defaultFire;\n }\n\n function transformPath2D(pathString, pathMatrix, x, y, scaleX, scaleY, rotation) {\n var path2d = new Path2D(pathString);\n\n var t1 = new Path2D();\n t1.addPath(path2d, new DOMMatrix(pathMatrix));\n\n var t2 = new Path2D();\n // see https://developer.mozilla.org/en-US/docs/Web/API/DOMMatrix/DOMMatrix\n t2.addPath(t1, new DOMMatrix([\n Math.cos(rotation) * scaleX,\n Math.sin(rotation) * scaleX,\n -Math.sin(rotation) * scaleY,\n Math.cos(rotation) * scaleY,\n x,\n y\n ]));\n\n return t2;\n }\n\n function shapeFromPath(pathData) {\n if (!canUsePaths) {\n throw new Error('path confetti are not supported in this browser');\n }\n\n var path, matrix;\n\n if (typeof pathData === 'string') {\n path = pathData;\n } else {\n path = pathData.path;\n matrix = pathData.matrix;\n }\n\n var path2d = new Path2D(path);\n var tempCanvas = document.createElement('canvas');\n var tempCtx = tempCanvas.getContext('2d');\n\n if (!matrix) {\n // attempt to figure out the width of the path, up to 1000x1000\n var maxSize = 1000;\n var minX = maxSize;\n var minY = maxSize;\n var maxX = 0;\n var maxY = 0;\n var width, height;\n\n // do some line skipping... this is faster than checking\n // every pixel and will be mostly still correct\n for (var x = 0; x < maxSize; x += 2) {\n for (var y = 0; y < maxSize; y += 2) {\n if (tempCtx.isPointInPath(path2d, x, y, 'nonzero')) {\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x);\n maxY = Math.max(maxY, y);\n }\n }\n }\n\n width = maxX - minX;\n height = maxY - minY;\n\n var maxDesiredSize = 10;\n var scale = Math.min(maxDesiredSize/width, maxDesiredSize/height);\n\n matrix = [\n scale, 0, 0, scale,\n -Math.round((width/2) + minX) * scale,\n -Math.round((height/2) + minY) * scale\n ];\n }\n\n return {\n type: 'path',\n path: path,\n matrix: matrix\n };\n }\n\n function shapeFromText(textData) {\n var text,\n scalar = 1,\n color = '#000000',\n // see https://nolanlawson.com/2022/04/08/the-struggle-of-using-native-emoji-on-the-web/\n fontFamily = '\"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\", \"EmojiOne Color\", \"Android Emoji\", \"Twemoji Mozilla\", \"system emoji\", sans-serif';\n\n if (typeof textData === 'string') {\n text = textData;\n } else {\n text = textData.text;\n scalar = 'scalar' in textData ? textData.scalar : scalar;\n fontFamily = 'fontFamily' in textData ? textData.fontFamily : fontFamily;\n color = 'color' in textData ? textData.color : color;\n }\n\n // all other confetti are 10 pixels,\n // so this pixel size is the de-facto 100% scale confetti\n var fontSize = 10 * scalar;\n var font = '' + fontSize + 'px ' + fontFamily;\n\n var canvas = new OffscreenCanvas(fontSize, fontSize);\n var ctx = canvas.getContext('2d');\n\n ctx.font = font;\n var size = ctx.measureText(text);\n var width = Math.ceil(size.actualBoundingBoxRight + size.actualBoundingBoxLeft);\n var height = Math.ceil(size.actualBoundingBoxAscent + size.actualBoundingBoxDescent);\n\n var padding = 2;\n var x = size.actualBoundingBoxLeft + padding;\n var y = size.actualBoundingBoxAscent + padding;\n width += padding + padding;\n height += padding + padding;\n\n canvas = new OffscreenCanvas(width, height);\n ctx = canvas.getContext('2d');\n ctx.font = font;\n ctx.fillStyle = color;\n\n ctx.fillText(text, x, y);\n\n var scale = 1 / scalar;\n\n return {\n type: 'bitmap',\n // TODO these probably need to be transfered for workers\n bitmap: canvas.transferToImageBitmap(),\n matrix: [scale, 0, 0, scale, -width * scale / 2, -height * scale / 2]\n };\n }\n\n module.exports = function() {\n return getDefaultFire().apply(this, arguments);\n };\n module.exports.reset = function() {\n getDefaultFire().reset();\n };\n module.exports.create = confettiCannon;\n module.exports.shapeFromPath = shapeFromPath;\n module.exports.shapeFromText = shapeFromText;\n}((function () {\n if (typeof window !== 'undefined') {\n return window;\n }\n\n if (typeof self !== 'undefined') {\n return self;\n }\n\n return this || {};\n})(), module, false));\n\n// end source content\n\nexport default module.exports;\nexport var create = module.exports.create;\n","<template>\n <div class=\"text-subtitle-1\">\n <v-alert v-if=\"isNewUser\" type=\"success\" class=\"text-subtitle-1\" variant=\"tonal\" :prepend-icon=\"'mdi-check'\">\n Welcome, {{ username }}! Please take a moment to look through these settings:\n </v-alert>\n\n <h1 class=\"text-h3\">Account Settings</h1>\n <h2 class=\"text-h4\">General:</h2>\n\n <v-checkbox\n v-model=\"configStore.config.likesConfetti\"\n label=\"I like confetti\"\n @update:model-value=\"updateConfetti\"\n />\n <v-checkbox v-model=\"configStore.config.darkMode\" label=\"I like the dark\" @update:model-value=\"updateDark\" />\n <!-- <h2 class=\"text-h4\">Languages:</h2>\n I am near-fluent or better in the following languages:\n {{ selectedLanguages.toString() }}\n <v-checkbox\n v-for=\"(language, i) in configLanguages\"\n :key=\"i\"\n :label=\"language.name\"\n :value=\"language.code\"\n v-model=\"selectedLanguages\"\n @update:model-value=\"updateLanguage\"\n /> -->\n\n <v-divider class=\"my-6\" />\n\n <h2 class=\"text-h4 mb-4\">Learning Preferences:</h2>\n <p class=\"text-body-2 text-medium-emphasis mb-4\">Customize how content is presented in your registered courses.</p>\n\n <v-select\n v-model=\"selectedCourseId\"\n :items=\"registeredCourses\"\n item-title=\"name\"\n item-value=\"courseID\"\n label=\"Select a course\"\n variant=\"outlined\"\n density=\"comfortable\"\n class=\"mb-4\"\n style=\"max-width: 400px\"\n >\n <template #item=\"{ props, item }\">\n <v-list-item v-bind=\"props\">\n <template #subtitle>\n {{ item.raw.courseID }}\n </template>\n </v-list-item>\n </template>\n </v-select>\n\n <user-tag-preferences\n v-if=\"selectedCourseId\"\n :course-id=\"selectedCourseId\"\n @preferences-saved=\"onPreferencesSaved\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { getCurrentUser, useConfigStore, UserTagPreferences } from '@vue-skuilder/common-ui';\nimport { UserDBInterface, getDataLayer } from '@vue-skuilder/db';\nimport { CourseConfig } from '@vue-skuilder/common';\nimport confetti from 'canvas-confetti';\nimport { defineComponent, PropType } from 'vue';\nimport { useRoute } from 'vue-router';\n\ninterface Language {\n name: string;\n code: string;\n}\n\nexport default defineComponent({\n name: 'UserSettings',\n\n components: {\n UserTagPreferences,\n },\n\n props: {\n username: {\n type: String as PropType<string>,\n required: true,\n },\n },\n\n setup() {\n const configStore = useConfigStore();\n const route = useRoute();\n\n const darkMode = configStore.config.darkMode;\n const likesConfetti = configStore.config.likesConfetti;\n\n const isNewUser = route.path.endsWith('new');\n\n return { configStore, darkMode, likesConfetti, route, isNewUser };\n },\n\n data() {\n return {\n u: {} as UserDBInterface,\n configLanguages: [\n {\n name: 'English',\n code: 'en',\n },\n {\n name: 'French',\n code: 'fr',\n },\n ] as Language[],\n selectedLanguages: [] as string[],\n registeredCourses: [] as CourseConfig[],\n selectedCourseId: '' as string,\n };\n },\n\n async created() {\n this.u = await getCurrentUser();\n this.configLanguages.forEach((l) => {\n console.log(`afweatifvwzeatfvwzeta` + l.name);\n });\n\n // Load registered courses for preferences selector\n await this.loadRegisteredCourses();\n },\n\n methods: {\n updateDark(): void {\n this.configStore.updateDarkMode(this.configStore.config.darkMode);\n },\n\n updateConfetti(): void {\n this.configStore.updateLikesConfetti(this.configStore.config.likesConfetti);\n\n if (this.configStore.config.likesConfetti) {\n confetti({\n origin: {\n x: 0.5,\n y: 1,\n },\n });\n }\n },\n\n async loadRegisteredCourses(): Promise<void> {\n try {\n const activeCourses = await this.u.getActiveCourses();\n const dataLayer = getDataLayer();\n\n // Fetch course configs for display names\n const courseConfigs = await Promise.all(\n activeCourses.map(async (reg) => {\n try {\n const courseDB = dataLayer.getCourseDB(reg.courseID);\n return await courseDB.getCourseConfig();\n } catch {\n // Return minimal config if fetch fails\n return { courseID: reg.courseID, name: reg.courseID } as CourseConfig;\n }\n })\n );\n\n this.registeredCourses = courseConfigs.filter(Boolean);\n } catch (e) {\n console.error('Failed to load registered courses:', e);\n }\n },\n\n onPreferencesSaved(): void {\n // Could show a snackbar or other feedback here\n console.log('Preferences saved for course:', this.selectedCourseId);\n },\n },\n});\n</script>\n\n<style scoped></style>\n","<template>\n <div class=\"text-subtitle-1\">\n <v-alert v-if=\"isNewUser\" type=\"success\" class=\"text-subtitle-1\" variant=\"tonal\" :prepend-icon=\"'mdi-check'\">\n Welcome, {{ username }}! Please take a moment to look through these settings:\n </v-alert>\n\n <h1 class=\"text-h3\">Account Settings</h1>\n <h2 class=\"text-h4\">General:</h2>\n\n <v-checkbox\n v-model=\"configStore.config.likesConfetti\"\n label=\"I like confetti\"\n @update:model-value=\"updateConfetti\"\n />\n <v-checkbox v-model=\"configStore.config.darkMode\" label=\"I like the dark\" @update:model-value=\"updateDark\" />\n <!-- <h2 class=\"text-h4\">Languages:</h2>\n I am near-fluent or better in the following languages:\n {{ selectedLanguages.toString() }}\n <v-checkbox\n v-for=\"(language, i) in configLanguages\"\n :key=\"i\"\n :label=\"language.name\"\n :value=\"language.code\"\n v-model=\"selectedLanguages\"\n @update:model-value=\"updateLanguage\"\n /> -->\n\n <v-divider class=\"my-6\" />\n\n <h2 class=\"text-h4 mb-4\">Learning Preferences:</h2>\n <p class=\"text-body-2 text-medium-emphasis mb-4\">Customize how content is presented in your registered courses.</p>\n\n <v-select\n v-model=\"selectedCourseId\"\n :items=\"registeredCourses\"\n item-title=\"name\"\n item-value=\"courseID\"\n label=\"Select a course\"\n variant=\"outlined\"\n density=\"comfortable\"\n class=\"mb-4\"\n style=\"max-width: 400px\"\n >\n <template #item=\"{ props, item }\">\n <v-list-item v-bind=\"props\">\n <template #subtitle>\n {{ item.raw.courseID }}\n </template>\n </v-list-item>\n </template>\n </v-select>\n\n <user-tag-preferences\n v-if=\"selectedCourseId\"\n :course-id=\"selectedCourseId\"\n @preferences-saved=\"onPreferencesSaved\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { getCurrentUser, useConfigStore, UserTagPreferences } from '@vue-skuilder/common-ui';\nimport { UserDBInterface, getDataLayer } from '@vue-skuilder/db';\nimport { CourseConfig } from '@vue-skuilder/common';\nimport confetti from 'canvas-confetti';\nimport { defineComponent, PropType } from 'vue';\nimport { useRoute } from 'vue-router';\n\ninterface Language {\n name: string;\n code: string;\n}\n\nexport default defineComponent({\n name: 'UserSettings',\n\n components: {\n UserTagPreferences,\n },\n\n props: {\n username: {\n type: String as PropType<string>,\n required: true,\n },\n },\n\n setup() {\n const configStore = useConfigStore();\n const route = useRoute();\n\n const darkMode = configStore.config.darkMode;\n const likesConfetti = configStore.config.likesConfetti;\n\n const isNewUser = route.path.endsWith('new');\n\n return { configStore, darkMode, likesConfetti, route, isNewUser };\n },\n\n data() {\n return {\n u: {} as UserDBInterface,\n configLanguages: [\n {\n name: 'English',\n code: 'en',\n },\n {\n name: 'French',\n code: 'fr',\n },\n ] as Language[],\n selectedLanguages: [] as string[],\n registeredCourses: [] as CourseConfig[],\n selectedCourseId: '' as string,\n };\n },\n\n async created() {\n this.u = await getCurrentUser();\n this.configLanguages.forEach((l) => {\n console.log(`afweatifvwzeatfvwzeta` + l.name);\n });\n\n // Load registered courses for preferences selector\n await this.loadRegisteredCourses();\n },\n\n methods: {\n updateDark(): void {\n this.configStore.updateDarkMode(this.configStore.config.darkMode);\n },\n\n updateConfetti(): void {\n this.configStore.updateLikesConfetti(this.configStore.config.likesConfetti);\n\n if (this.configStore.config.likesConfetti) {\n confetti({\n origin: {\n x: 0.5,\n y: 1,\n },\n });\n }\n },\n\n async loadRegisteredCourses(): Promise<void> {\n try {\n const activeCourses = await this.u.getActiveCourses();\n const dataLayer = getDataLayer();\n\n // Fetch course configs for display names\n const courseConfigs = await Promise.all(\n activeCourses.map(async (reg) => {\n try {\n const courseDB = dataLayer.getCourseDB(reg.courseID);\n return await courseDB.getCourseConfig();\n } catch {\n // Return minimal config if fetch fails\n return { courseID: reg.courseID, name: reg.courseID } as CourseConfig;\n }\n })\n );\n\n this.registeredCourses = courseConfigs.filter(Boolean);\n } catch (e) {\n console.error('Failed to load registered courses:', e);\n }\n },\n\n onPreferencesSaved(): void {\n // Could show a snackbar or other feedback here\n console.log('Preferences saved for course:', this.selectedCourseId);\n },\n },\n});\n</script>\n\n<style scoped></style>\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"User-dB5PO1RG.js","names":[],"sources":["../../../../node_modules/canvas-confetti/dist/confetti.module.mjs","../../src/views/User.vue","../../src/views/User.vue"],"sourcesContent":["// canvas-confetti v1.9.3 built on 2024-04-30T22:19:17.794Z\nvar module = {};\n\n// source content\n/* globals Map */\n\n(function main(global, module, isWorker, workerSize) {\n var canUseWorker = !!(\n global.Worker &&\n global.Blob &&\n global.Promise &&\n global.OffscreenCanvas &&\n global.OffscreenCanvasRenderingContext2D &&\n global.HTMLCanvasElement &&\n global.HTMLCanvasElement.prototype.transferControlToOffscreen &&\n global.URL &&\n global.URL.createObjectURL);\n\n var canUsePaths = typeof Path2D === 'function' && typeof DOMMatrix === 'function';\n var canDrawBitmap = (function () {\n // this mostly supports ssr\n if (!global.OffscreenCanvas) {\n return false;\n }\n\n var canvas = new OffscreenCanvas(1, 1);\n var ctx = canvas.getContext('2d');\n ctx.fillRect(0, 0, 1, 1);\n var bitmap = canvas.transferToImageBitmap();\n\n try {\n ctx.createPattern(bitmap, 'no-repeat');\n } catch (e) {\n return false;\n }\n\n return true;\n })();\n\n function noop() {}\n\n // create a promise if it exists, otherwise, just\n // call the function directly\n function promise(func) {\n var ModulePromise = module.exports.Promise;\n var Prom = ModulePromise !== void 0 ? ModulePromise : global.Promise;\n\n if (typeof Prom === 'function') {\n return new Prom(func);\n }\n\n func(noop, noop);\n\n return null;\n }\n\n var bitmapMapper = (function (skipTransform, map) {\n // see https://github.com/catdad/canvas-confetti/issues/209\n // creating canvases is actually pretty expensive, so we should create a\n // 1:1 map for bitmap:canvas, so that we can animate the confetti in\n // a performant manner, but also not store them forever so that we don't\n // have a memory leak\n return {\n transform: function(bitmap) {\n if (skipTransform) {\n return bitmap;\n }\n\n if (map.has(bitmap)) {\n return map.get(bitmap);\n }\n\n var canvas = new OffscreenCanvas(bitmap.width, bitmap.height);\n var ctx = canvas.getContext('2d');\n ctx.drawImage(bitmap, 0, 0);\n\n map.set(bitmap, canvas);\n\n return canvas;\n },\n clear: function () {\n map.clear();\n }\n };\n })(canDrawBitmap, new Map());\n\n var raf = (function () {\n var TIME = Math.floor(1000 / 60);\n var frame, cancel;\n var frames = {};\n var lastFrameTime = 0;\n\n if (typeof requestAnimationFrame === 'function' && typeof cancelAnimationFrame === 'function') {\n frame = function (cb) {\n var id = Math.random();\n\n frames[id] = requestAnimationFrame(function onFrame(time) {\n if (lastFrameTime === time || lastFrameTime + TIME - 1 < time) {\n lastFrameTime = time;\n delete frames[id];\n\n cb();\n } else {\n frames[id] = requestAnimationFrame(onFrame);\n }\n });\n\n return id;\n };\n cancel = function (id) {\n if (frames[id]) {\n cancelAnimationFrame(frames[id]);\n }\n };\n } else {\n frame = function (cb) {\n return setTimeout(cb, TIME);\n };\n cancel = function (timer) {\n return clearTimeout(timer);\n };\n }\n\n return { frame: frame, cancel: cancel };\n }());\n\n var getWorker = (function () {\n var worker;\n var prom;\n var resolves = {};\n\n function decorate(worker) {\n function execute(options, callback) {\n worker.postMessage({ options: options || {}, callback: callback });\n }\n worker.init = function initWorker(canvas) {\n var offscreen = canvas.transferControlToOffscreen();\n worker.postMessage({ canvas: offscreen }, [offscreen]);\n };\n\n worker.fire = function fireWorker(options, size, done) {\n if (prom) {\n execute(options, null);\n return prom;\n }\n\n var id = Math.random().toString(36).slice(2);\n\n prom = promise(function (resolve) {\n function workerDone(msg) {\n if (msg.data.callback !== id) {\n return;\n }\n\n delete resolves[id];\n worker.removeEventListener('message', workerDone);\n\n prom = null;\n\n bitmapMapper.clear();\n\n done();\n resolve();\n }\n\n worker.addEventListener('message', workerDone);\n execute(options, id);\n\n resolves[id] = workerDone.bind(null, { data: { callback: id }});\n });\n\n return prom;\n };\n\n worker.reset = function resetWorker() {\n worker.postMessage({ reset: true });\n\n for (var id in resolves) {\n resolves[id]();\n delete resolves[id];\n }\n };\n }\n\n return function () {\n if (worker) {\n return worker;\n }\n\n if (!isWorker && canUseWorker) {\n var code = [\n 'var CONFETTI, SIZE = {}, module = {};',\n '(' + main.toString() + ')(this, module, true, SIZE);',\n 'onmessage = function(msg) {',\n ' if (msg.data.options) {',\n ' CONFETTI(msg.data.options).then(function () {',\n ' if (msg.data.callback) {',\n ' postMessage({ callback: msg.data.callback });',\n ' }',\n ' });',\n ' } else if (msg.data.reset) {',\n ' CONFETTI && CONFETTI.reset();',\n ' } else if (msg.data.resize) {',\n ' SIZE.width = msg.data.resize.width;',\n ' SIZE.height = msg.data.resize.height;',\n ' } else if (msg.data.canvas) {',\n ' SIZE.width = msg.data.canvas.width;',\n ' SIZE.height = msg.data.canvas.height;',\n ' CONFETTI = module.exports.create(msg.data.canvas);',\n ' }',\n '}',\n ].join('\\n');\n try {\n worker = new Worker(URL.createObjectURL(new Blob([code])));\n } catch (e) {\n // eslint-disable-next-line no-console\n typeof console !== undefined && typeof console.warn === 'function' ? console.warn('🎊 Could not load worker', e) : null;\n\n return null;\n }\n\n decorate(worker);\n }\n\n return worker;\n };\n })();\n\n var defaults = {\n particleCount: 50,\n angle: 90,\n spread: 45,\n startVelocity: 45,\n decay: 0.9,\n gravity: 1,\n drift: 0,\n ticks: 200,\n x: 0.5,\n y: 0.5,\n shapes: ['square', 'circle'],\n zIndex: 100,\n colors: [\n '#26ccff',\n '#a25afd',\n '#ff5e7e',\n '#88ff5a',\n '#fcff42',\n '#ffa62d',\n '#ff36ff'\n ],\n // probably should be true, but back-compat\n disableForReducedMotion: false,\n scalar: 1\n };\n\n function convert(val, transform) {\n return transform ? transform(val) : val;\n }\n\n function isOk(val) {\n return !(val === null || val === undefined);\n }\n\n function prop(options, name, transform) {\n return convert(\n options && isOk(options[name]) ? options[name] : defaults[name],\n transform\n );\n }\n\n function onlyPositiveInt(number){\n return number < 0 ? 0 : Math.floor(number);\n }\n\n function randomInt(min, max) {\n // [min, max)\n return Math.floor(Math.random() * (max - min)) + min;\n }\n\n function toDecimal(str) {\n return parseInt(str, 16);\n }\n\n function colorsToRgb(colors) {\n return colors.map(hexToRgb);\n }\n\n function hexToRgb(str) {\n var val = String(str).replace(/[^0-9a-f]/gi, '');\n\n if (val.length < 6) {\n val = val[0]+val[0]+val[1]+val[1]+val[2]+val[2];\n }\n\n return {\n r: toDecimal(val.substring(0,2)),\n g: toDecimal(val.substring(2,4)),\n b: toDecimal(val.substring(4,6))\n };\n }\n\n function getOrigin(options) {\n var origin = prop(options, 'origin', Object);\n origin.x = prop(origin, 'x', Number);\n origin.y = prop(origin, 'y', Number);\n\n return origin;\n }\n\n function setCanvasWindowSize(canvas) {\n canvas.width = document.documentElement.clientWidth;\n canvas.height = document.documentElement.clientHeight;\n }\n\n function setCanvasRectSize(canvas) {\n var rect = canvas.getBoundingClientRect();\n canvas.width = rect.width;\n canvas.height = rect.height;\n }\n\n function getCanvas(zIndex) {\n var canvas = document.createElement('canvas');\n\n canvas.style.position = 'fixed';\n canvas.style.top = '0px';\n canvas.style.left = '0px';\n canvas.style.pointerEvents = 'none';\n canvas.style.zIndex = zIndex;\n\n return canvas;\n }\n\n function ellipse(context, x, y, radiusX, radiusY, rotation, startAngle, endAngle, antiClockwise) {\n context.save();\n context.translate(x, y);\n context.rotate(rotation);\n context.scale(radiusX, radiusY);\n context.arc(0, 0, 1, startAngle, endAngle, antiClockwise);\n context.restore();\n }\n\n function randomPhysics(opts) {\n var radAngle = opts.angle * (Math.PI / 180);\n var radSpread = opts.spread * (Math.PI / 180);\n\n return {\n x: opts.x,\n y: opts.y,\n wobble: Math.random() * 10,\n wobbleSpeed: Math.min(0.11, Math.random() * 0.1 + 0.05),\n velocity: (opts.startVelocity * 0.5) + (Math.random() * opts.startVelocity),\n angle2D: -radAngle + ((0.5 * radSpread) - (Math.random() * radSpread)),\n tiltAngle: (Math.random() * (0.75 - 0.25) + 0.25) * Math.PI,\n color: opts.color,\n shape: opts.shape,\n tick: 0,\n totalTicks: opts.ticks,\n decay: opts.decay,\n drift: opts.drift,\n random: Math.random() + 2,\n tiltSin: 0,\n tiltCos: 0,\n wobbleX: 0,\n wobbleY: 0,\n gravity: opts.gravity * 3,\n ovalScalar: 0.6,\n scalar: opts.scalar,\n flat: opts.flat\n };\n }\n\n function updateFetti(context, fetti) {\n fetti.x += Math.cos(fetti.angle2D) * fetti.velocity + fetti.drift;\n fetti.y += Math.sin(fetti.angle2D) * fetti.velocity + fetti.gravity;\n fetti.velocity *= fetti.decay;\n\n if (fetti.flat) {\n fetti.wobble = 0;\n fetti.wobbleX = fetti.x + (10 * fetti.scalar);\n fetti.wobbleY = fetti.y + (10 * fetti.scalar);\n\n fetti.tiltSin = 0;\n fetti.tiltCos = 0;\n fetti.random = 1;\n } else {\n fetti.wobble += fetti.wobbleSpeed;\n fetti.wobbleX = fetti.x + ((10 * fetti.scalar) * Math.cos(fetti.wobble));\n fetti.wobbleY = fetti.y + ((10 * fetti.scalar) * Math.sin(fetti.wobble));\n\n fetti.tiltAngle += 0.1;\n fetti.tiltSin = Math.sin(fetti.tiltAngle);\n fetti.tiltCos = Math.cos(fetti.tiltAngle);\n fetti.random = Math.random() + 2;\n }\n\n var progress = (fetti.tick++) / fetti.totalTicks;\n\n var x1 = fetti.x + (fetti.random * fetti.tiltCos);\n var y1 = fetti.y + (fetti.random * fetti.tiltSin);\n var x2 = fetti.wobbleX + (fetti.random * fetti.tiltCos);\n var y2 = fetti.wobbleY + (fetti.random * fetti.tiltSin);\n\n context.fillStyle = 'rgba(' + fetti.color.r + ', ' + fetti.color.g + ', ' + fetti.color.b + ', ' + (1 - progress) + ')';\n\n context.beginPath();\n\n if (canUsePaths && fetti.shape.type === 'path' && typeof fetti.shape.path === 'string' && Array.isArray(fetti.shape.matrix)) {\n context.fill(transformPath2D(\n fetti.shape.path,\n fetti.shape.matrix,\n fetti.x,\n fetti.y,\n Math.abs(x2 - x1) * 0.1,\n Math.abs(y2 - y1) * 0.1,\n Math.PI / 10 * fetti.wobble\n ));\n } else if (fetti.shape.type === 'bitmap') {\n var rotation = Math.PI / 10 * fetti.wobble;\n var scaleX = Math.abs(x2 - x1) * 0.1;\n var scaleY = Math.abs(y2 - y1) * 0.1;\n var width = fetti.shape.bitmap.width * fetti.scalar;\n var height = fetti.shape.bitmap.height * fetti.scalar;\n\n var matrix = new DOMMatrix([\n Math.cos(rotation) * scaleX,\n Math.sin(rotation) * scaleX,\n -Math.sin(rotation) * scaleY,\n Math.cos(rotation) * scaleY,\n fetti.x,\n fetti.y\n ]);\n\n // apply the transform matrix from the confetti shape\n matrix.multiplySelf(new DOMMatrix(fetti.shape.matrix));\n\n var pattern = context.createPattern(bitmapMapper.transform(fetti.shape.bitmap), 'no-repeat');\n pattern.setTransform(matrix);\n\n context.globalAlpha = (1 - progress);\n context.fillStyle = pattern;\n context.fillRect(\n fetti.x - (width / 2),\n fetti.y - (height / 2),\n width,\n height\n );\n context.globalAlpha = 1;\n } else if (fetti.shape === 'circle') {\n context.ellipse ?\n context.ellipse(fetti.x, fetti.y, Math.abs(x2 - x1) * fetti.ovalScalar, Math.abs(y2 - y1) * fetti.ovalScalar, Math.PI / 10 * fetti.wobble, 0, 2 * Math.PI) :\n ellipse(context, fetti.x, fetti.y, Math.abs(x2 - x1) * fetti.ovalScalar, Math.abs(y2 - y1) * fetti.ovalScalar, Math.PI / 10 * fetti.wobble, 0, 2 * Math.PI);\n } else if (fetti.shape === 'star') {\n var rot = Math.PI / 2 * 3;\n var innerRadius = 4 * fetti.scalar;\n var outerRadius = 8 * fetti.scalar;\n var x = fetti.x;\n var y = fetti.y;\n var spikes = 5;\n var step = Math.PI / spikes;\n\n while (spikes--) {\n x = fetti.x + Math.cos(rot) * outerRadius;\n y = fetti.y + Math.sin(rot) * outerRadius;\n context.lineTo(x, y);\n rot += step;\n\n x = fetti.x + Math.cos(rot) * innerRadius;\n y = fetti.y + Math.sin(rot) * innerRadius;\n context.lineTo(x, y);\n rot += step;\n }\n } else {\n context.moveTo(Math.floor(fetti.x), Math.floor(fetti.y));\n context.lineTo(Math.floor(fetti.wobbleX), Math.floor(y1));\n context.lineTo(Math.floor(x2), Math.floor(y2));\n context.lineTo(Math.floor(x1), Math.floor(fetti.wobbleY));\n }\n\n context.closePath();\n context.fill();\n\n return fetti.tick < fetti.totalTicks;\n }\n\n function animate(canvas, fettis, resizer, size, done) {\n var animatingFettis = fettis.slice();\n var context = canvas.getContext('2d');\n var animationFrame;\n var destroy;\n\n var prom = promise(function (resolve) {\n function onDone() {\n animationFrame = destroy = null;\n\n context.clearRect(0, 0, size.width, size.height);\n bitmapMapper.clear();\n\n done();\n resolve();\n }\n\n function update() {\n if (isWorker && !(size.width === workerSize.width && size.height === workerSize.height)) {\n size.width = canvas.width = workerSize.width;\n size.height = canvas.height = workerSize.height;\n }\n\n if (!size.width && !size.height) {\n resizer(canvas);\n size.width = canvas.width;\n size.height = canvas.height;\n }\n\n context.clearRect(0, 0, size.width, size.height);\n\n animatingFettis = animatingFettis.filter(function (fetti) {\n return updateFetti(context, fetti);\n });\n\n if (animatingFettis.length) {\n animationFrame = raf.frame(update);\n } else {\n onDone();\n }\n }\n\n animationFrame = raf.frame(update);\n destroy = onDone;\n });\n\n return {\n addFettis: function (fettis) {\n animatingFettis = animatingFettis.concat(fettis);\n\n return prom;\n },\n canvas: canvas,\n promise: prom,\n reset: function () {\n if (animationFrame) {\n raf.cancel(animationFrame);\n }\n\n if (destroy) {\n destroy();\n }\n }\n };\n }\n\n function confettiCannon(canvas, globalOpts) {\n var isLibCanvas = !canvas;\n var allowResize = !!prop(globalOpts || {}, 'resize');\n var hasResizeEventRegistered = false;\n var globalDisableForReducedMotion = prop(globalOpts, 'disableForReducedMotion', Boolean);\n var shouldUseWorker = canUseWorker && !!prop(globalOpts || {}, 'useWorker');\n var worker = shouldUseWorker ? getWorker() : null;\n var resizer = isLibCanvas ? setCanvasWindowSize : setCanvasRectSize;\n var initialized = (canvas && worker) ? !!canvas.__confetti_initialized : false;\n var preferLessMotion = typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion)').matches;\n var animationObj;\n\n function fireLocal(options, size, done) {\n var particleCount = prop(options, 'particleCount', onlyPositiveInt);\n var angle = prop(options, 'angle', Number);\n var spread = prop(options, 'spread', Number);\n var startVelocity = prop(options, 'startVelocity', Number);\n var decay = prop(options, 'decay', Number);\n var gravity = prop(options, 'gravity', Number);\n var drift = prop(options, 'drift', Number);\n var colors = prop(options, 'colors', colorsToRgb);\n var ticks = prop(options, 'ticks', Number);\n var shapes = prop(options, 'shapes');\n var scalar = prop(options, 'scalar');\n var flat = !!prop(options, 'flat');\n var origin = getOrigin(options);\n\n var temp = particleCount;\n var fettis = [];\n\n var startX = canvas.width * origin.x;\n var startY = canvas.height * origin.y;\n\n while (temp--) {\n fettis.push(\n randomPhysics({\n x: startX,\n y: startY,\n angle: angle,\n spread: spread,\n startVelocity: startVelocity,\n color: colors[temp % colors.length],\n shape: shapes[randomInt(0, shapes.length)],\n ticks: ticks,\n decay: decay,\n gravity: gravity,\n drift: drift,\n scalar: scalar,\n flat: flat\n })\n );\n }\n\n // if we have a previous canvas already animating,\n // add to it\n if (animationObj) {\n return animationObj.addFettis(fettis);\n }\n\n animationObj = animate(canvas, fettis, resizer, size , done);\n\n return animationObj.promise;\n }\n\n function fire(options) {\n var disableForReducedMotion = globalDisableForReducedMotion || prop(options, 'disableForReducedMotion', Boolean);\n var zIndex = prop(options, 'zIndex', Number);\n\n if (disableForReducedMotion && preferLessMotion) {\n return promise(function (resolve) {\n resolve();\n });\n }\n\n if (isLibCanvas && animationObj) {\n // use existing canvas from in-progress animation\n canvas = animationObj.canvas;\n } else if (isLibCanvas && !canvas) {\n // create and initialize a new canvas\n canvas = getCanvas(zIndex);\n document.body.appendChild(canvas);\n }\n\n if (allowResize && !initialized) {\n // initialize the size of a user-supplied canvas\n resizer(canvas);\n }\n\n var size = {\n width: canvas.width,\n height: canvas.height\n };\n\n if (worker && !initialized) {\n worker.init(canvas);\n }\n\n initialized = true;\n\n if (worker) {\n canvas.__confetti_initialized = true;\n }\n\n function onResize() {\n if (worker) {\n // TODO this really shouldn't be immediate, because it is expensive\n var obj = {\n getBoundingClientRect: function () {\n if (!isLibCanvas) {\n return canvas.getBoundingClientRect();\n }\n }\n };\n\n resizer(obj);\n\n worker.postMessage({\n resize: {\n width: obj.width,\n height: obj.height\n }\n });\n return;\n }\n\n // don't actually query the size here, since this\n // can execute frequently and rapidly\n size.width = size.height = null;\n }\n\n function done() {\n animationObj = null;\n\n if (allowResize) {\n hasResizeEventRegistered = false;\n global.removeEventListener('resize', onResize);\n }\n\n if (isLibCanvas && canvas) {\n if (document.body.contains(canvas)) {\n document.body.removeChild(canvas); \n }\n canvas = null;\n initialized = false;\n }\n }\n\n if (allowResize && !hasResizeEventRegistered) {\n hasResizeEventRegistered = true;\n global.addEventListener('resize', onResize, false);\n }\n\n if (worker) {\n return worker.fire(options, size, done);\n }\n\n return fireLocal(options, size, done);\n }\n\n fire.reset = function () {\n if (worker) {\n worker.reset();\n }\n\n if (animationObj) {\n animationObj.reset();\n }\n };\n\n return fire;\n }\n\n // Make default export lazy to defer worker creation until called.\n var defaultFire;\n function getDefaultFire() {\n if (!defaultFire) {\n defaultFire = confettiCannon(null, { useWorker: true, resize: true });\n }\n return defaultFire;\n }\n\n function transformPath2D(pathString, pathMatrix, x, y, scaleX, scaleY, rotation) {\n var path2d = new Path2D(pathString);\n\n var t1 = new Path2D();\n t1.addPath(path2d, new DOMMatrix(pathMatrix));\n\n var t2 = new Path2D();\n // see https://developer.mozilla.org/en-US/docs/Web/API/DOMMatrix/DOMMatrix\n t2.addPath(t1, new DOMMatrix([\n Math.cos(rotation) * scaleX,\n Math.sin(rotation) * scaleX,\n -Math.sin(rotation) * scaleY,\n Math.cos(rotation) * scaleY,\n x,\n y\n ]));\n\n return t2;\n }\n\n function shapeFromPath(pathData) {\n if (!canUsePaths) {\n throw new Error('path confetti are not supported in this browser');\n }\n\n var path, matrix;\n\n if (typeof pathData === 'string') {\n path = pathData;\n } else {\n path = pathData.path;\n matrix = pathData.matrix;\n }\n\n var path2d = new Path2D(path);\n var tempCanvas = document.createElement('canvas');\n var tempCtx = tempCanvas.getContext('2d');\n\n if (!matrix) {\n // attempt to figure out the width of the path, up to 1000x1000\n var maxSize = 1000;\n var minX = maxSize;\n var minY = maxSize;\n var maxX = 0;\n var maxY = 0;\n var width, height;\n\n // do some line skipping... this is faster than checking\n // every pixel and will be mostly still correct\n for (var x = 0; x < maxSize; x += 2) {\n for (var y = 0; y < maxSize; y += 2) {\n if (tempCtx.isPointInPath(path2d, x, y, 'nonzero')) {\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x);\n maxY = Math.max(maxY, y);\n }\n }\n }\n\n width = maxX - minX;\n height = maxY - minY;\n\n var maxDesiredSize = 10;\n var scale = Math.min(maxDesiredSize/width, maxDesiredSize/height);\n\n matrix = [\n scale, 0, 0, scale,\n -Math.round((width/2) + minX) * scale,\n -Math.round((height/2) + minY) * scale\n ];\n }\n\n return {\n type: 'path',\n path: path,\n matrix: matrix\n };\n }\n\n function shapeFromText(textData) {\n var text,\n scalar = 1,\n color = '#000000',\n // see https://nolanlawson.com/2022/04/08/the-struggle-of-using-native-emoji-on-the-web/\n fontFamily = '\"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\", \"EmojiOne Color\", \"Android Emoji\", \"Twemoji Mozilla\", \"system emoji\", sans-serif';\n\n if (typeof textData === 'string') {\n text = textData;\n } else {\n text = textData.text;\n scalar = 'scalar' in textData ? textData.scalar : scalar;\n fontFamily = 'fontFamily' in textData ? textData.fontFamily : fontFamily;\n color = 'color' in textData ? textData.color : color;\n }\n\n // all other confetti are 10 pixels,\n // so this pixel size is the de-facto 100% scale confetti\n var fontSize = 10 * scalar;\n var font = '' + fontSize + 'px ' + fontFamily;\n\n var canvas = new OffscreenCanvas(fontSize, fontSize);\n var ctx = canvas.getContext('2d');\n\n ctx.font = font;\n var size = ctx.measureText(text);\n var width = Math.ceil(size.actualBoundingBoxRight + size.actualBoundingBoxLeft);\n var height = Math.ceil(size.actualBoundingBoxAscent + size.actualBoundingBoxDescent);\n\n var padding = 2;\n var x = size.actualBoundingBoxLeft + padding;\n var y = size.actualBoundingBoxAscent + padding;\n width += padding + padding;\n height += padding + padding;\n\n canvas = new OffscreenCanvas(width, height);\n ctx = canvas.getContext('2d');\n ctx.font = font;\n ctx.fillStyle = color;\n\n ctx.fillText(text, x, y);\n\n var scale = 1 / scalar;\n\n return {\n type: 'bitmap',\n // TODO these probably need to be transfered for workers\n bitmap: canvas.transferToImageBitmap(),\n matrix: [scale, 0, 0, scale, -width * scale / 2, -height * scale / 2]\n };\n }\n\n module.exports = function() {\n return getDefaultFire().apply(this, arguments);\n };\n module.exports.reset = function() {\n getDefaultFire().reset();\n };\n module.exports.create = confettiCannon;\n module.exports.shapeFromPath = shapeFromPath;\n module.exports.shapeFromText = shapeFromText;\n}((function () {\n if (typeof window !== 'undefined') {\n return window;\n }\n\n if (typeof self !== 'undefined') {\n return self;\n }\n\n return this || {};\n})(), module, false));\n\n// end source content\n\nexport default module.exports;\nexport var create = module.exports.create;\n","<template>\n <div class=\"text-subtitle-1\">\n <v-alert v-if=\"isNewUser\" type=\"success\" class=\"text-subtitle-1\" variant=\"tonal\" :prepend-icon=\"'mdi-check'\">\n Welcome, {{ username }}! Please take a moment to look through these settings:\n </v-alert>\n\n <h1 class=\"text-h3\">Account Settings</h1>\n <h2 class=\"text-h4\">General:</h2>\n\n <v-checkbox\n v-model=\"configStore.config.likesConfetti\"\n label=\"I like confetti\"\n @update:model-value=\"updateConfetti\"\n />\n <v-checkbox v-model=\"configStore.config.darkMode\" label=\"I like the dark\" @update:model-value=\"updateDark\" />\n <!-- <h2 class=\"text-h4\">Languages:</h2>\n I am near-fluent or better in the following languages:\n {{ selectedLanguages.toString() }}\n <v-checkbox\n v-for=\"(language, i) in configLanguages\"\n :key=\"i\"\n :label=\"language.name\"\n :value=\"language.code\"\n v-model=\"selectedLanguages\"\n @update:model-value=\"updateLanguage\"\n /> -->\n\n <v-divider class=\"my-6\" />\n\n <h2 class=\"text-h4 mb-4\">Learning Preferences:</h2>\n <p class=\"text-body-2 text-medium-emphasis mb-4\">Customize how content is presented in your registered courses.</p>\n\n <v-select\n v-model=\"selectedCourseId\"\n :items=\"registeredCourses\"\n item-title=\"name\"\n item-value=\"courseID\"\n label=\"Select a course\"\n variant=\"outlined\"\n density=\"comfortable\"\n class=\"mb-4\"\n style=\"max-width: 400px\"\n >\n <template #item=\"{ props, item }\">\n <v-list-item v-bind=\"props\">\n <template #subtitle>\n {{ item.raw.courseID }}\n </template>\n </v-list-item>\n </template>\n </v-select>\n\n <user-tag-preferences\n v-if=\"selectedCourseId\"\n :course-id=\"selectedCourseId\"\n @preferences-saved=\"onPreferencesSaved\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { getCurrentUser, useConfigStore, UserTagPreferences } from '@vue-skuilder/common-ui';\nimport { UserDBInterface, getDataLayer } from '@vue-skuilder/db';\nimport { CourseConfig } from '@vue-skuilder/common';\nimport confetti from 'canvas-confetti';\nimport { defineComponent, PropType } from 'vue';\nimport { useRoute } from 'vue-router';\n\ninterface Language {\n name: string;\n code: string;\n}\n\nexport default defineComponent({\n name: 'UserSettings',\n\n components: {\n UserTagPreferences,\n },\n\n props: {\n username: {\n type: String as PropType<string>,\n required: true,\n },\n },\n\n setup() {\n const configStore = useConfigStore();\n const route = useRoute();\n\n const darkMode = configStore.config.darkMode;\n const likesConfetti = configStore.config.likesConfetti;\n\n const isNewUser = route.path.endsWith('new');\n\n return { configStore, darkMode, likesConfetti, route, isNewUser };\n },\n\n data() {\n return {\n u: {} as UserDBInterface,\n configLanguages: [\n {\n name: 'English',\n code: 'en',\n },\n {\n name: 'French',\n code: 'fr',\n },\n ] as Language[],\n selectedLanguages: [] as string[],\n registeredCourses: [] as CourseConfig[],\n selectedCourseId: '' as string,\n };\n },\n\n async created() {\n this.u = await getCurrentUser();\n this.configLanguages.forEach((l) => {\n console.log(`afweatifvwzeatfvwzeta` + l.name);\n });\n\n // Load registered courses for preferences selector\n await this.loadRegisteredCourses();\n },\n\n methods: {\n updateDark(): void {\n this.configStore.updateDarkMode(this.configStore.config.darkMode);\n },\n\n updateConfetti(): void {\n this.configStore.updateLikesConfetti(this.configStore.config.likesConfetti);\n\n if (this.configStore.config.likesConfetti) {\n confetti({\n origin: {\n x: 0.5,\n y: 1,\n },\n });\n }\n },\n\n async loadRegisteredCourses(): Promise<void> {\n try {\n const activeCourses = await this.u.getActiveCourses();\n const dataLayer = getDataLayer();\n\n // Fetch course configs for display names\n const courseConfigs = await Promise.all(\n activeCourses.map(async (reg) => {\n try {\n const courseDB = dataLayer.getCourseDB(reg.courseID);\n return await courseDB.getCourseConfig();\n } catch {\n // Return minimal config if fetch fails\n return { courseID: reg.courseID, name: reg.courseID } as CourseConfig;\n }\n })\n );\n\n this.registeredCourses = courseConfigs.filter(Boolean);\n } catch (e) {\n console.error('Failed to load registered courses:', e);\n }\n },\n\n onPreferencesSaved(): void {\n // Could show a snackbar or other feedback here\n console.log('Preferences saved for course:', this.selectedCourseId);\n },\n },\n});\n</script>\n\n<style scoped></style>\n","<template>\n <div class=\"text-subtitle-1\">\n <v-alert v-if=\"isNewUser\" type=\"success\" class=\"text-subtitle-1\" variant=\"tonal\" :prepend-icon=\"'mdi-check'\">\n Welcome, {{ username }}! Please take a moment to look through these settings:\n </v-alert>\n\n <h1 class=\"text-h3\">Account Settings</h1>\n <h2 class=\"text-h4\">General:</h2>\n\n <v-checkbox\n v-model=\"configStore.config.likesConfetti\"\n label=\"I like confetti\"\n @update:model-value=\"updateConfetti\"\n />\n <v-checkbox v-model=\"configStore.config.darkMode\" label=\"I like the dark\" @update:model-value=\"updateDark\" />\n <!-- <h2 class=\"text-h4\">Languages:</h2>\n I am near-fluent or better in the following languages:\n {{ selectedLanguages.toString() }}\n <v-checkbox\n v-for=\"(language, i) in configLanguages\"\n :key=\"i\"\n :label=\"language.name\"\n :value=\"language.code\"\n v-model=\"selectedLanguages\"\n @update:model-value=\"updateLanguage\"\n /> -->\n\n <v-divider class=\"my-6\" />\n\n <h2 class=\"text-h4 mb-4\">Learning Preferences:</h2>\n <p class=\"text-body-2 text-medium-emphasis mb-4\">Customize how content is presented in your registered courses.</p>\n\n <v-select\n v-model=\"selectedCourseId\"\n :items=\"registeredCourses\"\n item-title=\"name\"\n item-value=\"courseID\"\n label=\"Select a course\"\n variant=\"outlined\"\n density=\"comfortable\"\n class=\"mb-4\"\n style=\"max-width: 400px\"\n >\n <template #item=\"{ props, item }\">\n <v-list-item v-bind=\"props\">\n <template #subtitle>\n {{ item.raw.courseID }}\n </template>\n </v-list-item>\n </template>\n </v-select>\n\n <user-tag-preferences\n v-if=\"selectedCourseId\"\n :course-id=\"selectedCourseId\"\n @preferences-saved=\"onPreferencesSaved\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { getCurrentUser, useConfigStore, UserTagPreferences } from '@vue-skuilder/common-ui';\nimport { UserDBInterface, getDataLayer } from '@vue-skuilder/db';\nimport { CourseConfig } from '@vue-skuilder/common';\nimport confetti from 'canvas-confetti';\nimport { defineComponent, PropType } from 'vue';\nimport { useRoute } from 'vue-router';\n\ninterface Language {\n name: string;\n code: string;\n}\n\nexport default defineComponent({\n name: 'UserSettings',\n\n components: {\n UserTagPreferences,\n },\n\n props: {\n username: {\n type: String as PropType<string>,\n required: true,\n },\n },\n\n setup() {\n const configStore = useConfigStore();\n const route = useRoute();\n\n const darkMode = configStore.config.darkMode;\n const likesConfetti = configStore.config.likesConfetti;\n\n const isNewUser = route.path.endsWith('new');\n\n return { configStore, darkMode, likesConfetti, route, isNewUser };\n },\n\n data() {\n return {\n u: {} as UserDBInterface,\n configLanguages: [\n {\n name: 'English',\n code: 'en',\n },\n {\n name: 'French',\n code: 'fr',\n },\n ] as Language[],\n selectedLanguages: [] as string[],\n registeredCourses: [] as CourseConfig[],\n selectedCourseId: '' as string,\n };\n },\n\n async created() {\n this.u = await getCurrentUser();\n this.configLanguages.forEach((l) => {\n console.log(`afweatifvwzeatfvwzeta` + l.name);\n });\n\n // Load registered courses for preferences selector\n await this.loadRegisteredCourses();\n },\n\n methods: {\n updateDark(): void {\n this.configStore.updateDarkMode(this.configStore.config.darkMode);\n },\n\n updateConfetti(): void {\n this.configStore.updateLikesConfetti(this.configStore.config.likesConfetti);\n\n if (this.configStore.config.likesConfetti) {\n confetti({\n origin: {\n x: 0.5,\n y: 1,\n },\n });\n }\n },\n\n async loadRegisteredCourses(): Promise<void> {\n try {\n const activeCourses = await this.u.getActiveCourses();\n const dataLayer = getDataLayer();\n\n // Fetch course configs for display names\n const courseConfigs = await Promise.all(\n activeCourses.map(async (reg) => {\n try {\n const courseDB = dataLayer.getCourseDB(reg.courseID);\n return await courseDB.getCourseConfig();\n } catch {\n // Return minimal config if fetch fails\n return { courseID: reg.courseID, name: reg.courseID } as CourseConfig;\n }\n })\n );\n\n this.registeredCourses = courseConfigs.filter(Boolean);\n } catch (e) {\n console.error('Failed to load registered courses:', e);\n }\n },\n\n onPreferencesSaved(): void {\n // Could show a snackbar or other feedback here\n console.log('Preferences saved for course:', this.selectedCourseId);\n },\n },\n});\n</script>\n\n<style scoped></style>\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"./chunk-D6hFPZc3.js";import{H as e,S as t,T as n,Vt as r,_ as i,b as a,lt as o,z as s}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import
|
|
2
|
-
//# sourceMappingURL=UserStats-
|
|
1
|
+
import"./chunk-D6hFPZc3.js";import{H as e,S as t,T as n,Vt as r,_ as i,b as a,lt as o,z as s}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import"./dist-l4NOxAbA.js";import"./MarkdownRenderer-kStoDRNE-HDBFbDeD.js";import"./dist-DDw00TzX.js";import{w as c}from"./common-ui.es-DFOzc2ze.js";var l=n({__name:`UserStats`,setup(n){let l=o(null),u=o([]);return s(async()=>{l.value=await c(),u.value=(await Promise.all([1,7,30].map(e=>l.value.getReviewsForcast(e)))).map(e=>e.length)}),(n,o)=>(e(),a(`div`,null,[o[0]||(o[0]=i(`h2`,null,`Stats!`,-1)),t(` One day: `+r(u.value[0])+` `,1),o[1]||(o[1]=i(`br`,null,null,-1)),t(` Seven day: `+r(u.value[1])+` `,1),o[2]||(o[2]=i(`br`,null,null,-1)),t(` Thirty Day: `+r(u.value[2]),1)]))}});export{l as default};
|
|
2
|
+
//# sourceMappingURL=UserStats-uVV3CIXd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserStats-
|
|
1
|
+
{"version":3,"file":"UserStats-uVV3CIXd.js","names":[],"sources":["../../src/components/User/UserStats.vue","../../src/components/User/UserStats.vue"],"sourcesContent":["<template>\n <div>\n <h2>Stats!</h2>\n One day: {{ scheduledReviews[0] }}\n <br />\n Seven day: {{ scheduledReviews[1] }}\n <br />\n Thirty Day: {{ scheduledReviews[2] }}\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted } from 'vue';\nimport { User } from '@vue-skuilder/db';\nimport { getCurrentUser } from '@vue-skuilder/common-ui';\n\nconst user = ref<User | null>(null);\nconst scheduledReviews = ref<number[]>([]);\n\nonMounted(async () => {\n user.value = await getCurrentUser();\n\n // Using Promise.all to handle all forecasts concurrently\n const days = [1, 7, 30];\n const forecasts = await Promise.all(days.map((d) => user.value!.getReviewsForcast(d)));\n scheduledReviews.value = forecasts.map((f) => f.length);\n});\n</script>\n\n<style scoped></style>\n","<template>\n <div>\n <h2>Stats!</h2>\n One day: {{ scheduledReviews[0] }}\n <br />\n Seven day: {{ scheduledReviews[1] }}\n <br />\n Thirty Day: {{ scheduledReviews[2] }}\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted } from 'vue';\nimport { User } from '@vue-skuilder/db';\nimport { getCurrentUser } from '@vue-skuilder/common-ui';\n\nconst user = ref<User | null>(null);\nconst scheduledReviews = ref<number[]>([]);\n\nonMounted(async () => {\n user.value = await getCurrentUser();\n\n // Using Promise.all to handle all forecasts concurrently\n const days = [1, 7, 30];\n const forecasts = await Promise.all(days.map((d) => user.value!.getReviewsForcast(d)));\n scheduledReviews.value = forecasts.map((f) => f.length);\n});\n</script>\n\n<style scoped></style>\n"],"mappings":"mUCgBA,IAAM,EAAO,EAAiB,KAAK,CAC7B,EAAmB,EAAc,EAAE,CAAC,QAE1C,EAAU,SAAY,CACpB,EAAK,MAAQ,MAAM,GAAgB,CAKnC,EAAiB,OADC,MAAM,QAAQ,IADnB,CAAC,EAAG,EAAG,GAAG,CACkB,IAAK,GAAM,EAAK,MAAO,kBAAkB,EAAE,CAAC,CAAC,EACnD,IAAK,GAAM,EAAE,OAAO,EACvD"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"./chunk-D6hFPZc3.js";import{$ as e,C as t,H as n,K as r,S as i,T as a,v as o}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import
|
|
2
|
-
//# sourceMappingURL=VerifyEmail-
|
|
1
|
+
import"./chunk-D6hFPZc3.js";import{$ as e,C as t,H as n,K as r,S as i,T as a,v as o}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import"./dist-l4NOxAbA.js";import"./MarkdownRenderer-kStoDRNE-HDBFbDeD.js";import"./dist-DDw00TzX.js";import{d as s}from"./common-ui.es-DFOzc2ze.js";import{t as c}from"./index-oJ86i_Jb.js";var l=a({name:`VerifyEmailView`,components:{VerifyEmail:s},methods:{handleVerified(e){console.log(`User ${e} verified successfully`)},handleError(e){console.error(`Verification error:`,e)},goToLogin(){this.$router.push({name:`login`})},goToHome(){this.$router.push({name:`home`})}}});function _sfc_render(a,s,c,l,u,d){let f=r(`v-btn`),p=r(`verify-email`,!0);return n(),o(p,{onVerified:a.handleVerified,onError:a.handleError},{"success-action":e(()=>[t(f,{color:`primary`,onClick:a.goToLogin},{default:e(()=>s[0]||(s[0]=[i(` Continue to Login `)])),_:1},8,[`onClick`])]),"error-action":e(()=>[t(f,{variant:`text`,onClick:a.goToHome},{default:e(()=>s[1]||(s[1]=[i(` Back to Home `)])),_:1},8,[`onClick`])]),_:1},8,[`onVerified`,`onError`])}var u=c(l,[[`render`,_sfc_render]]);export{u as default};
|
|
2
|
+
//# sourceMappingURL=VerifyEmail-Dlm91Y-S.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VerifyEmail-
|
|
1
|
+
{"version":3,"file":"VerifyEmail-Dlm91Y-S.js","names":[],"sources":["../../src/views/VerifyEmail.vue","../../src/views/VerifyEmail.vue"],"sourcesContent":["<template>\n <verify-email @verified=\"handleVerified\" @error=\"handleError\">\n <template #success-action>\n <v-btn color=\"primary\" @click=\"goToLogin\">\n Continue to Login\n </v-btn>\n </template>\n <template #error-action>\n <v-btn variant=\"text\" @click=\"goToHome\">\n Back to Home\n </v-btn>\n </template>\n </verify-email>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { VerifyEmail } from '@vue-skuilder/common-ui';\n\nexport default defineComponent({\n name: 'VerifyEmailView',\n\n components: {\n VerifyEmail,\n },\n\n methods: {\n handleVerified(username: string) {\n console.log(`User ${username} verified successfully`);\n },\n\n handleError(error: string) {\n console.error('Verification error:', error);\n },\n\n goToLogin() {\n this.$router.push({ name: 'login' });\n },\n\n goToHome() {\n this.$router.push({ name: 'home' });\n },\n },\n});\n</script>\n","<template>\n <verify-email @verified=\"handleVerified\" @error=\"handleError\">\n <template #success-action>\n <v-btn color=\"primary\" @click=\"goToLogin\">\n Continue to Login\n </v-btn>\n </template>\n <template #error-action>\n <v-btn variant=\"text\" @click=\"goToHome\">\n Back to Home\n </v-btn>\n </template>\n </verify-email>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { VerifyEmail } from '@vue-skuilder/common-ui';\n\nexport default defineComponent({\n name: 'VerifyEmailView',\n\n components: {\n VerifyEmail,\n },\n\n methods: {\n handleVerified(username: string) {\n console.log(`User ${username} verified successfully`);\n },\n\n handleError(error: string) {\n console.error('Verification error:', error);\n },\n\n goToLogin() {\n this.$router.push({ name: 'login' });\n },\n\n goToHome() {\n this.$router.push({ name: 'home' });\n },\n },\n});\n</script>\n"],"mappings":"6TCmBA,IAAA,EAAe,EAAgB,CAC7B,KAAM,kBAEN,WAAY,CACV,YAAA,EACD,CAED,QAAS,CACP,eAAe,EAAkB,CAC/B,QAAQ,IAAI,QAAQ,EAAQ,wBAAyB,EAGvD,YAAY,EAAe,CACzB,QAAQ,MAAM,sBAAuB,EAAM,EAG7C,WAAY,CACV,KAAK,QAAQ,KAAK,CAAE,KAAM,QAAS,CAAC,EAGtC,UAAW,CACT,KAAK,QAAQ,KAAK,CAAE,KAAM,OAAQ,CAAC,EAEtC,CACF,CAAC,sFA1CA,EAWe,EAAA,CAXA,WAAU,EAAA,eAAiB,QAAO,EAAA,cACpC,iBAAc,MAGf,CAFR,EAEQ,EAAA,CAFD,MAAM,UAAW,QAAO,EAAA,YAHrC,QAAA,MAKM,EAAA,KAAA,EAAA,GAAA,CALN,EAGgD,sBAE1C,CAAA,EAAA,CALN,EAAA,oBAOe,eAAY,MAGb,CAFR,EAEQ,EAAA,CAFD,QAAQ,OAAQ,QAAO,EAAA,WARpC,QAAA,MAUM,EAAA,KAAA,EAAA,GAAA,CAVN,EAQ8C,iBAExC,CAAA,EAAA,CAVN,EAAA,oBAAA,EAAA"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import"./chunk-D6hFPZc3.js";import{$ as e,C as t,H as n,It as r,K as i,N as a,S as o,T as s,Vt as c,W as l,Z as u,_ as d,b as f,dt as p,f as m,g as h,ht as g,l as _,lt as v,v as y,y as b,z as x}from"./vue.runtime.esm-bundler-C3q8JS9f.js";var S={cardHistory:`cardH`,scheduled:`card_review_`,session:`SESSION::`,strategyState:`STRATEGY_STATE::`,registrations:`CourseRegistrations`};function toIsoTimestamp(e){if(typeof e==`number`)return new Date(e).toISOString();let t=String(e??``),n=Date.parse(t);return Number.isNaN(n)?t:new Date(n).toISOString()}function dumpFileName(e){return`userdb-${e.username}-${e.fetchedAt.slice(0,16).replace(`:`,``)}Z.json`}function parseLearnerDump(e){let t=JSON.parse(e);if(!t||typeof t.username!=`string`||!Array.isArray(t.docs))throw Error("[diagnostics] Not a learner dump: expected `username` and a `docs` array");return t}function questionTypeOf(e){if(typeof e!=`string`)return;let t=e.split(`.`);return t.length>=2?t[t.length-2]:e}function summarizeCards(e){let t=new Map(e.displayableData.map(e=>[e._id,e])),n=new Map;for(let r of e.cards){let e={};for(let n of t.get(r.id_displayable_data?.[0]??``)?.data??[])e[n.name]=n.data;n.set(r._id,{cardId:r._id,questionType:questionTypeOf(r.id_view),elo:r.elo,tags:[],data:e})}for(let t of e.tags)for(let e of t.taggedCards??[])n.get(e)?.tags.push(t.name);return n}function inferCourseId(e){if(e.courseId)return e.courseId;if(e.course)return e.course.courseId;let t=new Map;for(let n of e.docs)n._id.startsWith(S.session)&&typeof n.courseId==`string`&&t.set(n.courseId,(t.get(n.courseId)??0)+1);return[...t.entries()].sort((e,t)=>t[1]-e[1])[0]?.[0]}function fromDump(e,t){let n=t??inferCourseId(e);if(!n)throw Error(`[diagnostics] No course id given, and none found in the dump`);let r=[],i=[],a=[],o={},s;for(let t of e.docs){let e=t._id;if(e.startsWith(S.session))t.courseId===n&&r.push(t);else if(e.startsWith(S.cardHistory)){if(t.courseID!==n)continue;let e=t;i.push({...e,records:(e.records??[]).map(e=>({...e,timeStamp:toIsoTimestamp(e.timeStamp)})).sort((e,t)=>e.timeStamp.localeCompare(t.timeStamp))})}else if(e.startsWith(S.scheduled))t.courseId===n&&a.push(t);else if(e.startsWith(S.strategyState)){let[,r,i]=e.split(`::`);r===n&&i&&(o[i]=t.data)}else e===S.registrations&&(s=t)}return r.sort((e,t)=>e.startTime.localeCompare(t.startTime)),a.sort((e,t)=>String(e.reviewTime).localeCompare(String(t.reviewTime))),{username:e.username,courseId:n,asOf:e.fetchedAt,sessions:r,cardHistories:i,scheduled:a,registration:s,strategyState:o,tombstones:(e.tombstones??[]).map(({id:e,seq:t})=>({id:e,seq:t})),...e.course&&e.course.courseId===n?{cards:summarizeCards(e.course)}:{}}}function userDbName(e){let t=``;for(let n of new TextEncoder().encode(e))t+=n.toString(16).padStart(2,`0`);return`userdb-`+t}function base64(e){let t=``;for(let n of new TextEncoder().encode(e))t+=String.fromCharCode(n);return btoa(t)}function trimTrailingSlashes(e){let t=e.length;for(;t>0&&e[t-1]===`/`;)t--;return e.slice(0,t)}function couchReader(e){let t=e.fetchImpl??fetch,n=trimTrailingSlashes(e.couchUrl),r={Accept:`application/json`};e.auth.kind===`basic`&&(r.Authorization=`Basic `+base64(`${e.auth.username}:${e.auth.password}`));let i=e.auth.kind===`cookie`?`include`:void 0;async function get(e,a={}){let o=await t(`${n}/${e}`,{method:a.method??`GET`,headers:a.body?{...r,"Content-Type":`application/json`}:r,...a.body?{body:JSON.stringify(a.body)}:{},...i?{credentials:i}:{}});if(!o.ok){let t=await o.text().catch(()=>``);throw Error(`[diagnostics] ${a.method??`GET`} ${e} -> ${o.status} ${t}`)}return await o.json()}async function byKeys(e,t){let n=[];for(let r=0;r<t.length;r+=500){let i=await get(`${e}/_all_docs?include_docs=true`,{method:`POST`,body:{keys:t.slice(r,r+500)}});for(let e of i.rows)e.doc&&n.push(e.doc)}return n}async function byPrefix(e,t){return(await get(`${e}/_all_docs?${new URLSearchParams({include_docs:`true`,startkey:JSON.stringify(t),endkey:JSON.stringify(t+``)})}`)).rows.map(e=>e.doc).filter(e=>!!e)}return{base:n,get,byKeys,byPrefix}}function touchedCardIds(e){let t=new Set;for(let n of e)if(n._id.startsWith(`cardH`)&&typeof n.cardID==`string`)t.add(n.cardID);else if(n._id.startsWith(`card_review_`)&&typeof n.cardId==`string`)t.add(n.cardId);else if(n._id.startsWith(`SESSION::`)&&Array.isArray(n.eloEvents))for(let e of n.eloEvents)e.cardId&&t.add(e.cardId);return[...t]}async function fetchLearnerDump(e){let t=couchReader(e),n=userDbName(e.username),r=new Date().toISOString(),i=await t.get(n),a=new URLSearchParams({include_docs:`true`});e.attachments&&a.set(`attachments`,`true`);let o=(await t.get(`${n}/_all_docs?${a}`)).rows.map(e=>e.doc).filter(e=>!!e),s=(await t.get(`${n}/_changes?style=main_only`)).results.filter(e=>e.deleted).map(e=>({id:e.id,rev:e.changes[0]?.rev,seq:Number(String(e.seq).split(`-`)[0])})),c=e.cards??`touched`,l;if(c!==`none`){let n=`coursedb-${e.courseId}`,r;r=c===`all`?(await t.get(`${n}/_find`,{method:`POST`,body:{selector:{docType:`CARD`},limit:1e6}})).docs:await t.byKeys(n,touchedCardIds(o));let i=new Set(r.map(e=>e._id)),a=new Set;for(let e of r)for(let t of e.id_displayable_data??[])a.add(t);let s=await t.byKeys(n,[...a]),u=(await t.byPrefix(n,`TAG`)).map(e=>{let t=Array.isArray(e.taggedCards)?e.taggedCards:[];return{...e,taggedCount:t.length,taggedCards:c===`all`?t:t.filter(e=>i.has(e))}}).filter(e=>c===`all`||e.taggedCards.length>0);l={courseId:e.courseId,source:`${t.base}/${n}`,scope:c,cards:r,displayableData:s,tags:u}}return{formatVersion:1,username:e.username,dbName:n,source:t.base,fetchedAt:r,courseId:e.courseId,info:i,docs:o,tombstones:s,...l?{course:l}:{}}}var isSkillTag=(e,t)=>e?.isSkillTag?.(t)??!1,shortTag=(e,t)=>e?.shortTag?.(t)??t;function bySkillThenName(e){return(t,n)=>{let r=Number(isSkillTag(e,n))-Number(isSkillTag(e,t));return r===0?t.localeCompare(n):r}}function defaultSnapshotMetrics(e){let t={};for(let[n,r]of Object.entries(e))if(typeof r==`number`)t[n]=r;else if(r&&typeof r==`object`&&!Array.isArray(r))for(let[e,i]of Object.entries(r))typeof i==`number`&&(t[`${n}.${e}`]=i);return t}var C={churned:{label:`Churned`,help:`Many pipeline runs relative to cards served: the plan kept being rebuilt rather than consumed.`},"out-of-content":{label:`Out of content`,help:`Ended with time left on the clock: content ran out before the session did.`},walked:{label:`Walked`,help:`Abandoned or never closed, after real time invested. Not a mis-click.`},stalled:{label:`Stalled`,help:`No progress metric moved and ELO was essentially flat. The sitting produced nothing measurable.`},grinding:{label:`Grinding`,help:`Majority-incorrect, or ended with unfinished cards still in the failed queue.`}},w={churnRunsPerCard:1/3,churnMinCards:4,outOfContentSeconds:20,walkMinCards:2,stallEloEpsilon:5,grindAccuracy:.5};function stateRows(e,t){let n=t?.snapshotMetrics??defaultSnapshotMetrics,r=e.stateAtStart?n(e.stateAtStart):{},i=e.stateAtEnd?n(e.stateAtEnd):{};return[...new Set([...Object.keys(r),...Object.keys(i)])].map(e=>{let t=r[e]??null,n=i[e]??null;return{label:e,from:t,to:n,delta:t!==null&&n!==null?n-t:null}})}function flagSession(e,t){let n=w,{doc:r,accuracy:i,eloNet:a}=e,o=[],s=r.tally?.cardsPresented??0,c=r.runs?.length??0;s>=n.churnMinCards&&c/s>n.churnRunsPerCard&&o.push(`churned`),r.status===`closed`&&(r.tally?.secondsRemaining??0)>n.outOfContentSeconds&&o.push(`out-of-content`),(r.status===`open`||r.status===`abandoned`&&s>=n.walkMinCards)&&o.push(`walked`);let l=e.state.filter(e=>t?.progressMetrics?.includes(e.label)),u=a!==null||l.some(e=>e.delta!==null);return s>0&&u&&l.every(e=>(e.delta??0)===0)&&Math.abs(a??0)<n.stallEloEpsilon&&o.push(`stalled`),(i!==null&&i<n.grindAccuracy&&s>0||(r.tally?.failedQRemaining??0)>0)&&o.push(`grinding`),o}function summarizeSession(e,t){let n=Date.parse(e.startTime),r=e.endTime?Date.parse(e.endTime):NaN,i=Number.isNaN(n)||Number.isNaN(r)?null:Math.round((r-n)/1e3),a=e.tally?.responses??0,o=a>0?(e.tally?.correct??0)/a:null,s=e.eloEvents??[],c={doc:e,durationSeconds:i,accuracy:o,eloNet:s.length?s.reduce((e,t)=>e+(t.global.after-t.global.before),0):null,state:stateRows(e,t)};return{...c,flags:flagSession(c,t)}}function summarizeSessions(e,t){return e.sessions.map(e=>summarizeSession(e,t)).reverse()}function toResponseEloDelta(e,t){let n=bySkillThenName(t),r=Object.entries(e.tags??{}).map(([e,t])=>({tag:e,before:t.before,after:t.after,delta:t.after-t.before,score:t.score})).sort((e,t)=>n(e.tag,t.tag));return{userScore:e.userScore,global:{before:e.global.before,after:e.global.after,delta:e.global.after-e.global.before},...e.card?{card:{before:e.card.before,after:e.card.after,delta:e.card.after-e.card.before}}:{},tags:r}}function attachEloEvents(e,t,n){let r=new Set;for(let i of t){let t=Date.parse(i.at),a=-1,o=1/0;e.forEach((e,n)=>{if(r.has(n)||e.cardId!==i.cardId)return;let s=Math.abs(Date.parse(e.at)-t);s<o&&(o=s,a=n)}),a>=0&&(r.add(a),e[a].elo=toResponseEloDelta(i,n))}}function byTime(e,t){let n=Date.parse(e.at),r=Date.parse(t.at);return Number.isNaN(n)||Number.isNaN(r)?e.at.localeCompare(t.at):n-r}function sessionDetail(e,t,n){let r=e.sessions.find(e=>e.sessionId===t);if(!r)return null;let i=[];for(let r of e.cardHistories){let a=e.cards?.get(r.cardID);for(let e of r.records)e.sessionId===t&&i.push({kind:`response`,at:e.timeStamp,cardId:r.cardID,...a?{card:a,questionType:a.questionType}:{},tags:a?[...a.tags].sort(bySkillThenName(n)):[],isCorrect:typeof e.isCorrect==`boolean`?e.isCorrect:null,timeSpentMs:e.timeSpent??0,priorAttempts:typeof e.priorAttemps==`number`?e.priorAttemps:null,userAnswer:e.userAnswer})}r.eloEvents?.length&&attachEloEvents(i,r.eloEvents,n);let a=[...(r.runs??[]).map(e=>({kind:`run`,at:e.at,run:e})),...i].sort(byTime);return{summary:summarizeSession(r,n),timeline:a,responsesMissing:(r.tally?.responses??0)>i.length}}function servedTags(e,t){let n=new Map;for(let t of e)if(t.kind===`response`)for(let e of t.tags){let r=n.get(e);r||(r={responses:0,correct:0,incorrect:0,totalTimeMs:0,cards:new Set},n.set(e,r)),r.responses+=1,r.totalTimeMs+=t.timeSpentMs,r.cards.add(t.cardId),t.isCorrect===!0?r.correct+=1:t.isCorrect===!1&&(r.incorrect+=1)}return[...n.entries()].map(([e,t])=>{let n=t.correct+t.incorrect;return{tag:e,responses:t.responses,correct:t.correct,incorrect:t.incorrect,accuracy:n>0?t.correct/n:null,totalTimeMs:t.totalTimeMs,cards:t.cards.size}}).sort((e,n)=>{let r=Number(isSkillTag(t,n.tag))-Number(isSkillTag(t,e.tag));return r===0?n.responses===e.responses?e.tag.localeCompare(n.tag):n.responses-e.responses:r})}function eloLedger(e){let t={count:0,net:0,gained:0,lost:0,wins:0,losses:0};for(let n of e){if(n.kind!==`response`||!n.elo)continue;let e=n.elo.global.delta;t.count+=1,t.net+=e,e>0?(t.gained+=e,t.wins+=1):e<0&&(t.lost+=e,t.losses+=1)}return t.count?t:null}var T=3;function cardDossiers(e){let t=Date.parse(e.asOf),n=new Map;for(let t of e.scheduled){let e=String(t.reviewTime),r=n.get(t.cardId);(!r||e<r)&&n.set(t.cardId,e)}return e.cardHistories.map(r=>{let i=e.cards?.get(r.cardID),a=r.records.filter(e=>e.isCorrect===!1).length,o=r.records.reduce((e,t)=>e+(t.timeSpent??0),0),s=n.get(r.cardID),c=s?{reviewTime:s,overdue:Date.parse(s)<=t}:null,l=i?.elo?.global?.score??null,u=i?.elo?.global?.count??null;return{cardId:r.cardID,...i?{card:i}:{},records:r.records,lapses:r.lapses??0,streak:r.streak??0,bestIntervalSeconds:r.bestInterval??0,attempts:r.records.length,fails:a,firstSeen:r.records[0]?.timeStamp??null,lastSeen:r.records[r.records.length-1]?.timeStamp??null,totalTimeMs:o,pendingReview:c,cardElo:l,cardEloCount:u,stuck:a>0&&!!c?.overdue,frozenElo:a>=T&&u!==null&&u<a,painScore:o*(a+1)}}).sort((e,t)=>t.painScore-e.painScore)}function recordPerformance(e){let t=e.performance;return typeof t==`number`?t:t&&typeof t==`object`&&typeof t._global==`number`?t._global:null}function fmtDelta(e){if(e===null)return`—`;if(e===0)return`0`;let t=Number.isInteger(e)?e:Number(e.toFixed(1));return t>0?`+${t}`:String(t)}function fmtDuration(e){let t=Math.max(0,Math.round(e));if(t<60)return`${t}s`;let n=Math.floor(t/60);return n<60?t%60?`${n}m${t%60}s`:`${n}m`:`${(n/60).toFixed(1)}h`}function fmtAnswer(e,t=40){if(e==null)return``;if(typeof e==`string`||typeof e==`number`)return String(e);try{let n=JSON.stringify(e);return n.length>t?`${n.slice(0,t)}\u2026`:n}catch{return String(e)}}function fmtScore(e){return Math.abs(e)>=.01||e===0?e.toFixed(2):e.toExponential(1)}function trailText(e,t){let n=[` ${e}: ${t.cardId} (${t.origin}, ${t.generator??`?`}) final ${fmtScore(t.score)}`];for(let e of t.trail)n.push(` ${e.action} ${e.strategyName} \u2192 ${fmtScore(e.score)}: ${e.reason}`);return n}function runText(e){let t=[];if(t.push(`RUN ${e.label}${e.mode?` [${e.mode}]`:``} @ ${e.at} \u2014 generated ${e.generatedCount} \u2192 selected ${e.finalCount} (${e.newSelected} new, ${e.reviewsSelected} review)`+(e.generatedCount>0&&e.finalCount===0?` ⚠ nothing survived`:``)),typeof e.userElo==`number`&&t.push(` userElo: ${Math.round(e.userElo)}`),e.generators?.length){t.push(` generators:`);for(let n of e.generators)t.push(` - ${n.name}: ${n.cardCount} cards (${n.newCount} new, ${n.reviewCount} review), topScore ${n.topScore.toFixed(2)}`)}if(e.filters?.length){t.push(` filters:`);for(let n of e.filters)t.push(` - ${n.name}: +${n.boosted} boosted, -${n.penalized} penalized, ${n.passed} passed, ${n.removed} removed`)}if(e.hints&&t.push(` hints: ${JSON.stringify(e.hints)}`),e.cards?.length){t.push(` selection (✓ selected, · runner-up):`);for(let n of e.cards)t.push(` ${n.selected?`✓`:`·`} ${n.cardId} (${n.origin}, ${n.generator??`?`}) ${fmtScore(n.score)}`)}if(e.unselectedNew?.nextInLine&&t.push(...trailText(`next new in line`,e.unselectedNew.nextInLine)),e.unselectedNew?.topGenerated&&t.push(...trailText(`top-generated new (sunk)`,e.unselectedNew.topGenerated)),e.discardedTail){let n=e.discardedTail;t.push(` discardedTail: ${n.count} cards`+(n.scoreRange?` \xB7 score [${n.scoreRange[0].toFixed(2)}, ${n.scoreRange[1].toFixed(2)}]`:``)+(n.eloRange?` \xB7 elo [${Math.round(n.eloRange[0])}, ${Math.round(n.eloRange[1])}]`:``)),n.note&&t.push(` ${n.note}`)}return t.join(`
|
|
2
|
+
`)}function scoredTagDeltas(e){return e.tags.filter(e=>e.score!==null&&e.delta!==0).slice(0,4)}function eloSuffix(e,t){if(!e)return``;let n=`ELO g:${e.global.before}\u2192${e.global.after} (${fmtDelta(e.global.delta)})`,r=scoredTagDeltas(e).map(e=>`${shortTag(t,e.tag)}:${fmtDelta(e.delta)}`);return` ${n}${r.length?` | ${r.join(` `)}`:``}`}function clock(e){let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toISOString().slice(11,19)}function sessionText(e,t,n={},r){let i=t.summary,a=i.doc,o=t.timeline.filter(e=>e.kind===`response`).length,s=[];if(s.push(`# Study session ${a.sessionId} \u2014 user ${e}`),s.push(``),s.push(`## Legend`),s.push(`- The TIMELINE is one time-ordered stream: RUN lines are pipeline (re)plans;`),s.push(` the lines between them are card responses in the order presented.`),s.push(`- RUN "generated N → selected M (a new, b review)": the pipeline produced N`),s.push(` candidates and chose M. "nothing survived" = generated > 0 but 0 selected.`),s.push(` Bootstrap runs fire before card #1; replans are interleaved by time.`),s.push(`- generators: each source's contribution. filters: how each reshaped scores.`),s.push(` hints: the ReplanHints the navigator was told (_label = replan reason).`),s.push(` selection: the chosen cards and top runners-up. "next new in line" / "top-generated`),s.push(` new (sunk)": the unselected new cards worth explaining, with each score change.`),s.push(` Prescribed and hint-required cards count as origin "unknown" (known miscount).`),s.push(`- RESP "✓/✗ type <cardId> [tags] Ts (attempt k) 'answer'": one presentation and`),s.push(` its outcome. A trailing "ELO g:before→after (Δ) | tag:Δ …" is the exchange it`),s.push(` produced. Only first attempts move ELO.`),s.push(``),s.push(`## Headline`),s.push(`- status: ${a.status}`),s.push(`- start: ${a.startTime}${a.endTime?` \xB7 end: ${a.endTime}`:``}`),s.push(`- clock: ${i.durationSeconds??`—`}s of ${a.plannedSeconds}s planned`+(a.tally?` \xB7 ${a.tally.secondsRemaining}s remaining`:``)),a.tally&&s.push(`- tally: ${a.tally.cardsPresented} cards, ${a.tally.responses} responses (${a.tally.correct} correct / ${a.tally.incorrect} incorrect) \xB7 failedQ remaining ${a.tally.failedQRemaining}`),s.push(`- flags: ${i.flags.length?i.flags.join(`, `):`none`}`),s.push(`- config: batchLimit ${a.config?.defaultBatchLimit??`?`}, ${a.config?.sourceCount??`?`} source(s), opening queues supply ${a.initialQueues?.supplyQ??`?`} / failed ${a.initialQueues?.failedQ??`?`}`),t.responsesMissing&&s.push(`- \u26A0 responsesMissing: tally claims ${a.tally?.responses} responses but only ${o} stamped records were found.`),s.push(``),i.state.length){s.push(`## Learner state (start → end, Δ)`);for(let e of i.state)s.push(`- ${e.label}: ${e.from??`—`} \u2192 ${e.to??`—`} (${fmtDelta(e.delta)})`);s.push(``)}if(s.push(`## Session hints`),s.push(`- at open: ${a.config?.initHints?JSON.stringify(a.config.initHints):`none`}`),s.push(`- at close: ${a.finalHints?JSON.stringify(a.finalHints):`none`}`),s.push(``),n.servedTags?.length){s.push(`## Served tags`);for(let e of n.servedTags)s.push(`- ${e.tag}: ${e.responses} resp / ${e.cards} card(s), acc ${e.accuracy===null?`n/a`:`${Math.round(e.accuracy*100)}%`} (${e.correct}\u2713/${e.incorrect}\u2717), ${(e.totalTimeMs/1e3).toFixed(1)}s`);s.push(``)}let c=n.eloLedger;c&&(s.push(`## ELO ledger (learner global)`),s.push(`- net ${fmtDelta(c.net)} across ${c.count} exchange(s) \xB7 gained ${fmtDelta(c.gained)} over ${c.wins} win(s) \xB7 lost ${fmtDelta(c.lost)} over ${c.losses} loss(es)`),s.push(``)),s.push(`## Timeline (${t.timeline.length} entries)`);for(let e of t.timeline){if(e.kind===`run`){s.push(runText(e.run));continue}let t=e.isCorrect===!0?`✓`:e.isCorrect===!1?`✗`:`·`,n=e.tags.length?` [${e.tags.join(`, `)}]`:``,i=e.priorAttempts?` (attempt ${e.priorAttempts+1})`:``,a=e.userAnswer==null?``:` '${fmtAnswer(e.userAnswer)}'`;s.push(`RESP ${clock(e.at)} ${t} ${e.questionType??`card`} ${e.cardId}${n} \u2014 ${(e.timeSpentMs/1e3).toFixed(1)}s${i}${a}${eloSuffix(e.elo,r)}`)}return s.join(`
|
|
3
|
+
`)}var E=Object.defineProperty,__name=(e,t)=>E(e,`name`,{value:t,configurable:!0});function useLearnerDataset(){let e=p(null),t=p(null),n=v(!1),r=v(null);async function load(i,a){n.value=!0,r.value=null;try{let n=await i();t.value=fromDump(n,a),e.value=n}catch(e){r.value=e instanceof Error?e.message:String(e)}finally{n.value=!1}}function loadFromCouch(e){return load(()=>fetchLearnerDump({...e,auth:{kind:`cookie`}}),e.courseId)}function loadFromFile(e,t){return load(async()=>parseLearnerDump(await e.text()),t)}return{dump:e,dataset:t,loading:n,error:r,loadFromCouch,loadFromFile}}function downloadLearnerDump(e){let t=new Blob([JSON.stringify(e,null,2)],{type:`application/json`}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=dumpFileName(e),r.click(),URL.revokeObjectURL(n)}var D={class:`d-flex flex-wrap align-center ga-2`},O={key:1,class:`d-flex flex-wrap align-center ga-2 mt-3`},k=s({__name:`LearnerDatasetSource`,props:{couchUrl:{},courseId:{},initialUsername:{},autoload:{type:Boolean}},emits:[`loaded`],setup(r,{emit:a}){let s=r,l=a,{dump:p,dataset:S,loading:C,error:w,loadFromCouch:T,loadFromFile:E}=useLearnerDataset(),k=v(s.initialUsername??``),A=v(null),j=h(()=>{let e=S.value?.sessions??[];return e.length?`${e[0].startTime.slice(0,10)} .. ${e[e.length-1].startTime.slice(0,10)}`:``});function loadLive(){!s.couchUrl||!s.courseId||!k.value||T({couchUrl:s.couchUrl,courseId:s.courseId,username:k.value})}function onFile(e){let t=e.target,n=t.files?.[0];n&&E(n,s.courseId),t.value=``}return u(S,e=>{e&&p.value&&l(`loaded`,e,p.value)}),x(()=>{s.autoload&&loadLive()}),(r,a)=>{let s=i(`v-text-field`),l=i(`v-btn`),u=i(`v-alert`),h=i(`v-spacer`),v=i(`v-card-text`),x=i(`v-card`);return n(),y(x,{variant:`outlined`},{default:e(()=>[t(v,null,{default:e(()=>[d(`div`,D,[t(s,{modelValue:k.value,"onUpdate:modelValue":a[0]||(a[0]=e=>k.value=e),label:`Learner`,density:`compact`,"hide-details":``,style:{"max-width":`16rem`},disabled:!r.couchUrl||!r.courseId,onKeydown:_(loadLive,[`enter`])},null,8,[`modelValue`,`disabled`]),t(l,{color:`primary`,loading:g(C),disabled:!r.couchUrl||!r.courseId||!k.value,onClick:loadLive},{default:e(()=>a[3]||(a[3]=[o(` Load `)])),_:1},8,[`loading`,`disabled`]),a[5]||(a[5]=d(`span`,{class:`text-medium-emphasis mx-2`},`or`,-1)),t(l,{variant:`tonal`,"prepend-icon":`mdi-file-upload-outline`,onClick:a[1]||(a[1]=e=>A.value?.click())},{default:e(()=>a[4]||(a[4]=[o(` Open dump file `)])),_:1}),d(`input`,{ref_key:`fileInput`,ref:A,type:`file`,accept:`.json,application/json`,hidden:``,onChange:onFile},null,544)]),g(w)?(n(),y(u,{key:0,type:`error`,variant:`tonal`,density:`compact`,class:`mt-3`},{default:e(()=>[o(c(g(w)),1)]),_:1})):b(``,!0),g(S)&&g(p)?(n(),f(`div`,O,[d(`span`,null,[d(`strong`,null,c(g(S).username),1),o(` · `+c(g(S).sessions.length)+` sessions `,1),j.value?(n(),f(m,{key:0},[o(`(`+c(j.value)+`)`,1)],64)):b(``,!0),o(` · `+c(g(S).cardHistories.length)+` cards seen · as of `+c(g(S).asOf.slice(0,16))+`Z `,1),g(S).cards?b(``,!0):(n(),f(m,{key:1},[o(`· no course slice`)],64))]),t(h),t(l,{variant:`text`,size:`small`,"prepend-icon":`mdi-download`,onClick:a[2]||(a[2]=e=>g(downloadLearnerDump)(g(p)))},{default:e(()=>a[6]||(a[6]=[o(` Save dump `)])),_:1})])):b(``,!0)]),_:1})]),_:1})}}}),A={churned:{icon:`mdi-autorenew`,color:`warning`},"out-of-content":{icon:`mdi-cup-off-outline`,color:`error`},walked:{icon:`mdi-exit-run`,color:`error`},stalled:{icon:`mdi-arrow-collapse-horizontal`,color:`grey`},grinding:{icon:`mdi-alert-octagon-outline`,color:`warning`}};function statusColor(e){return e===`closed`?`success`:e===`abandoned`?`warning`:`error`}function accuracyClass(e){return e===null?`text-disabled`:e>=.8?`text-success`:e<.5?`text-error`:``}function deltaClass(e){return e===null||e===0?`text-disabled`:e>0?`text-success`:`text-error`}function deltaColor(e){return e>0?`success`:e<0?`error`:`grey`}function fmtTime(e){if(!e)return`—`;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}function fmtClock(e){let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleTimeString(void 0,{hour12:!1})}function shortId(e,t=28){return e.length>t?`…${e.slice(-(t-2))}`:e}function useCopy(){let e=v(null),t=null;async function copy(n,r){try{await navigator.clipboard.writeText(n),e.value=r,t&&clearTimeout(t),t=setTimeout(()=>e.value=null,1400)}catch(e){console.warn(`[admin] clipboard write failed`,e)}}return{copied:e,copy}}var j={key:0,class:`text-caption mb-2`},M={class:`text-medium-emphasis`},N={class:`d-flex flex-wrap mb-2 ga-1`},P={key:0,class:`text-caption text-disabled`},F={class:`text-caption text-medium-emphasis mb-2`},I={key:0,class:`text-error`},L={class:`text-no-wrap`},R={key:2,class:`text-disabled`},z={class:`text-truncate`,style:{"max-width":`200px`}},ee=s({__name:`CardDossierDetail`,props:{dossier:{},interpreters:{}},setup(a){function perf(e){let t=recordPerformance(e);return t===null?`—`:t.toFixed(2)}function fmtInterval(e){return e?e<3600?`${Math.round(e/60)}m`:e<86400?`${Math.round(e/3600)}h`:`${Math.round(e/86400)}d`:`none`}return(a,s)=>{let u=i(`v-chip`),p=i(`v-icon`),h=i(`v-table`);return n(),f(`div`,null,[a.dossier.card&&Object.keys(a.dossier.card.data).length?(n(),f(`div`,j,[(n(!0),f(m,null,l(a.dossier.card.data,(e,t)=>(n(),f(`span`,{key:t,class:`mr-3`},[d(`span`,M,c(t)+`:`,1),o(` `+c(g(fmtAnswer)(e,60)),1)]))),128))])):b(``,!0),d(`div`,N,[(n(!0),f(m,null,l(a.dossier.card?.tags??[],t=>(n(),y(u,{key:t,size:`x-small`,variant:`outlined`,color:g(isSkillTag)(a.interpreters,t)?`primary`:void 0},{default:e(()=>[o(c(t),1)]),_:2},1032,[`color`]))),128)),a.dossier.card?b(``,!0):(n(),f(`span`,P,`no course data in this dataset`))]),d(`div`,F,[o(` lapses `+c(a.dossier.lapses)+` · streak `+c(a.dossier.streak)+` · best interval `+c(fmtInterval(a.dossier.bestIntervalSeconds))+` · `,1),a.dossier.pendingReview?(n(),f(m,{key:0},[o(` next review `+c(g(fmtTime)(a.dossier.pendingReview.reviewTime))+` `,1),a.dossier.pendingReview.overdue?(n(),f(`span`,I,`(overdue)`)):b(``,!0)],64)):(n(),f(m,{key:1},[o(`no review scheduled`)],64))]),t(h,{density:`compact`,class:`sk-record-table`},{default:e(()=>[s[2]||(s[2]=d(`thead`,null,[d(`tr`,null,[d(`th`,null,`#`),d(`th`,null,`When`),d(`th`,null,`Result`),d(`th`,null,`Perf`),d(`th`,null,`Prior att.`),d(`th`,null,`Time`),d(`th`,null,`Answer`)])],-1)),d(`tbody`,null,[(n(!0),f(m,null,l(a.dossier.records,(t,i)=>(n(),f(`tr`,{key:i,class:r(t.isCorrect===!1?`sk-fail-row`:``)},[d(`td`,null,c(i+1),1),d(`td`,L,c(g(fmtTime)(t.timeStamp)),1),d(`td`,null,[t.isCorrect===!0?(n(),y(p,{key:0,size:`small`,color:`success`},{default:e(()=>s[0]||(s[0]=[o(`mdi-check`)])),_:1})):t.isCorrect===!1?(n(),y(p,{key:1,size:`small`,color:`error`},{default:e(()=>s[1]||(s[1]=[o(`mdi-close`)])),_:1})):(n(),f(`span`,R,`—`))]),d(`td`,null,c(perf(t)),1),d(`td`,null,c(t.priorAttemps??`—`),1),d(`td`,null,c(((t.timeSpent??0)/1e3).toFixed(1))+`s`,1),d(`td`,z,c(g(fmtAnswer)(t.userAnswer)),1)],2))),128))])]),_:1})])}}}),B=__name((e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},`default`),V=B(ee,[[`__scopeId`,`data-v-76b0a622`]]),te={class:`text-caption text-medium-emphasis mb-4`},H={class:`text-h6`},U={class:`text-caption`},W={class:`d-flex align-center flex-wrap mb-3 ga-3`},G={class:`d-flex align-center flex-wrap ga-2`,style:{width:`100%`}},K={class:`text-body-2 font-weight-medium`},q={class:`text-caption text-medium-emphasis`},J={key:2,class:`text-caption`},Y={key:0,class:`ml-1 text-disabled`},X=B(s({__name:`LearnerCardHistory`,props:{dataset:{},interpreters:{},focus:{}},setup(s){let p=s,_=h(()=>cardDossiers(p.dataset)),x=v(`all`),S=v(``),C=v([]),w=v(null),T=h(()=>({stuck:_.value.filter(e=>e.stuck).length,failed:_.value.filter(e=>e.fails>0).length,frozen:_.value.filter(e=>e.frozenElo).length})),E=h(()=>[{label:`cards seen`,value:_.value.length,color:`primary`},{label:`total attempts`,value:_.value.reduce((e,t)=>e+t.attempts,0),color:`primary`},{label:`total fails`,value:_.value.reduce((e,t)=>e+t.fails,0),color:`error`},{label:`time on cards`,value:fmtDuration(_.value.reduce((e,t)=>e+t.totalTimeMs,0)/1e3),color:`grey`},{label:`stuck reviews`,value:T.value.stuck,color:`error`},{label:`frozen ELO`,value:T.value.frozen,color:`warning`}]),D=h(()=>{let e=_.value;x.value===`stuck`?e=e.filter(e=>e.stuck):x.value===`failed`?e=e.filter(e=>e.fails>0):x.value===`frozen`&&(e=e.filter(e=>e.frozenElo));let t=S.value?.trim().toLowerCase();return t&&(e=e.filter(e=>e.cardId.toLowerCase().includes(t)||(e.card?.questionType??``).toLowerCase().includes(t)||(e.card?.tags??[]).some(e=>e.toLowerCase().includes(t))||Object.values(e.card?.data??{}).some(e=>typeof e==`string`&&e.toLowerCase().includes(t)))),e});function headline(e){let t=Object.values(e.card?.data??{}).find(e=>typeof e==`string`&&e.length<=40);return typeof t==`string`?t:``}async function applyFocus(e){!e||!_.value.some(t=>t.cardId===e)||(x.value=`all`,S.value=e,C.value=[e],await a(),document.querySelector(`[data-card="${CSS.escape(e)}"]`)?.scrollIntoView({behavior:`smooth`,block:`center`}),w.value=e,setTimeout(()=>{w.value===e&&(w.value=null)},2200))}return u(()=>p.focus,e=>void applyFocus(e),{immediate:!0}),(a,s)=>{let u=i(`v-icon`),p=i(`v-card`),h=i(`v-col`),v=i(`v-row`),O=i(`v-btn`),k=i(`v-btn-toggle`),A=i(`v-text-field`),j=i(`v-alert`),M=i(`v-spacer`),N=i(`v-chip`),P=i(`v-expansion-panel-title`),F=i(`v-expansion-panel-text`),I=i(`v-expansion-panel`),L=i(`v-expansion-panels`);return n(),f(`div`,null,[d(`p`,te,[s[5]||(s[5]=o(` Every card the learner has met, most painful first (time sunk × failures), with its pending review and current card ELO. `)),t(u,{size:`x-small`,color:`error`},{default:e(()=>s[3]||(s[3]=[o(`mdi-sync-alert`)])),_:1}),s[6]||(s[6]=o(` is a failed card holding an overdue review; `)),t(u,{size:`x-small`,color:`warning`},{default:e(()=>s[4]||(s[4]=[o(`mdi-snowflake`)])),_:1}),s[7]||(s[7]=o(` is a repeatedly failed card whose ELO has fewer updates than failures. `))]),t(v,{dense:``,class:`mb-2`},{default:e(()=>[(n(!0),f(m,null,l(E.value,r=>(n(),y(h,{key:r.label,cols:`6`,sm:`4`,md:`2`},{default:e(()=>[t(p,{variant:`tonal`,color:r.color,class:`pa-2 text-center`},{default:e(()=>[d(`div`,H,c(r.value),1),d(`div`,U,c(r.label),1)]),_:2},1032,[`color`])]),_:2},1024))),128))]),_:1}),d(`div`,W,[t(k,{modelValue:x.value,"onUpdate:modelValue":s[0]||(s[0]=e=>x.value=e),density:`compact`,color:`primary`,variant:`outlined`},{default:e(()=>[t(O,{value:`all`,size:`small`},{default:e(()=>[o(`All (`+c(_.value.length)+`)`,1)]),_:1}),t(O,{value:`stuck`,size:`small`},{default:e(()=>[t(u,{start:``,size:`small`,color:`error`},{default:e(()=>s[8]||(s[8]=[o(`mdi-sync-alert`)])),_:1}),o(` Stuck (`+c(T.value.stuck)+`) `,1)]),_:1}),t(O,{value:`failed`,size:`small`},{default:e(()=>[o(`Ever failed (`+c(T.value.failed)+`)`,1)]),_:1}),t(O,{value:`frozen`,size:`small`},{default:e(()=>[t(u,{start:``,size:`small`,color:`warning`},{default:e(()=>s[9]||(s[9]=[o(`mdi-snowflake`)])),_:1}),o(` Frozen ELO (`+c(T.value.frozen)+`) `,1)]),_:1})]),_:1},8,[`modelValue`]),t(A,{modelValue:S.value,"onUpdate:modelValue":s[1]||(s[1]=e=>S.value=e),density:`compact`,variant:`outlined`,"hide-details":``,clearable:``,placeholder:`filter by card / tag / type / content`,"prepend-inner-icon":`mdi-magnify`,style:{"max-width":`320px`}},null,8,[`modelValue`])]),_.value.length===0?(n(),y(j,{key:0,type:`info`,variant:`tonal`},{default:e(()=>s[10]||(s[10]=[o(`No card history for this learner.`)])),_:1})):(n(),y(L,{key:1,modelValue:C.value,"onUpdate:modelValue":s[2]||(s[2]=e=>C.value=e),multiple:``,variant:`accordion`},{default:e(()=>[(n(!0),f(m,null,l(D.value,i=>(n(),y(I,{key:i.cardId,value:i.cardId,"data-card":i.cardId,class:r(i.cardId===w.value?`sk-card-flash`:``)},{default:e(()=>[t(P,null,{default:e(()=>[d(`div`,G,[i.stuck?(n(),y(u,{key:0,color:`error`,size:`small`,title:`failed + overdue review`},{default:e(()=>s[11]||(s[11]=[o(`mdi-sync-alert`)])),_:1})):b(``,!0),i.frozenElo?(n(),y(u,{key:1,color:`warning`,size:`small`,title:`repeatedly failed, ELO barely updated`},{default:e(()=>s[12]||(s[12]=[o(` mdi-snowflake `)])),_:1})):b(``,!0),d(`span`,K,c(i.card?.questionType??`card`),1),d(`code`,q,c(g(shortId)(i.cardId,24)),1),headline(i)?(n(),f(`span`,J,c(headline(i)),1)):b(``,!0),t(M),i.fails>0?(n(),y(N,{key:3,size:`x-small`,color:`error`,variant:`tonal`},{default:e(()=>[o(c(i.fails)+` fail`+c(i.fails===1?``:`s`),1)]),_:2},1024)):b(``,!0),t(N,{size:`x-small`,variant:`tonal`},{default:e(()=>[o(c(i.attempts)+` view`+c(i.attempts===1?``:`s`),1)]),_:2},1024),t(N,{size:`x-small`,variant:`tonal`,color:`grey`},{default:e(()=>[o(c(g(fmtDuration)(i.totalTimeMs/1e3)),1)]),_:2},1024),i.pendingReview?(n(),y(N,{key:4,size:`x-small`,color:i.pendingReview.overdue?`error`:`success`,variant:`flat`},{default:e(()=>[o(` review `+c(i.pendingReview.overdue?`overdue`:`scheduled`),1)]),_:2},1032,[`color`])):b(``,!0),t(N,{size:`x-small`,variant:`tonal`,color:i.frozenElo?`warning`:void 0},{default:e(()=>[o(` ELO `+c(i.cardElo===null?`?`:Math.round(i.cardElo))+` `,1),i.cardEloCount===null?b(``,!0):(n(),f(`span`,Y,`/`+c(i.cardEloCount),1))]),_:2},1032,[`color`])])]),_:2},1024),t(F,null,{default:e(()=>[t(V,{dossier:i,interpreters:a.interpreters},null,8,[`dossier`,`interpreters`])]),_:2},1024)]),_:2},1032,[`value`,`data-card`,`class`]))),128))]),_:1},8,[`modelValue`]))])}}}),[[`__scopeId`,`data-v-bb6b302b`]]),Z={class:`sk-run-detail`},Q={key:0,class:`mb-2`},ne={class:`text-right`},re={class:`text-right`},ie={class:`text-right`},ae={class:`text-right`},oe={key:1,class:`mb-2`},se={class:`text-right`},ce={class:`text-right`},le={class:`text-right`},ue={key:2,class:`mb-2`},de={key:1,title:`runner-up`},fe=[`onClick`],pe={class:`text-right`},me={class:`text-caption font-weight-medium`},he=[`onClick`],ge={class:`text-medium-emphasis`},_e={class:`text-no-wrap`},ve={class:`text-no-wrap`},ye={class:`text-right text-no-wrap`},be={class:`text-caption`},xe={key:3,class:`mb-2`},Se={class:`sk-hint-block`},Ce={key:4,class:`text-caption text-medium-emphasis`},we={key:2},Te=B(s({__name:`RunDetail`,props:{run:{}},emits:[`open-card`],setup(a,{emit:s}){let u=a,p=s,g=h(()=>{let e=u.run.unselectedNew,t=[];return e?.nextInLine&&t.push({label:`next new card in line`,card:e.nextInLine}),e?.topGenerated&&t.push({label:`top-generated new card (sunk)`,card:e.topGenerated}),t});function fmtScore(e){return Math.abs(e)>=.01||e===0?e.toFixed(2):e.toExponential(1)}return(a,s)=>{let u=i(`v-table`),h=i(`v-icon`);return n(),f(`div`,Z,[a.run.generators?.length?(n(),f(`div`,Q,[s[1]||(s[1]=d(`div`,{class:`text-caption font-weight-medium`},`generators`,-1)),t(u,{density:`compact`,class:`sk-mini-table`},{default:e(()=>[s[0]||(s[0]=d(`thead`,null,[d(`tr`,null,[d(`th`),d(`th`,{class:`text-right`},`cards`),d(`th`,{class:`text-right`},`new`),d(`th`,{class:`text-right`},`review`),d(`th`,{class:`text-right`},`top`)])],-1)),d(`tbody`,null,[(n(!0),f(m,null,l(a.run.generators,e=>(n(),f(`tr`,{key:e.name},[d(`td`,null,c(e.name),1),d(`td`,ne,c(e.cardCount),1),d(`td`,re,c(e.newCount),1),d(`td`,ie,c(e.reviewCount),1),d(`td`,ae,c(e.topScore.toFixed(2)),1)]))),128))])]),_:1})])):b(``,!0),a.run.filters?.length?(n(),f(`div`,oe,[s[3]||(s[3]=d(`div`,{class:`text-caption font-weight-medium`},`filters`,-1)),t(u,{density:`compact`,class:`sk-mini-table`},{default:e(()=>[s[2]||(s[2]=d(`thead`,null,[d(`tr`,null,[d(`th`),d(`th`,{class:`text-right`},`boosted`),d(`th`,{class:`text-right`},`penalized`),d(`th`,{class:`text-right`},`passed`),d(`th`,{class:`text-right`},`removed`)])],-1)),d(`tbody`,null,[(n(!0),f(m,null,l(a.run.filters,e=>(n(),f(`tr`,{key:e.name},[d(`td`,null,c(e.name),1),d(`td`,se,c(e.boosted),1),d(`td`,ce,c(e.penalized),1),d(`td`,le,c(e.passed),1),d(`td`,{class:r([`text-right`,e.removed>0?`text-error`:``])},c(e.removed),3)]))),128))])]),_:1})])):b(``,!0),a.run.cards?.length?(n(),f(`div`,ue,[s[6]||(s[6]=d(`div`,{class:`text-caption font-weight-medium`},`selection`,-1)),t(u,{density:`compact`,class:`sk-mini-table`},{default:e(()=>[s[5]||(s[5]=d(`thead`,null,[d(`tr`,null,[d(`th`),d(`th`,null,`card`),d(`th`,null,`origin`),d(`th`,null,`generator`),d(`th`,{class:`text-right`},`score`)])],-1)),d(`tbody`,null,[(n(!0),f(m,null,l(a.run.cards,t=>(n(),f(`tr`,{key:t.cardId,class:r(t.selected?``:`text-medium-emphasis`)},[d(`td`,null,[t.selected?(n(),y(h,{key:0,size:`x-small`,color:`success`},{default:e(()=>s[4]||(s[4]=[o(`mdi-check`)])),_:1})):(n(),f(`span`,de,`·`))]),d(`td`,null,[d(`a`,{class:`sk-card-link`,onClick:e=>p(`open-card`,t.cardId)},c(t.cardId),9,fe)]),d(`td`,null,c(t.origin),1),d(`td`,null,c(t.generator??`—`),1),d(`td`,pe,c(fmtScore(t.score)),1)],2))),128))])]),_:1})])):b(``,!0),(n(!0),f(m,null,l(g.value,r=>(n(),f(`div`,{key:r.label,class:`mb-2`},[d(`div`,me,[o(c(r.label)+`: `,1),d(`a`,{class:`sk-card-link`,onClick:e=>p(`open-card`,r.card.cardId)},c(r.card.cardId),9,he),d(`span`,ge,` (`+c(r.card.origin)+`, `+c(r.card.generator??`?`)+`) final `+c(fmtScore(r.card.score)),1)]),t(u,{density:`compact`,class:`sk-mini-table`},{default:e(()=>[d(`tbody`,null,[(n(!0),f(m,null,l(r.card.trail,(e,t)=>(n(),f(`tr`,{key:t},[d(`td`,_e,c(e.action),1),d(`td`,ve,c(e.strategyName),1),d(`td`,ye,c(fmtScore(e.score)),1),d(`td`,be,c(e.reason),1)]))),128))])]),_:2},1024)]))),128)),a.run.hints?(n(),f(`div`,xe,[s[7]||(s[7]=d(`div`,{class:`text-caption font-weight-medium`},`hints`,-1)),d(`pre`,Se,c(JSON.stringify(a.run.hints,null,2)),1)])):b(``,!0),a.run.discardedTail?(n(),f(`div`,Ce,[o(` discarded tail: `+c(a.run.discardedTail.count)+` cards `,1),a.run.discardedTail.scoreRange?(n(),f(m,{key:0},[o(` · score [`+c(a.run.discardedTail.scoreRange[0].toFixed(2))+`, `+c(a.run.discardedTail.scoreRange[1].toFixed(2))+`] `,1)],64)):b(``,!0),a.run.discardedTail.eloRange?(n(),f(m,{key:1},[o(` · ELO [`+c(Math.round(a.run.discardedTail.eloRange[0]))+`, `+c(Math.round(a.run.discardedTail.eloRange[1]))+`] `,1)],64)):b(``,!0),a.run.discardedTail.note?(n(),f(`div`,we,c(a.run.discardedTail.note),1)):b(``,!0)])):b(``,!0)])}}}),[[`__scopeId`,`data-v-ffc34f95`]]),Ee={class:`d-flex align-center flex-wrap mb-4 ga-2`},De={class:`text-caption text-medium-emphasis`},Oe={class:`text-right`},ke={class:`text-right`},Ae={key:1,class:`text-caption text-disabled`},je={class:`sk-hint-block`},Me={class:`sk-hint-block`},Ne={class:`text-caption text-medium-emphasis mb-4`},Pe={class:`text-right`},Fe={class:`text-right`},Ie={class:`text-disabled`},Le={class:`text-right`},Re={class:`d-flex flex-wrap ga-5`},ze={class:`text-caption text-medium-emphasis`},Be={class:`text-h6 text-success`},Ve={class:`text-caption text-medium-emphasis`},He={class:`text-h6 text-error`},Ue={class:`text-h6`},We={class:`text-caption text-disabled`},Ge={class:`d-flex align-center flex-wrap mb-2 ga-3`},Ke={key:4,class:`sk-timeline`},qe={class:`sk-tl-time text-caption text-disabled`},Je={class:`sk-tl-gutter`},Ye={key:0,class:`sk-tl-body`},Xe={class:`d-flex align-center flex-wrap ga-1`},Ze={class:`font-weight-medium`},Qe={class:`text-caption text-medium-emphasis ml-2`},$e={key:1,class:`text-caption text-error ml-2`},et={key:1,class:`sk-tl-body`},tt=[`title`,`onClick`],nt={class:`text-caption`},rt={class:`text-caption text-medium-emphasis ml-2`},it={key:0,class:`text-caption text-disabled ml-2`},at=B(s({__name:`LearnerSessionDetail`,props:{dataset:{},sessionId:{},interpreters:{}},emits:[`open-card`],setup(a,{emit:s}){let u=a,p=s,_=h(()=>sessionDetail(u.dataset,u.sessionId,u.interpreters)),x=h(()=>_.value.summary.doc),S=h(()=>servedTags(_.value?.timeline??[],u.interpreters)),w=h(()=>eloLedger(_.value?.timeline??[])),T=h(()=>_.value?.timeline.filter(e=>e.kind===`response`).length??0),E=v(`all`),D=h(()=>{let e=_.value?.timeline??[];return!E.value||E.value===`all`?e:e.filter(e=>e.kind===E.value)}),O=v(new Set);function toggle(e){let t=new Set(O.value);t.has(e)?t.delete(e):t.add(e),O.value=t}let{copied:k,copy:j}=useCopy();function asText(){return _.value?sessionText(u.dataset.username,_.value,{servedTags:S.value,eloLedger:w.value},u.interpreters):``}let M=h(()=>{let e=_.value?.summary;if(!e)return``;let t=fmtDuration(e.doc.plannedSeconds);return e.durationSeconds===null?`— of ${t}`:`${fmtDuration(e.durationSeconds)} of ${t}`});function skillTags(e){return e.filter(e=>isSkillTag(u.interpreters,e)).slice(0,3)}function fmtNum(e){return e===null?`—`:Number.isInteger(e)?String(e):e.toFixed(1)}function fmtHints(e){return e==null?`none`:JSON.stringify(e,null,2)}function entryIcon(e){return e.kind===`run`?`mdi-cog-refresh-outline`:e.isCorrect===!0?`mdi-check-circle-outline`:e.isCorrect===!1?`mdi-close-circle-outline`:`mdi-circle-small`}function entryColor(e){return e.kind===`run`?`primary`:e.isCorrect===!0?`success`:e.isCorrect===!1?`error`:`grey`}function rowClass(e){return e.kind===`run`?`sk-tl-run`:e.isCorrect===!1?`sk-tl-fail`:``}return(a,s)=>{let u=i(`v-alert`),h=i(`v-chip`),v=i(`v-icon`),N=i(`v-spacer`),P=i(`v-btn`),F=i(`v-table`),I=i(`v-card`),L=i(`v-col`),R=i(`v-row`),z=i(`v-btn-toggle`);return n(),f(`div`,null,[_.value?(n(),f(m,{key:1},[d(`div`,Ee,[t(h,{size:`small`,variant:`flat`,color:g(statusColor)(x.value.status)},{default:e(()=>[o(c(x.value.status),1)]),_:1},8,[`color`]),t(h,{size:`small`,variant:`tonal`},{default:e(()=>[o(c(g(fmtTime)(x.value.startTime)),1)]),_:1}),t(h,{size:`small`,variant:`tonal`,color:`grey`},{default:e(()=>[o(c(M.value),1)]),_:1}),(n(!0),f(m,null,l(_.value.summary.flags,r=>(n(),y(h,{key:r,size:`small`,variant:`tonal`,color:g(A)[r].color,title:g(C)[r].help},{default:e(()=>[t(v,{start:``,size:`small`},{default:e(()=>[o(c(g(A)[r].icon),1)]),_:2},1024),o(` `+c(g(C)[r].label),1)]),_:2},1032,[`color`,`title`]))),128)),t(N),d(`code`,De,c(a.sessionId),1),t(P,{variant:`text`,size:`small`,"prepend-icon":g(k)===`session`?`mdi-check`:`mdi-clipboard-text-outline`,color:g(k)===`session`?`success`:void 0,onClick:s[0]||(s[0]=e=>g(j)(asText(),`session`))},{default:e(()=>[o(c(g(k)===`session`?`Copied`:`Copy as text`),1)]),_:1},8,[`prepend-icon`,`color`])]),_.value.responsesMissing?(n(),y(u,{key:0,type:`warning`,variant:`tonal`,density:`compact`,class:`mb-4`},{default:e(()=>[o(` The session records `+c(x.value.tally?.responses)+` responses but only `+c(T.value)+` card records carry its id. The timeline is incomplete. `,1)]),_:1})):b(``,!0),t(R,{class:`mb-2`},{default:e(()=>[t(L,{cols:`12`,md:`6`},{default:e(()=>[t(I,{variant:`outlined`,class:`pa-3 h-100`},{default:e(()=>[s[4]||(s[4]=d(`div`,{class:`text-subtitle-2 mb-1`},`Learner state`,-1)),s[5]||(s[5]=d(`div`,{class:`text-caption text-medium-emphasis mb-3`},` What the navigator was choosing against, and what moved. `,-1)),_.value.summary.state.length?(n(),y(F,{key:0,density:`compact`,class:`sk-mini-table`},{default:e(()=>[s[3]||(s[3]=d(`thead`,null,[d(`tr`,null,[d(`th`),d(`th`,{class:`text-right`},`Start`),d(`th`,{class:`text-right`},`End`),d(`th`,{class:`text-right`},`Δ`)])],-1)),d(`tbody`,null,[(n(!0),f(m,null,l(_.value.summary.state,e=>(n(),f(`tr`,{key:e.label},[d(`td`,null,c(e.label),1),d(`td`,Oe,c(fmtNum(e.from)),1),d(`td`,ke,c(fmtNum(e.to)),1),d(`td`,{class:r([`text-right`,g(deltaClass)(e.delta)])},c(g(fmtDelta)(e.delta)),3)]))),128))])]),_:1})):(n(),f(`div`,Ae,`No state snapshot recorded.`))]),_:1})]),_:1}),t(L,{cols:`12`,md:`6`},{default:e(()=>[t(I,{variant:`outlined`,class:`pa-3 h-100`},{default:e(()=>[s[6]||(s[6]=d(`div`,{class:`text-subtitle-2 mb-1`},`Session hints`,-1)),s[7]||(s[7]=d(`div`,{class:`text-caption text-medium-emphasis mb-3`},` What outcome observers told the navigator. They act only through these. `,-1)),s[8]||(s[8]=d(`span`,{class:`text-caption font-weight-medium`},`at open`,-1)),d(`pre`,je,c(fmtHints(x.value.config?.initHints)),1),s[9]||(s[9]=d(`span`,{class:`text-caption font-weight-medium`},`at close`,-1)),d(`pre`,Me,c(fmtHints(x.value.finalHints)),1)]),_:1})]),_:1})]),_:1}),d(`div`,Ne,[o(` batch limit `+c(x.value.config?.defaultBatchLimit??`?`)+` · `+c(x.value.config?.sourceCount??`?`)+` source(s) · opening queues supply `+c(x.value.initialQueues?.supplyQ??`?`)+` / failed `+c(x.value.initialQueues?.failedQ??`?`)+` `,1),x.value.tally?(n(),f(m,{key:0},[o(` · ended with `+c(x.value.tally.failedQRemaining)+` still in the failed queue`,1)],64)):b(``,!0)]),S.value.length?(n(),y(I,{key:1,variant:`outlined`,class:`pa-3 mb-4`},{default:e(()=>[s[11]||(s[11]=d(`div`,{class:`text-subtitle-2 mb-1`},`Served tags`,-1)),s[12]||(s[12]=d(`div`,{class:`text-caption text-medium-emphasis mb-2`},` What this sitting put in front of the learner, by content tag. A response with several tags counts toward each. `,-1)),t(F,{density:`compact`,class:`sk-mini-table`},{default:e(()=>[s[10]||(s[10]=d(`thead`,null,[d(`tr`,null,[d(`th`,null,`Tag`),d(`th`,{class:`text-right`},`Resp.`),d(`th`,{class:`text-right`},`Cards`),d(`th`,{class:`text-right`},`Accuracy`),d(`th`,{class:`text-right`},`Time`)])],-1)),d(`tbody`,null,[(n(!0),f(m,null,l(S.value,e=>(n(),f(`tr`,{key:e.tag},[d(`td`,null,[d(`code`,{class:r(g(isSkillTag)(a.interpreters,e.tag)?`text-primary`:``)},c(e.tag),3)]),d(`td`,Pe,c(e.responses),1),d(`td`,Fe,c(e.cards),1),d(`td`,{class:r([`text-right`,g(accuracyClass)(e.accuracy)])},[e.accuracy===null?(n(),f(m,{key:0},[o(`—`)],64)):(n(),f(m,{key:1},[o(c(Math.round(e.accuracy*100))+`% `,1),d(`span`,Ie,`(`+c(e.correct)+`/`+c(e.correct+e.incorrect)+`)`,1)],64))],2),d(`td`,Le,c((e.totalTimeMs/1e3).toFixed(1))+`s`,1)]))),128))])]),_:1})]),_:1})):b(``,!0),w.value?(n(),y(I,{key:2,variant:`outlined`,class:`pa-3 mb-4`},{default:e(()=>[s[15]||(s[15]=d(`div`,{class:`text-subtitle-2 mb-1`},`ELO ledger`,-1)),s[16]||(s[16]=d(`div`,{class:`text-caption text-medium-emphasis mb-3`},` The per-response learner global-ELO exchanges that net to the session's ELO move. Wins above the learner's level pay little; losses below it cost a lot, so a high hit rate can still net negative. `,-1)),d(`div`,Re,[d(`div`,null,[s[13]||(s[13]=d(`div`,{class:`text-caption text-medium-emphasis`},`net`,-1)),d(`div`,{class:r([`text-h6`,g(deltaClass)(w.value.net)])},c(g(fmtDelta)(w.value.net)),3)]),d(`div`,null,[d(`div`,ze,`gained · `+c(w.value.wins)+` win(s)`,1),d(`div`,Be,c(g(fmtDelta)(w.value.gained)),1)]),d(`div`,null,[d(`div`,Ve,`lost · `+c(w.value.losses)+` loss(es)`,1),d(`div`,He,c(g(fmtDelta)(w.value.lost)),1)]),d(`div`,null,[s[14]||(s[14]=d(`div`,{class:`text-caption text-medium-emphasis`},`exchanges`,-1)),d(`div`,Ue,c(w.value.count),1),d(`div`,We,`of `+c(T.value)+` response(s)`,1)])])]),_:1})):b(``,!0),d(`div`,Ge,[s[17]||(s[17]=d(`h2`,{class:`text-h6`},`Timeline`,-1)),t(z,{modelValue:E.value,"onUpdate:modelValue":s[1]||(s[1]=e=>E.value=e),density:`compact`,color:`primary`,variant:`outlined`},{default:e(()=>[t(P,{value:`all`,size:`small`},{default:e(()=>[o(`All (`+c(_.value.timeline.length)+`)`,1)]),_:1}),t(P,{value:`response`,size:`small`},{default:e(()=>[o(`Responses (`+c(T.value)+`)`,1)]),_:1}),t(P,{value:`run`,size:`small`},{default:e(()=>[o(`Runs (`+c(_.value.timeline.length-T.value)+`)`,1)]),_:1})]),_:1},8,[`modelValue`])]),_.value.timeline.length===0?(n(),y(u,{key:3,type:`info`,variant:`tonal`},{default:e(()=>s[18]||(s[18]=[o(`Nothing recorded for this session.`)])),_:1})):(n(),f(`div`,Ke,[(n(!0),f(m,null,l(D.value,(i,u)=>(n(),f(`div`,{key:u,class:r([`sk-tl-row`,rowClass(i)])},[d(`div`,qe,c(g(fmtClock)(i.at)),1),d(`div`,Je,[t(v,{size:`small`,color:entryColor(i)},{default:e(()=>[o(c(entryIcon(i)),1)]),_:2},1032,[`color`])]),i.kind===`run`?(n(),f(`div`,Ye,[d(`div`,Xe,[d(`span`,Ze,c(i.run.label),1),i.run.mode?(n(),y(h,{key:0,size:`x-small`,variant:`tonal`},{default:e(()=>[o(c(i.run.mode),1)]),_:2},1024)):b(``,!0),d(`span`,Qe,` generated `+c(i.run.generatedCount)+` → selected `+c(i.run.finalCount)+` (`+c(i.run.newSelected)+` new, `+c(i.run.reviewsSelected)+` review) `,1),i.run.generatedCount>0&&i.run.finalCount===0?(n(),f(`span`,$e,` nothing survived `)):b(``,!0),typeof i.run.userElo==`number`?(n(),y(h,{key:2,size:`x-small`,variant:`tonal`,color:`grey`,class:`ml-2`},{default:e(()=>[o(` ELO `+c(Math.round(i.run.userElo)),1)]),_:2},1024)):b(``,!0),t(N),t(P,{icon:O.value.has(i.run.runId)?`mdi-chevron-up`:`mdi-chevron-down`,size:`x-small`,variant:`text`,onClick:e=>toggle(i.run.runId)},null,8,[`icon`,`onClick`]),t(P,{icon:g(k)===i.run.runId?`mdi-check`:`mdi-content-copy`,size:`x-small`,variant:`text`,color:g(k)===i.run.runId?`success`:void 0,title:`Copy run as text`,onClick:e=>g(j)(g(runText)(i.run),i.run.runId)},null,8,[`icon`,`color`,`onClick`])]),O.value.has(i.run.runId)?(n(),y(Te,{key:0,run:i.run,class:`mt-1`,onOpenCard:s[2]||(s[2]=e=>p(`open-card`,e))},null,8,[`run`])):b(``,!0)])):(n(),f(`div`,et,[d(`a`,{class:`sk-card-link`,title:`Open ${i.cardId} in card history`,onClick:e=>p(`open-card`,i.cardId)},[o(c(i.questionType??`card`)+` `,1),d(`code`,nt,c(g(shortId)(i.cardId)),1)],8,tt),(n(!0),f(m,null,l(skillTags(i.tags),t=>(n(),y(h,{key:t,size:`x-small`,variant:`outlined`,color:`primary`,class:`ml-1`},{default:e(()=>[o(c(g(shortTag)(a.interpreters,t)),1)]),_:2},1024))),128)),d(`span`,rt,[o(c((i.timeSpentMs/1e3).toFixed(1))+`s `,1),i.priorAttempts?(n(),f(m,{key:0},[o(` · attempt `+c(i.priorAttempts+1),1)],64)):b(``,!0)]),i.userAnswer==null?b(``,!0):(n(),f(`span`,it,`“`+c(g(fmtAnswer)(i.userAnswer))+`”`,1)),i.elo?(n(),f(m,{key:1},[t(h,{size:`x-small`,variant:`tonal`,color:g(deltaColor)(i.elo.global.delta),class:`ml-2`,title:`learner global ELO ${i.elo.global.before} → ${i.elo.global.after} · userScore ${i.elo.userScore.toFixed(2)}`},{default:e(()=>[o(` ELO `+c(g(fmtDelta)(i.elo.global.delta)),1)]),_:2},1032,[`color`,`title`]),(n(!0),f(m,null,l(g(scoredTagDeltas)(i.elo),t=>(n(),y(h,{key:t.tag,size:`x-small`,variant:`text`,color:g(deltaColor)(t.delta),class:`sk-elo-tag`,title:`${t.tag}: ${t.before} → ${t.after} (score ${t.score?.toFixed(2)})`},{default:e(()=>[o(c(g(shortTag)(a.interpreters,t.tag))+` `+c(g(fmtDelta)(t.delta)),1)]),_:2},1032,[`color`,`title`]))),128))],64)):b(``,!0)]))],2))),128))]))],64)):(n(),y(u,{key:0,type:`info`,variant:`tonal`},{default:e(()=>[o(`No session with id `+c(a.sessionId)+`.`,1)]),_:1}))])}}}),[[`__scopeId`,`data-v-36c9215c`]]),ot={class:`text-h6`},st={class:`text-caption`},ct={class:`d-flex align-center flex-wrap mb-3 ga-3`},lt=[`onClick`],ut={class:`text-no-wrap`},dt={class:`text-right`},ft={class:`text-right`},$={key:1,class:`text-disabled`},pt={class:`text-right`},mt={class:`text-no-wrap text-caption`},ht={class:`text-no-wrap text-caption`},gt={key:0},_t={key:0,class:`text-disabled`},vt={class:`text-right`},yt=B(s({__name:`LearnerSessionList`,props:{dataset:{},interpreters:{}},emits:[`open`],setup(a,{emit:s}){let u=a,p=s,_=h(()=>summarizeSessions(u.dataset,u.interpreters)),x=v(`all`),S=h(()=>{let e=new Map;for(let t of _.value)for(let n of t.flags)e.set(n,(e.get(n)??0)+1);return[...e.entries()].map(([e,t])=>({flag:e,count:t})).sort((e,t)=>t.count-e.count)}),w=h(()=>!x.value||x.value===`all`?_.value:_.value.filter(e=>e.flags.includes(x.value))),T=h(()=>{let e=_.value,t=e.filter(e=>e.doc.status===`closed`).length,n=e.reduce((e,t)=>e+(t.doc.tally?.responses??0),0),r=e.reduce((e,t)=>e+(t.doc.tally?.correct??0),0),i=e.reduce((e,t)=>e+(t.durationSeconds??0),0);return[{label:`sessions`,value:e.length,color:`primary`},{label:`completed`,value:t,color:`success`},{label:`not completed`,value:e.length-t,color:`error`},{label:`responses`,value:n,color:`primary`},{label:`overall acc.`,value:n>0?`${Math.round(r/n*100)}%`:`—`,color:`primary`},{label:`time studied`,value:fmtDuration(i),color:`grey`}]});function deltas(e){let t=[];e.eloNet!==null&&t.push({label:`elo`,delta:Math.round(e.eloNet)});for(let n of u.interpreters?.progressMetrics??[]){let r=e.state.find(e=>e.label===n);r&&t.push({label:n,delta:r.delta})}return t}function clockText(e){let t=fmtDuration(e.doc.plannedSeconds);return e.durationSeconds===null?`— of ${t}`:`${fmtDuration(e.durationSeconds)} of ${t}`}return(a,s)=>{let u=i(`v-card`),h=i(`v-col`),v=i(`v-row`),E=i(`v-btn`),D=i(`v-icon`),O=i(`v-btn-toggle`),k=i(`v-alert`),j=i(`v-chip`),M=i(`v-table`);return n(),f(`div`,null,[s[4]||(s[4]=d(`p`,{class:`text-caption text-medium-emphasis mb-4`},[o(` One row per sitting. Flags name a specific way the session failed to do its job; open one to read its interleaved timeline of responses and pipeline runs. `),d(`strong`,null,`Δ`),o(` is movement across the session: ELO, then any progress metrics the course declares. `)],-1)),t(v,{dense:``,class:`mb-2`},{default:e(()=>[(n(!0),f(m,null,l(T.value,r=>(n(),y(h,{key:r.label,cols:`6`,sm:`4`,md:`2`},{default:e(()=>[t(u,{variant:`tonal`,color:r.color,class:`pa-2 text-center`},{default:e(()=>[d(`div`,ot,c(r.value),1),d(`div`,st,c(r.label),1)]),_:2},1032,[`color`])]),_:2},1024))),128))]),_:1}),d(`div`,ct,[t(O,{modelValue:x.value,"onUpdate:modelValue":s[0]||(s[0]=e=>x.value=e),density:`compact`,color:`primary`,variant:`outlined`},{default:e(()=>[t(E,{value:`all`,size:`small`},{default:e(()=>[o(`All (`+c(_.value.length)+`)`,1)]),_:1}),(n(!0),f(m,null,l(S.value,r=>(n(),y(E,{key:r.flag,value:r.flag,size:`small`,title:g(C)[r.flag].help},{default:e(()=>[t(D,{start:``,size:`small`,color:g(A)[r.flag].color},{default:e(()=>[o(c(g(A)[r.flag].icon),1)]),_:2},1032,[`color`]),o(` `+c(g(C)[r.flag].label)+` (`+c(r.count)+`) `,1)]),_:2},1032,[`value`,`title`]))),128))]),_:1},8,[`modelValue`])]),_.value.length===0?(n(),y(k,{key:0,type:`info`,variant:`tonal`},{default:e(()=>s[1]||(s[1]=[o(` No study sessions recorded. Session records began with a framework release; there is no backfill, so earlier activity shows only in card history. `)])),_:1})):(n(),y(M,{key:1,density:`compact`,class:`sk-admin-table`},{default:e(()=>[s[3]||(s[3]=d(`thead`,null,[d(`tr`,null,[d(`th`,null,`Started`),d(`th`,null,`Status`),d(`th`,{class:`text-right`},`Cards`),d(`th`,{class:`text-right`},`Acc.`),d(`th`,{class:`text-right`},`Runs`),d(`th`,null,`Clock`),d(`th`,null,`Δ`),d(`th`,null,`Flags`),d(`th`)])],-1)),d(`tbody`,null,[(n(!0),f(m,null,l(w.value,i=>(n(),f(`tr`,{key:i.doc.sessionId,class:`sk-admin-row`,onClick:e=>p(`open`,i.doc.sessionId)},[d(`td`,ut,c(g(fmtTime)(i.doc.startTime)),1),d(`td`,null,[t(j,{size:`x-small`,variant:`flat`,color:g(statusColor)(i.doc.status)},{default:e(()=>[o(c(i.doc.status),1)]),_:2},1032,[`color`])]),d(`td`,dt,c(i.doc.tally?.cardsPresented??`—`),1),d(`td`,ft,[i.accuracy===null?(n(),f(`span`,$,`—`)):(n(),f(`span`,{key:0,class:r(g(accuracyClass)(i.accuracy))},c(Math.round(i.accuracy*100))+`% `,3))]),d(`td`,pt,c(i.doc.runs?.length??0),1),d(`td`,mt,c(clockText(i)),1),d(`td`,ht,[(n(!0),f(m,null,l(deltas(i),(e,t)=>(n(),f(m,{key:e.label},[t>0?(n(),f(`span`,gt,` · `)):b(``,!0),d(`span`,{class:r(g(deltaClass)(e.delta))},c(g(fmtDelta)(e.delta))+`\xA0`+c(e.label),3)],64))),128)),deltas(i).length===0?(n(),f(`span`,_t,`—`)):b(``,!0)]),d(`td`,null,[(n(!0),f(m,null,l(i.flags,t=>(n(),y(D,{key:t,size:`small`,class:`mr-1`,color:g(A)[t].color,title:`${g(C)[t].label}: ${g(C)[t].help}`},{default:e(()=>[o(c(g(A)[t].icon),1)]),_:2},1032,[`color`,`title`]))),128))]),d(`td`,vt,[t(D,{size:`small`,class:`text-disabled`},{default:e(()=>s[2]||(s[2]=[o(`mdi-chevron-right`)])),_:1})])],8,lt))),128))])]),_:1}))])}}}),[[`__scopeId`,`data-v-5c46cc58`]]),bt=s({__name:`LearnerDiagnostics`,props:{dataset:{},interpreters:{}},setup(r){let a=r,s=v(`sessions`),l=v(null),d=v(void 0);function openCard(e){d.value=void 0,s.value=`cards`,setTimeout(()=>d.value=e)}return u(()=>a.dataset,()=>{s.value=`sessions`,l.value=null,d.value=void 0}),(r,a)=>{let u=i(`v-tab`),p=i(`v-tabs`),h=i(`v-btn`);return n(),f(`div`,null,[t(p,{modelValue:s.value,"onUpdate:modelValue":a[0]||(a[0]=e=>s.value=e),density:`compact`,class:`mb-4`},{default:e(()=>[t(u,{value:`sessions`},{default:e(()=>[o(`Sessions (`+c(r.dataset.sessions.length)+`)`,1)]),_:1}),t(u,{value:`cards`},{default:e(()=>[o(`Cards (`+c(r.dataset.cardHistories.length)+`)`,1)]),_:1})]),_:1},8,[`modelValue`]),s.value===`sessions`?(n(),f(m,{key:0},[l.value?(n(),f(m,{key:0},[t(h,{variant:`text`,size:`small`,"prepend-icon":`mdi-arrow-left`,class:`mb-2`,onClick:a[1]||(a[1]=e=>l.value=null)},{default:e(()=>a[3]||(a[3]=[o(` All sessions `)])),_:1}),t(at,{dataset:r.dataset,"session-id":l.value,interpreters:r.interpreters,onOpenCard:openCard},null,8,[`dataset`,`session-id`,`interpreters`])],64)):(n(),y(yt,{key:1,dataset:r.dataset,interpreters:r.interpreters,onOpen:a[2]||(a[2]=e=>l.value=e)},null,8,[`dataset`,`interpreters`]))],64)):(n(),y(X,{key:1,dataset:r.dataset,interpreters:r.interpreters,focus:d.value},null,8,[`dataset`,`interpreters`,`focus`]))])}}});export{fetchLearnerDump as a,cardDossiers as i,V as n,fromDump as o,k as r,bt as t};
|
|
4
|
+
//# sourceMappingURL=admin-BNR4JZ2X.js.map
|