bitsnap-react 1.8.0 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +162 -0
- package/dist/CartProvider-HXLGQ4EX.mjs +2 -0
- package/dist/CartProvider-OHHYOMSG.js +2 -0
- package/dist/CartProvider-OHHYOMSG.js.map +1 -0
- package/dist/analytics.d.mts +45 -0
- package/dist/analytics.d.ts +45 -0
- package/dist/analytics.js +2 -0
- package/dist/analytics.js.map +1 -0
- package/dist/analytics.mjs +2 -0
- package/dist/catalog.d.mts +14 -1
- package/dist/catalog.d.ts +14 -1
- package/dist/catalog.js +1 -1
- package/dist/catalog.js.map +1 -1
- package/dist/catalog.mjs +1 -1
- package/dist/chunk-3Z6VNXBP.js +2 -0
- package/dist/chunk-3Z6VNXBP.js.map +1 -0
- package/dist/chunk-43IIYJ6J.mjs +2 -0
- package/dist/chunk-43IIYJ6J.mjs.map +1 -0
- package/dist/chunk-6D3OORMK.mjs +2 -0
- package/dist/chunk-6D3OORMK.mjs.map +1 -0
- package/dist/chunk-ADYVTMGH.mjs +2 -0
- package/dist/chunk-ADYVTMGH.mjs.map +1 -0
- package/dist/{chunk-WRCXZMKK.js → chunk-AJNULBC3.js} +2 -2
- package/dist/chunk-AJNULBC3.js.map +1 -0
- package/dist/chunk-B32ACCW2.js +2 -0
- package/dist/chunk-B32ACCW2.js.map +1 -0
- package/dist/chunk-DDY7IBMG.mjs +2 -0
- package/dist/chunk-DDY7IBMG.mjs.map +1 -0
- package/dist/chunk-DPKT6ITB.js +4 -0
- package/dist/chunk-DPKT6ITB.js.map +1 -0
- package/dist/{chunk-T2POA6RW.js → chunk-F46RJVWC.js} +2 -2
- package/dist/chunk-F46RJVWC.js.map +1 -0
- package/dist/chunk-F6GQLKA6.js +2 -0
- package/dist/chunk-F6GQLKA6.js.map +1 -0
- package/dist/chunk-JSDGZ4NY.js.map +1 -1
- package/dist/chunk-JXCHRSPW.mjs +4 -0
- package/dist/chunk-JXCHRSPW.mjs.map +1 -0
- package/dist/chunk-KOYBZORL.js.map +1 -1
- package/dist/chunk-RLEC25JI.mjs +2 -0
- package/dist/chunk-RLEC25JI.mjs.map +1 -0
- package/dist/chunk-RVILRUW3.js +2 -0
- package/dist/chunk-RVILRUW3.js.map +1 -0
- package/dist/chunk-T2OUOO4X.mjs +2 -0
- package/dist/chunk-T2OUOO4X.mjs.map +1 -0
- package/dist/chunk-VIII45AC.js +2 -0
- package/dist/chunk-VIII45AC.js.map +1 -0
- package/dist/chunk-XIHGWNTS.js +2 -0
- package/dist/chunk-XIHGWNTS.js.map +1 -0
- package/dist/chunk-YXFJG4MF.mjs +2 -0
- package/dist/chunk-YXFJG4MF.mjs.map +1 -0
- package/dist/chunk-ZPTHK4OX.mjs +2 -0
- package/dist/{chunk-OJT3YO2R.mjs.map → chunk-ZPTHK4OX.mjs.map} +1 -1
- package/dist/consent.d.mts +165 -0
- package/dist/consent.d.ts +165 -0
- package/dist/consent.js +75 -0
- package/dist/consent.js.map +1 -0
- package/dist/consent.mjs +75 -0
- package/dist/consent.mjs.map +1 -0
- package/dist/course.d.mts +13 -3
- package/dist/course.d.ts +13 -3
- package/dist/course.js +1 -1
- package/dist/course.js.map +1 -1
- package/dist/course.mjs +1 -1
- package/dist/course.mjs.map +1 -1
- package/dist/embed/analytics.js +1 -0
- package/dist/embed/consent.js +74 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.css +1 -1
- package/dist/index.css.map +1 -1
- package/dist/index.d.mts +54 -7
- package/dist/index.d.ts +54 -7
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/instrument-CmxK7S4T.d.mts +929 -0
- package/dist/instrument-CmxK7S4T.d.ts +929 -0
- package/dist/internal.js.map +1 -1
- package/dist/methods-A5KGZBAM.js +2 -0
- package/dist/methods-A5KGZBAM.js.map +1 -0
- package/dist/methods-AOHKV7IN.mjs +2 -0
- package/dist/methods-AOHKV7IN.mjs.map +1 -0
- package/dist/models.js.map +1 -1
- package/dist/returns.d.mts +9 -1
- package/dist/returns.d.ts +9 -1
- package/dist/returns.js +1 -1
- package/dist/returns.js.map +1 -1
- package/dist/returns.mjs +1 -1
- package/dist/{types-PSBBDdQm.d.mts → types-BnVWLcoB.d.mts} +13 -0
- package/dist/{types-BTm_ZolC.d.ts → types-i-IuN4Im.d.ts} +13 -0
- package/package.json +46 -45
- package/dist/CartProvider-5KAG5QGA.mjs +0 -2
- package/dist/CartProvider-7GJXW2IP.js +0 -2
- package/dist/CartProvider-7GJXW2IP.js.map +0 -1
- package/dist/chunk-45AP7UZE.mjs +0 -2
- package/dist/chunk-45AP7UZE.mjs.map +0 -1
- package/dist/chunk-7XTDFTQU.js +0 -4
- package/dist/chunk-7XTDFTQU.js.map +0 -1
- package/dist/chunk-C6Z7LOHB.mjs +0 -2
- package/dist/chunk-C6Z7LOHB.mjs.map +0 -1
- package/dist/chunk-HB6KQT26.mjs +0 -4
- package/dist/chunk-HB6KQT26.mjs.map +0 -1
- package/dist/chunk-LWK4E5G5.js +0 -2
- package/dist/chunk-LWK4E5G5.js.map +0 -1
- package/dist/chunk-OJT3YO2R.mjs +0 -2
- package/dist/chunk-OUYRKNZJ.mjs +0 -2
- package/dist/chunk-OUYRKNZJ.mjs.map +0 -1
- package/dist/chunk-P2YB25KZ.js +0 -2
- package/dist/chunk-P2YB25KZ.js.map +0 -1
- package/dist/chunk-T2POA6RW.js.map +0 -1
- package/dist/chunk-VPKE2ZOR.mjs +0 -2
- package/dist/chunk-VPKE2ZOR.mjs.map +0 -1
- package/dist/chunk-WRCXZMKK.js.map +0 -1
- package/dist/chunk-WSM4OM72.mjs +0 -2
- package/dist/chunk-WSM4OM72.mjs.map +0 -1
- package/dist/chunk-XRNTUSBH.js +0 -2
- package/dist/chunk-XRNTUSBH.js.map +0 -1
- package/dist/chunk-Z2BKIX6F.js +0 -2
- package/dist/chunk-Z2BKIX6F.js.map +0 -1
- package/dist/methods-ITD6WFIY.mjs +0 -2
- package/dist/methods-JENIGNF7.js +0 -2
- package/dist/methods-JENIGNF7.js.map +0 -1
- /package/dist/{CartProvider-5KAG5QGA.mjs.map → CartProvider-HXLGQ4EX.mjs.map} +0 -0
- /package/dist/{methods-ITD6WFIY.mjs.map → analytics.mjs.map} +0 -0
package/dist/course.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{b as we,j as Te,k as Ee}from"./chunk-C6Z7LOHB.mjs";import{m as Ve,n as Pe,q as V,r as Ie,s as ce,u as te,v as ue}from"./chunk-WSM4OM72.mjs";import{a as h,f as Ge,j as Ue}from"./chunk-OUYRKNZJ.mjs";import"./chunk-U6FLIRIV.mjs";import{ChevronLeft as Ne,List as hs,Play as vs}from"lucide-react";import{useCallback as vt,useEffect as Rt,useMemo as yt,useRef as Rs,useState as le}from"react";function Le(e){let t={},s=e?.brand?.trim(),o=e?.brandDark?.trim()||s;if(s){t["--course-accent"]=s;let n=ce(s);n&&(t["--course-accent-fg"]=n)}if(o){t["--course-accent-dark"]=o;let n=ce(o);n&&(t["--course-accent-dark-fg"]=n)}return t}import{createContext as Ct,useContext as Nt}from"react";var Be=Ct(void 0),Ze=Be.Provider;function v(){let e=Nt(Be);if(e==null)throw new Error("Course components have to be rendered inside PanelCourse");return e}import{CheckCircle2 as Pt,ClipboardCheck as It,Lock as wt,PlayCircle as Tt,FileText as Et}from"lucide-react";function de(e){return[...e.sections.flatMap(t=>t.items.map(s=>({...s,sectionId:t.id}))),...e.finalItems.map(t=>({...t,sectionId:""}))]}function se(e,t){if(!(t==null||t===""))return de(e).find(s=>s.id===t)}function pe(e,t){let s=de(e),o=s.findIndex(n=>n.id===t);return o<0?{}:{prev:s[o-1],next:s[o+1]}}function Xe(e,t){let{next:s}=pe(e,t);return s!=null&&s.kind==="lesson"&&!s.locked?s:void 0}function kt(e){let t=0,s=0;for(let o of e.sections)for(let n of o.items)n.kind==="lesson"&&(t+=1,n.completed&&(s+=1));return{total:t,completed:s,percent:t===0?0:Math.round(s/t*100)}}function Me(e,t){let s=e.sections.map(n=>({...n,items:n.items.map(r=>r.id===t&&r.kind==="lesson"?{...r,completed:!0}:r)})),o=kt({sections:s});return{...e,sections:s,totalLessons:o.total,completedLessons:o.completed,progressPercent:o.percent}}function ze(e,t){return se(e,t)!=null?t:se(e,e.resumeItemId)?.locked===!1?e.resumeItemId:de(e).find(s=>!s.locked)?.id}function w(e,t){return e.replace(/\{(\w+)\}/g,(s,o)=>o in t?String(t[o]):s)}function Qe(e,t){return t>0&&e/t>=.8}function We(e,t){return e<5||t>0&&e>=t-5?0:Math.floor(e)}function me(e){let t=Math.max(0,Math.floor(e)),s=Math.floor(t/3600),o=Math.floor(t%3600/60),n=String(t%60).padStart(2,"0");return s>0?`${s}:${String(o).padStart(2,"0")}:${n}`:`${o}:${n}`}function Ye(e){if(!(e>0))return"0 B";let t=["B","KB","MB","GB"],s=Math.min(Math.floor(Math.log(e)/Math.log(1024)),t.length-1),o=e/1024**s;return`${s===0||o>=10?Math.round(o):o.toFixed(1)} ${t[s]}`}function Fe(e){switch(e.type){case"mcq":return{type:"mcq",selectedIds:[]};case"todolist":return{type:"todolist",checkedIds:[]};case"fill_gap":return{type:"fill_gap",values:{}};case"sort_order":return{type:"sort_order",orderedIds:e.items.map(t=>t.id)}}}function Vt(e,t){if(t==null||t.type!==e.config.type)return!1;switch(t.type){case"mcq":return t.selectedIds.length>0;case"todolist":return t.checkedIds.length>0;case"fill_gap":return Object.values(t.values).some(s=>s.trim()!=="");case"sort_order":return t.orderedIds.length>0}}function _e(e,t){return e.filter(s=>!Vt(s,t[s.id])).length}function Ke(e,t,s){if(t===s||t<0||s<0||t>=e.length||s>=e.length)return[...e];let o=[...e],[n]=o.splice(t,1);return o.splice(s,0,n),o}function ge(e,t){let s=[],o=/\{\{\s*([^{}\s]+)\s*\}\}/g,n=0;for(let r of e.matchAll(o)){let i=r[1];t.includes(i)&&(r.index>n&&s.push({type:"text",text:e.slice(n,r.index)}),s.push({type:"blank",id:i}),n=r.index+r[0].length)}return n<e.length&&s.push({type:"text",text:e.slice(n)}),s}function Je(e,t){let{config:s}=e;if(t==null||t.type!==s.type)return"";let o=(n,r)=>n.find(i=>i.id===r)?.label??r;return s.type==="mcq"&&t.type==="mcq"?t.selectedIds.map(n=>o(s.choices,n)).join(", "):s.type==="todolist"&&t.type==="todolist"?t.checkedIds.map(n=>o(s.steps,n)).join(", "):s.type==="sort_order"&&t.type==="sort_order"?t.orderedIds.map(n=>o(s.items,n)).join(" \u2192 "):s.type==="fill_gap"&&t.type==="fill_gap"?ge(s.template,s.blanks).map(n=>n.type==="text"?n.text:`[${t.values[n.id]??""}]`).join(""):""}import{jsx as I,jsxs as Y}from"react/jsx-runtime";function je({item:e}){return e.locked?I(wt,{className:"size-4 text-neutral-500","aria-hidden":!0}):e.completed?I(Pt,{className:"size-4 text-emerald-600 dark:text-emerald-400","aria-hidden":!0}):e.kind==="test"?I(It,{className:"size-4 text-neutral-500","aria-hidden":!0}):e.durationSeconds>0?I(Tt,{className:"size-4 text-neutral-500","aria-hidden":!0}):I(Et,{className:"size-4 text-neutral-500","aria-hidden":!0})}function Gt({item:e,selected:t,variant:s,onSelect:o}){let{texts:n}=v(),r=e.lockReason?w(n.lockedByTest,{test:e.lockReason.gatingTestTitle}):n.locked,i=e.locked?r:e.completed?n.completed:void 0;return I("li",{children:Y("button",{type:"button","data-item-id":e.id,"data-locked":e.locked||void 0,"aria-current":t?"true":void 0,"aria-disabled":e.locked||void 0,title:e.locked?r:void 0,onClick:()=>{e.locked||o(e)},className:h("flex w-full items-start gap-3 rounded-lg p-2 text-left text-sm outline-none transition focus-visible:ring-[3px] focus-visible:ring-ring/50",t?"bg-neutral-200 dark:bg-neutral-700":"hover:bg-neutral-100 dark:hover:bg-neutral-800",e.locked&&"cursor-not-allowed opacity-60 hover:bg-transparent dark:hover:bg-transparent"),children:[s==="playlist"&&e.kind==="lesson"&&Y("span",{className:"relative aspect-video w-24 shrink-0 overflow-hidden rounded bg-neutral-200 dark:bg-neutral-800",children:[e.thumbnailUrl&&I("img",{src:e.thumbnailUrl,alt:"",loading:"lazy",draggable:!1,className:"size-full object-cover"}),e.durationSeconds>0&&I("span",{className:"absolute right-1 bottom-1 rounded bg-black/75 px-1 text-[10px] text-white",children:me(e.durationSeconds)})]}),(s==="modules"||e.kind==="test")&&I("span",{className:"mt-0.5 shrink-0",children:I(je,{item:e})}),Y("span",{className:"min-w-0 flex-1",children:[I("span",{className:"block font-medium break-words",children:e.title}),Y("span",{className:"mt-0.5 flex flex-wrap items-center gap-x-2 text-xs text-neutral-500 dark:text-neutral-400",children:[e.kind==="test"&&I("span",{children:n.testBadge}),e.isFree&&!e.locked&&I("span",{children:n.free}),s==="modules"&&e.durationSeconds>0&&I("span",{children:me(e.durationSeconds)}),i&&I("span",{children:i})]})]}),s==="playlist"&&e.kind==="lesson"&&I("span",{className:"mt-0.5 shrink-0",children:I(je,{item:e})})]})})}function De({course:e,selectedId:t,onSelect:s,variant:o,className:n}){let{texts:r}=v(),i=a=>I("ul",{className:"flex flex-col gap-1",children:a.map(l=>I(Gt,{item:l,selected:l.id===t,variant:o,onSelect:s},l.id))});return Y("nav",{"aria-label":r.contents,className:h("space-y-4",n),children:[e.sections.map(a=>{let l=a.items.filter(R=>R.kind==="lesson"),p=l.filter(R=>R.completed).length;return Y("section",{"data-section-id":a.id,children:[Y("h3",{className:"mb-1 flex items-baseline justify-between gap-2 px-2 text-sm font-semibold",children:[I("span",{className:"break-words",children:a.title}),l.length>0&&Y("span",{className:"shrink-0 text-xs font-normal text-neutral-500 dark:text-neutral-400",children:[p,"/",l.length]})]}),i(a.items)]},a.id)}),e.finalItems.length>0&&I("section",{"data-section-id":"final",children:i(e.finalItems)})]})}import{createClient as jt}from"@connectrpc/connect";import{enumDesc as Qs,fileDesc as Ut,messageDesc as Ws,serviceDesc as Lt}from"@bufbuild/protobuf/codegenv2";import{file_google_protobuf_timestamp as Bt}from"@bufbuild/protobuf/wkt";var Zt=Ut("CiFwdWJsaWMvdjEvdXNlcl9wYW5lbF9jb3Vyc2UucHJvdG8SDXB1YmxpY19hcGkudjEiRAoPUGFuZWxMb2NrUmVhc29uEhYKDmdhdGluZ190ZXN0X2lkGAEgASgJEhkKEWdhdGluZ190ZXN0X3RpdGxlGAIgASgJIrQCCg9QYW5lbENvdXJzZUl0ZW0SCgoCaWQYASABKAkSMAoEa2luZBgCIAEoDjIiLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VJdGVtS2luZBINCgV0aXRsZRgDIAEoCRIPCgdpc19mcmVlGAQgASgIEg4KBmxvY2tlZBgFIAEoCBI4Cgtsb2NrX3JlYXNvbhgGIAEoCzIeLnB1YmxpY19hcGkudjEuUGFuZWxMb2NrUmVhc29uSACIAQESEQoJY29tcGxldGVkGAcgASgIEhgKEGR1cmF0aW9uX3NlY29uZHMYCCABKAUSGgoNdGh1bWJuYWlsX3VybBgJIAEoCUgBiAEBEg4KBmdhdGluZxgKIAEoCEIOCgxfbG9ja19yZWFzb25CEAoOX3RodW1ibmFpbF91cmwicwoSUGFuZWxDb3Vyc2VTZWN0aW9uEgoKAmlkGAEgASgJEg0KBXRpdGxlGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJEi0KBWl0ZW1zGAQgAygLMh4ucHVibGljX2FwaS52MS5QYW5lbENvdXJzZUl0ZW0i3wIKC1BhbmVsQ291cnNlEgoKAmlkGAEgASgJEiwKBHR5cGUYAiABKA4yHi5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlVHlwZRINCgV0aXRsZRgDIAEoCRITCgtkZXNjcmlwdGlvbhgEIAEoCRIWCgljb3Zlcl91cmwYBSABKAlIAIgBARIVCg10b3RhbF9sZXNzb25zGAYgASgFEhkKEWNvbXBsZXRlZF9sZXNzb25zGAcgASgFEhgKEHByb2dyZXNzX3BlcmNlbnQYCCABKAUSMwoIc2VjdGlvbnMYCSADKAsyIS5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlU2VjdGlvbhIzCgtmaW5hbF9pdGVtcxgKIAMoCzIeLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VJdGVtEhYKDnJlc3VtZV9pdGVtX2lkGAsgASgJQgwKCl9jb3Zlcl91cmwiRAoZVXNlclBhbmVsR2V0Q291cnNlUmVxdWVzdBIUCgxhY2Nlc3NfdG9rZW4YASABKAkSEQoJYWNjZXNzX2lkGAIgASgJIosBChpVc2VyUGFuZWxHZXRDb3Vyc2VSZXNwb25zZRItCgdzdWNjZXNzGAEgASgLMhoucHVibGljX2FwaS52MS5QYW5lbENvdXJzZUgAEjQKB2ZhaWx1cmUYAiABKA4yIS5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlRmFpbHVyZUgAQggKBnJlc3VsdCJfCgpQYW5lbFZpZGVvEg8KB2hsc191cmwYASABKAkSFwoKcG9zdGVyX3VybBgCIAEoCUgAiAEBEhgKEGR1cmF0aW9uX3NlY29uZHMYAyABKAVCDQoLX3Bvc3Rlcl91cmwiRgoPUGFuZWxBdHRhY2htZW50EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEc2l6ZRgDIAEoAxILCgN1cmwYBCABKAkiTAoMUGFuZWxJdGVtUmVmEgoKAmlkGAEgASgJEjAKBGtpbmQYAiABKA4yIi5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlSXRlbUtpbmQigQQKC1BhbmVsTGVzc29uEgoKAmlkGAEgASgJEhIKCnNlY3Rpb25faWQYAiABKAkSDQoFdGl0bGUYAyABKAkSEwoLZGVzY3JpcHRpb24YBCABKAkSFAoMY29udGVudF9odG1sGAUgASgJEi0KBXZpZGVvGAYgASgLMhkucHVibGljX2FwaS52MS5QYW5lbFZpZGVvSACIAQESMwoLYXR0YWNobWVudHMYByADKAsyHi5wdWJsaWNfYXBpLnYxLlBhbmVsQXR0YWNobWVudBIuCgRwcmV2GAggASgLMhsucHVibGljX2FwaS52MS5QYW5lbEl0ZW1SZWZIAYgBARIuCgRuZXh0GAkgASgLMhsucHVibGljX2FwaS52MS5QYW5lbEl0ZW1SZWZIAogBARIRCgljb21wbGV0ZWQYCiABKAgSGAoQcG9zaXRpb25fc2Vjb25kcxgLIAEoBRIRCglteV9yYXRpbmcYDCABKAUSFgoOYXZlcmFnZV9yYXRpbmcYDSABKAISFAoMcmF0aW5nX2NvdW50GA4gASgFEjcKDnVybHNfZXhwaXJlX2F0GA8gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgDiAEBQggKBl92aWRlb0IHCgVfcHJldkIHCgVfbmV4dEIRCg9fdXJsc19leHBpcmVfYXQiVwoZVXNlclBhbmVsR2V0TGVzc29uUmVxdWVzdBIUCgxhY2Nlc3NfdG9rZW4YASABKAkSEQoJYWNjZXNzX2lkGAIgASgJEhEKCWxlc3Nvbl9pZBgDIAEoCSKLAQoaVXNlclBhbmVsR2V0TGVzc29uUmVzcG9uc2USLQoHc3VjY2VzcxgBIAEoCzIaLnB1YmxpY19hcGkudjEuUGFuZWxMZXNzb25IABI0CgdmYWlsdXJlGAIgASgOMiEucHVibGljX2FwaS52MS5QYW5lbENvdXJzZUZhaWx1cmVIAEIICgZyZXN1bHQipwEKIlVzZXJQYW5lbFNhdmVMZXNzb25Qcm9ncmVzc1JlcXVlc3QSFAoMYWNjZXNzX3Rva2VuGAEgASgJEhEKCWFjY2Vzc19pZBgCIAEoCRIRCglsZXNzb25faWQYAyABKAkSEQoJY29tcGxldGVkGAQgASgIEhgKEHBvc2l0aW9uX3NlY29uZHMYBSABKAUSGAoQZHVyYXRpb25fc2Vjb25kcxgGIAEoBSKFAgojVXNlclBhbmVsU2F2ZUxlc3NvblByb2dyZXNzUmVzcG9uc2USTAoHc3VjY2VzcxgBIAEoCzI5LnB1YmxpY19hcGkudjEuVXNlclBhbmVsU2F2ZUxlc3NvblByb2dyZXNzUmVzcG9uc2UuUmVzdWx0SAASNAoHZmFpbHVyZRgCIAEoDjIhLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VGYWlsdXJlSAAaUAoGUmVzdWx0EhEKCWNvbXBsZXRlZBgBIAEoCBIZChFjb21wbGV0ZWRfbGVzc29ucxgCIAEoBRIYChBwcm9ncmVzc19wZXJjZW50GAMgASgFQggKBnJlc3VsdCIoCgtQYW5lbENob2ljZRIKCgJpZBgBIAEoCRINCgVsYWJlbBgCIAEoCSJPCg5QYW5lbE1jcUNvbmZpZxIrCgdjaG9pY2VzGAEgAygLMhoucHVibGljX2FwaS52MS5QYW5lbENob2ljZRIQCghtdWx0aXBsZRgCIAEoCCKCAQoTUGFuZWxUb2RvbGlzdENvbmZpZxI2CgVzdGVwcxgBIAMoCzInLnB1YmxpY19hcGkudjEuUGFuZWxUb2RvbGlzdENvbmZpZy5TdGVwGjMKBFN0ZXASCgoCaWQYASABKAkSDQoFbGFiZWwYAiABKAkSEAoIcmVxdWlyZWQYAyABKAgiNgoSUGFuZWxGaWxsR2FwQ29uZmlnEhAKCHRlbXBsYXRlGAEgASgJEg4KBmJsYW5rcxgCIAMoCSJBChRQYW5lbFNvcnRPcmRlckNvbmZpZxIpCgVpdGVtcxgBIAMoCzIaLnB1YmxpY19hcGkudjEuUGFuZWxDaG9pY2UioQIKEVBhbmVsVGVzdFF1ZXN0aW9uEgoKAmlkGAEgASgJEg4KBnByb21wdBgCIAEoCRIOCgZwb2ludHMYAyABKAUSLAoDbWNxGAogASgLMh0ucHVibGljX2FwaS52MS5QYW5lbE1jcUNvbmZpZ0gAEjYKCHRvZG9saXN0GAsgASgLMiIucHVibGljX2FwaS52MS5QYW5lbFRvZG9saXN0Q29uZmlnSAASNQoIZmlsbF9nYXAYDCABKAsyIS5wdWJsaWNfYXBpLnYxLlBhbmVsRmlsbEdhcENvbmZpZ0gAEjkKCnNvcnRfb3JkZXIYDSABKAsyIy5wdWJsaWNfYXBpLnYxLlBhbmVsU29ydE9yZGVyQ29uZmlnSABCCAoGY29uZmlnIqsCCglQYW5lbFRlc3QSCgoCaWQYASABKAkSDQoFdGl0bGUYAiABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSDgoGZ2F0aW5nGAQgASgIEh4KFnBhc3NfdGhyZXNob2xkX3BlcmNlbnQYBSABKAUSGAoQYXR0ZW1wdHNfYWxsb3dlZBgGIAEoBRIaCg1hdHRlbXB0c19sZWZ0GAcgASgFSACIAQESFQoNYXR0ZW1wdF9jb3VudBgIIAEoBRIaChJiZXN0X3Njb3JlX3BlcmNlbnQYCSABKAUSDgoGcGFzc2VkGAogASgIEjMKCXF1ZXN0aW9ucxgLIAMoCzIgLnB1YmxpY19hcGkudjEuUGFuZWxUZXN0UXVlc3Rpb25CEAoOX2F0dGVtcHRzX2xlZnQiUwoXVXNlclBhbmVsR2V0VGVzdFJlcXVlc3QSFAoMYWNjZXNzX3Rva2VuGAEgASgJEhEKCWFjY2Vzc19pZBgCIAEoCRIPCgd0ZXN0X2lkGAMgASgJIocBChhVc2VyUGFuZWxHZXRUZXN0UmVzcG9uc2USKwoHc3VjY2VzcxgBIAEoCzIYLnB1YmxpY19hcGkudjEuUGFuZWxUZXN0SAASNAoHZmFpbHVyZRgCIAEoDjIhLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VGYWlsdXJlSABCCAoGcmVzdWx0IiYKDlBhbmVsTWNxQW5zd2VyEhQKDHNlbGVjdGVkX2lkcxgBIAMoCSIqChNQYW5lbFRvZG9saXN0QW5zd2VyEhMKC2NoZWNrZWRfaWRzGAEgAygJIoIBChJQYW5lbEZpbGxHYXBBbnN3ZXISPQoGdmFsdWVzGAEgAygLMi0ucHVibGljX2FwaS52MS5QYW5lbEZpbGxHYXBBbnN3ZXIuVmFsdWVzRW50cnkaLQoLVmFsdWVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASIrChRQYW5lbFNvcnRPcmRlckFuc3dlchITCgtvcmRlcmVkX2lkcxgBIAMoCSKDAgoLUGFuZWxBbnN3ZXISEwoLcXVlc3Rpb25faWQYASABKAkSLAoDbWNxGAogASgLMh0ucHVibGljX2FwaS52MS5QYW5lbE1jcUFuc3dlckgAEjYKCHRvZG9saXN0GAsgASgLMiIucHVibGljX2FwaS52MS5QYW5lbFRvZG9saXN0QW5zd2VySAASNQoIZmlsbF9nYXAYDCABKAsyIS5wdWJsaWNfYXBpLnYxLlBhbmVsRmlsbEdhcEFuc3dlckgAEjkKCnNvcnRfb3JkZXIYDSABKAsyIy5wdWJsaWNfYXBpLnYxLlBhbmVsU29ydE9yZGVyQW5zd2VySABCBwoFdmFsdWUijQEKE1BhbmVsVGVzdFN1Ym1pc3Npb24SCgoCaWQYASABKAkSFQoNc2NvcmVfcGVyY2VudBgCIAEoBRIOCgZwYXNzZWQYAyABKAgSEwoLZHVyYXRpb25fbXMYBCABKAMSLgoKY3JlYXRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAilwEKE1BhbmVsUXVlc3Rpb25SZXN1bHQSEwoLcXVlc3Rpb25faWQYASABKAkSDwoHY29ycmVjdBgCIAEoCBIOCgZwb2ludHMYAyABKAUSNwoOY29ycmVjdF9hbnN3ZXIYBCABKAsyGi5wdWJsaWNfYXBpLnYxLlBhbmVsQW5zd2VySACIAQFCEQoPX2NvcnJlY3RfYW5zd2VyIpgBChpVc2VyUGFuZWxTdWJtaXRUZXN0UmVxdWVzdBIUCgxhY2Nlc3NfdG9rZW4YASABKAkSEQoJYWNjZXNzX2lkGAIgASgJEg8KB3Rlc3RfaWQYAyABKAkSKwoHYW5zd2VycxgEIAMoCzIaLnB1YmxpY19hcGkudjEuUGFuZWxBbnN3ZXISEwoLZHVyYXRpb25fbXMYBSABKAMiyQIKG1VzZXJQYW5lbFN1Ym1pdFRlc3RSZXNwb25zZRJECgdzdWNjZXNzGAEgASgLMjEucHVibGljX2FwaS52MS5Vc2VyUGFuZWxTdWJtaXRUZXN0UmVzcG9uc2UuUmVzdWx0SAASNAoHZmFpbHVyZRgCIAEoDjIhLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VGYWlsdXJlSAAaowEKBlJlc3VsdBI2CgpzdWJtaXNzaW9uGAEgASgLMiIucHVibGljX2FwaS52MS5QYW5lbFRlc3RTdWJtaXNzaW9uEjMKB3Jlc3VsdHMYAiADKAsyIi5wdWJsaWNfYXBpLnYxLlBhbmVsUXVlc3Rpb25SZXN1bHQSGgoNYXR0ZW1wdHNfbGVmdBgDIAEoBUgAiAEBQhAKDl9hdHRlbXB0c19sZWZ0QggKBnJlc3VsdCJfCiNVc2VyUGFuZWxMaXN0VGVzdFN1Ym1pc3Npb25zUmVxdWVzdBIUCgxhY2Nlc3NfdG9rZW4YASABKAkSEQoJYWNjZXNzX2lkGAIgASgJEg8KB3Rlc3RfaWQYAyABKAkiqwIKJFVzZXJQYW5lbExpc3RUZXN0U3VibWlzc2lvbnNSZXNwb25zZRJNCgdzdWNjZXNzGAEgASgLMjoucHVibGljX2FwaS52MS5Vc2VyUGFuZWxMaXN0VGVzdFN1Ym1pc3Npb25zUmVzcG9uc2UuUmVzdWx0SAASNAoHZmFpbHVyZRgCIAEoDjIhLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VGYWlsdXJlSAAadAoGUmVzdWx0EjcKC3N1Ym1pc3Npb25zGAEgAygLMiIucHVibGljX2FwaS52MS5QYW5lbFRlc3RTdWJtaXNzaW9uEhoKEmJlc3Rfc2NvcmVfcGVyY2VudBgCIAEoBRIVCg1hdHRlbXB0X2NvdW50GAMgASgFQggKBnJlc3VsdCJWChNQYW5lbFF1ZXN0aW9uQW5zd2VyEg8KB2NvbnRlbnQYASABKAkSLgoKY3JlYXRlZF9hdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAizAEKE1BhbmVsTGVzc29uUXVlc3Rpb24SCgoCaWQYASABKAkSDwoHY29udGVudBgCIAEoCRITCgthdXRob3JfbmFtZRgDIAEoCRIPCgdpc19taW5lGAQgASgIEi4KCmNyZWF0ZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjcKBmFuc3dlchgGIAEoCzIiLnB1YmxpY19hcGkudjEuUGFuZWxRdWVzdGlvbkFuc3dlckgAiAEBQgkKB19hbnN3ZXIiYQojVXNlclBhbmVsTGlzdExlc3NvblF1ZXN0aW9uc1JlcXVlc3QSFAoMYWNjZXNzX3Rva2VuGAEgASgJEhEKCWFjY2Vzc19pZBgCIAEoCRIRCglsZXNzb25faWQYAyABKAki9gEKJFVzZXJQYW5lbExpc3RMZXNzb25RdWVzdGlvbnNSZXNwb25zZRJNCgdzdWNjZXNzGAEgASgLMjoucHVibGljX2FwaS52MS5Vc2VyUGFuZWxMaXN0TGVzc29uUXVlc3Rpb25zUmVzcG9uc2UuUmVzdWx0SAASNAoHZmFpbHVyZRgCIAEoDjIhLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VGYWlsdXJlSAAaPwoGUmVzdWx0EjUKCXF1ZXN0aW9ucxgBIAMoCzIiLnB1YmxpY19hcGkudjEuUGFuZWxMZXNzb25RdWVzdGlvbkIICgZyZXN1bHQicAohVXNlclBhbmVsQXNrTGVzc29uUXVlc3Rpb25SZXF1ZXN0EhQKDGFjY2Vzc190b2tlbhgBIAEoCRIRCglhY2Nlc3NfaWQYAiABKAkSEQoJbGVzc29uX2lkGAMgASgJEg8KB2NvbnRlbnQYBCABKAkimwEKIlVzZXJQYW5lbEFza0xlc3NvblF1ZXN0aW9uUmVzcG9uc2USNQoHc3VjY2VzcxgBIAEoCzIiLnB1YmxpY19hcGkudjEuUGFuZWxMZXNzb25RdWVzdGlvbkgAEjQKB2ZhaWx1cmUYAiABKA4yIS5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlRmFpbHVyZUgAQggKBnJlc3VsdCJ4ChpVc2VyUGFuZWxSYXRlTGVzc29uUmVxdWVzdBIUCgxhY2Nlc3NfdG9rZW4YASABKAkSEQoJYWNjZXNzX2lkGAIgASgJEhEKCWxlc3Nvbl9pZBgDIAEoCRINCgVzY29yZRgEIAEoBRIPCgdjb21tZW50GAUgASgJIu4BChtVc2VyUGFuZWxSYXRlTGVzc29uUmVzcG9uc2USRAoHc3VjY2VzcxgBIAEoCzIxLnB1YmxpY19hcGkudjEuVXNlclBhbmVsUmF0ZUxlc3NvblJlc3BvbnNlLlJlc3VsdEgAEjQKB2ZhaWx1cmUYAiABKA4yIS5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlRmFpbHVyZUgAGkkKBlJlc3VsdBIRCglteV9yYXRpbmcYASABKAUSFgoOYXZlcmFnZV9yYXRpbmcYAiABKAISFAoMcmF0aW5nX2NvdW50GAMgASgFQggKBnJlc3VsdCr6AgoSUGFuZWxDb3Vyc2VGYWlsdXJlEiAKHFBBTkVMX0NPVVJTRV9GQUlMVVJFX1VOS05PV04QABIlCiFQQU5FTF9DT1VSU0VfRkFJTFVSRV9VTkFVVEhPUklaRUQQARIpCiVQQU5FTF9DT1VSU0VfRkFJTFVSRV9DT1VSU0VfTk9UX0ZPVU5EEAISJwojUEFORUxfQ09VUlNFX0ZBSUxVUkVfSVRFTV9OT1RfRk9VTkQQAxIkCiBQQU5FTF9DT1VSU0VfRkFJTFVSRV9JVEVNX0xPQ0tFRBAEEikKJVBBTkVMX0NPVVJTRV9GQUlMVVJFX05PX0FUVEVNUFRTX0xFRlQQBRIpCiVQQU5FTF9DT1VSU0VfRkFJTFVSRV9JTlZBTElEX0FSR1VNRU5UEAYSJQohUEFORUxfQ09VUlNFX0ZBSUxVUkVfUkFURV9MSU1JVEVEEAcSJAogUEFORUxfQ09VUlNFX0ZBSUxVUkVfVU5BVkFJTEFCTEUQCCptCg9QYW5lbENvdXJzZVR5cGUSHQoZUEFORUxfQ09VUlNFX1RZUEVfVU5LTk9XThAAEh4KGlBBTkVMX0NPVVJTRV9UWVBFX1NUQU5EQVJEEAESGwoXUEFORUxfQ09VUlNFX1RZUEVfVklERU8QAip9ChNQYW5lbENvdXJzZUl0ZW1LaW5kEiIKHlBBTkVMX0NPVVJTRV9JVEVNX0tJTkRfVU5LTk9XThAAEiEKHVBBTkVMX0NPVVJTRV9JVEVNX0tJTkRfTEVTU09OEAESHwobUEFORUxfQ09VUlNFX0lURU1fS0lORF9URVNUEAIy+QcKFlVzZXJQYW5lbENvdXJzZVNlcnZpY2USYAoJR2V0Q291cnNlEigucHVibGljX2FwaS52MS5Vc2VyUGFuZWxHZXRDb3Vyc2VSZXF1ZXN0GikucHVibGljX2FwaS52MS5Vc2VyUGFuZWxHZXRDb3Vyc2VSZXNwb25zZRJgCglHZXRMZXNzb24SKC5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbEdldExlc3NvblJlcXVlc3QaKS5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbEdldExlc3NvblJlc3BvbnNlEnsKElNhdmVMZXNzb25Qcm9ncmVzcxIxLnB1YmxpY19hcGkudjEuVXNlclBhbmVsU2F2ZUxlc3NvblByb2dyZXNzUmVxdWVzdBoyLnB1YmxpY19hcGkudjEuVXNlclBhbmVsU2F2ZUxlc3NvblByb2dyZXNzUmVzcG9uc2USWgoHR2V0VGVzdBImLnB1YmxpY19hcGkudjEuVXNlclBhbmVsR2V0VGVzdFJlcXVlc3QaJy5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbEdldFRlc3RSZXNwb25zZRJjCgpTdWJtaXRUZXN0EikucHVibGljX2FwaS52MS5Vc2VyUGFuZWxTdWJtaXRUZXN0UmVxdWVzdBoqLnB1YmxpY19hcGkudjEuVXNlclBhbmVsU3VibWl0VGVzdFJlc3BvbnNlEn4KE0xpc3RUZXN0U3VibWlzc2lvbnMSMi5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbExpc3RUZXN0U3VibWlzc2lvbnNSZXF1ZXN0GjMucHVibGljX2FwaS52MS5Vc2VyUGFuZWxMaXN0VGVzdFN1Ym1pc3Npb25zUmVzcG9uc2USfgoTTGlzdExlc3NvblF1ZXN0aW9ucxIyLnB1YmxpY19hcGkudjEuVXNlclBhbmVsTGlzdExlc3NvblF1ZXN0aW9uc1JlcXVlc3QaMy5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbExpc3RMZXNzb25RdWVzdGlvbnNSZXNwb25zZRJ4ChFBc2tMZXNzb25RdWVzdGlvbhIwLnB1YmxpY19hcGkudjEuVXNlclBhbmVsQXNrTGVzc29uUXVlc3Rpb25SZXF1ZXN0GjEucHVibGljX2FwaS52MS5Vc2VyUGFuZWxBc2tMZXNzb25RdWVzdGlvblJlc3BvbnNlEmMKClJhdGVMZXNzb24SKS5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbFJhdGVMZXNzb25SZXF1ZXN0GioucHVibGljX2FwaS52MS5Vc2VyUGFuZWxSYXRlTGVzc29uUmVzcG9uc2ViBnByb3RvMw",[Bt]);var He=Lt(Zt,0);import{Code as $,ConnectError as Xt}from"@connectrpc/connect";import{timestampDate as ae}from"@bufbuild/protobuf/wkt";var B=class extends Error{code;constructor(t,s){super(s??t),this.name="CourseError",this.code=t}};var Mt={0:"unknown",1:"unauthorized",2:"course_not_found",3:"item_not_found",4:"item_locked",5:"no_attempts_left",6:"invalid_argument",7:"rate_limited",8:"unavailable"};function zt(e){return Mt[e]??"unknown"}function Qt(e){if(e instanceof B)return e;let t=Xt.from(e);switch(t.code){case $.Unauthenticated:case $.PermissionDenied:return new B("unauthorized",t.rawMessage);case $.NotFound:return new B("course_not_found",t.rawMessage);case $.ResourceExhausted:return new B("rate_limited",t.rawMessage);case $.Unavailable:case $.DeadlineExceeded:return new B("unavailable",t.rawMessage);default:return e}}function Q(e){let{result:t}=e;if(t.case==="success")return t.value;throw t.case==="failure"?new B(zt(t.value)):new B("unknown","empty response")}function qe(e){return{id:e.id,kind:e.kind===2?"test":"lesson",title:e.title,isFree:e.isFree,locked:e.locked,lockReason:e.locked&&e.lockReason!=null?{gatingTestId:e.lockReason.gatingTestId,gatingTestTitle:e.lockReason.gatingTestTitle}:void 0,completed:e.completed,durationSeconds:e.durationSeconds,thumbnailUrl:e.thumbnailUrl||void 0,gating:e.gating}}function Wt(e){return{id:e.id,type:e.type===2?"video":"standard",title:e.title,description:e.description,coverUrl:e.coverUrl||void 0,totalLessons:e.totalLessons,completedLessons:e.completedLessons,progressPercent:e.progressPercent,sections:e.sections.map(t=>({id:t.id,title:t.title,description:t.description,items:t.items.map(qe)})),finalItems:e.finalItems.map(qe),resumeItemId:e.resumeItemId}}function Oe(e){return e==null?void 0:{id:e.id,kind:e.kind===2?"test":"lesson"}}function Yt(e){return{id:e.id,sectionId:e.sectionId,title:e.title,description:e.description,contentHtml:e.contentHtml,video:e.video!=null&&e.video.hlsUrl!==""?{hlsUrl:e.video.hlsUrl,posterUrl:e.video.posterUrl||void 0,durationSeconds:e.video.durationSeconds}:void 0,attachments:e.attachments.map(t=>({id:t.id,name:t.name,size:Number(t.size),url:t.url})),prev:Oe(e.prev),next:Oe(e.next),completed:e.completed,positionSeconds:e.positionSeconds,myRating:e.myRating,averageRating:e.averageRating,ratingCount:e.ratingCount,urlsExpireAt:e.urlsExpireAt!=null?ae(e.urlsExpireAt):void 0}}function Ft(e){let t={id:e.id,prompt:e.prompt,points:e.points},{config:s}=e;switch(s.case){case"mcq":return{...t,config:{type:"mcq",choices:s.value.choices.map(o=>({id:o.id,label:o.label})),multiple:s.value.multiple}};case"todolist":return{...t,config:{type:"todolist",steps:s.value.steps.map(o=>({id:o.id,label:o.label,required:o.required}))}};case"fillGap":return{...t,config:{type:"fill_gap",template:s.value.template,blanks:[...s.value.blanks]}};case"sortOrder":return{...t,config:{type:"sort_order",items:s.value.items.map(o=>({id:o.id,label:o.label}))}};default:return}}function _t(e){return{id:e.id,title:e.title,description:e.description,gating:e.gating,passThresholdPercent:e.passThresholdPercent,attemptsAllowed:e.attemptsAllowed,attemptsLeft:e.attemptsLeft,attemptCount:e.attemptCount,bestScorePercent:e.bestScorePercent,passed:e.passed,questions:e.questions.map(Ft).filter(t=>t!=null)}}function $e(e){return{id:e.id,scorePercent:e.scorePercent,passed:e.passed,durationMs:Number(e.durationMs),createdAt:e.createdAt!=null?ae(e.createdAt):void 0}}function Kt(e){let{value:t}=e;switch(t.case){case"mcq":return{type:"mcq",selectedIds:[...t.value.selectedIds]};case"todolist":return{type:"todolist",checkedIds:[...t.value.checkedIds]};case"fillGap":return{type:"fill_gap",values:{...t.value.values}};case"sortOrder":return{type:"sort_order",orderedIds:[...t.value.orderedIds]};default:return}}function Jt(e,t){switch(t.type){case"mcq":return{questionId:e,value:{case:"mcq",value:{selectedIds:t.selectedIds}}};case"todolist":return{questionId:e,value:{case:"todolist",value:{checkedIds:t.checkedIds}}};case"fill_gap":return{questionId:e,value:{case:"fillGap",value:{values:t.values}}};case"sort_order":return{questionId:e,value:{case:"sortOrder",value:{orderedIds:t.orderedIds}}}}}function et(e){return{id:e.id,content:e.content,authorName:e.authorName,isMine:e.isMine,createdAt:e.createdAt!=null?ae(e.createdAt):void 0,answer:e.answer!=null?{content:e.answer.content,createdAt:e.answer.createdAt!=null?ae(e.answer.createdAt):void 0}:void 0}}function be(e,t){let s=()=>({accessId:t.accessId,accessToken:typeof t.accessToken=="function"?t.accessToken()??"":t.accessToken});async function o(n){try{return await n()}catch(r){throw Qt(r)}}return{getCourse:()=>o(async()=>Wt(Q(await e.getCourse(s())))),getLesson:n=>o(async()=>Yt(Q(await e.getLesson({...s(),lessonId:n})))),saveProgress:n=>o(async()=>{let r=Q(await e.saveLessonProgress({...s(),...n}));return{completed:r.completed,completedLessons:r.completedLessons,progressPercent:r.progressPercent}}),getTest:n=>o(async()=>_t(Q(await e.getTest({...s(),testId:n})))),submitTest:(n,r,i)=>o(async()=>{let a=Q(await e.submitTest({...s(),testId:n,durationMs:BigInt(Math.max(0,Math.round(i))),answers:Object.entries(r).map(([l,p])=>Jt(l,p))}));if(a.submission==null)throw new B("unknown","missing submission");return{submission:$e(a.submission),results:a.results.map(l=>({questionId:l.questionId,correct:l.correct,points:l.points,correctAnswer:l.correctAnswer!=null?Kt(l.correctAnswer):void 0})),attemptsLeft:a.attemptsLeft}}),listSubmissions:n=>o(async()=>{let r=Q(await e.listTestSubmissions({...s(),testId:n}));return{submissions:r.submissions.map($e),bestScorePercent:r.bestScorePercent,attemptCount:r.attemptCount}}),listQuestions:n=>o(async()=>Q(await e.listLessonQuestions({...s(),lessonId:n})).questions.map(et)),askQuestion:(n,r)=>o(async()=>et(Q(await e.askLessonQuestion({...s(),lessonId:n,content:r})))),rate:(n,r,i="")=>o(async()=>{let a=Q(await e.rateLesson({...s(),lessonId:n,score:r,comment:i}));return{myRating:a.myRating,averageRating:a.averageRating,ratingCount:a.ratingCount}})}}function fe(e){let t=e.host??Ve(),s=jt(He,Pe(t));return be(s,{accessId:e.accessId,accessToken:e.accessToken??(()=>{let{projectID:o,host:n}=we();return Ee(o,n)})})}import{ChevronLeft as rs,ChevronRight as as,Download as is,Paperclip as ls}from"lucide-react";import{useEffect as cs,useMemo as us,useRef as Re,useState as pt}from"react";import{useState as j}from"react";import{Star as Dt}from"lucide-react";import{useState as Ht}from"react";import{jsx as ie}from"react/jsx-runtime";function tt({value:e,onSelect:t,disabled:s}){let{texts:o}=v(),[n,r]=Ht(0),i=n||e;return ie("div",{className:"flex items-center gap-1",role:t?"radiogroup":"img","aria-label":w(o.rateStar,{n:Math.round(e)}),children:[1,2,3,4,5].map(a=>{let l=a<=Math.round(i),p=ie(Dt,{className:h("size-5",l?"fill-amber-400 text-amber-400":"text-neutral-300 dark:text-neutral-600"),"aria-hidden":!0});return t?ie("button",{type:"button",role:"radio","aria-checked":a===e,"aria-label":w(o.rateStar,{n:a}),disabled:s,className:"rounded p-0.5 outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:opacity-50",onMouseEnter:()=>r(a),onMouseLeave:()=>r(0),onClick:()=>t(a),children:p},a):ie("span",{children:p},a)})})}import{AlertTriangle as qt}from"lucide-react";import{jsx as F,jsxs as Ae}from"react/jsx-runtime";var st="bg-[var(--course-accent,var(--primary))] text-[var(--course-accent-fg,var(--primary-foreground))] dark:bg-[var(--course-accent-dark,var(--course-accent,var(--primary)))] dark:text-[var(--course-accent-dark-fg,var(--course-accent-fg,var(--primary-foreground)))]",D=h(st,"hover:bg-[var(--course-accent,var(--primary))] hover:opacity-90 dark:hover:bg-[var(--course-accent-dark,var(--course-accent,var(--primary)))]"),X="rounded-xl bg-white p-4 drop-shadow-xl sm:p-6 dark:border dark:border-neutral-700 dark:bg-neutral-900 dark:drop-shadow-none";function _(e,t){if(e instanceof B)switch(e.code){case"unauthorized":return t.errorUnauthorized;case"course_not_found":case"item_not_found":return t.errorNotFound;case"unavailable":return t.errorUnavailable}return t.errorGeneric}function H({error:e,onRetry:t,className:s}){let{texts:o}=v();return Ae("div",{role:"alert",className:h("flex flex-col items-start gap-3 rounded-xl border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-900 dark:bg-red-950 dark:text-red-300",s),children:[Ae("p",{className:"flex items-center gap-2 font-medium",children:[F(qt,{className:"size-4 shrink-0","aria-hidden":!0}),_(e,o)]}),t&&F(V,{variant:"outline",size:"sm",onClick:t,children:o.retry})]})}function ne({label:e}){let{texts:t}=v();return Ae("div",{role:"status","aria-label":e??t.loading,className:"space-y-3",children:[F(te,{className:"aspect-video w-full"}),F(te,{className:"h-6 w-2/3"}),F(te,{className:"h-4 w-full"}),F(te,{className:"h-4 w-5/6"})]})}function nt({percent:e,label:t}){let s=Math.max(0,Math.min(100,Math.round(e)));return F("div",{role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":s,"aria-label":t,className:"h-2 w-full overflow-hidden rounded-full bg-neutral-200 dark:bg-neutral-700",children:F("div",{className:h("h-full rounded-full transition-all duration-300",st),style:{width:`${s}%`}})})}import{useCallback as xe,useEffect as Ot,useRef as ye,useState as ot}from"react";function K(e,t,s){let[o,n]=ot(s!==void 0?{status:"success",data:s}:{status:"loading"}),[r,i]=ot(0),a=ye(0),l=ye(e);l.current=e;let p=ye(s!==void 0);Ot(()=>{if(p.current){p.current=!1;return}let b=++a.current;return n({status:"loading"}),l.current().then(f=>{b===a.current&&n({status:"success",data:f})}).catch(f=>{b===a.current&&n({status:"error",error:f})}),()=>{a.current+=1}},[...t,r]);let R=xe(()=>i(b=>b+1),[]),g=xe(()=>{let b=++a.current;l.current().then(f=>{b===a.current&&n({status:"success",data:f})}).catch(()=>{})},[]),c=xe(b=>{n(f=>f.status==="success"?{status:"success",data:b(f.data)}:f)},[]);return{...o,reload:R,refresh:g,mutate:c}}import{jsx as E,jsxs as J}from"react/jsx-runtime";function at({lessonId:e,initial:t}){let{dataSource:s,texts:o,preview:n}=v(),[r,i]=j(t),[a,l]=j(t.myRating),[p,R]=j(""),[g,c]=j("idle"),[b,f]=j();async function A(){if(!(a<1)){c("saving");try{i(await s.rate(e,a,p.trim())),c("saved")}catch(S){f(S),c("error")}}}return J("section",{"aria-labelledby":`rate-${e}`,className:"space-y-3",children:[E("h3",{id:`rate-${e}`,className:"text-lg font-semibold",children:o.rateTitle}),E(tt,{value:a,onSelect:S=>{l(S),c("idle")},disabled:n||g==="saving"}),r.ratingCount>0&&E("p",{className:"text-xs text-neutral-500 dark:text-neutral-400",children:w(o.rateAverage,{average:r.averageRating.toFixed(1),count:r.ratingCount})}),!n&&a>0&&J("div",{className:"space-y-2",children:[E(ue,{value:p,maxLength:1e3,placeholder:o.ratePlaceholder,onChange:S=>{R(S.target.value),c("idle")}}),E(V,{size:"sm",className:D,disabled:g==="saving",onClick:A,children:o.rateSubmit})]}),g==="saved"&&E("p",{role:"status",className:"text-sm text-emerald-700 dark:text-emerald-400",children:o.rateSaved}),g==="error"&&E("p",{role:"alert",className:"text-sm text-red-600 dark:text-red-400",children:_(b,o)})]})}function rt(e){return e==null?"":e.toLocaleDateString()}function it({lessonId:e}){let{dataSource:t,texts:s,preview:o}=v(),n=K(()=>t.listQuestions(e),[t,e]),[r,i]=j(""),[a,l]=j("idle"),[p,R]=j();async function g(){let c=r.trim();if(c!==""){l("sending");try{let b=await t.askQuestion(e,c);n.mutate(f=>[b,...f]),i(""),l("sent")}catch(b){R(b),l("error")}}}return J("section",{"aria-labelledby":`qa-${e}`,className:"space-y-4",children:[E("h3",{id:`qa-${e}`,className:"text-lg font-semibold",children:s.questionsTitle}),J("form",{className:"space-y-2",onSubmit:c=>{c.preventDefault(),g()},children:[E(ue,{value:r,maxLength:2e3,placeholder:s.questionPlaceholder,"aria-label":s.questionPlaceholder,onChange:c=>{i(c.target.value),l("idle")}}),E(V,{type:"submit",size:"sm",className:D,disabled:a==="sending"||r.trim()==="",children:s.questionSubmit}),a==="sent"&&E("p",{role:"status",className:"text-sm text-emerald-700 dark:text-emerald-400",children:s.questionSent}),a==="error"&&E("p",{role:"alert",className:"text-sm text-red-600 dark:text-red-400",children:_(p,s)})]}),n.status==="loading"&&E("p",{role:"status",className:"text-sm text-neutral-500",children:s.loading}),n.status==="error"&&E(H,{error:n.error,onRetry:n.reload}),n.status==="success"&&(n.data.length===0?E("p",{className:"text-sm text-neutral-500 dark:text-neutral-400",children:s.questionsEmpty}):E("ul",{className:"space-y-3",children:n.data.map(c=>J("li",{className:"rounded-lg bg-neutral-100 p-3 text-sm dark:bg-neutral-800",children:[J("p",{className:"mb-1 text-xs text-neutral-500 dark:text-neutral-400",children:[c.isMine?s.questionMine:c.authorName,c.createdAt&&` \xB7 ${rt(c.createdAt)}`]}),E("p",{className:"break-words whitespace-pre-wrap",children:c.content}),c.answer&&J("div",{className:"mt-2 border-l-2 border-neutral-400 pl-3 dark:border-neutral-500",children:[J("p",{className:"mb-1 text-xs font-medium text-neutral-500 dark:text-neutral-400",children:[s.questionTeamAnswer,c.answer.createdAt&&` \xB7 ${rt(c.answer.createdAt)}`]}),E("p",{className:"break-words whitespace-pre-wrap",children:c.answer.content})]})]},c.id))}))]})}import $t from"dompurify";var es={USE_PROFILES:{html:!0},FORBID_TAGS:["style","form","input","button","textarea","select","iframe","frame","object","embed","base","meta","link"],FORBID_ATTR:["style","srcdoc","formaction"],ALLOW_DATA_ATTR:!1,RETURN_TRUSTED_TYPE:!1};function ts(e){if(e.isSupported===!1||e.sanitize==null)return()=>"";let t=e.sanitize.bind(e);return e.addHook?.("afterSanitizeAttributes",s=>{s.tagName==="A"&&s.hasAttribute("href")&&(s.setAttribute("target","_blank"),s.setAttribute("rel","noopener noreferrer nofollow")),s.tagName==="IMG"&&(s.setAttribute("loading","lazy"),s.setAttribute("referrerpolicy","no-referrer"))}),s=>s==null||s===""?"":String(t(s,es))}var lt;function Se(e){return typeof window>"u"?"":(lt??=ts($t),lt(e))}import ee from"hls.js";import{useCallback as ss,useEffect as ns,useRef as he,useState as ct}from"react";import{jsx as ve,jsxs as ut}from"react/jsx-runtime";function os(e){return e.canPlayType("application/vnd.apple.mpegurl")!==""}function dt({src:e,poster:t,startAt:s=0,durationHint:o=0,autoPlay:n=!1,onReport:r,onEnded:i,onExpired:a,className:l}){let{texts:p}=v(),R=he(null),[g,c]=ct(!1),[b,f]=ct(0),A=he({onReport:r,onEnded:i,onExpired:a,durationHint:o});A.current={onReport:r,onEnded:i,onExpired:a,durationHint:o};let S=he(void 0),U=ss((d,C=R.current)=>{if(C==null||A.current.onReport==null)return;let T=Math.floor(C.currentTime);if(T<=0&&d!=="ended")return;let m=Number.isFinite(C.duration)?C.duration:A.current.durationHint;S.current=T,A.current.onReport({positionSeconds:T,durationSeconds:Math.floor(m||0),reason:d})},[]);return ns(()=>{let d=R.current;if(d==null)return;c(!1);let C,T=!1,m=!1,y,k=()=>{s>0&&(d.currentTime=s),n&&d.play().catch(()=>{})};os(d)?(d.src=e,d.addEventListener("loadedmetadata",k,{once:!0})):ee.isSupported()?(C=new ee,C.attachMedia(d),C.loadSource(e),C.on(ee.Events.MANIFEST_PARSED,k),C.on(ee.Events.ERROR,(N,z)=>{if(!z.fatal)return;let O=z.response?.code;O===401||O===403?(A.current.onExpired?.(),c(!0)):z.type===ee.ErrorTypes.NETWORK_ERROR&&!T?(T=!0,C?.startLoad()):z.type===ee.ErrorTypes.MEDIA_ERROR&&!m?(m=!0,C?.recoverMediaError()):c(!0)})):d.src=e;let M=()=>{clearInterval(y),y=setInterval(()=>U("periodic"),15e3)},q=()=>{clearInterval(y),d.ended||U("pause")},W=()=>{clearInterval(y),U("ended"),A.current.onEnded?.()},re=()=>{C==null&&c(!0)};return d.addEventListener("play",M),d.addEventListener("pause",q),d.addEventListener("ended",W),d.addEventListener("error",re),()=>{clearInterval(y),d.removeEventListener("play",M),d.removeEventListener("pause",q),d.removeEventListener("ended",W),d.removeEventListener("error",re),d.removeEventListener("loadedmetadata",k),!d.ended&&d.currentTime>0&&U("leave",d),C?.destroy(),d.removeAttribute("src"),d.load()}},[e,b]),ut("div",{className:h("relative overflow-hidden rounded-xl bg-black",l),children:[ve("video",{ref:R,className:"aspect-video w-full",poster:t,controls:!0,playsInline:!0,preload:"metadata",controlsList:"nodownload"}),g&&ut("div",{role:"alert",className:"absolute inset-0 flex flex-col items-center justify-center gap-3 bg-black/80 p-4 text-center text-sm text-white",children:[ve("p",{children:p.videoError}),ve(V,{variant:"secondary",size:"sm",onClick:()=>{A.current.onExpired?.(),f(d=>d+1)},children:p.videoRetry})]})]})}import{jsx as G,jsxs as Z}from"react/jsx-runtime";function mt({lesson:e,courseType:t,prev:s,next:o,autoplay:n,onAutoplayChange:r,startPlaying:i,onNavigate:a,onProgressSaved:l,onEnded:p,onUrlsExpired:R}){let{dataSource:g,texts:c,preview:b}=v(),[f,A]=pt(e.completed),S=Re(e.completed),U=Re(void 0),d=Re(e.positionSeconds),[C,T]=pt(!1),m=e.urlsExpireAt?.getTime();cs(()=>{if(m==null)return;let N=m-Date.now()-6e4;if(N<=0||N>2**31-1)return;let z=setTimeout(R,N);return()=>clearTimeout(z)},[m]);let y=us(()=>Se(e.contentHtml),[e.contentHtml]);async function k(N,z,O){if(b)return;let ke=await g.saveProgress({lessonId:e.id,completed:O,positionSeconds:N,durationSeconds:z});U.current=N,ke.completed&&!S.current&&(S.current=!0,A(!0)),l(e.id,ke)}function M(N){if(d.current=N.positionSeconds,b||N.reason==="periodic"&&N.positionSeconds===U.current)return;let z=N.reason==="ended"||Qe(N.positionSeconds,N.durationSeconds);k(N.positionSeconds,N.durationSeconds,z&&!S.current).catch(O=>{console.warn("Saving the progress of the lesson failed",O)})}async function q(){T(!0);try{await k(d.current,e.video?.durationSeconds??0,!0)}catch(N){console.warn("Marking the lesson as completed failed",N)}finally{T(!1)}}let W=e.description.trim(),re=y!==""||W!=="";return Z("article",{"data-lesson-id":e.id,className:"min-w-0 space-y-5","aria-labelledby":`lesson-${e.id}`,children:[e.video&&G(dt,{src:e.video.hlsUrl,poster:e.video.posterUrl,startAt:We(d.current,e.video.durationSeconds),durationHint:e.video.durationSeconds,autoPlay:i,onReport:M,onEnded:p,onExpired:R}),Z("div",{className:h(X,"space-y-5"),children:[Z("header",{className:"flex flex-wrap items-start justify-between gap-3",children:[G("h2",{id:`lesson-${e.id}`,className:"text-2xl font-semibold break-words",children:e.title}),!b&&G(V,{size:"sm",variant:f?"outline":"default",className:h(!f&&D),disabled:f||C,onClick:q,children:f?c.markedComplete:c.markComplete})]}),t==="video"&&e.video&&Z("label",{className:"flex w-fit cursor-pointer items-center gap-2 text-sm text-neutral-600 dark:text-neutral-300",children:[G("input",{type:"checkbox",checked:n,onChange:N=>r(N.target.checked)}),c.autoplay]}),W!==""&&G("p",{className:"text-sm break-words whitespace-pre-wrap text-neutral-700 dark:text-neutral-300",children:W}),y!==""&&G("div",{className:"bitsnap-course-html break-words [&_a]:underline [&_blockquote]:border-l-4 [&_blockquote]:pl-4 [&_h1]:text-2xl [&_h1]:font-semibold [&_h2]:text-xl [&_h2]:font-semibold [&_h3]:text-lg [&_h3]:font-semibold [&_img]:h-auto [&_img]:max-w-full [&_ol]:list-decimal [&_ol]:pl-6 [&_p]:my-3 [&_pre]:overflow-x-auto [&_table]:block [&_table]:max-w-full [&_table]:overflow-x-auto [&_ul]:list-disc [&_ul]:pl-6",dangerouslySetInnerHTML:{__html:y}}),!re&&!e.video&&G("p",{className:"text-sm text-neutral-500 dark:text-neutral-400",children:c.noContent}),e.attachments.length>0&&Z("section",{"aria-labelledby":`files-${e.id}`,className:"space-y-2",children:[Z("h3",{id:`files-${e.id}`,className:"flex items-center gap-2 text-lg font-semibold",children:[G(ls,{className:"size-4","aria-hidden":!0}),c.attachments]}),G("ul",{className:"space-y-2",children:e.attachments.map(N=>G("li",{children:Z("a",{href:N.url,target:"_blank",rel:"noopener noreferrer",download:N.name,className:"flex items-center justify-between gap-3 rounded-lg bg-neutral-100 px-3 py-2 text-sm transition hover:bg-neutral-200 dark:bg-neutral-800 dark:hover:bg-neutral-700",children:[Z("span",{className:"min-w-0 break-words",children:[N.name,G("span",{className:"ml-2 text-xs text-neutral-500 dark:text-neutral-400",children:Ye(N.size)})]}),Z("span",{className:"flex shrink-0 items-center gap-1 text-xs font-medium",children:[c.download,G(is,{className:"size-3.5","aria-hidden":!0})]})]})},N.id))})]}),Z("nav",{className:"flex items-center justify-between gap-3 border-t pt-4",children:[Z(V,{variant:"outline",size:"sm",disabled:s==null,onClick:()=>s&&a(s),children:[G(rs,{"aria-hidden":!0}),c.prevItem]}),Z(V,{variant:"outline",size:"sm",disabled:o==null,onClick:()=>o&&a(o),children:[c.nextItem,G(as,{"aria-hidden":!0})]})]})]}),G("div",{className:h(X),children:G(at,{lessonId:e.id,initial:{myRating:e.myRating,averageRating:e.averageRating,ratingCount:e.ratingCount}})}),G("div",{className:h(X),children:G(it,{lessonId:e.id})})]})}var gt={pl:{back:"Wr\xF3\u0107",loading:"\u0141adowanie kursu...",retry:"Spr\xF3buj ponownie",errorGeneric:"Nie uda\u0142o si\u0119 za\u0142adowa\u0107 danych. Spr\xF3buj ponownie za chwil\u0119.",errorUnauthorized:"Nie masz dost\u0119pu do tego kursu. Zaloguj si\u0119 ponownie lub skontaktuj si\u0119 z pomoc\u0105.",errorNotFound:"Nie znaleziono tego kursu lub lekcji.",errorUnavailable:"Kurs jest chwilowo niedost\u0119pny. Spr\xF3buj ponownie za chwil\u0119.",previewBadge:"Podgl\u0105d",progressLessons:"{done} z {total} lekcji",progressPercent:"{percent}% uko\u0144czono",contents:"Spis tre\u015Bci",free:"Darmowa",locked:"Zablokowane",lockedByTest:"Odblokuje je zaliczenie testu: {test}",lockedPage:"Ta lekcja jest zablokowana. Zalicz test \u201E{test}\u201D, aby j\u0105 odblokowa\u0107.",testBadge:"Test",completed:"Uko\u0144czono",continueCourse:"Kontynuuj kurs",noItem:"Wybierz lekcj\u0119 z listy.",markComplete:"Oznacz jako uko\u0144czon\u0105",markedComplete:"Lekcja uko\u0144czona",prevItem:"Poprzednia",nextItem:"Nast\u0119pna",attachments:"Materia\u0142y do pobrania",download:"Pobierz",autoplay:"Autoodtwarzanie nast\u0119pnej lekcji",videoError:"Nie uda\u0142o si\u0119 odtworzy\u0107 wideo.",videoRetry:"Od\u015Bwie\u017C wideo",noContent:"Ta lekcja nie ma jeszcze tre\u015Bci.",testGating:"Zaliczenie tego testu odblokowuje kolejne lekcje.",testAttemptsLeft:"Pozosta\u0142o pr\xF3b: {count}",testAttemptsUnlimited:"Liczba pr\xF3b nie jest ograniczona.",testNoAttemptsLeft:"Wykorzystano wszystkie pr\xF3by.",testPassThreshold:"Pr\xF3g zaliczenia: {percent}%",testBestScore:"Najlepszy wynik: {percent}%",testSubmit:"Sprawd\u017A odpowiedzi",testSubmitting:"Sprawdzanie...",testUnanswered:"Pytania bez odpowiedzi: {count}",testPassed:"Test zaliczony",testFailed:"Test niezaliczony",testScore:"Wynik: {percent}%",testCorrect:"Poprawnie",testIncorrect:"Niepoprawnie",testCorrectAnswer:"Poprawna odpowied\u017A",testTryAgain:"Spr\xF3buj ponownie",testPreviousAttempts:"Poprzednie podej\u015Bcia",testAttemptRow:"{percent}% \xB7 {date}",testNoQuestions:"Ten test nie ma jeszcze pyta\u0144.",mcqSingle:"Wybierz jedn\u0105 odpowied\u017A",mcqMultiple:"Zaznacz wszystkie poprawne odpowiedzi",todoHint:"Zaznacz wykonane kroki",todoRequired:"wymagany",gapPlaceholder:"uzupe\u0142nij",sortHint:"U\u0142\xF3\u017C elementy w poprawnej kolejno\u015Bci",moveUp:"Przesu\u0144 w g\xF3r\u0119",moveDown:"Przesu\u0144 w d\xF3\u0142",questionsTitle:"Pytania do lekcji",questionsEmpty:"Nikt jeszcze nie zada\u0142 pytania.",questionPlaceholder:"Zadaj pytanie autorowi kursu",questionSubmit:"Wy\u015Blij pytanie",questionSent:"Pytanie wys\u0142ane.",questionMine:"Ty",questionTeamAnswer:"Odpowied\u017A autora",rateTitle:"Oce\u0144 lekcj\u0119",rateStar:"{n} z 5",ratePlaceholder:"Komentarz (opcjonalnie)",rateSubmit:"Zapisz ocen\u0119",rateSaved:"Dzi\u0119kujemy za ocen\u0119.",rateAverage:"\u015Arednia ocena {average} ({count})"},en:{back:"Back",loading:"Loading the course...",retry:"Try again",errorGeneric:"Could not load the data. Please try again in a moment.",errorUnauthorized:"You do not have access to this course. Sign in again or contact support.",errorNotFound:"This course or lesson was not found.",errorUnavailable:"The course is temporarily unavailable. Please try again in a moment.",previewBadge:"Preview",progressLessons:"{done} of {total} lessons",progressPercent:"{percent}% complete",contents:"Contents",free:"Free",locked:"Locked",lockedByTest:"Pass the test to unlock it: {test}",lockedPage:"This lesson is locked. Pass the test \u201C{test}\u201D to unlock it.",testBadge:"Test",completed:"Completed",continueCourse:"Continue the course",noItem:"Pick a lesson from the list.",markComplete:"Mark as completed",markedComplete:"Lesson completed",prevItem:"Previous",nextItem:"Next",attachments:"Downloads",download:"Download",autoplay:"Autoplay the next lesson",videoError:"The video could not be played.",videoRetry:"Reload the video",noContent:"This lesson has no content yet.",testGating:"Passing this test unlocks the following lessons.",testAttemptsLeft:"Attempts left: {count}",testAttemptsUnlimited:"The number of attempts is unlimited.",testNoAttemptsLeft:"You have used all attempts.",testPassThreshold:"Passing score: {percent}%",testBestScore:"Best score: {percent}%",testSubmit:"Check answers",testSubmitting:"Checking...",testUnanswered:"Unanswered questions: {count}",testPassed:"Test passed",testFailed:"Test not passed",testScore:"Score: {percent}%",testCorrect:"Correct",testIncorrect:"Incorrect",testCorrectAnswer:"Correct answer",testTryAgain:"Try again",testPreviousAttempts:"Previous attempts",testAttemptRow:"{percent}% \xB7 {date}",testNoQuestions:"This test has no questions yet.",mcqSingle:"Choose one answer",mcqMultiple:"Select all correct answers",todoHint:"Check the steps you have done",todoRequired:"required",gapPlaceholder:"fill in",sortHint:"Put the items in the correct order",moveUp:"Move up",moveDown:"Move down",questionsTitle:"Questions about this lesson",questionsEmpty:"Nobody has asked a question yet.",questionPlaceholder:"Ask the course author a question",questionSubmit:"Send question",questionSent:"Question sent.",questionMine:"You",questionTeamAnswer:"Answer from the author",rateTitle:"Rate this lesson",rateStar:"{n} of 5",ratePlaceholder:"Comment (optional)",rateSubmit:"Save rating",rateSaved:"Thanks for your rating.",rateAverage:"Average rating {average} ({count})"}};function Ce(e,t=Ue()){return Ge(gt,t,e)}import{ArrowDown as ds,ArrowUp as ps,Check as ft,X as At}from"lucide-react";import{useRef as bt,useState as oe}from"react";import{Fragment as Ss,jsx as u,jsxs as P}from"react/jsx-runtime";function ms({question:e,answer:t,disabled:s,onChange:o}){let{texts:n}=v();if(e.config.type!=="mcq")return null;let{choices:r,multiple:i}=e.config;return P("fieldset",{className:"space-y-2",disabled:s,children:[u("legend",{className:"mb-2 text-xs text-neutral-500 dark:text-neutral-400",children:i?n.mcqMultiple:n.mcqSingle}),r.map(a=>{let l=t.selectedIds.includes(a.id);return P("label",{className:"flex cursor-pointer items-start gap-3 rounded-lg bg-neutral-100 px-3 py-2 text-sm dark:bg-neutral-800",children:[u("input",{className:"mt-0.5",type:i?"checkbox":"radio",name:`q-${e.id}`,checked:l,onChange:()=>o({type:"mcq",selectedIds:i?l?t.selectedIds.filter(p=>p!==a.id):[...t.selectedIds,a.id]:[a.id]})}),u("span",{className:"break-words",children:a.label})]},a.id)})]})}function gs({question:e,answer:t,disabled:s,onChange:o}){let{texts:n}=v();return e.config.type!=="todolist"?null:P("fieldset",{className:"space-y-2",disabled:s,children:[u("legend",{className:"mb-2 text-xs text-neutral-500 dark:text-neutral-400",children:n.todoHint}),e.config.steps.map(r=>{let i=t.checkedIds.includes(r.id);return P("label",{className:"flex cursor-pointer items-start gap-3 rounded-lg bg-neutral-100 px-3 py-2 text-sm dark:bg-neutral-800",children:[u("input",{className:"mt-0.5",type:"checkbox",checked:i,onChange:()=>o({type:"todolist",checkedIds:i?t.checkedIds.filter(a=>a!==r.id):[...t.checkedIds,r.id]})}),P("span",{className:"break-words",children:[r.label,r.required&&P("span",{className:"ml-2 text-xs text-neutral-500 dark:text-neutral-400",children:["(",n.todoRequired,")"]})]})]},r.id)})]})}function bs({question:e,answer:t,disabled:s,onChange:o}){let{texts:n}=v();if(e.config.type!=="fill_gap")return null;let r=ge(e.config.template,e.config.blanks);return u("p",{className:"text-sm leading-10 break-words",children:r.map((i,a)=>i.type==="text"?u("span",{className:"whitespace-pre-wrap",children:i.text},a):u(Ie,{className:"mx-1 inline-block h-8 w-36 align-middle","aria-label":`${n.gapPlaceholder} ${i.id}`,placeholder:n.gapPlaceholder,disabled:s,value:t.values[i.id]??"",onChange:l=>o({type:"fill_gap",values:{...t.values,[i.id]:l.target.value}})},a))})}function fs({question:e,answer:t,disabled:s,onChange:o}){let{texts:n}=v();if(e.config.type!=="sort_order")return null;let r=new Map(e.config.items.map(a=>[a.id,a.label])),i=(a,l)=>o({type:"sort_order",orderedIds:Ke(t.orderedIds,a,l)});return P("div",{className:"space-y-2",children:[u("p",{className:"text-xs text-neutral-500 dark:text-neutral-400",children:n.sortHint}),u("ol",{className:"space-y-2",children:t.orderedIds.map((a,l)=>P("li",{className:"flex items-center gap-2 rounded-lg bg-neutral-100 px-3 py-2 text-sm dark:bg-neutral-800",children:[P("span",{className:"w-5 text-xs text-neutral-500",children:[l+1,"."]}),u("span",{className:"min-w-0 flex-1 break-words",children:r.get(a)??a}),u(V,{type:"button",variant:"ghost",size:"icon-xs","aria-label":n.moveUp,disabled:s||l===0,onClick:()=>i(l,l-1),children:u(ps,{"aria-hidden":!0})}),u(V,{type:"button",variant:"ghost",size:"icon-xs","aria-label":n.moveDown,disabled:s||l===t.orderedIds.length-1,onClick:()=>i(l,l+1),children:u(ds,{"aria-hidden":!0})})]},a))})]})}function As({question:e,answer:t,disabled:s,onChange:o}){let n={question:e,disabled:s,onChange:o};switch(t.type){case"mcq":return u(ms,{...n,answer:t});case"todolist":return u(gs,{...n,answer:t});case"fill_gap":return u(bs,{...n,answer:t});case"sort_order":return u(fs,{...n,answer:t})}}function xs({list:e}){let{texts:t}=v();return e.submissions.length===0?null:P("section",{className:"space-y-2",children:[u("h3",{className:"text-sm font-semibold",children:t.testPreviousAttempts}),u("ul",{className:"space-y-1 text-sm",children:e.submissions.map(s=>P("li",{className:"flex items-center gap-2 text-neutral-700 dark:text-neutral-300",children:[s.passed?u(ft,{className:"size-4 text-emerald-600","aria-hidden":!0}):u(At,{className:"size-4 text-red-600","aria-hidden":!0}),w(t.testAttemptRow,{percent:s.scorePercent,date:s.createdAt?.toLocaleString()??""})]},s.id))})]})}function ys({test:e,onSubmitted:t,onTryAgain:s}){let{dataSource:o,texts:n}=v(),[r,i]=oe({}),[a,l]=oe(),[p,R]=oe(!1),[g,c]=oe(),b=bt(Date.now()),f=bt(e.questions).current,A=e.attemptsLeft!=null&&e.attemptsLeft<=0,S=a?a.attemptsLeft:e.attemptsLeft,U=_e(f,r),d=m=>r[m.id]??Fe(m.config);async function C(){R(!0),c(void 0);try{let m={};for(let k of f)m[k.id]=d(k);let y=await o.submitTest(e.id,m,Date.now()-b.current);l(y),t(y)}catch(m){c(m)}finally{R(!1)}}let T=new Map(a?.results.map(m=>[m.questionId,m]));return f.length===0?u("p",{className:"text-sm text-neutral-500 dark:text-neutral-400",children:n.testNoQuestions}):P("form",{className:"space-y-6",onSubmit:m=>{m.preventDefault(),a==null&&!A&&C()},children:[a&&P("div",{role:"status",className:h("rounded-xl p-4 text-sm",a.submission.passed?"bg-emerald-50 text-emerald-800 dark:bg-emerald-950 dark:text-emerald-300":"bg-red-50 text-red-800 dark:bg-red-950 dark:text-red-300"),children:[u("p",{className:"text-base font-semibold",children:a.submission.passed?n.testPassed:n.testFailed}),u("p",{children:w(n.testScore,{percent:a.submission.scorePercent})})]}),u("ol",{className:"space-y-6",children:f.map((m,y)=>{let k=T.get(m.id),M=k?.correctAnswer!=null?Je(m,k.correctAnswer):"";return P("li",{className:"space-y-3","data-question-id":m.id,children:[P("p",{className:"font-medium break-words",children:[y+1,". ",m.prompt]}),u(As,{question:m,answer:d(m),disabled:a!=null||p||A,onChange:q=>i(W=>({...W,[m.id]:q}))}),k&&P("div",{className:h("flex items-start gap-2 text-sm",k.correct?"text-emerald-700 dark:text-emerald-400":"text-red-700 dark:text-red-400"),children:[k.correct?u(ft,{className:"mt-0.5 size-4 shrink-0","aria-hidden":!0}):u(At,{className:"mt-0.5 size-4 shrink-0","aria-hidden":!0}),P("span",{children:[k.correct?n.testCorrect:n.testIncorrect,M!==""&&!k.correct&&P("span",{className:"block text-neutral-700 dark:text-neutral-300",children:[n.testCorrectAnswer,": ",M]})]})]})]},m.id)})}),g!=null&&u("p",{role:"alert",className:"text-sm text-red-600 dark:text-red-400",children:_(g,n)}),a==null?P("div",{className:"space-y-2",children:[U>0&&!A&&u("p",{className:"text-xs text-neutral-500 dark:text-neutral-400",children:w(n.testUnanswered,{count:U})}),u(V,{type:"submit",className:D,disabled:p||A,children:p?n.testSubmitting:n.testSubmit})]}):S!==0&&!a.submission.passed&&u(V,{type:"button",variant:"outline",onClick:s,children:n.testTryAgain})]})}function xt({testId:e,title:t,onSubmitted:s}){let{dataSource:o,texts:n}=v(),r=K(()=>o.getTest(e),[o,e]),i=K(()=>o.listSubmissions(e).catch(()=>{}),[o,e]),[a,l]=oe(0);return P("article",{"data-test-id":e,className:h(X,"min-w-0 space-y-5"),children:[u("h2",{className:"text-2xl font-semibold break-words",children:r.status==="success"?r.data.title:t}),r.status==="loading"&&u(ne,{}),r.status==="error"&&u(H,{error:r.error,onRetry:r.reload}),r.status==="success"&&P(Ss,{children:[r.data.description.trim()!==""&&u("p",{className:"text-sm break-words whitespace-pre-wrap text-neutral-700 dark:text-neutral-300",children:r.data.description}),P("ul",{className:"space-y-1 text-sm text-neutral-600 dark:text-neutral-400",children:[r.data.gating&&u("li",{children:n.testGating}),u("li",{children:w(n.testPassThreshold,{percent:r.data.passThresholdPercent})}),u("li",{children:r.data.attemptsLeft==null?n.testAttemptsUnlimited:w(n.testAttemptsLeft,{count:r.data.attemptsLeft})}),r.data.attemptCount>0&&u("li",{children:w(n.testBestScore,{percent:r.data.bestScorePercent})})]}),r.data.attemptsLeft!=null&&r.data.attemptsLeft<=0&&u("p",{role:"alert",className:"text-sm font-medium text-red-700 dark:text-red-400",children:n.testNoAttemptsLeft}),u(ys,{test:r.data,onSubmitted:p=>{s(p),i.refresh(),r.refresh()},onTryAgain:()=>l(p=>p+1)},a),i.status==="success"&&i.data&&u(xs,{list:i.data})]})]})}import{jsx as x,jsxs as L}from"react/jsx-runtime";var St="bitsnap-course-autoplay";function Cs(){let[e,t]=le(!1);Rt(()=>{try{t(window.localStorage.getItem(St)==="1")}catch{}},[]);let s=vt(o=>{t(o);try{window.localStorage.setItem(St,o?"1":"0")}catch{}},[]);return[e,s]}function ht(e){return e==null?void 0:{id:e.id,kind:e.kind}}function Ns({item:e}){let{texts:t}=v();return L("div",{className:h(X,"space-y-2"),role:"status",children:[x("h2",{className:"text-2xl font-semibold break-words",children:e.title}),x("p",{className:"text-sm text-neutral-600 dark:text-neutral-300",children:e.lockReason?w(t.lockedPage,{test:e.lockReason.gatingTestTitle}):t.locked})]})}function ks({course:e,item:t,autoplay:s,onAutoplayChange:o,startPlaying:n,onNavigate:r,onProgressSaved:i,onEnded:a,onLocked:l}){let{dataSource:p,texts:R}=v(),g=K(()=>p.getLesson(t.id),[p,t.id]),c=g.status==="error"&&g.error instanceof B&&g.error.code==="item_locked";if(Rt(()=>{c&&l()},[c]),g.status==="loading")return x(ne,{});if(g.status==="error")return c?L("div",{className:h(X,"space-y-2"),role:"alert",children:[x("h2",{className:"text-2xl font-semibold break-words",children:t.title}),x("p",{className:"text-sm",children:_(g.error,R)})]}):x(H,{error:g.error,onRetry:g.reload});let b=pe(e,t.id);return x(mt,{lesson:g.data,courseType:e.type,prev:g.data.prev??ht(b.prev),next:g.data.next??ht(b.next),autoplay:s,onAutoplayChange:o,startPlaying:n,onNavigate:r,onProgressSaved:i,onEnded:a,onUrlsExpired:g.refresh},g.data.id)}function Vs({course:e,selectedId:t,onSelect:s,onBack:o,onCourseChange:n,onCourseRefresh:r}){let{texts:i,preview:a}=v(),l=Rs(null),[p,R]=le(!1),[g,c]=Cs(),[b,f]=le(),A=ze(e,t),S=se(e,A),U=(y,k=!1)=>{f(k?y:void 0),R(!1),s(y),l.current?.scrollIntoView({block:"start",behavior:"smooth"})},d=x(De,{course:e,selectedId:A,variant:e.type==="video"?"playlist":"modules",onSelect:y=>U(y.id)}),C;S==null?C=x("p",{className:"text-sm text-neutral-500",children:i.noItem}):S.locked?C=x(Ns,{item:S}):S.kind==="test"?C=x(xt,{testId:S.id,title:S.title,onSubmitted:()=>r()},S.id):C=x(ks,{course:e,item:S,autoplay:g,onAutoplayChange:c,startPlaying:b===S.id,onNavigate:y=>U(y.id),onProgressSaved:(y,k)=>n(M=>({...k.completed?Me(M,y):M,completedLessons:k.completedLessons,progressPercent:k.progressPercent})),onEnded:()=>{if(!g)return;let y=Xe(e,S.id);y&&U(y.id,!0)},onLocked:r},S.id);let T=e.type==="video",m=e.resumeItemId!==""&&e.resumeItemId!==A&&se(e,e.resumeItemId)?.locked===!1;return L("div",{ref:l,className:"space-y-4 scroll-mt-4",children:[L("header",{className:"space-y-3",children:[L("div",{className:"flex flex-wrap items-center gap-2",children:[o&&L(V,{variant:"ghost",size:"sm",onClick:o,children:[x(Ne,{"aria-hidden":!0}),i.back]}),a&&x("span",{"data-course-preview":!0,className:"rounded-full bg-amber-100 px-3 py-0.5 text-xs font-semibold text-amber-900 dark:bg-amber-900/40 dark:text-amber-200",children:i.previewBadge})]}),L("div",{className:"flex flex-wrap items-end justify-between gap-4",children:[x("div",{className:"min-w-0 space-y-1",children:x("h1",{className:"text-2xl font-semibold break-words sm:text-3xl",children:e.title})}),m&&L(V,{size:"sm",variant:"outline",onClick:()=>U(e.resumeItemId),children:[x(vs,{"aria-hidden":!0}),i.continueCourse]})]}),L("div",{className:"max-w-xl space-y-1",children:[x(nt,{percent:e.progressPercent,label:w(i.progressPercent,{percent:e.progressPercent})}),L("p",{className:"text-xs text-neutral-500 dark:text-neutral-400",children:[w(i.progressLessons,{done:e.completedLessons,total:e.totalLessons})," \xB7 ",w(i.progressPercent,{percent:e.progressPercent})]})]})]}),L("div",{className:h("grid gap-6",T?"lg:grid-cols-[minmax(0,1fr)_380px]":"lg:grid-cols-[320px_minmax(0,1fr)]"),children:[!T&&x("div",{className:"lg:hidden",children:L(V,{variant:"outline",size:"sm","aria-expanded":p,onClick:()=>R(y=>!y),children:[x(hs,{"aria-hidden":!0}),i.contents]})}),!T&&x("aside",{className:h(X,"p-3 sm:p-3 lg:sticky lg:top-4 lg:block lg:max-h-[calc(100vh-2rem)] lg:self-start lg:overflow-y-auto",p?"block":"hidden"),children:d}),x("div",{className:"min-w-0","data-course-content":!0,children:C}),T&&x("aside",{className:h(X,"p-3 sm:p-3 lg:sticky lg:top-4 lg:max-h-[calc(100vh-2rem)] lg:self-start lg:overflow-y-auto"),children:d})]})]})}function Ps({accessId:e,accessToken:t,dataSource:s,preview:o=!1,itemId:n,onItemChange:r,onBack:i,initialCourse:a,texts:l,locale:p,theme:R,className:g}){let c=Te(),b=yt(()=>Ce(l,p),[l,p]),f=yt(()=>{if(s)return s;if(e==null||e==="")throw new Error("PanelCourse needs an accessId or a dataSource");return fe({accessId:e,accessToken:t})},[s,e,t]),A=K(()=>f.getCourse(),[f],a),[S,U]=le(),d=r?n:n??S,C=vt(m=>{U(m),r?.(m)},[r]),T=Le(R?.colors??c.theme?.colors);return x(Ze,{value:{dataSource:f,texts:b,preview:o},children:L("div",{"data-bitsnap-course":!0,"data-course-type":A.status==="success"?A.data.type:void 0,style:T,className:h("font-inter w-full max-w-7xl",g),children:[A.status==="loading"&&L("div",{className:"space-y-4",children:[i&&L(V,{variant:"ghost",size:"sm",onClick:i,children:[x(Ne,{"aria-hidden":!0}),b.back]}),x("p",{className:"sr-only",role:"status",children:b.loading}),x(ne,{})]}),A.status==="error"&&L("div",{className:"space-y-4",children:[i&&L(V,{variant:"ghost",size:"sm",onClick:i,children:[x(Ne,{"aria-hidden":!0}),b.back]}),x(H,{error:A.error,onRetry:A.reload})]}),A.status==="success"&&x(Vs,{course:A.data,selectedId:d,onSelect:C,onBack:i,onCourseChange:A.mutate,onCourseRefresh:A.refresh})]})})}export{gt as COURSE_TEXT_TABLES,B as CourseError,Ps as PanelCourse,be as createCourseDataSource,fe as createRpcCourseDataSource,Ce as getCourseTexts,Se as sanitizeLessonHtml};
|
|
1
|
+
import{b as Fe,j as _e,k as Ke}from"./chunk-YXFJG4MF.mjs";import{m as Qe,n as We,q as N,r as Ye,s as Ae,u as ie,v as xe}from"./chunk-T2OUOO4X.mjs";import{d as v,i as Je,m as je}from"./chunk-43IIYJ6J.mjs";import{l as Ze,n as Xe,r as Me,s as ze}from"./chunk-RLEC25JI.mjs";import"./chunk-ADYVTMGH.mjs";import"./chunk-U6FLIRIV.mjs";import{ChevronLeft as Ee,List as Us,Play as Ls}from"lucide-react";import{useCallback as Bt,useEffect as Ge,useMemo as we,useRef as Bs,useState as fe}from"react";function De(e){let t={},s=e?.brand?.trim(),o=e?.brandDark?.trim()||s;if(s){t["--course-accent"]=s;let n=Ae(s);n&&(t["--course-accent-fg"]=n)}if(o){t["--course-accent-dark"]=o;let n=Ae(o);n&&(t["--course-accent-dark-fg"]=n)}return t}import{useCallback as Mt}from"react";import{createContext as Zt,useContext as Xt}from"react";var He=Zt(void 0),qe=He.Provider;function h(){let e=Xt(He);if(e==null)throw new Error("Course components have to be rendered inside PanelCourse");return e}function Q(){let{analytics:e,preview:t}=h();return Mt((s,o)=>{t||e?.courseId==null||e.instrument.track(s,{...o,course_id:e.courseId})},[e,t])}import{CheckCircle2 as Wt,ClipboardCheck as Yt,Lock as Ft,PlayCircle as _t,FileText as Kt}from"lucide-react";function ce(e){return[...e.sections.flatMap(t=>t.items.map(s=>({...s,sectionId:t.id}))),...e.finalItems.map(t=>({...t,sectionId:""}))]}function le(e,t){if(!(t==null||t===""))return ce(e).find(s=>s.id===t)}function ye(e,t){let s=ce(e),o=s.findIndex(n=>n.id===t);return o<0?{}:{prev:s[o-1],next:s[o+1]}}function Oe(e,t){let{next:s}=ye(e,t);return s!=null&&s.kind==="lesson"&&!s.locked?s:void 0}function zt(e){let t=0,s=0;for(let o of e.sections)for(let n of o.items)n.kind==="lesson"&&(t+=1,n.completed&&(s+=1));return{total:t,completed:s,percent:t===0?0:Math.round(s/t*100)}}function $e(e,t){let s=e.sections.map(n=>({...n,items:n.items.map(i=>i.id===t&&i.kind==="lesson"?{...i,completed:!0}:i)})),o=zt({sections:s});return{...e,sections:s,totalLessons:o.total,completedLessons:o.completed,progressPercent:o.percent}}function et(e,t){return le(e,t)!=null?t:le(e,e.resumeItemId)?.locked===!1?e.resumeItemId:ce(e).find(s=>!s.locked)?.id}function w(e,t){return e.replace(/\{(\w+)\}/g,(s,o)=>o in t?String(t[o]):s)}function tt(e,t){return t>0&&e/t>=.8}function st(e,t){return e<5||t>0&&e>=t-5?0:Math.floor(e)}function Se(e){let t=Math.max(0,Math.floor(e)),s=Math.floor(t/3600),o=Math.floor(t%3600/60),n=String(t%60).padStart(2,"0");return s>0?`${s}:${String(o).padStart(2,"0")}:${n}`:`${o}:${n}`}function nt(e){if(!(e>0))return"0 B";let t=["B","KB","MB","GB"],s=Math.min(Math.floor(Math.log(e)/Math.log(1024)),t.length-1),o=e/1024**s;return`${s===0||o>=10?Math.round(o):o.toFixed(1)} ${t[s]}`}function ot(e){switch(e.type){case"mcq":return{type:"mcq",selectedIds:[]};case"todolist":return{type:"todolist",checkedIds:[]};case"fill_gap":return{type:"fill_gap",values:{}};case"sort_order":return{type:"sort_order",orderedIds:e.items.map(t=>t.id)}}}function Qt(e,t){if(t==null||t.type!==e.config.type)return!1;switch(t.type){case"mcq":return t.selectedIds.length>0;case"todolist":return t.checkedIds.length>0;case"fill_gap":return Object.values(t.values).some(s=>s.trim()!=="");case"sort_order":return t.orderedIds.length>0}}function rt(e,t){return e.filter(s=>!Qt(s,t[s.id])).length}function at(e,t,s){if(t===s||t<0||s<0||t>=e.length||s>=e.length)return[...e];let o=[...e],[n]=o.splice(t,1);return o.splice(s,0,n),o}function he(e,t){let s=[],o=/\{\{\s*([^{}\s]+)\s*\}\}/g,n=0;for(let i of e.matchAll(o)){let a=i[1];t.includes(a)&&(i.index>n&&s.push({type:"text",text:e.slice(n,i.index)}),s.push({type:"blank",id:a}),n=i.index+i[0].length)}return n<e.length&&s.push({type:"text",text:e.slice(n)}),s}function it(e,t){let{config:s}=e;if(t==null||t.type!==s.type)return"";let o=(n,i)=>n.find(a=>a.id===i)?.label??i;return s.type==="mcq"&&t.type==="mcq"?t.selectedIds.map(n=>o(s.choices,n)).join(", "):s.type==="todolist"&&t.type==="todolist"?t.checkedIds.map(n=>o(s.steps,n)).join(", "):s.type==="sort_order"&&t.type==="sort_order"?t.orderedIds.map(n=>o(s.items,n)).join(" \u2192 "):s.type==="fill_gap"&&t.type==="fill_gap"?he(s.template,s.blanks).map(n=>n.type==="text"?n.text:`[${t.values[n.id]??""}]`).join(""):""}import{jsx as V,jsxs as _}from"react/jsx-runtime";function lt({item:e}){return e.locked?V(Ft,{className:"size-4 text-neutral-500","aria-hidden":!0}):e.completed?V(Wt,{className:"size-4 text-emerald-600 dark:text-emerald-400","aria-hidden":!0}):e.kind==="test"?V(Yt,{className:"size-4 text-neutral-500","aria-hidden":!0}):e.durationSeconds>0?V(_t,{className:"size-4 text-neutral-500","aria-hidden":!0}):V(Kt,{className:"size-4 text-neutral-500","aria-hidden":!0})}function Jt({item:e,selected:t,variant:s,onSelect:o}){let{texts:n}=h(),i=e.lockReason?w(n.lockedByTest,{test:e.lockReason.gatingTestTitle}):n.locked,a=e.locked?i:e.completed?n.completed:void 0;return V("li",{children:_("button",{type:"button","data-item-id":e.id,"data-locked":e.locked||void 0,"aria-current":t?"true":void 0,"aria-disabled":e.locked||void 0,title:e.locked?i:void 0,onClick:()=>{e.locked||o(e)},className:v("flex w-full items-start gap-3 rounded-lg p-2 text-left text-sm outline-none transition focus-visible:ring-[3px] focus-visible:ring-ring/50",t?"bg-neutral-200 dark:bg-neutral-700":"hover:bg-neutral-100 dark:hover:bg-neutral-800",e.locked&&"cursor-not-allowed opacity-60 hover:bg-transparent dark:hover:bg-transparent"),children:[s==="playlist"&&e.kind==="lesson"&&_("span",{className:"relative aspect-video w-24 shrink-0 overflow-hidden rounded bg-neutral-200 dark:bg-neutral-800",children:[e.thumbnailUrl&&V("img",{src:e.thumbnailUrl,alt:"",loading:"lazy",draggable:!1,className:"size-full object-cover"}),e.durationSeconds>0&&V("span",{className:"absolute right-1 bottom-1 rounded bg-black/75 px-1 text-[10px] text-white",children:Se(e.durationSeconds)})]}),(s==="modules"||e.kind==="test")&&V("span",{className:"mt-0.5 shrink-0",children:V(lt,{item:e})}),_("span",{className:"min-w-0 flex-1",children:[V("span",{className:"block font-medium break-words",children:e.title}),_("span",{className:"mt-0.5 flex flex-wrap items-center gap-x-2 text-xs text-neutral-500 dark:text-neutral-400",children:[e.kind==="test"&&V("span",{children:n.testBadge}),e.isFree&&!e.locked&&V("span",{children:n.free}),s==="modules"&&e.durationSeconds>0&&V("span",{children:Se(e.durationSeconds)}),a&&V("span",{children:a})]})]}),s==="playlist"&&e.kind==="lesson"&&V("span",{className:"mt-0.5 shrink-0",children:V(lt,{item:e})})]})})}function ct({course:e,selectedId:t,onSelect:s,variant:o,className:n}){let{texts:i}=h(),a=r=>V("ul",{className:"flex flex-col gap-1",children:r.map(c=>V(Jt,{item:c,selected:c.id===t,variant:o,onSelect:s},c.id))});return _("nav",{"aria-label":i.contents,className:v("space-y-4",n),children:[e.sections.map(r=>{let c=r.items.filter(y=>y.kind==="lesson"),b=c.filter(y=>y.completed).length;return _("section",{"data-section-id":r.id,children:[_("h3",{className:"mb-1 flex items-baseline justify-between gap-2 px-2 text-sm font-semibold",children:[V("span",{className:"break-words",children:r.title}),c.length>0&&_("span",{className:"shrink-0 text-xs font-normal text-neutral-500 dark:text-neutral-400",children:[b,"/",c.length]})]}),a(r.items)]},r.id)}),e.finalItems.length>0&&V("section",{"data-section-id":"final",children:a(e.finalItems)})]})}import{createClient as ls}from"@connectrpc/connect";import{enumDesc as nn,fileDesc as jt,messageDesc as on,serviceDesc as Dt}from"@bufbuild/protobuf/codegenv2";import{file_google_protobuf_timestamp as Ht}from"@bufbuild/protobuf/wkt";var qt=jt("CiFwdWJsaWMvdjEvdXNlcl9wYW5lbF9jb3Vyc2UucHJvdG8SDXB1YmxpY19hcGkudjEiRAoPUGFuZWxMb2NrUmVhc29uEhYKDmdhdGluZ190ZXN0X2lkGAEgASgJEhkKEWdhdGluZ190ZXN0X3RpdGxlGAIgASgJIrQCCg9QYW5lbENvdXJzZUl0ZW0SCgoCaWQYASABKAkSMAoEa2luZBgCIAEoDjIiLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VJdGVtS2luZBINCgV0aXRsZRgDIAEoCRIPCgdpc19mcmVlGAQgASgIEg4KBmxvY2tlZBgFIAEoCBI4Cgtsb2NrX3JlYXNvbhgGIAEoCzIeLnB1YmxpY19hcGkudjEuUGFuZWxMb2NrUmVhc29uSACIAQESEQoJY29tcGxldGVkGAcgASgIEhgKEGR1cmF0aW9uX3NlY29uZHMYCCABKAUSGgoNdGh1bWJuYWlsX3VybBgJIAEoCUgBiAEBEg4KBmdhdGluZxgKIAEoCEIOCgxfbG9ja19yZWFzb25CEAoOX3RodW1ibmFpbF91cmwicwoSUGFuZWxDb3Vyc2VTZWN0aW9uEgoKAmlkGAEgASgJEg0KBXRpdGxlGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJEi0KBWl0ZW1zGAQgAygLMh4ucHVibGljX2FwaS52MS5QYW5lbENvdXJzZUl0ZW0i3wIKC1BhbmVsQ291cnNlEgoKAmlkGAEgASgJEiwKBHR5cGUYAiABKA4yHi5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlVHlwZRINCgV0aXRsZRgDIAEoCRITCgtkZXNjcmlwdGlvbhgEIAEoCRIWCgljb3Zlcl91cmwYBSABKAlIAIgBARIVCg10b3RhbF9sZXNzb25zGAYgASgFEhkKEWNvbXBsZXRlZF9sZXNzb25zGAcgASgFEhgKEHByb2dyZXNzX3BlcmNlbnQYCCABKAUSMwoIc2VjdGlvbnMYCSADKAsyIS5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlU2VjdGlvbhIzCgtmaW5hbF9pdGVtcxgKIAMoCzIeLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VJdGVtEhYKDnJlc3VtZV9pdGVtX2lkGAsgASgJQgwKCl9jb3Zlcl91cmwiRAoZVXNlclBhbmVsR2V0Q291cnNlUmVxdWVzdBIUCgxhY2Nlc3NfdG9rZW4YASABKAkSEQoJYWNjZXNzX2lkGAIgASgJIosBChpVc2VyUGFuZWxHZXRDb3Vyc2VSZXNwb25zZRItCgdzdWNjZXNzGAEgASgLMhoucHVibGljX2FwaS52MS5QYW5lbENvdXJzZUgAEjQKB2ZhaWx1cmUYAiABKA4yIS5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlRmFpbHVyZUgAQggKBnJlc3VsdCJfCgpQYW5lbFZpZGVvEg8KB2hsc191cmwYASABKAkSFwoKcG9zdGVyX3VybBgCIAEoCUgAiAEBEhgKEGR1cmF0aW9uX3NlY29uZHMYAyABKAVCDQoLX3Bvc3Rlcl91cmwiRgoPUGFuZWxBdHRhY2htZW50EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEc2l6ZRgDIAEoAxILCgN1cmwYBCABKAkiTAoMUGFuZWxJdGVtUmVmEgoKAmlkGAEgASgJEjAKBGtpbmQYAiABKA4yIi5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlSXRlbUtpbmQigQQKC1BhbmVsTGVzc29uEgoKAmlkGAEgASgJEhIKCnNlY3Rpb25faWQYAiABKAkSDQoFdGl0bGUYAyABKAkSEwoLZGVzY3JpcHRpb24YBCABKAkSFAoMY29udGVudF9odG1sGAUgASgJEi0KBXZpZGVvGAYgASgLMhkucHVibGljX2FwaS52MS5QYW5lbFZpZGVvSACIAQESMwoLYXR0YWNobWVudHMYByADKAsyHi5wdWJsaWNfYXBpLnYxLlBhbmVsQXR0YWNobWVudBIuCgRwcmV2GAggASgLMhsucHVibGljX2FwaS52MS5QYW5lbEl0ZW1SZWZIAYgBARIuCgRuZXh0GAkgASgLMhsucHVibGljX2FwaS52MS5QYW5lbEl0ZW1SZWZIAogBARIRCgljb21wbGV0ZWQYCiABKAgSGAoQcG9zaXRpb25fc2Vjb25kcxgLIAEoBRIRCglteV9yYXRpbmcYDCABKAUSFgoOYXZlcmFnZV9yYXRpbmcYDSABKAISFAoMcmF0aW5nX2NvdW50GA4gASgFEjcKDnVybHNfZXhwaXJlX2F0GA8gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgDiAEBQggKBl92aWRlb0IHCgVfcHJldkIHCgVfbmV4dEIRCg9fdXJsc19leHBpcmVfYXQiVwoZVXNlclBhbmVsR2V0TGVzc29uUmVxdWVzdBIUCgxhY2Nlc3NfdG9rZW4YASABKAkSEQoJYWNjZXNzX2lkGAIgASgJEhEKCWxlc3Nvbl9pZBgDIAEoCSKLAQoaVXNlclBhbmVsR2V0TGVzc29uUmVzcG9uc2USLQoHc3VjY2VzcxgBIAEoCzIaLnB1YmxpY19hcGkudjEuUGFuZWxMZXNzb25IABI0CgdmYWlsdXJlGAIgASgOMiEucHVibGljX2FwaS52MS5QYW5lbENvdXJzZUZhaWx1cmVIAEIICgZyZXN1bHQipwEKIlVzZXJQYW5lbFNhdmVMZXNzb25Qcm9ncmVzc1JlcXVlc3QSFAoMYWNjZXNzX3Rva2VuGAEgASgJEhEKCWFjY2Vzc19pZBgCIAEoCRIRCglsZXNzb25faWQYAyABKAkSEQoJY29tcGxldGVkGAQgASgIEhgKEHBvc2l0aW9uX3NlY29uZHMYBSABKAUSGAoQZHVyYXRpb25fc2Vjb25kcxgGIAEoBSKFAgojVXNlclBhbmVsU2F2ZUxlc3NvblByb2dyZXNzUmVzcG9uc2USTAoHc3VjY2VzcxgBIAEoCzI5LnB1YmxpY19hcGkudjEuVXNlclBhbmVsU2F2ZUxlc3NvblByb2dyZXNzUmVzcG9uc2UuUmVzdWx0SAASNAoHZmFpbHVyZRgCIAEoDjIhLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VGYWlsdXJlSAAaUAoGUmVzdWx0EhEKCWNvbXBsZXRlZBgBIAEoCBIZChFjb21wbGV0ZWRfbGVzc29ucxgCIAEoBRIYChBwcm9ncmVzc19wZXJjZW50GAMgASgFQggKBnJlc3VsdCIoCgtQYW5lbENob2ljZRIKCgJpZBgBIAEoCRINCgVsYWJlbBgCIAEoCSJPCg5QYW5lbE1jcUNvbmZpZxIrCgdjaG9pY2VzGAEgAygLMhoucHVibGljX2FwaS52MS5QYW5lbENob2ljZRIQCghtdWx0aXBsZRgCIAEoCCKCAQoTUGFuZWxUb2RvbGlzdENvbmZpZxI2CgVzdGVwcxgBIAMoCzInLnB1YmxpY19hcGkudjEuUGFuZWxUb2RvbGlzdENvbmZpZy5TdGVwGjMKBFN0ZXASCgoCaWQYASABKAkSDQoFbGFiZWwYAiABKAkSEAoIcmVxdWlyZWQYAyABKAgiNgoSUGFuZWxGaWxsR2FwQ29uZmlnEhAKCHRlbXBsYXRlGAEgASgJEg4KBmJsYW5rcxgCIAMoCSJBChRQYW5lbFNvcnRPcmRlckNvbmZpZxIpCgVpdGVtcxgBIAMoCzIaLnB1YmxpY19hcGkudjEuUGFuZWxDaG9pY2UioQIKEVBhbmVsVGVzdFF1ZXN0aW9uEgoKAmlkGAEgASgJEg4KBnByb21wdBgCIAEoCRIOCgZwb2ludHMYAyABKAUSLAoDbWNxGAogASgLMh0ucHVibGljX2FwaS52MS5QYW5lbE1jcUNvbmZpZ0gAEjYKCHRvZG9saXN0GAsgASgLMiIucHVibGljX2FwaS52MS5QYW5lbFRvZG9saXN0Q29uZmlnSAASNQoIZmlsbF9nYXAYDCABKAsyIS5wdWJsaWNfYXBpLnYxLlBhbmVsRmlsbEdhcENvbmZpZ0gAEjkKCnNvcnRfb3JkZXIYDSABKAsyIy5wdWJsaWNfYXBpLnYxLlBhbmVsU29ydE9yZGVyQ29uZmlnSABCCAoGY29uZmlnIqsCCglQYW5lbFRlc3QSCgoCaWQYASABKAkSDQoFdGl0bGUYAiABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSDgoGZ2F0aW5nGAQgASgIEh4KFnBhc3NfdGhyZXNob2xkX3BlcmNlbnQYBSABKAUSGAoQYXR0ZW1wdHNfYWxsb3dlZBgGIAEoBRIaCg1hdHRlbXB0c19sZWZ0GAcgASgFSACIAQESFQoNYXR0ZW1wdF9jb3VudBgIIAEoBRIaChJiZXN0X3Njb3JlX3BlcmNlbnQYCSABKAUSDgoGcGFzc2VkGAogASgIEjMKCXF1ZXN0aW9ucxgLIAMoCzIgLnB1YmxpY19hcGkudjEuUGFuZWxUZXN0UXVlc3Rpb25CEAoOX2F0dGVtcHRzX2xlZnQiUwoXVXNlclBhbmVsR2V0VGVzdFJlcXVlc3QSFAoMYWNjZXNzX3Rva2VuGAEgASgJEhEKCWFjY2Vzc19pZBgCIAEoCRIPCgd0ZXN0X2lkGAMgASgJIocBChhVc2VyUGFuZWxHZXRUZXN0UmVzcG9uc2USKwoHc3VjY2VzcxgBIAEoCzIYLnB1YmxpY19hcGkudjEuUGFuZWxUZXN0SAASNAoHZmFpbHVyZRgCIAEoDjIhLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VGYWlsdXJlSABCCAoGcmVzdWx0IiYKDlBhbmVsTWNxQW5zd2VyEhQKDHNlbGVjdGVkX2lkcxgBIAMoCSIqChNQYW5lbFRvZG9saXN0QW5zd2VyEhMKC2NoZWNrZWRfaWRzGAEgAygJIoIBChJQYW5lbEZpbGxHYXBBbnN3ZXISPQoGdmFsdWVzGAEgAygLMi0ucHVibGljX2FwaS52MS5QYW5lbEZpbGxHYXBBbnN3ZXIuVmFsdWVzRW50cnkaLQoLVmFsdWVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASIrChRQYW5lbFNvcnRPcmRlckFuc3dlchITCgtvcmRlcmVkX2lkcxgBIAMoCSKDAgoLUGFuZWxBbnN3ZXISEwoLcXVlc3Rpb25faWQYASABKAkSLAoDbWNxGAogASgLMh0ucHVibGljX2FwaS52MS5QYW5lbE1jcUFuc3dlckgAEjYKCHRvZG9saXN0GAsgASgLMiIucHVibGljX2FwaS52MS5QYW5lbFRvZG9saXN0QW5zd2VySAASNQoIZmlsbF9nYXAYDCABKAsyIS5wdWJsaWNfYXBpLnYxLlBhbmVsRmlsbEdhcEFuc3dlckgAEjkKCnNvcnRfb3JkZXIYDSABKAsyIy5wdWJsaWNfYXBpLnYxLlBhbmVsU29ydE9yZGVyQW5zd2VySABCBwoFdmFsdWUijQEKE1BhbmVsVGVzdFN1Ym1pc3Npb24SCgoCaWQYASABKAkSFQoNc2NvcmVfcGVyY2VudBgCIAEoBRIOCgZwYXNzZWQYAyABKAgSEwoLZHVyYXRpb25fbXMYBCABKAMSLgoKY3JlYXRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAilwEKE1BhbmVsUXVlc3Rpb25SZXN1bHQSEwoLcXVlc3Rpb25faWQYASABKAkSDwoHY29ycmVjdBgCIAEoCBIOCgZwb2ludHMYAyABKAUSNwoOY29ycmVjdF9hbnN3ZXIYBCABKAsyGi5wdWJsaWNfYXBpLnYxLlBhbmVsQW5zd2VySACIAQFCEQoPX2NvcnJlY3RfYW5zd2VyIpgBChpVc2VyUGFuZWxTdWJtaXRUZXN0UmVxdWVzdBIUCgxhY2Nlc3NfdG9rZW4YASABKAkSEQoJYWNjZXNzX2lkGAIgASgJEg8KB3Rlc3RfaWQYAyABKAkSKwoHYW5zd2VycxgEIAMoCzIaLnB1YmxpY19hcGkudjEuUGFuZWxBbnN3ZXISEwoLZHVyYXRpb25fbXMYBSABKAMiyQIKG1VzZXJQYW5lbFN1Ym1pdFRlc3RSZXNwb25zZRJECgdzdWNjZXNzGAEgASgLMjEucHVibGljX2FwaS52MS5Vc2VyUGFuZWxTdWJtaXRUZXN0UmVzcG9uc2UuUmVzdWx0SAASNAoHZmFpbHVyZRgCIAEoDjIhLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VGYWlsdXJlSAAaowEKBlJlc3VsdBI2CgpzdWJtaXNzaW9uGAEgASgLMiIucHVibGljX2FwaS52MS5QYW5lbFRlc3RTdWJtaXNzaW9uEjMKB3Jlc3VsdHMYAiADKAsyIi5wdWJsaWNfYXBpLnYxLlBhbmVsUXVlc3Rpb25SZXN1bHQSGgoNYXR0ZW1wdHNfbGVmdBgDIAEoBUgAiAEBQhAKDl9hdHRlbXB0c19sZWZ0QggKBnJlc3VsdCJfCiNVc2VyUGFuZWxMaXN0VGVzdFN1Ym1pc3Npb25zUmVxdWVzdBIUCgxhY2Nlc3NfdG9rZW4YASABKAkSEQoJYWNjZXNzX2lkGAIgASgJEg8KB3Rlc3RfaWQYAyABKAkiqwIKJFVzZXJQYW5lbExpc3RUZXN0U3VibWlzc2lvbnNSZXNwb25zZRJNCgdzdWNjZXNzGAEgASgLMjoucHVibGljX2FwaS52MS5Vc2VyUGFuZWxMaXN0VGVzdFN1Ym1pc3Npb25zUmVzcG9uc2UuUmVzdWx0SAASNAoHZmFpbHVyZRgCIAEoDjIhLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VGYWlsdXJlSAAadAoGUmVzdWx0EjcKC3N1Ym1pc3Npb25zGAEgAygLMiIucHVibGljX2FwaS52MS5QYW5lbFRlc3RTdWJtaXNzaW9uEhoKEmJlc3Rfc2NvcmVfcGVyY2VudBgCIAEoBRIVCg1hdHRlbXB0X2NvdW50GAMgASgFQggKBnJlc3VsdCJWChNQYW5lbFF1ZXN0aW9uQW5zd2VyEg8KB2NvbnRlbnQYASABKAkSLgoKY3JlYXRlZF9hdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAizAEKE1BhbmVsTGVzc29uUXVlc3Rpb24SCgoCaWQYASABKAkSDwoHY29udGVudBgCIAEoCRITCgthdXRob3JfbmFtZRgDIAEoCRIPCgdpc19taW5lGAQgASgIEi4KCmNyZWF0ZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjcKBmFuc3dlchgGIAEoCzIiLnB1YmxpY19hcGkudjEuUGFuZWxRdWVzdGlvbkFuc3dlckgAiAEBQgkKB19hbnN3ZXIiYQojVXNlclBhbmVsTGlzdExlc3NvblF1ZXN0aW9uc1JlcXVlc3QSFAoMYWNjZXNzX3Rva2VuGAEgASgJEhEKCWFjY2Vzc19pZBgCIAEoCRIRCglsZXNzb25faWQYAyABKAki9gEKJFVzZXJQYW5lbExpc3RMZXNzb25RdWVzdGlvbnNSZXNwb25zZRJNCgdzdWNjZXNzGAEgASgLMjoucHVibGljX2FwaS52MS5Vc2VyUGFuZWxMaXN0TGVzc29uUXVlc3Rpb25zUmVzcG9uc2UuUmVzdWx0SAASNAoHZmFpbHVyZRgCIAEoDjIhLnB1YmxpY19hcGkudjEuUGFuZWxDb3Vyc2VGYWlsdXJlSAAaPwoGUmVzdWx0EjUKCXF1ZXN0aW9ucxgBIAMoCzIiLnB1YmxpY19hcGkudjEuUGFuZWxMZXNzb25RdWVzdGlvbkIICgZyZXN1bHQicAohVXNlclBhbmVsQXNrTGVzc29uUXVlc3Rpb25SZXF1ZXN0EhQKDGFjY2Vzc190b2tlbhgBIAEoCRIRCglhY2Nlc3NfaWQYAiABKAkSEQoJbGVzc29uX2lkGAMgASgJEg8KB2NvbnRlbnQYBCABKAkimwEKIlVzZXJQYW5lbEFza0xlc3NvblF1ZXN0aW9uUmVzcG9uc2USNQoHc3VjY2VzcxgBIAEoCzIiLnB1YmxpY19hcGkudjEuUGFuZWxMZXNzb25RdWVzdGlvbkgAEjQKB2ZhaWx1cmUYAiABKA4yIS5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlRmFpbHVyZUgAQggKBnJlc3VsdCJ4ChpVc2VyUGFuZWxSYXRlTGVzc29uUmVxdWVzdBIUCgxhY2Nlc3NfdG9rZW4YASABKAkSEQoJYWNjZXNzX2lkGAIgASgJEhEKCWxlc3Nvbl9pZBgDIAEoCRINCgVzY29yZRgEIAEoBRIPCgdjb21tZW50GAUgASgJIu4BChtVc2VyUGFuZWxSYXRlTGVzc29uUmVzcG9uc2USRAoHc3VjY2VzcxgBIAEoCzIxLnB1YmxpY19hcGkudjEuVXNlclBhbmVsUmF0ZUxlc3NvblJlc3BvbnNlLlJlc3VsdEgAEjQKB2ZhaWx1cmUYAiABKA4yIS5wdWJsaWNfYXBpLnYxLlBhbmVsQ291cnNlRmFpbHVyZUgAGkkKBlJlc3VsdBIRCglteV9yYXRpbmcYASABKAUSFgoOYXZlcmFnZV9yYXRpbmcYAiABKAISFAoMcmF0aW5nX2NvdW50GAMgASgFQggKBnJlc3VsdCr6AgoSUGFuZWxDb3Vyc2VGYWlsdXJlEiAKHFBBTkVMX0NPVVJTRV9GQUlMVVJFX1VOS05PV04QABIlCiFQQU5FTF9DT1VSU0VfRkFJTFVSRV9VTkFVVEhPUklaRUQQARIpCiVQQU5FTF9DT1VSU0VfRkFJTFVSRV9DT1VSU0VfTk9UX0ZPVU5EEAISJwojUEFORUxfQ09VUlNFX0ZBSUxVUkVfSVRFTV9OT1RfRk9VTkQQAxIkCiBQQU5FTF9DT1VSU0VfRkFJTFVSRV9JVEVNX0xPQ0tFRBAEEikKJVBBTkVMX0NPVVJTRV9GQUlMVVJFX05PX0FUVEVNUFRTX0xFRlQQBRIpCiVQQU5FTF9DT1VSU0VfRkFJTFVSRV9JTlZBTElEX0FSR1VNRU5UEAYSJQohUEFORUxfQ09VUlNFX0ZBSUxVUkVfUkFURV9MSU1JVEVEEAcSJAogUEFORUxfQ09VUlNFX0ZBSUxVUkVfVU5BVkFJTEFCTEUQCCptCg9QYW5lbENvdXJzZVR5cGUSHQoZUEFORUxfQ09VUlNFX1RZUEVfVU5LTk9XThAAEh4KGlBBTkVMX0NPVVJTRV9UWVBFX1NUQU5EQVJEEAESGwoXUEFORUxfQ09VUlNFX1RZUEVfVklERU8QAip9ChNQYW5lbENvdXJzZUl0ZW1LaW5kEiIKHlBBTkVMX0NPVVJTRV9JVEVNX0tJTkRfVU5LTk9XThAAEiEKHVBBTkVMX0NPVVJTRV9JVEVNX0tJTkRfTEVTU09OEAESHwobUEFORUxfQ09VUlNFX0lURU1fS0lORF9URVNUEAIy+QcKFlVzZXJQYW5lbENvdXJzZVNlcnZpY2USYAoJR2V0Q291cnNlEigucHVibGljX2FwaS52MS5Vc2VyUGFuZWxHZXRDb3Vyc2VSZXF1ZXN0GikucHVibGljX2FwaS52MS5Vc2VyUGFuZWxHZXRDb3Vyc2VSZXNwb25zZRJgCglHZXRMZXNzb24SKC5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbEdldExlc3NvblJlcXVlc3QaKS5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbEdldExlc3NvblJlc3BvbnNlEnsKElNhdmVMZXNzb25Qcm9ncmVzcxIxLnB1YmxpY19hcGkudjEuVXNlclBhbmVsU2F2ZUxlc3NvblByb2dyZXNzUmVxdWVzdBoyLnB1YmxpY19hcGkudjEuVXNlclBhbmVsU2F2ZUxlc3NvblByb2dyZXNzUmVzcG9uc2USWgoHR2V0VGVzdBImLnB1YmxpY19hcGkudjEuVXNlclBhbmVsR2V0VGVzdFJlcXVlc3QaJy5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbEdldFRlc3RSZXNwb25zZRJjCgpTdWJtaXRUZXN0EikucHVibGljX2FwaS52MS5Vc2VyUGFuZWxTdWJtaXRUZXN0UmVxdWVzdBoqLnB1YmxpY19hcGkudjEuVXNlclBhbmVsU3VibWl0VGVzdFJlc3BvbnNlEn4KE0xpc3RUZXN0U3VibWlzc2lvbnMSMi5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbExpc3RUZXN0U3VibWlzc2lvbnNSZXF1ZXN0GjMucHVibGljX2FwaS52MS5Vc2VyUGFuZWxMaXN0VGVzdFN1Ym1pc3Npb25zUmVzcG9uc2USfgoTTGlzdExlc3NvblF1ZXN0aW9ucxIyLnB1YmxpY19hcGkudjEuVXNlclBhbmVsTGlzdExlc3NvblF1ZXN0aW9uc1JlcXVlc3QaMy5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbExpc3RMZXNzb25RdWVzdGlvbnNSZXNwb25zZRJ4ChFBc2tMZXNzb25RdWVzdGlvbhIwLnB1YmxpY19hcGkudjEuVXNlclBhbmVsQXNrTGVzc29uUXVlc3Rpb25SZXF1ZXN0GjEucHVibGljX2FwaS52MS5Vc2VyUGFuZWxBc2tMZXNzb25RdWVzdGlvblJlc3BvbnNlEmMKClJhdGVMZXNzb24SKS5wdWJsaWNfYXBpLnYxLlVzZXJQYW5lbFJhdGVMZXNzb25SZXF1ZXN0GioucHVibGljX2FwaS52MS5Vc2VyUGFuZWxSYXRlTGVzc29uUmVzcG9uc2ViBnByb3RvMw",[Ht]);var ut=Dt(qt,0);import{Code as se,ConnectError as Ot}from"@connectrpc/connect";import{timestampDate as me}from"@bufbuild/protobuf/wkt";var Z=class extends Error{code;constructor(t,s){super(s??t),this.name="CourseError",this.code=t}};var $t={0:"unknown",1:"unauthorized",2:"course_not_found",3:"item_not_found",4:"item_locked",5:"no_attempts_left",6:"invalid_argument",7:"rate_limited",8:"unavailable"};function es(e){return $t[e]??"unknown"}function ts(e){if(e instanceof Z)return e;let t=Ot.from(e);switch(t.code){case se.Unauthenticated:case se.PermissionDenied:return new Z("unauthorized",t.rawMessage);case se.NotFound:return new Z("course_not_found",t.rawMessage);case se.ResourceExhausted:return new Z("rate_limited",t.rawMessage);case se.Unavailable:case se.DeadlineExceeded:return new Z("unavailable",t.rawMessage);default:return e}}function F(e){let{result:t}=e;if(t.case==="success")return t.value;throw t.case==="failure"?new Z(es(t.value)):new Z("unknown","empty response")}function dt(e){return{id:e.id,kind:e.kind===2?"test":"lesson",title:e.title,isFree:e.isFree,locked:e.locked,lockReason:e.locked&&e.lockReason!=null?{gatingTestId:e.lockReason.gatingTestId,gatingTestTitle:e.lockReason.gatingTestTitle}:void 0,completed:e.completed,durationSeconds:e.durationSeconds,thumbnailUrl:e.thumbnailUrl||void 0,gating:e.gating}}function ss(e){return{id:e.id,type:e.type===2?"video":"standard",title:e.title,description:e.description,coverUrl:e.coverUrl||void 0,totalLessons:e.totalLessons,completedLessons:e.completedLessons,progressPercent:e.progressPercent,sections:e.sections.map(t=>({id:t.id,title:t.title,description:t.description,items:t.items.map(dt)})),finalItems:e.finalItems.map(dt),resumeItemId:e.resumeItemId}}function pt(e){return e==null?void 0:{id:e.id,kind:e.kind===2?"test":"lesson"}}function ns(e){return{id:e.id,sectionId:e.sectionId,title:e.title,description:e.description,contentHtml:e.contentHtml,video:e.video!=null&&e.video.hlsUrl!==""?{hlsUrl:e.video.hlsUrl,posterUrl:e.video.posterUrl||void 0,durationSeconds:e.video.durationSeconds}:void 0,attachments:e.attachments.map(t=>({id:t.id,name:t.name,size:Number(t.size),url:t.url})),prev:pt(e.prev),next:pt(e.next),completed:e.completed,positionSeconds:e.positionSeconds,myRating:e.myRating,averageRating:e.averageRating,ratingCount:e.ratingCount,urlsExpireAt:e.urlsExpireAt!=null?me(e.urlsExpireAt):void 0}}function os(e){let t={id:e.id,prompt:e.prompt,points:e.points},{config:s}=e;switch(s.case){case"mcq":return{...t,config:{type:"mcq",choices:s.value.choices.map(o=>({id:o.id,label:o.label})),multiple:s.value.multiple}};case"todolist":return{...t,config:{type:"todolist",steps:s.value.steps.map(o=>({id:o.id,label:o.label,required:o.required}))}};case"fillGap":return{...t,config:{type:"fill_gap",template:s.value.template,blanks:[...s.value.blanks]}};case"sortOrder":return{...t,config:{type:"sort_order",items:s.value.items.map(o=>({id:o.id,label:o.label}))}};default:return}}function rs(e){return{id:e.id,title:e.title,description:e.description,gating:e.gating,passThresholdPercent:e.passThresholdPercent,attemptsAllowed:e.attemptsAllowed,attemptsLeft:e.attemptsLeft,attemptCount:e.attemptCount,bestScorePercent:e.bestScorePercent,passed:e.passed,questions:e.questions.map(os).filter(t=>t!=null)}}function mt(e){return{id:e.id,scorePercent:e.scorePercent,passed:e.passed,durationMs:Number(e.durationMs),createdAt:e.createdAt!=null?me(e.createdAt):void 0}}function as(e){let{value:t}=e;switch(t.case){case"mcq":return{type:"mcq",selectedIds:[...t.value.selectedIds]};case"todolist":return{type:"todolist",checkedIds:[...t.value.checkedIds]};case"fillGap":return{type:"fill_gap",values:{...t.value.values}};case"sortOrder":return{type:"sort_order",orderedIds:[...t.value.orderedIds]};default:return}}function is(e,t){switch(t.type){case"mcq":return{questionId:e,value:{case:"mcq",value:{selectedIds:t.selectedIds}}};case"todolist":return{questionId:e,value:{case:"todolist",value:{checkedIds:t.checkedIds}}};case"fill_gap":return{questionId:e,value:{case:"fillGap",value:{values:t.values}}};case"sort_order":return{questionId:e,value:{case:"sortOrder",value:{orderedIds:t.orderedIds}}}}}function gt(e){return{id:e.id,content:e.content,authorName:e.authorName,isMine:e.isMine,createdAt:e.createdAt!=null?me(e.createdAt):void 0,answer:e.answer!=null?{content:e.answer.content,createdAt:e.answer.createdAt!=null?me(e.answer.createdAt):void 0}:void 0}}function ve(e,t){let s=()=>({accessId:t.accessId,accessToken:typeof t.accessToken=="function"?t.accessToken()??"":t.accessToken});async function o(n){try{return await n()}catch(i){throw ts(i)}}return{getCourse:()=>o(async()=>ss(F(await e.getCourse(s())))),getLesson:n=>o(async()=>ns(F(await e.getLesson({...s(),lessonId:n})))),saveProgress:n=>o(async()=>{let i=F(await e.saveLessonProgress({...s(),...n}));return{completed:i.completed,completedLessons:i.completedLessons,progressPercent:i.progressPercent}}),getTest:n=>o(async()=>rs(F(await e.getTest({...s(),testId:n})))),submitTest:(n,i,a)=>o(async()=>{let r=F(await e.submitTest({...s(),testId:n,durationMs:BigInt(Math.max(0,Math.round(a))),answers:Object.entries(i).map(([c,b])=>is(c,b))}));if(r.submission==null)throw new Z("unknown","missing submission");return{submission:mt(r.submission),results:r.results.map(c=>({questionId:c.questionId,correct:c.correct,points:c.points,correctAnswer:c.correctAnswer!=null?as(c.correctAnswer):void 0})),attemptsLeft:r.attemptsLeft}}),listSubmissions:n=>o(async()=>{let i=F(await e.listTestSubmissions({...s(),testId:n}));return{submissions:i.submissions.map(mt),bestScorePercent:i.bestScorePercent,attemptCount:i.attemptCount}}),listQuestions:n=>o(async()=>F(await e.listLessonQuestions({...s(),lessonId:n})).questions.map(gt)),askQuestion:(n,i)=>o(async()=>gt(F(await e.askLessonQuestion({...s(),lessonId:n,content:i})))),rate:(n,i,a="")=>o(async()=>{let r=F(await e.rateLesson({...s(),lessonId:n,score:i,comment:a}));return{myRating:r.myRating,averageRating:r.averageRating,ratingCount:r.ratingCount}})}}function Ce(e){let t=e.host??Qe(),s=ls(ut,We(t));return ve(s,{accessId:e.accessId,accessToken:e.accessToken??(()=>{let{projectID:o,host:n}=Fe();return Ke(o,n)})})}import{ChevronLeft as ys,ChevronRight as Ss,Download as hs,Paperclip as vs}from"lucide-react";import{useEffect as Nt,useMemo as Cs,useRef as Ie,useState as Pt}from"react";import{useState as H}from"react";import{Star as cs}from"lucide-react";import{useState as us}from"react";import{jsx as ge}from"react/jsx-runtime";function bt({value:e,onSelect:t,disabled:s}){let{texts:o}=h(),[n,i]=us(0),a=n||e;return ge("div",{className:"flex items-center gap-1",role:t?"radiogroup":"img","aria-label":w(o.rateStar,{n:Math.round(e)}),children:[1,2,3,4,5].map(r=>{let c=r<=Math.round(a),b=ge(cs,{className:v("size-5",c?"fill-amber-400 text-amber-400":"text-neutral-300 dark:text-neutral-600"),"aria-hidden":!0});return t?ge("button",{type:"button",role:"radio","aria-checked":r===e,"aria-label":w(o.rateStar,{n:r}),disabled:s,className:"rounded p-0.5 outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:opacity-50",onMouseEnter:()=>i(r),onMouseLeave:()=>i(0),onClick:()=>t(r),children:b},r):ge("span",{children:b},r)})})}import{AlertTriangle as ds}from"lucide-react";import{jsx as K,jsxs as Re}from"react/jsx-runtime";var ft="bg-[var(--course-accent,var(--primary))] text-[var(--course-accent-fg,var(--primary-foreground))] dark:bg-[var(--course-accent-dark,var(--course-accent,var(--primary)))] dark:text-[var(--course-accent-dark-fg,var(--course-accent-fg,var(--primary-foreground)))]",$=v(ft,"hover:bg-[var(--course-accent,var(--primary))] hover:opacity-90 dark:hover:bg-[var(--course-accent-dark,var(--course-accent,var(--primary)))]"),z="rounded-xl bg-white p-4 drop-shadow-xl sm:p-6 dark:border dark:border-neutral-700 dark:bg-neutral-900 dark:drop-shadow-none";function J(e,t){if(e instanceof Z)switch(e.code){case"unauthorized":return t.errorUnauthorized;case"course_not_found":case"item_not_found":return t.errorNotFound;case"unavailable":return t.errorUnavailable}return t.errorGeneric}function ee({error:e,onRetry:t,className:s}){let{texts:o}=h();return Re("div",{role:"alert",className:v("flex flex-col items-start gap-3 rounded-xl border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-900 dark:bg-red-950 dark:text-red-300",s),children:[Re("p",{className:"flex items-center gap-2 font-medium",children:[K(ds,{className:"size-4 shrink-0","aria-hidden":!0}),J(e,o)]}),t&&K(N,{variant:"outline",size:"sm",onClick:t,children:o.retry})]})}function ue({label:e}){let{texts:t}=h();return Re("div",{role:"status","aria-label":e??t.loading,className:"space-y-3",children:[K(ie,{className:"aspect-video w-full"}),K(ie,{className:"h-6 w-2/3"}),K(ie,{className:"h-4 w-full"}),K(ie,{className:"h-4 w-5/6"})]})}function At({percent:e,label:t}){let s=Math.max(0,Math.min(100,Math.round(e)));return K("div",{role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":s,"aria-label":t,className:"h-2 w-full overflow-hidden rounded-full bg-neutral-200 dark:bg-neutral-700",children:K("div",{className:v("h-full rounded-full transition-all duration-300",ft),style:{width:`${s}%`}})})}import{useCallback as ke,useEffect as ps,useRef as Ne,useState as xt}from"react";function j(e,t,s){let[o,n]=xt(s!==void 0?{status:"success",data:s}:{status:"loading"}),[i,a]=xt(0),r=Ne(0),c=Ne(e);c.current=e;let b=Ne(s!==void 0);ps(()=>{if(b.current){b.current=!1;return}let p=++r.current;return n({status:"loading"}),c.current().then(A=>{p===r.current&&n({status:"success",data:A})}).catch(A=>{p===r.current&&n({status:"error",error:A})}),()=>{r.current+=1}},[...t,i]);let y=ke(()=>a(p=>p+1),[]),f=ke(()=>{let p=++r.current;c.current().then(A=>{p===r.current&&n({status:"success",data:A})}).catch(()=>{})},[]),d=ke(p=>{n(A=>A.status==="success"?{status:"success",data:p(A.data)}:A)},[]);return{...o,reload:y,refresh:f,mutate:d}}import{jsx as G,jsxs as D}from"react/jsx-runtime";function St({lessonId:e,initial:t}){let{dataSource:s,texts:o,preview:n}=h(),i=Q(),[a,r]=H(t),[c,b]=H(t.myRating),[y,f]=H(""),[d,p]=H("idle"),[A,C]=H();async function I(){if(!(c<1)){p("saving");try{r(await s.rate(e,c,y.trim())),p("saved"),i("lesson_rated",{lesson_id:e,rating:c})}catch(g){C(g),p("error")}}}return D("section",{"aria-labelledby":`rate-${e}`,className:"space-y-3",children:[G("h3",{id:`rate-${e}`,className:"text-lg font-semibold",children:o.rateTitle}),G(bt,{value:c,onSelect:g=>{b(g),p("idle")},disabled:n||d==="saving"}),a.ratingCount>0&&G("p",{className:"text-xs text-neutral-500 dark:text-neutral-400",children:w(o.rateAverage,{average:a.averageRating.toFixed(1),count:a.ratingCount})}),!n&&c>0&&D("div",{className:"space-y-2",children:[G(xe,{value:y,maxLength:1e3,placeholder:o.ratePlaceholder,onChange:g=>{f(g.target.value),p("idle")}}),G(N,{size:"sm",className:$,disabled:d==="saving",onClick:I,children:o.rateSubmit})]}),d==="saved"&&G("p",{role:"status",className:"text-sm text-emerald-700 dark:text-emerald-400",children:o.rateSaved}),d==="error"&&G("p",{role:"alert",className:"text-sm text-red-600 dark:text-red-400",children:J(A,o)})]})}function yt(e){return e==null?"":e.toLocaleDateString()}function ht({lessonId:e}){let{dataSource:t,texts:s,preview:o}=h(),n=j(()=>t.listQuestions(e),[t,e]),[i,a]=H(""),[r,c]=H("idle"),[b,y]=H();async function f(){let d=i.trim();if(d!==""){c("sending");try{let p=await t.askQuestion(e,d);n.mutate(A=>[p,...A]),a(""),c("sent")}catch(p){y(p),c("error")}}}return D("section",{"aria-labelledby":`qa-${e}`,className:"space-y-4",children:[G("h3",{id:`qa-${e}`,className:"text-lg font-semibold",children:s.questionsTitle}),D("form",{className:"space-y-2",onSubmit:d=>{d.preventDefault(),f()},children:[G(xe,{value:i,maxLength:2e3,placeholder:s.questionPlaceholder,"aria-label":s.questionPlaceholder,onChange:d=>{a(d.target.value),c("idle")}}),G(N,{type:"submit",size:"sm",className:$,disabled:r==="sending"||i.trim()==="",children:s.questionSubmit}),r==="sent"&&G("p",{role:"status",className:"text-sm text-emerald-700 dark:text-emerald-400",children:s.questionSent}),r==="error"&&G("p",{role:"alert",className:"text-sm text-red-600 dark:text-red-400",children:J(b,s)})]}),n.status==="loading"&&G("p",{role:"status",className:"text-sm text-neutral-500",children:s.loading}),n.status==="error"&&G(ee,{error:n.error,onRetry:n.reload}),n.status==="success"&&(n.data.length===0?G("p",{className:"text-sm text-neutral-500 dark:text-neutral-400",children:s.questionsEmpty}):G("ul",{className:"space-y-3",children:n.data.map(d=>D("li",{className:"rounded-lg bg-neutral-100 p-3 text-sm dark:bg-neutral-800",children:[D("p",{className:"mb-1 text-xs text-neutral-500 dark:text-neutral-400",children:[d.isMine?s.questionMine:d.authorName,d.createdAt&&` \xB7 ${yt(d.createdAt)}`]}),G("p",{className:"break-words whitespace-pre-wrap",children:d.content}),d.answer&&D("div",{className:"mt-2 border-l-2 border-neutral-400 pl-3 dark:border-neutral-500",children:[D("p",{className:"mb-1 text-xs font-medium text-neutral-500 dark:text-neutral-400",children:[s.questionTeamAnswer,d.answer.createdAt&&` \xB7 ${yt(d.answer.createdAt)}`]}),G("p",{className:"break-words whitespace-pre-wrap",children:d.answer.content})]})]},d.id))}))]})}import ms from"dompurify";var gs={USE_PROFILES:{html:!0},FORBID_TAGS:["style","form","input","button","textarea","select","iframe","frame","object","embed","base","meta","link"],FORBID_ATTR:["style","srcdoc","formaction"],ALLOW_DATA_ATTR:!1,RETURN_TRUSTED_TYPE:!1};function bs(e){if(e.isSupported===!1||e.sanitize==null)return()=>"";let t=e.sanitize.bind(e);return e.addHook?.("afterSanitizeAttributes",s=>{s.tagName==="A"&&s.hasAttribute("href")&&(s.setAttribute("target","_blank"),s.setAttribute("rel","noopener noreferrer nofollow")),s.tagName==="IMG"&&(s.setAttribute("loading","lazy"),s.setAttribute("referrerpolicy","no-referrer"))}),s=>s==null||s===""?"":String(t(s,gs))}var vt;function Pe(e){return typeof window>"u"?"":(vt??=bs(ms),vt(e))}import ne from"hls.js";import{useCallback as fs,useEffect as As,useRef as be,useState as Ct}from"react";import{jsx as Ve,jsxs as Rt}from"react/jsx-runtime";function xs(e){return e.canPlayType("application/vnd.apple.mpegurl")!==""}function kt({src:e,poster:t,startAt:s=0,durationHint:o=0,autoPlay:n=!1,lessonId:i,onReport:a,onEnded:r,onExpired:c,className:b}){let{texts:y}=h(),f=Q(),d=be(f);d.current=f;let p=be(null),[A,C]=Ct(!1),[I,g]=Ct(0),k=be({onReport:a,onEnded:r,onExpired:c,durationHint:o});k.current={onReport:a,onEnded:r,onExpired:c,durationHint:o};let M=be(void 0),E=fs((l,R=p.current)=>{if(R==null||k.current.onReport==null)return;let m=Math.floor(R.currentTime);if(m<=0&&l!=="ended")return;let T=Number.isFinite(R.duration)?R.duration:k.current.durationHint;M.current=m,k.current.onReport({positionSeconds:m,durationSeconds:Math.floor(T||0),reason:l})},[]);return As(()=>{let l=p.current;if(l==null)return;C(!1);let R,m=!1,T=!1,B,q=()=>{s>0&&(l.currentTime=s),n&&l.play().catch(()=>{})};xs(l)?(l.src=e,l.addEventListener("loadedmetadata",q,{once:!0})):ne.isSupported()?(R=new ne,R.attachMedia(l),R.loadSource(e),R.on(ne.Events.MANIFEST_PARSED,q),R.on(ne.Events.ERROR,(O,Y)=>{if(!Y.fatal)return;let Be=Y.response?.code;Be===401||Be===403?(k.current.onExpired?.(),C(!0)):Y.type===ne.ErrorTypes.NETWORK_ERROR&&!m?(m=!0,R?.startLoad()):Y.type===ne.ErrorTypes.MEDIA_ERROR&&!T?(T=!0,R?.recoverMediaError()):C(!0)})):l.src=e;let pe=()=>{clearInterval(B),B=setInterval(()=>E("periodic"),15e3)},te=()=>{clearInterval(B),l.ended||E("pause")},oe=new Set,S=l.currentTime,W=0,re=O=>{if(i!=null)for(let Y of ze(O,oe))d.current("video_progress",{lesson_id:i,milestone:Y})},ae=()=>{let O=l.currentTime,Y=Number.isFinite(l.duration)?l.duration:k.current.durationHint;Y>0&&!l.seeking&&O>=S&&O-S<=2&&(W=Math.max(W,O),re(W/Y*100)),S=O},Ue=()=>{clearInterval(B),i!=null&&!oe.has(100)&&(oe.add(100),d.current("video_progress",{lesson_id:i,milestone:100})),E("ended"),k.current.onEnded?.()},Le=()=>{R==null&&C(!0)};return l.addEventListener("play",pe),l.addEventListener("pause",te),l.addEventListener("ended",Ue),l.addEventListener("error",Le),l.addEventListener("timeupdate",ae),()=>{clearInterval(B),l.removeEventListener("play",pe),l.removeEventListener("pause",te),l.removeEventListener("ended",Ue),l.removeEventListener("error",Le),l.removeEventListener("timeupdate",ae),l.removeEventListener("loadedmetadata",q),!l.ended&&l.currentTime>0&&E("leave",l),R?.destroy(),l.removeAttribute("src"),l.load()}},[e,I]),Rt("div",{className:v("relative overflow-hidden rounded-xl bg-black",b),children:[Ve("video",{ref:p,className:"aspect-video w-full",poster:t,controls:!0,playsInline:!0,preload:"metadata",controlsList:"nodownload"}),A&&Rt("div",{role:"alert",className:"absolute inset-0 flex flex-col items-center justify-center gap-3 bg-black/80 p-4 text-center text-sm text-white",children:[Ve("p",{children:y.videoError}),Ve(N,{variant:"secondary",size:"sm",onClick:()=>{k.current.onExpired?.(),g(l=>l+1)},children:y.videoRetry})]})]})}import{jsx as U,jsxs as X}from"react/jsx-runtime";function Vt({lesson:e,position:t=0,courseType:s,prev:o,next:n,autoplay:i,onAutoplayChange:a,startPlaying:r,onNavigate:c,onProgressSaved:b,onEnded:y,onUrlsExpired:f}){let{dataSource:d,texts:p,preview:A}=h(),C=Q(),[I,g]=Pt(e.completed),k=Ie(e.completed),M=Ie(void 0),E=Ie(e.positionSeconds),[l,R]=Pt(!1);Nt(()=>{C("lesson_started",{lesson_id:e.id,position:t})},[e.id]);let m=e.urlsExpireAt?.getTime();Nt(()=>{if(m==null)return;let S=m-Date.now()-6e4;if(S<=0||S>2**31-1)return;let W=setTimeout(f,S);return()=>clearTimeout(W)},[m]);let T=Cs(()=>Pe(e.contentHtml),[e.contentHtml]);async function B(S,W,re){if(A)return;let ae=await d.saveProgress({lessonId:e.id,completed:re,positionSeconds:S,durationSeconds:W});M.current=S,ae.completed&&!k.current&&(k.current=!0,g(!0),C("lesson_completed",{lesson_id:e.id,position:t})),b(e.id,ae)}function q(S){if(E.current=S.positionSeconds,A||S.reason==="periodic"&&S.positionSeconds===M.current)return;let W=S.reason==="ended"||tt(S.positionSeconds,S.durationSeconds);B(S.positionSeconds,S.durationSeconds,W&&!k.current).catch(re=>{console.warn("Saving the progress of the lesson failed",re)})}async function pe(){R(!0);try{await B(E.current,e.video?.durationSeconds??0,!0)}catch(S){console.warn("Marking the lesson as completed failed",S)}finally{R(!1)}}let te=e.description.trim(),oe=T!==""||te!=="";return X("article",{"data-lesson-id":e.id,className:"min-w-0 space-y-5","aria-labelledby":`lesson-${e.id}`,children:[e.video&&U(kt,{src:e.video.hlsUrl,poster:e.video.posterUrl,lessonId:e.id,startAt:st(E.current,e.video.durationSeconds),durationHint:e.video.durationSeconds,autoPlay:r,onReport:q,onEnded:y,onExpired:f}),X("div",{className:v(z,"space-y-5"),children:[X("header",{className:"flex flex-wrap items-start justify-between gap-3",children:[U("h2",{id:`lesson-${e.id}`,className:"text-2xl font-semibold break-words",children:e.title}),!A&&U(N,{size:"sm",variant:I?"outline":"default",className:v(!I&&$),disabled:I||l,onClick:pe,children:I?p.markedComplete:p.markComplete})]}),s==="video"&&e.video&&X("label",{className:"flex w-fit cursor-pointer items-center gap-2 text-sm text-neutral-600 dark:text-neutral-300",children:[U("input",{type:"checkbox",checked:i,onChange:S=>a(S.target.checked)}),p.autoplay]}),te!==""&&U("p",{className:"text-sm break-words whitespace-pre-wrap text-neutral-700 dark:text-neutral-300",children:te}),T!==""&&U("div",{className:"bitsnap-course-html break-words [&_a]:underline [&_blockquote]:border-l-4 [&_blockquote]:pl-4 [&_h1]:text-2xl [&_h1]:font-semibold [&_h2]:text-xl [&_h2]:font-semibold [&_h3]:text-lg [&_h3]:font-semibold [&_img]:h-auto [&_img]:max-w-full [&_ol]:list-decimal [&_ol]:pl-6 [&_p]:my-3 [&_pre]:overflow-x-auto [&_table]:block [&_table]:max-w-full [&_table]:overflow-x-auto [&_ul]:list-disc [&_ul]:pl-6",dangerouslySetInnerHTML:{__html:T}}),!oe&&!e.video&&U("p",{className:"text-sm text-neutral-500 dark:text-neutral-400",children:p.noContent}),e.attachments.length>0&&X("section",{"aria-labelledby":`files-${e.id}`,className:"space-y-2",children:[X("h3",{id:`files-${e.id}`,className:"flex items-center gap-2 text-lg font-semibold",children:[U(vs,{className:"size-4","aria-hidden":!0}),p.attachments]}),U("ul",{className:"space-y-2",children:e.attachments.map(S=>U("li",{children:X("a",{href:S.url,target:"_blank",rel:"noopener noreferrer",download:S.name,className:"flex items-center justify-between gap-3 rounded-lg bg-neutral-100 px-3 py-2 text-sm transition hover:bg-neutral-200 dark:bg-neutral-800 dark:hover:bg-neutral-700",children:[X("span",{className:"min-w-0 break-words",children:[S.name,U("span",{className:"ml-2 text-xs text-neutral-500 dark:text-neutral-400",children:nt(S.size)})]}),X("span",{className:"flex shrink-0 items-center gap-1 text-xs font-medium",children:[p.download,U(hs,{className:"size-3.5","aria-hidden":!0})]})]})},S.id))})]}),X("nav",{className:"flex items-center justify-between gap-3 border-t pt-4",children:[X(N,{variant:"outline",size:"sm",disabled:o==null,onClick:()=>o&&c(o),children:[U(ys,{"aria-hidden":!0}),p.prevItem]}),X(N,{variant:"outline",size:"sm",disabled:n==null,onClick:()=>n&&c(n),children:[p.nextItem,U(Ss,{"aria-hidden":!0})]})]})]}),U("div",{className:v(z),children:U(St,{lessonId:e.id,initial:{myRating:e.myRating,averageRating:e.averageRating,ratingCount:e.ratingCount}})}),U("div",{className:v(z),children:U(ht,{lessonId:e.id})})]})}var It={pl:{back:"Wr\xF3\u0107",loading:"\u0141adowanie kursu...",retry:"Spr\xF3buj ponownie",errorGeneric:"Nie uda\u0142o si\u0119 za\u0142adowa\u0107 danych. Spr\xF3buj ponownie za chwil\u0119.",errorUnauthorized:"Nie masz dost\u0119pu do tego kursu. Zaloguj si\u0119 ponownie lub skontaktuj si\u0119 z pomoc\u0105.",errorNotFound:"Nie znaleziono tego kursu lub lekcji.",errorUnavailable:"Kurs jest chwilowo niedost\u0119pny. Spr\xF3buj ponownie za chwil\u0119.",previewBadge:"Podgl\u0105d",progressLessons:"{done} z {total} lekcji",progressPercent:"{percent}% uko\u0144czono",contents:"Spis tre\u015Bci",free:"Darmowa",locked:"Zablokowane",lockedByTest:"Odblokuje je zaliczenie testu: {test}",lockedPage:"Ta lekcja jest zablokowana. Zalicz test \u201E{test}\u201D, aby j\u0105 odblokowa\u0107.",testBadge:"Test",completed:"Uko\u0144czono",continueCourse:"Kontynuuj kurs",noItem:"Wybierz lekcj\u0119 z listy.",markComplete:"Oznacz jako uko\u0144czon\u0105",markedComplete:"Lekcja uko\u0144czona",prevItem:"Poprzednia",nextItem:"Nast\u0119pna",attachments:"Materia\u0142y do pobrania",download:"Pobierz",autoplay:"Autoodtwarzanie nast\u0119pnej lekcji",videoError:"Nie uda\u0142o si\u0119 odtworzy\u0107 wideo.",videoRetry:"Od\u015Bwie\u017C wideo",noContent:"Ta lekcja nie ma jeszcze tre\u015Bci.",testGating:"Zaliczenie tego testu odblokowuje kolejne lekcje.",testAttemptsLeft:"Pozosta\u0142o pr\xF3b: {count}",testAttemptsUnlimited:"Liczba pr\xF3b nie jest ograniczona.",testNoAttemptsLeft:"Wykorzystano wszystkie pr\xF3by.",testPassThreshold:"Pr\xF3g zaliczenia: {percent}%",testBestScore:"Najlepszy wynik: {percent}%",testSubmit:"Sprawd\u017A odpowiedzi",testSubmitting:"Sprawdzanie...",testUnanswered:"Pytania bez odpowiedzi: {count}",testPassed:"Test zaliczony",testFailed:"Test niezaliczony",testScore:"Wynik: {percent}%",testCorrect:"Poprawnie",testIncorrect:"Niepoprawnie",testCorrectAnswer:"Poprawna odpowied\u017A",testTryAgain:"Spr\xF3buj ponownie",testPreviousAttempts:"Poprzednie podej\u015Bcia",testAttemptRow:"{percent}% \xB7 {date}",testNoQuestions:"Ten test nie ma jeszcze pyta\u0144.",mcqSingle:"Wybierz jedn\u0105 odpowied\u017A",mcqMultiple:"Zaznacz wszystkie poprawne odpowiedzi",todoHint:"Zaznacz wykonane kroki",todoRequired:"wymagany",gapPlaceholder:"uzupe\u0142nij",sortHint:"U\u0142\xF3\u017C elementy w poprawnej kolejno\u015Bci",moveUp:"Przesu\u0144 w g\xF3r\u0119",moveDown:"Przesu\u0144 w d\xF3\u0142",questionsTitle:"Pytania do lekcji",questionsEmpty:"Nikt jeszcze nie zada\u0142 pytania.",questionPlaceholder:"Zadaj pytanie autorowi kursu",questionSubmit:"Wy\u015Blij pytanie",questionSent:"Pytanie wys\u0142ane.",questionMine:"Ty",questionTeamAnswer:"Odpowied\u017A autora",rateTitle:"Oce\u0144 lekcj\u0119",rateStar:"{n} z 5",ratePlaceholder:"Komentarz (opcjonalnie)",rateSubmit:"Zapisz ocen\u0119",rateSaved:"Dzi\u0119kujemy za ocen\u0119.",rateAverage:"\u015Arednia ocena {average} ({count})"},en:{back:"Back",loading:"Loading the course...",retry:"Try again",errorGeneric:"Could not load the data. Please try again in a moment.",errorUnauthorized:"You do not have access to this course. Sign in again or contact support.",errorNotFound:"This course or lesson was not found.",errorUnavailable:"The course is temporarily unavailable. Please try again in a moment.",previewBadge:"Preview",progressLessons:"{done} of {total} lessons",progressPercent:"{percent}% complete",contents:"Contents",free:"Free",locked:"Locked",lockedByTest:"Pass the test to unlock it: {test}",lockedPage:"This lesson is locked. Pass the test \u201C{test}\u201D to unlock it.",testBadge:"Test",completed:"Completed",continueCourse:"Continue the course",noItem:"Pick a lesson from the list.",markComplete:"Mark as completed",markedComplete:"Lesson completed",prevItem:"Previous",nextItem:"Next",attachments:"Downloads",download:"Download",autoplay:"Autoplay the next lesson",videoError:"The video could not be played.",videoRetry:"Reload the video",noContent:"This lesson has no content yet.",testGating:"Passing this test unlocks the following lessons.",testAttemptsLeft:"Attempts left: {count}",testAttemptsUnlimited:"The number of attempts is unlimited.",testNoAttemptsLeft:"You have used all attempts.",testPassThreshold:"Passing score: {percent}%",testBestScore:"Best score: {percent}%",testSubmit:"Check answers",testSubmitting:"Checking...",testUnanswered:"Unanswered questions: {count}",testPassed:"Test passed",testFailed:"Test not passed",testScore:"Score: {percent}%",testCorrect:"Correct",testIncorrect:"Incorrect",testCorrectAnswer:"Correct answer",testTryAgain:"Try again",testPreviousAttempts:"Previous attempts",testAttemptRow:"{percent}% \xB7 {date}",testNoQuestions:"This test has no questions yet.",mcqSingle:"Choose one answer",mcqMultiple:"Select all correct answers",todoHint:"Check the steps you have done",todoRequired:"required",gapPlaceholder:"fill in",sortHint:"Put the items in the correct order",moveUp:"Move up",moveDown:"Move down",questionsTitle:"Questions about this lesson",questionsEmpty:"Nobody has asked a question yet.",questionPlaceholder:"Ask the course author a question",questionSubmit:"Send question",questionSent:"Question sent.",questionMine:"You",questionTeamAnswer:"Answer from the author",rateTitle:"Rate this lesson",rateStar:"{n} of 5",ratePlaceholder:"Comment (optional)",rateSubmit:"Save rating",rateSaved:"Thanks for your rating.",rateAverage:"Average rating {average} ({count})"}};function Te(e,t=je()){return Je(It,t,e)}import{ArrowDown as Rs,ArrowUp as ks,Check as wt,X as Et}from"lucide-react";import{useRef as Tt,useState as de}from"react";import{Fragment as Gs,jsx as u,jsxs as P}from"react/jsx-runtime";function Ns({question:e,answer:t,disabled:s,onChange:o}){let{texts:n}=h();if(e.config.type!=="mcq")return null;let{choices:i,multiple:a}=e.config;return P("fieldset",{className:"space-y-2",disabled:s,children:[u("legend",{className:"mb-2 text-xs text-neutral-500 dark:text-neutral-400",children:a?n.mcqMultiple:n.mcqSingle}),i.map(r=>{let c=t.selectedIds.includes(r.id);return P("label",{className:"flex cursor-pointer items-start gap-3 rounded-lg bg-neutral-100 px-3 py-2 text-sm dark:bg-neutral-800",children:[u("input",{className:"mt-0.5",type:a?"checkbox":"radio",name:`q-${e.id}`,checked:c,onChange:()=>o({type:"mcq",selectedIds:a?c?t.selectedIds.filter(b=>b!==r.id):[...t.selectedIds,r.id]:[r.id]})}),u("span",{className:"break-words",children:r.label})]},r.id)})]})}function Ps({question:e,answer:t,disabled:s,onChange:o}){let{texts:n}=h();return e.config.type!=="todolist"?null:P("fieldset",{className:"space-y-2",disabled:s,children:[u("legend",{className:"mb-2 text-xs text-neutral-500 dark:text-neutral-400",children:n.todoHint}),e.config.steps.map(i=>{let a=t.checkedIds.includes(i.id);return P("label",{className:"flex cursor-pointer items-start gap-3 rounded-lg bg-neutral-100 px-3 py-2 text-sm dark:bg-neutral-800",children:[u("input",{className:"mt-0.5",type:"checkbox",checked:a,onChange:()=>o({type:"todolist",checkedIds:a?t.checkedIds.filter(r=>r!==i.id):[...t.checkedIds,i.id]})}),P("span",{className:"break-words",children:[i.label,i.required&&P("span",{className:"ml-2 text-xs text-neutral-500 dark:text-neutral-400",children:["(",n.todoRequired,")"]})]})]},i.id)})]})}function Vs({question:e,answer:t,disabled:s,onChange:o}){let{texts:n}=h();if(e.config.type!=="fill_gap")return null;let i=he(e.config.template,e.config.blanks);return u("p",{className:"text-sm leading-10 break-words",children:i.map((a,r)=>a.type==="text"?u("span",{className:"whitespace-pre-wrap",children:a.text},r):u(Ye,{className:"mx-1 inline-block h-8 w-36 align-middle","aria-label":`${n.gapPlaceholder} ${a.id}`,placeholder:n.gapPlaceholder,disabled:s,value:t.values[a.id]??"",onChange:c=>o({type:"fill_gap",values:{...t.values,[a.id]:c.target.value}})},r))})}function Is({question:e,answer:t,disabled:s,onChange:o}){let{texts:n}=h();if(e.config.type!=="sort_order")return null;let i=new Map(e.config.items.map(r=>[r.id,r.label])),a=(r,c)=>o({type:"sort_order",orderedIds:at(t.orderedIds,r,c)});return P("div",{className:"space-y-2",children:[u("p",{className:"text-xs text-neutral-500 dark:text-neutral-400",children:n.sortHint}),u("ol",{className:"space-y-2",children:t.orderedIds.map((r,c)=>P("li",{className:"flex items-center gap-2 rounded-lg bg-neutral-100 px-3 py-2 text-sm dark:bg-neutral-800",children:[P("span",{className:"w-5 text-xs text-neutral-500",children:[c+1,"."]}),u("span",{className:"min-w-0 flex-1 break-words",children:i.get(r)??r}),u(N,{type:"button",variant:"ghost",size:"icon-xs","aria-label":n.moveUp,disabled:s||c===0,onClick:()=>a(c,c-1),children:u(ks,{"aria-hidden":!0})}),u(N,{type:"button",variant:"ghost",size:"icon-xs","aria-label":n.moveDown,disabled:s||c===t.orderedIds.length-1,onClick:()=>a(c,c+1),children:u(Rs,{"aria-hidden":!0})})]},r))})]})}function Ts({question:e,answer:t,disabled:s,onChange:o}){let n={question:e,disabled:s,onChange:o};switch(t.type){case"mcq":return u(Ns,{...n,answer:t});case"todolist":return u(Ps,{...n,answer:t});case"fill_gap":return u(Vs,{...n,answer:t});case"sort_order":return u(Is,{...n,answer:t})}}function ws({list:e}){let{texts:t}=h();return e.submissions.length===0?null:P("section",{className:"space-y-2",children:[u("h3",{className:"text-sm font-semibold",children:t.testPreviousAttempts}),u("ul",{className:"space-y-1 text-sm",children:e.submissions.map(s=>P("li",{className:"flex items-center gap-2 text-neutral-700 dark:text-neutral-300",children:[s.passed?u(wt,{className:"size-4 text-emerald-600","aria-hidden":!0}):u(Et,{className:"size-4 text-red-600","aria-hidden":!0}),w(t.testAttemptRow,{percent:s.scorePercent,date:s.createdAt?.toLocaleString()??""})]},s.id))})]})}function Es({test:e,onSubmitted:t,onTryAgain:s}){let{dataSource:o,texts:n}=h(),[i,a]=de({}),[r,c]=de(),[b,y]=de(!1),[f,d]=de(),p=Tt(Date.now()),A=Tt(e.questions).current,C=e.attemptsLeft!=null&&e.attemptsLeft<=0,I=r?r.attemptsLeft:e.attemptsLeft,g=rt(A,i),k=l=>i[l.id]??ot(l.config);async function M(){y(!0),d(void 0);try{let l={};for(let m of A)l[m.id]=k(m);let R=await o.submitTest(e.id,l,Date.now()-p.current);c(R),t(R)}catch(l){d(l)}finally{y(!1)}}let E=new Map(r?.results.map(l=>[l.questionId,l]));return A.length===0?u("p",{className:"text-sm text-neutral-500 dark:text-neutral-400",children:n.testNoQuestions}):P("form",{className:"space-y-6",onSubmit:l=>{l.preventDefault(),r==null&&!C&&M()},children:[r&&P("div",{role:"status",className:v("rounded-xl p-4 text-sm",r.submission.passed?"bg-emerald-50 text-emerald-800 dark:bg-emerald-950 dark:text-emerald-300":"bg-red-50 text-red-800 dark:bg-red-950 dark:text-red-300"),children:[u("p",{className:"text-base font-semibold",children:r.submission.passed?n.testPassed:n.testFailed}),u("p",{children:w(n.testScore,{percent:r.submission.scorePercent})})]}),u("ol",{className:"space-y-6",children:A.map((l,R)=>{let m=E.get(l.id),T=m?.correctAnswer!=null?it(l,m.correctAnswer):"";return P("li",{className:"space-y-3","data-question-id":l.id,children:[P("p",{className:"font-medium break-words",children:[R+1,". ",l.prompt]}),u(Ts,{question:l,answer:k(l),disabled:r!=null||b||C,onChange:B=>a(q=>({...q,[l.id]:B}))}),m&&P("div",{className:v("flex items-start gap-2 text-sm",m.correct?"text-emerald-700 dark:text-emerald-400":"text-red-700 dark:text-red-400"),children:[m.correct?u(wt,{className:"mt-0.5 size-4 shrink-0","aria-hidden":!0}):u(Et,{className:"mt-0.5 size-4 shrink-0","aria-hidden":!0}),P("span",{children:[m.correct?n.testCorrect:n.testIncorrect,T!==""&&!m.correct&&P("span",{className:"block text-neutral-700 dark:text-neutral-300",children:[n.testCorrectAnswer,": ",T]})]})]})]},l.id)})}),f!=null&&u("p",{role:"alert",className:"text-sm text-red-600 dark:text-red-400",children:J(f,n)}),r==null?P("div",{className:"space-y-2",children:[g>0&&!C&&u("p",{className:"text-xs text-neutral-500 dark:text-neutral-400",children:w(n.testUnanswered,{count:g})}),u(N,{type:"submit",className:$,disabled:b||C,children:b?n.testSubmitting:n.testSubmit})]}):I!==0&&!r.submission.passed&&u(N,{type:"button",variant:"outline",onClick:s,children:n.testTryAgain})]})}function Gt({testId:e,title:t,onSubmitted:s}){let{dataSource:o,texts:n}=h(),i=Q(),a=j(()=>o.getTest(e),[o,e]),r=j(()=>o.listSubmissions(e).catch(()=>{}),[o,e]),[c,b]=de(0);return P("article",{"data-test-id":e,className:v(z,"min-w-0 space-y-5"),children:[u("h2",{className:"text-2xl font-semibold break-words",children:a.status==="success"?a.data.title:t}),a.status==="loading"&&u(ue,{}),a.status==="error"&&u(ee,{error:a.error,onRetry:a.reload}),a.status==="success"&&P(Gs,{children:[a.data.description.trim()!==""&&u("p",{className:"text-sm break-words whitespace-pre-wrap text-neutral-700 dark:text-neutral-300",children:a.data.description}),P("ul",{className:"space-y-1 text-sm text-neutral-600 dark:text-neutral-400",children:[a.data.gating&&u("li",{children:n.testGating}),u("li",{children:w(n.testPassThreshold,{percent:a.data.passThresholdPercent})}),u("li",{children:a.data.attemptsLeft==null?n.testAttemptsUnlimited:w(n.testAttemptsLeft,{count:a.data.attemptsLeft})}),a.data.attemptCount>0&&u("li",{children:w(n.testBestScore,{percent:a.data.bestScorePercent})})]}),a.data.attemptsLeft!=null&&a.data.attemptsLeft<=0&&u("p",{role:"alert",className:"text-sm font-medium text-red-700 dark:text-red-400",children:n.testNoAttemptsLeft}),u(Es,{test:a.data,onSubmitted:y=>{i("test_submitted",{lesson_id:e,score_bucket:Me(y.submission.scorePercent)}),s(y),r.refresh(),a.refresh()},onTryAgain:()=>b(y=>y+1)},c),r.status==="success"&&r.data&&u(ws,{list:r.data})]})]})}import{jsx as x,jsxs as L}from"react/jsx-runtime";var Ut="bitsnap-course-autoplay";function Zs(){let[e,t]=fe(!1);Ge(()=>{try{t(window.localStorage.getItem(Ut)==="1")}catch{}},[]);let s=Bt(o=>{t(o);try{window.localStorage.setItem(Ut,o?"1":"0")}catch{}},[]);return[e,s]}function Lt(e){return e==null?void 0:{id:e.id,kind:e.kind}}function Xs({item:e}){let{texts:t}=h();return L("div",{className:v(z,"space-y-2"),role:"status",children:[x("h2",{className:"text-2xl font-semibold break-words",children:e.title}),x("p",{className:"text-sm text-neutral-600 dark:text-neutral-300",children:e.lockReason?w(t.lockedPage,{test:e.lockReason.gatingTestTitle}):t.locked})]})}function Ms({course:e,item:t,autoplay:s,onAutoplayChange:o,startPlaying:n,onNavigate:i,onProgressSaved:a,onEnded:r,onLocked:c}){let{dataSource:b,texts:y}=h(),f=j(()=>b.getLesson(t.id),[b,t.id]),d=f.status==="error"&&f.error instanceof Z&&f.error.code==="item_locked";if(Ge(()=>{d&&c()},[d]),f.status==="loading")return x(ue,{});if(f.status==="error")return d?L("div",{className:v(z,"space-y-2"),role:"alert",children:[x("h2",{className:"text-2xl font-semibold break-words",children:t.title}),x("p",{className:"text-sm",children:J(f.error,y)})]}):x(ee,{error:f.error,onRetry:f.reload});let p=ye(e,t.id),A=ce(e).filter(C=>C.kind!=="test").findIndex(C=>C.id===t.id)+1;return x(Vt,{lesson:f.data,position:A,courseType:e.type,prev:f.data.prev??Lt(p.prev),next:f.data.next??Lt(p.next),autoplay:s,onAutoplayChange:o,startPlaying:n,onNavigate:i,onProgressSaved:a,onEnded:r,onUrlsExpired:f.refresh},f.data.id)}function zs({course:e,selectedId:t,onSelect:s,onBack:o,onCourseChange:n,onCourseRefresh:i}){let{texts:a,preview:r}=h(),c=Q(),b=Bs(null),[y,f]=fe(!1),[d,p]=Zs(),[A,C]=fe(),I=et(e,t),g=le(e,I);Ge(()=>{c("course_opened",{})},[e.id]);let k=(m,T=!1)=>{C(T?m:void 0),f(!1),s(m),b.current?.scrollIntoView({block:"start",behavior:"smooth"})},M=x(ct,{course:e,selectedId:I,variant:e.type==="video"?"playlist":"modules",onSelect:m=>k(m.id)}),E;g==null?E=x("p",{className:"text-sm text-neutral-500",children:a.noItem}):g.locked?E=x(Xs,{item:g}):g.kind==="test"?E=x(Gt,{testId:g.id,title:g.title,onSubmitted:()=>i()},g.id):E=x(Ms,{course:e,item:g,autoplay:d,onAutoplayChange:p,startPlaying:A===g.id,onNavigate:m=>k(m.id),onProgressSaved:(m,T)=>n(B=>({...T.completed?$e(B,m):B,completedLessons:T.completedLessons,progressPercent:T.progressPercent})),onEnded:()=>{if(!d)return;let m=Oe(e,g.id);m&&k(m.id,!0)},onLocked:i},g.id);let l=e.type==="video",R=e.resumeItemId!==""&&e.resumeItemId!==I&&le(e,e.resumeItemId)?.locked===!1;return L("div",{ref:b,className:"space-y-4 scroll-mt-4",children:[L("header",{className:"space-y-3",children:[L("div",{className:"flex flex-wrap items-center gap-2",children:[o&&L(N,{variant:"ghost",size:"sm",onClick:o,children:[x(Ee,{"aria-hidden":!0}),a.back]}),r&&x("span",{"data-course-preview":!0,className:"rounded-full bg-amber-100 px-3 py-0.5 text-xs font-semibold text-amber-900 dark:bg-amber-900/40 dark:text-amber-200",children:a.previewBadge})]}),L("div",{className:"flex flex-wrap items-end justify-between gap-4",children:[x("div",{className:"min-w-0 space-y-1",children:x("h1",{className:"text-2xl font-semibold break-words sm:text-3xl",children:e.title})}),R&&L(N,{size:"sm",variant:"outline",onClick:()=>k(e.resumeItemId),children:[x(Ls,{"aria-hidden":!0}),a.continueCourse]})]}),L("div",{className:"max-w-xl space-y-1",children:[x(At,{percent:e.progressPercent,label:w(a.progressPercent,{percent:e.progressPercent})}),L("p",{className:"text-xs text-neutral-500 dark:text-neutral-400",children:[w(a.progressLessons,{done:e.completedLessons,total:e.totalLessons})," \xB7 ",w(a.progressPercent,{percent:e.progressPercent})]})]})]}),L("div",{className:v("grid gap-6",l?"lg:grid-cols-[minmax(0,1fr)_380px]":"lg:grid-cols-[320px_minmax(0,1fr)]"),children:[!l&&x("div",{className:"lg:hidden",children:L(N,{variant:"outline",size:"sm","aria-expanded":y,onClick:()=>f(m=>!m),children:[x(Us,{"aria-hidden":!0}),a.contents]})}),!l&&x("aside",{className:v(z,"p-3 sm:p-3 lg:sticky lg:top-4 lg:block lg:max-h-[calc(100vh-2rem)] lg:self-start lg:overflow-y-auto",y?"block":"hidden"),children:M}),x("div",{className:"min-w-0","data-course-content":!0,children:E}),l&&x("aside",{className:v(z,"p-3 sm:p-3 lg:sticky lg:top-4 lg:max-h-[calc(100vh-2rem)] lg:self-start lg:overflow-y-auto"),children:M})]})]})}function Qs({accessId:e,accessToken:t,dataSource:s,preview:o=!1,itemId:n,onItemChange:i,onBack:a,initialCourse:r,texts:c,locale:b,theme:y,className:f,analytics:d}){let p=_e(),A=Xe(p.projectID,o?!1:d,"course"),C=we(()=>Te(c,b),[c,b]),I=we(()=>{if(s)return s;if(e==null||e==="")throw new Error("PanelCourse needs an accessId or a dataSource");return Ce({accessId:e,accessToken:t})},[s,e,t]),g=j(()=>I.getCourse(),[I],r),[k,M]=fe(),E=i?n:n??k,l=Bt(B=>{M(B),i?.(B)},[i]),R=De(y?.colors??p.theme?.colors),m=g.status==="success"?g.data.id:void 0,T=we(()=>({dataSource:I,texts:C,preview:o,analytics:{courseId:m,instrument:A}}),[I,C,o,m,A]);return x(Ze,{value:A,children:x(qe,{value:T,children:L("div",{"data-bitsnap-course":!0,"data-course-type":g.status==="success"?g.data.type:void 0,style:R,className:v("font-inter w-full max-w-7xl",f),children:[g.status==="loading"&&L("div",{className:"space-y-4",children:[a&&L(N,{variant:"ghost",size:"sm",onClick:a,children:[x(Ee,{"aria-hidden":!0}),C.back]}),x("p",{className:"sr-only",role:"status",children:C.loading}),x(ue,{})]}),g.status==="error"&&L("div",{className:"space-y-4",children:[a&&L(N,{variant:"ghost",size:"sm",onClick:a,children:[x(Ee,{"aria-hidden":!0}),C.back]}),x(ee,{error:g.error,onRetry:g.reload})]}),g.status==="success"&&x(zs,{course:g.data,selectedId:E,onSelect:l,onBack:a,onCourseChange:g.mutate,onCourseRefresh:g.refresh})]})})})}export{It as COURSE_TEXT_TABLES,Z as CourseError,Qs as PanelCourse,ve as createCourseDataSource,Ce as createRpcCourseDataSource,Te as getCourseTexts,Pe as sanitizeLessonHtml};
|
|
2
2
|
//# sourceMappingURL=course.mjs.map
|