bitsnap-react 1.12.1 → 1.13.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.
Files changed (65) hide show
  1. package/README.md +18 -5
  2. package/dist/CartProvider-F7ER3WSS.js +2 -0
  3. package/dist/{CartProvider-YPZ3HD7W.js.map → CartProvider-F7ER3WSS.js.map} +1 -1
  4. package/dist/CartProvider-N73XNL7S.mjs +2 -0
  5. package/dist/analytics.js +1 -1
  6. package/dist/analytics.mjs +1 -1
  7. package/dist/catalog.js +1 -1
  8. package/dist/catalog.mjs +1 -1
  9. package/dist/{chunk-MZSLLGFS.js → chunk-3A4YOO7Z.js} +2 -2
  10. package/dist/{chunk-MZSLLGFS.js.map → chunk-3A4YOO7Z.js.map} +1 -1
  11. package/dist/{chunk-VF62KDNS.mjs → chunk-3DGHF373.mjs} +2 -2
  12. package/dist/{chunk-GJNFDUJN.mjs → chunk-5GMWRCHK.mjs} +3 -3
  13. package/dist/chunk-5GMWRCHK.mjs.map +1 -0
  14. package/dist/{chunk-STVEBT6M.js → chunk-6CUCRTIK.js} +2 -2
  15. package/dist/{chunk-STVEBT6M.js.map → chunk-6CUCRTIK.js.map} +1 -1
  16. package/dist/{chunk-I6BRDRPB.js → chunk-EWLOGFF2.js} +2 -2
  17. package/dist/{chunk-I6BRDRPB.js.map → chunk-EWLOGFF2.js.map} +1 -1
  18. package/dist/chunk-GAVLY6RX.mjs +2 -0
  19. package/dist/chunk-GAVLY6RX.mjs.map +1 -0
  20. package/dist/{chunk-3ITTSNWG.js → chunk-IP4OOWZ6.js} +2 -2
  21. package/dist/{chunk-3ITTSNWG.js.map → chunk-IP4OOWZ6.js.map} +1 -1
  22. package/dist/{chunk-HBPSSGYN.mjs → chunk-K2EITRNW.mjs} +2 -2
  23. package/dist/{chunk-G3VVAVG7.mjs → chunk-KH7DFTJY.mjs} +2 -2
  24. package/dist/{chunk-DRAKVCD7.mjs → chunk-L6J6H73J.mjs} +2 -2
  25. package/dist/chunk-M4KEUK6I.js +2 -0
  26. package/dist/{chunk-4BV5IUZH.js.map → chunk-M4KEUK6I.js.map} +1 -1
  27. package/dist/{chunk-VDLJW4JJ.mjs → chunk-OC7YS3UY.mjs} +2 -2
  28. package/dist/{chunk-VRL3IF5J.js → chunk-TMBC2BHN.js} +3 -3
  29. package/dist/{chunk-VRL3IF5J.js.map → chunk-TMBC2BHN.js.map} +1 -1
  30. package/dist/{chunk-HDLCLZOK.js → chunk-TSJCVFOX.js} +2 -2
  31. package/dist/{chunk-HDLCLZOK.js.map → chunk-TSJCVFOX.js.map} +1 -1
  32. package/dist/{chunk-4ZFIL5S7.js → chunk-UFQVOGBS.js} +2 -2
  33. package/dist/{chunk-4ZFIL5S7.js.map → chunk-UFQVOGBS.js.map} +1 -1
  34. package/dist/{chunk-T2YSOHJM.mjs → chunk-YNGXQJPE.mjs} +2 -2
  35. package/dist/{chunk-T2YSOHJM.mjs.map → chunk-YNGXQJPE.mjs.map} +1 -1
  36. package/dist/course.js +1 -1
  37. package/dist/course.mjs +1 -1
  38. package/dist/embed/analytics.js +1 -1
  39. package/dist/index.d.mts +17 -7
  40. package/dist/index.d.ts +17 -7
  41. package/dist/index.js +1 -1
  42. package/dist/index.js.map +1 -1
  43. package/dist/index.mjs +1 -1
  44. package/dist/index.mjs.map +1 -1
  45. package/dist/methods-ADH5XI4I.js +2 -0
  46. package/dist/{methods-ISVX5JQ7.js.map → methods-ADH5XI4I.js.map} +1 -1
  47. package/dist/methods-BCR54EWX.mjs +2 -0
  48. package/dist/returns.js +1 -1
  49. package/dist/returns.mjs +1 -1
  50. package/package.json +1 -1
  51. package/dist/CartProvider-WPJWECBS.mjs +0 -2
  52. package/dist/CartProvider-YPZ3HD7W.js +0 -2
  53. package/dist/chunk-4BV5IUZH.js +0 -2
  54. package/dist/chunk-GJNFDUJN.mjs.map +0 -1
  55. package/dist/chunk-T3PAOMHI.mjs +0 -2
  56. package/dist/chunk-T3PAOMHI.mjs.map +0 -1
  57. package/dist/methods-FVDH6Y57.mjs +0 -2
  58. package/dist/methods-ISVX5JQ7.js +0 -2
  59. /package/dist/{CartProvider-WPJWECBS.mjs.map → CartProvider-N73XNL7S.mjs.map} +0 -0
  60. /package/dist/{chunk-VF62KDNS.mjs.map → chunk-3DGHF373.mjs.map} +0 -0
  61. /package/dist/{chunk-HBPSSGYN.mjs.map → chunk-K2EITRNW.mjs.map} +0 -0
  62. /package/dist/{chunk-G3VVAVG7.mjs.map → chunk-KH7DFTJY.mjs.map} +0 -0
  63. /package/dist/{chunk-DRAKVCD7.mjs.map → chunk-L6J6H73J.mjs.map} +0 -0
  64. /package/dist/{chunk-VDLJW4JJ.mjs.map → chunk-OC7YS3UY.mjs.map} +0 -0
  65. /package/dist/{methods-FVDH6Y57.mjs.map → methods-BCR54EWX.mjs.map} +0 -0
package/dist/course.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{b as Fe,j as _e,k as Ke}from"./chunk-HBPSSGYN.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-VF62KDNS.mjs";import{d as v,i as Je,m as je}from"./chunk-T3PAOMHI.mjs";import{l as Ze,n as Xe,r as Me,s as ze}from"./chunk-T2YSOHJM.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};
1
+ import{b as Fe,j as _e,k as Ke}from"./chunk-K2EITRNW.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-3DGHF373.mjs";import{d as v,i as Je,m as je}from"./chunk-GAVLY6RX.mjs";import{l as Ze,n as Xe,r as Me,s as ze}from"./chunk-YNGXQJPE.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
@@ -1 +1 @@
1
- "use strict";var BitsnapAnalyticsEmbed=(()=>{var F=Object.defineProperty;var tt=Object.getOwnPropertyDescriptor;var nt=Object.getOwnPropertyNames;var rt=Object.prototype.hasOwnProperty;var ot=(e,t)=>{for(var n in t)F(e,n,{get:t[n],enumerable:!0})},it=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of nt(t))!rt.call(e,o)&&o!==n&&F(e,o,{get:()=>t[o],enumerable:!(r=tt(t,o))||r.enumerable});return e};var st=e=>it(F({},"__esModule",{value:!0}),e);var Kt={};ot(Kt,{dashboardRoute:()=>Je,init:()=>Xe});var l={maxBatchEvents:50,maxBodyBytes:65536,maxPropsChars:4096,maxPropString:200,maxPropArray:50,host:253,path:512,referrerHost:253,utm:100,refCode:64,id:64,sdk:64,pageId:32,region:64,osBrowser:32,tsSkewMs:864e5},at=["storefront_events","app_events","business_events"],ct=["live","test"],ut=["storefront","sdk_react","script","server","dashboard"],lt=["hosted","custom_domain","embed","api","panel"],J=["shop","catalog","product","cart","checkout","payment","panel","course","custom_page","order","returns","app","other"];var pt={storefront_events:["storefront","sdk_react","script"],app_events:["dashboard"],business_events:["server"]},A={value_minor:"number",currency:"string"},$e={page_view:{landing:"boolean"},product_list_viewed:{list_id:"string?",item_count:"number"},product_impression:{list_id:"string?",product_ids:"string[]",positions:"number[]"},product_clicked:{list_id:"string?",position:"number?"},product_view:{price_minor:"number",currency:"string",availability:"enum:in_stock|out_of_stock|preorder"},variant_selected:{},add_to_cart:{qty:"number",...A},remove_from_cart:{qty:"number",...A},cart_opened:{item_count:"number",...A},checkout_started:{item_count:"number",checkout_type:"enum:single|cart|link",...A},checkout_step_completed:{step:"enum:contact|delivery|invoice|consents"},checkout_validation_error:{field:"string",rule:"string"},coupon_applied:{coupon_id:"string"},coupon_rejected:{coupon_id:"string?",reason:"string"},delivery_method_selected:{method:"string"},payment_method_selected:{gateway:"string",method:"string"},payment_submitted:{gateway:"string",method:"string"},apple_pay_clicked:{},apple_pay_result:{outcome:"enum:success|fail|cancel"},payment_returned:{gateway:"string",method:"string?",outcome:"enum:success|fail|cancel|pending",error_code:"string?"},availability_signup:{},panel_login:{},panel_order_viewed:{},panel_download:{},return_started:{},return_submitted:{reason_code:"string",item_count:"number"},course_opened:{course_id:"string"},lesson_started:{course_id:"string",lesson_id:"string",position:"number"},lesson_completed:{course_id:"string",lesson_id:"string",position:"number"},video_progress:{course_id:"string",lesson_id:"string",milestone:"number"},test_submitted:{course_id:"string",lesson_id:"string",score_bucket:"enum:0-24|25-49|50-74|75-99|100"},lesson_rated:{course_id:"string",lesson_id:"string",rating:"number"},consent_updated:{consent_id:"string",action:"enum:accept_all|reject_all|custom|withdraw",analytics:"boolean",marketing:"boolean",preferences:"boolean",banner_version:"number"}},Ie={app_page_view:{route:"string",previous_route:"string?"},insight_shown:{insight_type:"string",rank:"number",category:"string"},insight_clicked:{insight_type:"string",rank:"number",category:"string"},insight_dismissed:{insight_type:"string",rank:"number",category:"string"},checklist_step_viewed:{step:"string"},checklist_step_completed:{step:"string"},gateway_connect_started:{gateway:"string",step:"string?"},gateway_connect_completed:{gateway:"string",step:"string?"},gateway_connect_failed:{gateway:"string",step:"string?",error_code:"string?"},domain_connect_started:{},domain_connect_verified:{},domain_connect_failed:{error_code:"string?"},product_created:{product_type:"string?"},product_published:{product_type:"string?"},product_editor_section_opened:{section:"string"},feature_enabled:{feature:"string"},stats_viewed:{tab:"string"},stats_filter_changed:{tab:"string",filter:"string"},report_exported:{report:"string",format:"string?"},search_performed:{result_count:"number"},error_shown:{code:"string",route:"string"},help_opened:{topic:"string?"},ai_assistant_used:{topic:"string?"},member_invited:{role:"string"}},R={gateway:"string?",method:"string?",value_minor:"number?",currency:"string?"},C={subscription_id:"string?",value_minor:"number?",currency:"string?"},Oe={transaction_created:R,transaction_success:R,transaction_failure:{...R,error_code:"string?"},transaction_expired:R,transaction_charge:R,subscription_created:C,subscription_paused:C,subscription_resumed:C,subscription_updated:C,subscription_deleted:C,subscription_charge_paid:C,subscription_charge_failed:{...C,error_code:"string?"},subscription_past_due:C,subscription_canceled:C,access_expires_in_3_days:{},access_expired:{},cart_recovery:{value_minor:"number?",currency:"string?"},testimonial_email_send:{},testimonial_fulfilled:{},partner_commission_earned:{partner_id:"string",commission_minor:"number",currency:"string"},checkout_session_created:{item_count:"number",checkout_type:"enum:single|cart|link",gateway:"string?",...A},order_paid:{gateway:"string",method:"string?",item_count:"number?",visitor_day:"string?",items:"line_items?",...A},refund_issued:{gateway:"string?",reason:"string?",...A},return_requested:{item_count:"number",reason_code:"string?"},automation_run_completed:{automation_id:"string",status:"string",trigger:"string?"},notification_sent:{medium:"string",template:"string?"},notification_failed:{medium:"string",template:"string?",error_code:"string?"},recovery_email_sent:{step:"number?"},recovery_link_clicked:{},api_request:{endpoint:"string",client:"string?",status:"number",latency_bucket:"enum:lt_50|lt_200|lt_1000|gte_1000",sample_rate:"number"}};var dt={...$e,...Ie,...Oe},ft={storefront_events:Object.keys($e),app_events:Object.keys(Ie),business_events:Object.keys(Oe)},Re=Object.fromEntries(at.flatMap(e=>ft[e].map(t=>[t,e])));function Ve(e){return typeof e=="string"&&Object.hasOwn(Re,e)}var qt=365*24*60*60;function Q(e){let t=e.startsWith("pk_")?e.slice(3):e;return/^[A-Za-z0-9]{1,32}$/.test(t)?t:null}var gt=/^([a-z][a-z0-9-]{0,39})@(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.+-]{1,20})?)$/;function Le(e){if(!e||e.length>l.sdk)return null;let t=gt.exec(e);return t?{package:t[1],version:t[2]}:null}var V=l.utm;function I(e,t){if(e==null)return null;let n=e.trim();return n.length===0||n.includes("@")?null:n.slice(0,t)}function O(e){let n=e.split("/").map(r=>r.includes("@")||r.includes("%40")?":email":/^[A-Za-z0-9_-]{24,}$/.test(r)?":token":r).join("/")||"/";return(n.startsWith("/")?n:`/${n}`).slice(0,l.path)}function ee(e,t){let n;try{n=new URL(e,t)}catch{return null}if(n.protocol!=="https:"&&n.protocol!=="http:")return null;let r=n.searchParams;return{host:n.hostname.toLowerCase().slice(0,l.host),path:O(n.pathname),utm_source:I(r.get("utm_source"),V),utm_medium:I(r.get("utm_medium"),V),utm_campaign:I(r.get("utm_campaign"),V),utm_content:I(r.get("utm_content"),V),utm_term:I(r.get("utm_term"),V),ref_code:I(r.get("ref"),l.refCode)}}var mt=/^[A-Za-z0-9_-]{1,64}$/;function Be(e){if(!e)return null;try{let t=new URL(e);return t.protocol!=="https:"&&t.protocol!=="http:"?null:t.hostname.toLowerCase().slice(0,l.referrerHost)}catch{return null}}var Gt=new TextEncoder;function j(e){return`bs_vid_${e}`}var _t=/^[A-Za-z0-9_-]{22}$/;var yt=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,ht=/^[A-Za-z0-9_-]{8,32}$/,bt=/[^\s@]+@[^\s@]+\.[A-Za-z]{2,}\b/;function H(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function vt(e,t,n){let r=e[t];return r==null?null:typeof r!="string"?`bad_${t}`:r.length>n?`too_long_${t}`:null}function Et(e,t){let r=e.endsWith("?")?e.slice(0,-1):e;if(r.startsWith("enum:"))return typeof t=="string"&&r.slice(5).split("|").includes(t);switch(r){case"string":return typeof t=="string"&&t.length<=l.maxPropString;case"number":return typeof t=="number"&&Number.isFinite(t);case"boolean":return typeof t=="boolean";case"string[]":return Array.isArray(t)&&t.length<=l.maxPropArray&&t.every(o=>typeof o=="string"&&o.length<=l.maxPropString);case"number[]":return Array.isArray(t)&&t.length<=l.maxPropArray&&t.every(o=>typeof o=="number"&&Number.isFinite(o));case"line_items":return Array.isArray(t)&&t.length<=l.maxPropArray&&t.every(o=>H(o)&&typeof o.product_id=="string"&&mt.test(o.product_id)&&Ne(o.qty)&&Ne(o.value_minor));default:return!1}}function Ne(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0}function kt(e){return Le(e)!==null?!1:bt.test(e)}function X(e){return typeof e=="string"?kt(e):Array.isArray(e)?e.some(X):H(e)?Object.values(e).some(X):!1}function te(e,t){if(!Ve(e))return{ok:!1,reason:"unknown_event"};let n=dt[e];if(!n)return{ok:!1,reason:"unknown_event"};if(!H(t))return{ok:!1,reason:"bad_props"};let r={};for(let[o,s]of Object.entries(n)){let c=t[o];if(c==null){if(!s.endsWith("?"))return{ok:!1,reason:`props_missing_${o}`};continue}if(!Et(s,c))return{ok:!1,reason:`props_bad_${o}`};if(X(c))return{ok:!1,reason:`props_pii_${o}`};r[o]=s.startsWith("line_items")&&Array.isArray(c)?c.map(d=>({product_id:d.product_id,qty:d.qty,value_minor:d.value_minor})):c}return JSON.stringify(r).length>l.maxPropsChars?{ok:!1,reason:"props_too_large"}:{ok:!0,props:r}}function De(e,t={}){var d;let n=(d=t.from)!=null?d:"browser",r=g=>({ok:!1,reason:g});if(!H(e))return r("not_object");if(typeof e.event_id!="string"||!yt.test(e.event_id))return r("bad_event_id");if(!Ve(e.event))return r("unknown_event");let o=Re[e.event];if(n==="browser"){if(o==="business_events")return r("server_only_event");if(e.event==="consent_updated")return r("consent_via_consent_endpoint")}if(typeof e.ts!="number"||!Number.isInteger(e.ts)||e.ts<=0||e.ts>4e12)return r("bad_ts");if(e.schema_version!==1)return r("bad_schema_version");if(!ct.includes(e.env))return r("bad_env");if(!ut.includes(e.source))return r("bad_source");if(!pt[o].includes(e.source))return r("source_not_allowed_for_event");if(!lt.includes(e.channel))return r("bad_channel");if(e.sdk!=null&&(typeof e.sdk!="string"||Le(e.sdk)===null))return r("bad_sdk");if(e.page_id!=null&&(typeof e.page_id!="string"||!ht.test(e.page_id)))return r("bad_page_id");if(e.page_type!=null&&!J.includes(e.page_type))return r("bad_page_type");if(n==="browser"){if(typeof e.host!="string"||e.host.length===0)return r("bad_host");if(typeof e.path!="string"||!e.path.startsWith("/"))return r("bad_path")}if(typeof e.path=="string"&&e.path.includes("?"))return r("path_has_query");if(typeof e.path=="string"&&e.path.includes("#"))return r("path_has_fragment");let s=[["host",l.host],["path",l.path],["referrer_host",l.referrerHost],["utm_source",l.utm],["utm_medium",l.utm],["utm_campaign",l.utm],["utm_content",l.utm],["utm_term",l.utm],["ref_code",l.refCode],["product_id",l.id],["variant_id",l.id],["order_ref",l.id]];for(let[g,y]of s){let T=vt(e,g,y);if(T)return r(T)}if(e.visitor_id!=null&&(typeof e.visitor_id!="string"||!/^[A-Za-z0-9_-]{22}$/.test(e.visitor_id)))return r("bad_visitor_id");if(e.client_id!=null&&(typeof e.client_id!="string"||!_t.test(e.client_id)))return r("bad_client_id");let c=te(e.event,e.props);return c.ok?{ok:!0}:r(c.reason)}var Me="1.12.1";var ne=Symbol.for("bitsnap.pageViews");function St(e){var n;let t=e;return(n=t[ne])!=null?n:t[ne]={path:null,starters:new Set,watching:!1}}function Ct(e,t){let n=()=>{try{t()}catch{}};for(let r of["pushState","replaceState"]){let o=e.history[r];e.history[r]=function(...s){let c=o.apply(this,s);return n(),c}}e.addEventListener("popstate",n)}function re(e,t=window){try{let n=St(t),r=()=>e();n.watching||(n.watching=!0,Ct(t,()=>{var c,d;let s=t.location.pathname;s===n.path||n.starters.size===0||(n.path=s,(d=(c=n.starters.values().next()).value)==null||d.call(c))})),n.starters.add(r);let o=t.location.pathname;return o!==n.path&&(n.path=o,r()),()=>void n.starters.delete(r)}catch{return()=>{}}}function L(e){let t=new Uint8Array(e),n=typeof crypto!="undefined"?crypto:void 0;if(n&&typeof n.getRandomValues=="function")n.getRandomValues(t);else for(let r=0;r<e;r++)t[r]=Math.floor(Math.random()*256);return t}function oe(e){if(!e||/^[\d.]+$/.test(e)||e.includes(":"))return[];let t=e.split("."),n=[];for(let r=0;r<=t.length-2;r++)n.push(t.slice(r).join("."));return n}var wt=390*24*60*60,Tt=/^[A-Za-z0-9_-]{22}$/;function z(e){return e.BitsnapConsent}function xt(e,t){for(let n of e.cookie.split(";")){let r=n.indexOf("=");if(r!==-1&&n.slice(0,r).trim()===t)return n.slice(r+1).trim()}return null}function At(e){let t=e.toLowerCase();return t==="bitsnap.pl"||t.endsWith(".bitsnap.pl")}function ie(e,t){try{let n=z(e);if(!n)return!1;if(n.scope==="project")return n.projectKey===t;let r=At(e.location.hostname);return n.scope==="global"?!r:!1}catch{return!1}}function se(e,t){var n,r;try{return((r=(n=z(e))==null?void 0:n.get())==null?void 0:r.c.analytics)===!0&&ie(e,t)}catch{return!1}}function Ue(){let e="";return L(16).forEach(t=>e+=String.fromCharCode(t)),btoa(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function je(e,t){try{return xt(e,j(t))}catch{return null}}function K(e,t){let n=je(e,t);return n!==null&&Tt.test(n)?n:null}function He(e,t,n){try{let r=e.document,o=`${j(t)}=${n}; Max-Age=${wt}; Path=/; SameSite=Lax`+(e.location.protocol==="https:"?"; Secure":"");for(let s of oe(e.location.hostname).reverse())if(r.cookie=`${o}; Domain=${s}`,K(r,t)===n)return;r.cookie=o}catch{}}function ze(e,t){try{let n=e.document;if(je(n,t)===null)return;let r=`${j(t)}=; Max-Age=0; Path=/; SameSite=Lax`+(e.location.protocol==="https:"?"; Secure":"");n.cookie=r;for(let o of oe(e.location.hostname))n.cookie=`${r}; Domain=${o}`}catch{}}function ae(e,t){try{let n=e.navigator;return(n==null?void 0:n.globalPrivacyControl)===!0||(n==null?void 0:n.webdriver)===!0?null:se(e,t)?K(e.document,t):null}catch{return null}}var Nt="https://collect.bitsnap.pl",$t=5e3,It=20,Ke=32*1024,Ot=60*1024,We=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;function qe(e){return typeof TextEncoder=="function"?new TextEncoder().encode(e).length:unescape(encodeURIComponent(e)).length}var B={track(){},page(){},clientId:()=>null,flush(){},setEnabled(){},onEvent:()=>()=>{},configure(){},destroy(){}};function Rt(e=Date.now()){let t=L(16),n=e;for(let o=5;o>=0;o--)t[o]=n%256,n=Math.floor(n/256);t[6]=t[6]&15|112,t[8]=t[8]&63|128;let r=Array.from(t,o=>o.toString(16).padStart(2,"0")).join("");return`${r.slice(0,8)}-${r.slice(8,12)}-${r.slice(12,16)}-${r.slice(16,20)}-${r.slice(20)}`}var Ge="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Vt(){return Array.from(L(16),e=>Ge[e%Ge.length]).join("")}function Ye(e){return typeof e=="string"&&J.includes(e)}function Lt(e,t,n=!1){let r=qe(JSON.stringify({k:e,events:[]})),o=[],s=[],c=r,d=()=>{s.length>0&&o.push({body:JSON.stringify({k:e,events:s}),bytes:c,count:s.length}),s=[],c=r};for(let g of t){let y=qe(JSON.stringify(g));r+y>Ke||((s.length>=l.maxBatchEvents||c+y+(s.length>0?1:0)>Ke)&&d(),c+=y+(s.length>0?1:0),s.push(g))}if(d(),n){let g=0,y=o.length;for(;y>0&&g+o[y-1].bytes<=Ot;)g+=o[y-1].bytes,y--;o=o.slice(y)}return o}function Ze(e){try{return typeof window=="undefined"||typeof document=="undefined"?B:Bt(e,window)}catch{return B}}function Bt(e,t){var ge,me,_e,ye;let n=Q((ge=e.projectKey)!=null?ge:""),r=!!e.debug,o=(...i)=>{r&&console.warn("[bitsnap analytics]",...i)};if(!n)return o("invalid projectKey, tracking is off"),B;let s=n,c=i=>`${(i||Nt).replace(/\/+$/,"")}/e`,d=c(e.endpoint),g=(me=e.source)!=null?me:"sdk_react",y=(_e=e.channel)!=null?_e:"embed",T=`bitsnap-react@${Me}`,S=Vt(),u=ee(t.location.href),P=(ye=e.env)!=null?ye:"live";if(!e.env)try{new URLSearchParams(t.location.search).has("test")&&(P="test")}catch{}let W=Be(document.referrer),m=e.enabled!==!1,h=null,v=0,p=[],f=null,E=new Set;e.onEvent&&E.add(e.onEvent);let k=[],b,w=!0;function q(){var _;let i=z(t);!i||i===b||(b=i,w=!i.ready,(_=i.ready)==null||_.then(()=>{b===i&&(w=!0,le())},()=>{b===i&&(w=!0)}))}function ce(){q();try{if(!b)return!1;let i=b.get();return!!b.denied&&b.denied("analytics")||!!i&&i.c.analytics===!1}catch{return!1}}function ue(i){E.forEach(_=>{try{_(i)}catch{}})}function G(i){try{if(q(),!b||!ie(t,s))return;se(t,s)?D()&&K(t.document,s)===null&&He(t,s,Ue()):i&&ze(t,s)}catch{}}function le(){if(G(!0),ce())p=[],k=[],M();else{if(w&&k.length>0){let i=k;k=[],i.forEach(ue)}p.length>0&&N()}}function D(){if(!m)return!1;let i=t.navigator;return i&&(i.globalPrivacyControl===!0||i.webdriver===!0)?!1:!ce()}function M(){f!==null&&clearTimeout(f),f=null}function Qe(){var i;f===null&&(f=setTimeout(()=>{f=null,N()},$t),(i=f.unref)==null||i.call(f))}function et(i){try{if(typeof fetch=="function"){fetch(d,{method:"POST",body:i,keepalive:!0,credentials:"omit",headers:{"Content-Type":"text/plain"}}).catch(()=>{});return}}catch{}try{let _=t.navigator;_&&typeof _.sendBeacon=="function"&&_.sendBeacon(d,new Blob([i],{type:"text/plain"}))}catch{}}function N(i=!1){try{if(M(),p.length===0)return;if(!D()){p=[];return}if(!w)return;G(w);let _=ae(t,s),a=_?p.map(x=>({...x,client_id:_})):p;p=[],Lt(s,a,i).forEach(x=>et(x.body))}catch{}}function pe(i,_,a){var be,ve,Ee,ke,Se,Ce,we,Te,xe,Ae,Pe;if(!D())return;let x=te(i,_);if(!x.ok){o("dropped",i,x.reason);return}let $=ee(t.location.href),Y={event_id:a!=null&&a.event_id&&We.test(a.event_id)?a.event_id:Rt(),event:i,ts:Date.now(),schema_version:1,env:P,source:g,channel:y,sdk:T,page_id:S,page_type:(a==null?void 0:a.page_type)!==void 0?a.page_type:h,host:(be=$==null?void 0:$.host)!=null?be:null,path:a!=null&&a.path?O(a.path.split(/[?#]/)[0]):(ve=$==null?void 0:$.path)!=null?ve:null,referrer_host:W,utm_source:(Ee=u==null?void 0:u.utm_source)!=null?Ee:null,utm_medium:(ke=u==null?void 0:u.utm_medium)!=null?ke:null,utm_campaign:(Se=u==null?void 0:u.utm_campaign)!=null?Se:null,utm_content:(Ce=u==null?void 0:u.utm_content)!=null?Ce:null,utm_term:(we=u==null?void 0:u.utm_term)!=null?we:null,ref_code:(Te=u==null?void 0:u.ref_code)!=null?Te:null,product_id:(xe=a==null?void 0:a.product_id)!=null?xe:null,variant_id:(Ae=a==null?void 0:a.variant_id)!=null?Ae:null,order_ref:(Pe=a==null?void 0:a.order_ref)!=null?Pe:null,props:x.props};a!=null&&a.event_id&&!We.test(a.event_id)&&o("ignored invalid event_id",i),g==="dashboard"&&e.visitorId&&(Y.visitor_id=e.visitorId);let he=De(Y);if(!he.ok){o("dropped",i,he.reason);return}let Z=Y;w?ue(Z):k.push(Z),p.push(Z),p.length>=It?N():Qe()}let de=()=>N(!0),fe=()=>{document.visibilityState==="hidden"&&N(!0)},U=()=>le();return t.addEventListener("pagehide",de),document.addEventListener("visibilitychange",fe),t.addEventListener("bitsnap:consent",U),t.addEventListener("bitsnap:consent:ready",U),q(),G(w),{track(i,_,a){try{pe(i,_,a)}catch{}},page(i,_){try{i!==void 0&&(h=i),pe("page_view",{landing:v++===0},_)}catch{}},clientId(i){try{return i!==void 0&&Q(i)!==s?null:D()?ae(t,s):null}catch{return null}},flush:()=>N(),setEnabled(i){m=!!i,m||(p=[],k=[],M())},configure(i){try{(i.env==="live"||i.env==="test")&&(P=i.env),typeof i.endpoint=="string"&&i.endpoint&&(d=c(i.endpoint))}catch{}},onEvent(i){return E.add(i),()=>void E.delete(i)},destroy(){p=[],k=[],M(),E.clear(),t.removeEventListener("pagehide",de),document.removeEventListener("visibilitychange",fe),t.removeEventListener("bitsnap:consent",U),t.removeEventListener("bitsnap:consent:ready",U)}}}var Dt=["storefront","dashboard","script"],Mt=["hosted","custom_domain","embed","panel"],Ut=/^[A-Za-z0-9_-]{22}$/;function Fe(e,t,n){return e.includes(t)?t:n}function Xe(e){try{if(typeof window=="undefined")return;let t=window.bitsnap;if(t!=null&&t.loaded)return t;let n=m=>(e==null?void 0:e.getAttribute(`data-${m}`))||void 0,r=n("env"),o=Fe(Dt,n("source"),"script"),s=Fe(Mt,n("channel"),"embed"),c=o==="dashboard",d=n("visitor-id"),g=n("project")?Ze({projectKey:n("project"),env:r==="live"||r==="test"?r:void 0,endpoint:n("endpoint"),source:o,channel:s,visitorId:c&&d&&Ut.test(d)?d:void 0}):B,y=n("route-template"),T=n("page-type"),S=Ye(T)?T:void 0,u;if(c){let m=S!=null?S:"app",h;u={track:(v,p,f)=>{var E;return g.track(v,p,{...f,page_type:(E=f==null?void 0:f.page_type)!=null?E:m})},page:(v,p)=>{var E,k,b;let f=O(((k=(E=p==null?void 0:p.path)!=null?E:y)!=null?k:Je(location.pathname)).split(/[?#]/)[0]);g.track("app_page_view",h&&h!==f?{route:f,previous_route:h}:{route:f},{...p,page_type:(b=v!=null?v:p==null?void 0:p.page_type)!=null?b:m,path:f}),h=f},loaded:!0}}else u={track:(m,h,v)=>g.track(m,h,v),page:(m,h)=>g.page(m!==void 0?m:S,h),loaded:!0};let P=m=>{try{let[h,...v]=Array.prototype.slice.call(m);(h==="track"||h==="page")&&u[h](...v)}catch{}},W=Array.isArray(t==null?void 0:t.q)?t.q:[];return window.bitsnap=u,W.forEach(P),u.q={push(...m){return m.forEach(P),0}},n("auto")!=="off"&&re(()=>u.page(S!=null?S:null)),u}catch{return}}var jt=new Set(["products","orders","customers","coupons","discounts","projects","users","members","invoices","returns","carts","subscriptions","pages","posts","courses","lessons","notifications","automations","webhooks","integrations","themes","newsletters","campaigns","forms","categories","collections","variants","tags","reviews","templates","payments","shipping","tests","partners"]),Ht=new Set(["new","create","add","edit","import","export","list","settings","stats","overview","all","archive","archived","drafts","preview","duplicate","bulk","search"]),zt=/^[A-Za-z0-9_]{3,24}$/;function Je(e){let t=O(e).split("/");return t.map((n,r)=>{var s;if(!n||n.startsWith(":"))return n;if(/\d/.test(n))return":id";let o=(s=t[r-1])==null?void 0:s.toLowerCase();return o&&jt.has(o)&&!Ht.has(n.toLowerCase())&&zt.test(n)?":id":n}).join("/")}typeof document!="undefined"&&Xe(document.currentScript);return st(Kt);})();
1
+ "use strict";var BitsnapAnalyticsEmbed=(()=>{var F=Object.defineProperty;var tt=Object.getOwnPropertyDescriptor;var nt=Object.getOwnPropertyNames;var rt=Object.prototype.hasOwnProperty;var ot=(e,t)=>{for(var n in t)F(e,n,{get:t[n],enumerable:!0})},it=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of nt(t))!rt.call(e,o)&&o!==n&&F(e,o,{get:()=>t[o],enumerable:!(r=tt(t,o))||r.enumerable});return e};var st=e=>it(F({},"__esModule",{value:!0}),e);var Kt={};ot(Kt,{dashboardRoute:()=>Je,init:()=>Xe});var l={maxBatchEvents:50,maxBodyBytes:65536,maxPropsChars:4096,maxPropString:200,maxPropArray:50,host:253,path:512,referrerHost:253,utm:100,refCode:64,id:64,sdk:64,pageId:32,region:64,osBrowser:32,tsSkewMs:864e5},at=["storefront_events","app_events","business_events"],ct=["live","test"],ut=["storefront","sdk_react","script","server","dashboard"],lt=["hosted","custom_domain","embed","api","panel"],J=["shop","catalog","product","cart","checkout","payment","panel","course","custom_page","order","returns","app","other"];var pt={storefront_events:["storefront","sdk_react","script"],app_events:["dashboard"],business_events:["server"]},A={value_minor:"number",currency:"string"},$e={page_view:{landing:"boolean"},product_list_viewed:{list_id:"string?",item_count:"number"},product_impression:{list_id:"string?",product_ids:"string[]",positions:"number[]"},product_clicked:{list_id:"string?",position:"number?"},product_view:{price_minor:"number",currency:"string",availability:"enum:in_stock|out_of_stock|preorder"},variant_selected:{},add_to_cart:{qty:"number",...A},remove_from_cart:{qty:"number",...A},cart_opened:{item_count:"number",...A},checkout_started:{item_count:"number",checkout_type:"enum:single|cart|link",...A},checkout_step_completed:{step:"enum:contact|delivery|invoice|consents"},checkout_validation_error:{field:"string",rule:"string"},coupon_applied:{coupon_id:"string"},coupon_rejected:{coupon_id:"string?",reason:"string"},delivery_method_selected:{method:"string"},payment_method_selected:{gateway:"string",method:"string"},payment_submitted:{gateway:"string",method:"string"},apple_pay_clicked:{},apple_pay_result:{outcome:"enum:success|fail|cancel"},payment_returned:{gateway:"string",method:"string?",outcome:"enum:success|fail|cancel|pending",error_code:"string?"},availability_signup:{},panel_login:{},panel_order_viewed:{},panel_download:{},return_started:{},return_submitted:{reason_code:"string",item_count:"number"},course_opened:{course_id:"string"},lesson_started:{course_id:"string",lesson_id:"string",position:"number"},lesson_completed:{course_id:"string",lesson_id:"string",position:"number"},video_progress:{course_id:"string",lesson_id:"string",milestone:"number"},test_submitted:{course_id:"string",lesson_id:"string",score_bucket:"enum:0-24|25-49|50-74|75-99|100"},lesson_rated:{course_id:"string",lesson_id:"string",rating:"number"},consent_updated:{consent_id:"string",action:"enum:accept_all|reject_all|custom|withdraw",analytics:"boolean",marketing:"boolean",preferences:"boolean",banner_version:"number"}},Ie={app_page_view:{route:"string",previous_route:"string?"},insight_shown:{insight_type:"string",rank:"number",category:"string"},insight_clicked:{insight_type:"string",rank:"number",category:"string"},insight_dismissed:{insight_type:"string",rank:"number",category:"string"},checklist_step_viewed:{step:"string"},checklist_step_completed:{step:"string"},gateway_connect_started:{gateway:"string",step:"string?"},gateway_connect_completed:{gateway:"string",step:"string?"},gateway_connect_failed:{gateway:"string",step:"string?",error_code:"string?"},domain_connect_started:{},domain_connect_verified:{},domain_connect_failed:{error_code:"string?"},product_created:{product_type:"string?"},product_published:{product_type:"string?"},product_editor_section_opened:{section:"string"},feature_enabled:{feature:"string"},stats_viewed:{tab:"string"},stats_filter_changed:{tab:"string",filter:"string"},report_exported:{report:"string",format:"string?"},search_performed:{result_count:"number"},error_shown:{code:"string",route:"string"},help_opened:{topic:"string?"},ai_assistant_used:{topic:"string?"},member_invited:{role:"string"}},R={gateway:"string?",method:"string?",value_minor:"number?",currency:"string?"},C={subscription_id:"string?",value_minor:"number?",currency:"string?"},Oe={transaction_created:R,transaction_success:R,transaction_failure:{...R,error_code:"string?"},transaction_expired:R,transaction_charge:R,subscription_created:C,subscription_paused:C,subscription_resumed:C,subscription_updated:C,subscription_deleted:C,subscription_charge_paid:C,subscription_charge_failed:{...C,error_code:"string?"},subscription_past_due:C,subscription_canceled:C,access_expires_in_3_days:{},access_expired:{},cart_recovery:{value_minor:"number?",currency:"string?"},testimonial_email_send:{},testimonial_fulfilled:{},partner_commission_earned:{partner_id:"string",commission_minor:"number",currency:"string"},checkout_session_created:{item_count:"number",checkout_type:"enum:single|cart|link",gateway:"string?",...A},order_paid:{gateway:"string",method:"string?",item_count:"number?",visitor_day:"string?",items:"line_items?",...A},refund_issued:{gateway:"string?",reason:"string?",...A},return_requested:{item_count:"number",reason_code:"string?"},automation_run_completed:{automation_id:"string",status:"string",trigger:"string?"},notification_sent:{medium:"string",template:"string?"},notification_failed:{medium:"string",template:"string?",error_code:"string?"},recovery_email_sent:{step:"number?"},recovery_link_clicked:{},api_request:{endpoint:"string",client:"string?",status:"number",latency_bucket:"enum:lt_50|lt_200|lt_1000|gte_1000",sample_rate:"number"}};var dt={...$e,...Ie,...Oe},ft={storefront_events:Object.keys($e),app_events:Object.keys(Ie),business_events:Object.keys(Oe)},Re=Object.fromEntries(at.flatMap(e=>ft[e].map(t=>[t,e])));function Ve(e){return typeof e=="string"&&Object.hasOwn(Re,e)}var qt=365*24*60*60;function Q(e){let t=e.startsWith("pk_")?e.slice(3):e;return/^[A-Za-z0-9]{1,32}$/.test(t)?t:null}var gt=/^([a-z][a-z0-9-]{0,39})@(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.+-]{1,20})?)$/;function Le(e){if(!e||e.length>l.sdk)return null;let t=gt.exec(e);return t?{package:t[1],version:t[2]}:null}var V=l.utm;function I(e,t){if(e==null)return null;let n=e.trim();return n.length===0||n.includes("@")?null:n.slice(0,t)}function O(e){let n=e.split("/").map(r=>r.includes("@")||r.includes("%40")?":email":/^[A-Za-z0-9_-]{24,}$/.test(r)?":token":r).join("/")||"/";return(n.startsWith("/")?n:`/${n}`).slice(0,l.path)}function ee(e,t){let n;try{n=new URL(e,t)}catch{return null}if(n.protocol!=="https:"&&n.protocol!=="http:")return null;let r=n.searchParams;return{host:n.hostname.toLowerCase().slice(0,l.host),path:O(n.pathname),utm_source:I(r.get("utm_source"),V),utm_medium:I(r.get("utm_medium"),V),utm_campaign:I(r.get("utm_campaign"),V),utm_content:I(r.get("utm_content"),V),utm_term:I(r.get("utm_term"),V),ref_code:I(r.get("ref"),l.refCode)}}var mt=/^[A-Za-z0-9_-]{1,64}$/;function Be(e){if(!e)return null;try{let t=new URL(e);return t.protocol!=="https:"&&t.protocol!=="http:"?null:t.hostname.toLowerCase().slice(0,l.referrerHost)}catch{return null}}var Gt=new TextEncoder;function j(e){return`bs_vid_${e}`}var _t=/^[A-Za-z0-9_-]{22}$/;var yt=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,ht=/^[A-Za-z0-9_-]{8,32}$/,bt=/[^\s@]+@[^\s@]+\.[A-Za-z]{2,}\b/;function H(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function vt(e,t,n){let r=e[t];return r==null?null:typeof r!="string"?`bad_${t}`:r.length>n?`too_long_${t}`:null}function Et(e,t){let r=e.endsWith("?")?e.slice(0,-1):e;if(r.startsWith("enum:"))return typeof t=="string"&&r.slice(5).split("|").includes(t);switch(r){case"string":return typeof t=="string"&&t.length<=l.maxPropString;case"number":return typeof t=="number"&&Number.isFinite(t);case"boolean":return typeof t=="boolean";case"string[]":return Array.isArray(t)&&t.length<=l.maxPropArray&&t.every(o=>typeof o=="string"&&o.length<=l.maxPropString);case"number[]":return Array.isArray(t)&&t.length<=l.maxPropArray&&t.every(o=>typeof o=="number"&&Number.isFinite(o));case"line_items":return Array.isArray(t)&&t.length<=l.maxPropArray&&t.every(o=>H(o)&&typeof o.product_id=="string"&&mt.test(o.product_id)&&Ne(o.qty)&&Ne(o.value_minor));default:return!1}}function Ne(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0}function kt(e){return Le(e)!==null?!1:bt.test(e)}function X(e){return typeof e=="string"?kt(e):Array.isArray(e)?e.some(X):H(e)?Object.values(e).some(X):!1}function te(e,t){if(!Ve(e))return{ok:!1,reason:"unknown_event"};let n=dt[e];if(!n)return{ok:!1,reason:"unknown_event"};if(!H(t))return{ok:!1,reason:"bad_props"};let r={};for(let[o,s]of Object.entries(n)){let c=t[o];if(c==null){if(!s.endsWith("?"))return{ok:!1,reason:`props_missing_${o}`};continue}if(!Et(s,c))return{ok:!1,reason:`props_bad_${o}`};if(X(c))return{ok:!1,reason:`props_pii_${o}`};r[o]=s.startsWith("line_items")&&Array.isArray(c)?c.map(d=>({product_id:d.product_id,qty:d.qty,value_minor:d.value_minor})):c}return JSON.stringify(r).length>l.maxPropsChars?{ok:!1,reason:"props_too_large"}:{ok:!0,props:r}}function De(e,t={}){var d;let n=(d=t.from)!=null?d:"browser",r=g=>({ok:!1,reason:g});if(!H(e))return r("not_object");if(typeof e.event_id!="string"||!yt.test(e.event_id))return r("bad_event_id");if(!Ve(e.event))return r("unknown_event");let o=Re[e.event];if(n==="browser"){if(o==="business_events")return r("server_only_event");if(e.event==="consent_updated")return r("consent_via_consent_endpoint")}if(typeof e.ts!="number"||!Number.isInteger(e.ts)||e.ts<=0||e.ts>4e12)return r("bad_ts");if(e.schema_version!==1)return r("bad_schema_version");if(!ct.includes(e.env))return r("bad_env");if(!ut.includes(e.source))return r("bad_source");if(!pt[o].includes(e.source))return r("source_not_allowed_for_event");if(!lt.includes(e.channel))return r("bad_channel");if(e.sdk!=null&&(typeof e.sdk!="string"||Le(e.sdk)===null))return r("bad_sdk");if(e.page_id!=null&&(typeof e.page_id!="string"||!ht.test(e.page_id)))return r("bad_page_id");if(e.page_type!=null&&!J.includes(e.page_type))return r("bad_page_type");if(n==="browser"){if(typeof e.host!="string"||e.host.length===0)return r("bad_host");if(typeof e.path!="string"||!e.path.startsWith("/"))return r("bad_path")}if(typeof e.path=="string"&&e.path.includes("?"))return r("path_has_query");if(typeof e.path=="string"&&e.path.includes("#"))return r("path_has_fragment");let s=[["host",l.host],["path",l.path],["referrer_host",l.referrerHost],["utm_source",l.utm],["utm_medium",l.utm],["utm_campaign",l.utm],["utm_content",l.utm],["utm_term",l.utm],["ref_code",l.refCode],["product_id",l.id],["variant_id",l.id],["order_ref",l.id]];for(let[g,y]of s){let T=vt(e,g,y);if(T)return r(T)}if(e.visitor_id!=null&&(typeof e.visitor_id!="string"||!/^[A-Za-z0-9_-]{22}$/.test(e.visitor_id)))return r("bad_visitor_id");if(e.client_id!=null&&(typeof e.client_id!="string"||!_t.test(e.client_id)))return r("bad_client_id");let c=te(e.event,e.props);return c.ok?{ok:!0}:r(c.reason)}var Me="1.13.0";var ne=Symbol.for("bitsnap.pageViews");function St(e){var n;let t=e;return(n=t[ne])!=null?n:t[ne]={path:null,starters:new Set,watching:!1}}function Ct(e,t){let n=()=>{try{t()}catch{}};for(let r of["pushState","replaceState"]){let o=e.history[r];e.history[r]=function(...s){let c=o.apply(this,s);return n(),c}}e.addEventListener("popstate",n)}function re(e,t=window){try{let n=St(t),r=()=>e();n.watching||(n.watching=!0,Ct(t,()=>{var c,d;let s=t.location.pathname;s===n.path||n.starters.size===0||(n.path=s,(d=(c=n.starters.values().next()).value)==null||d.call(c))})),n.starters.add(r);let o=t.location.pathname;return o!==n.path&&(n.path=o,r()),()=>void n.starters.delete(r)}catch{return()=>{}}}function L(e){let t=new Uint8Array(e),n=typeof crypto!="undefined"?crypto:void 0;if(n&&typeof n.getRandomValues=="function")n.getRandomValues(t);else for(let r=0;r<e;r++)t[r]=Math.floor(Math.random()*256);return t}function oe(e){if(!e||/^[\d.]+$/.test(e)||e.includes(":"))return[];let t=e.split("."),n=[];for(let r=0;r<=t.length-2;r++)n.push(t.slice(r).join("."));return n}var wt=390*24*60*60,Tt=/^[A-Za-z0-9_-]{22}$/;function z(e){return e.BitsnapConsent}function xt(e,t){for(let n of e.cookie.split(";")){let r=n.indexOf("=");if(r!==-1&&n.slice(0,r).trim()===t)return n.slice(r+1).trim()}return null}function At(e){let t=e.toLowerCase();return t==="bitsnap.pl"||t.endsWith(".bitsnap.pl")}function ie(e,t){try{let n=z(e);if(!n)return!1;if(n.scope==="project")return n.projectKey===t;let r=At(e.location.hostname);return n.scope==="global"?!r:!1}catch{return!1}}function se(e,t){var n,r;try{return((r=(n=z(e))==null?void 0:n.get())==null?void 0:r.c.analytics)===!0&&ie(e,t)}catch{return!1}}function Ue(){let e="";return L(16).forEach(t=>e+=String.fromCharCode(t)),btoa(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function je(e,t){try{return xt(e,j(t))}catch{return null}}function K(e,t){let n=je(e,t);return n!==null&&Tt.test(n)?n:null}function He(e,t,n){try{let r=e.document,o=`${j(t)}=${n}; Max-Age=${wt}; Path=/; SameSite=Lax`+(e.location.protocol==="https:"?"; Secure":"");for(let s of oe(e.location.hostname).reverse())if(r.cookie=`${o}; Domain=${s}`,K(r,t)===n)return;r.cookie=o}catch{}}function ze(e,t){try{let n=e.document;if(je(n,t)===null)return;let r=`${j(t)}=; Max-Age=0; Path=/; SameSite=Lax`+(e.location.protocol==="https:"?"; Secure":"");n.cookie=r;for(let o of oe(e.location.hostname))n.cookie=`${r}; Domain=${o}`}catch{}}function ae(e,t){try{let n=e.navigator;return(n==null?void 0:n.globalPrivacyControl)===!0||(n==null?void 0:n.webdriver)===!0?null:se(e,t)?K(e.document,t):null}catch{return null}}var Nt="https://collect.bitsnap.pl",$t=5e3,It=20,Ke=32*1024,Ot=60*1024,We=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;function qe(e){return typeof TextEncoder=="function"?new TextEncoder().encode(e).length:unescape(encodeURIComponent(e)).length}var B={track(){},page(){},clientId:()=>null,flush(){},setEnabled(){},onEvent:()=>()=>{},configure(){},destroy(){}};function Rt(e=Date.now()){let t=L(16),n=e;for(let o=5;o>=0;o--)t[o]=n%256,n=Math.floor(n/256);t[6]=t[6]&15|112,t[8]=t[8]&63|128;let r=Array.from(t,o=>o.toString(16).padStart(2,"0")).join("");return`${r.slice(0,8)}-${r.slice(8,12)}-${r.slice(12,16)}-${r.slice(16,20)}-${r.slice(20)}`}var Ge="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Vt(){return Array.from(L(16),e=>Ge[e%Ge.length]).join("")}function Ye(e){return typeof e=="string"&&J.includes(e)}function Lt(e,t,n=!1){let r=qe(JSON.stringify({k:e,events:[]})),o=[],s=[],c=r,d=()=>{s.length>0&&o.push({body:JSON.stringify({k:e,events:s}),bytes:c,count:s.length}),s=[],c=r};for(let g of t){let y=qe(JSON.stringify(g));r+y>Ke||((s.length>=l.maxBatchEvents||c+y+(s.length>0?1:0)>Ke)&&d(),c+=y+(s.length>0?1:0),s.push(g))}if(d(),n){let g=0,y=o.length;for(;y>0&&g+o[y-1].bytes<=Ot;)g+=o[y-1].bytes,y--;o=o.slice(y)}return o}function Ze(e){try{return typeof window=="undefined"||typeof document=="undefined"?B:Bt(e,window)}catch{return B}}function Bt(e,t){var ge,me,_e,ye;let n=Q((ge=e.projectKey)!=null?ge:""),r=!!e.debug,o=(...i)=>{r&&console.warn("[bitsnap analytics]",...i)};if(!n)return o("invalid projectKey, tracking is off"),B;let s=n,c=i=>`${(i||Nt).replace(/\/+$/,"")}/e`,d=c(e.endpoint),g=(me=e.source)!=null?me:"sdk_react",y=(_e=e.channel)!=null?_e:"embed",T=`bitsnap-react@${Me}`,S=Vt(),u=ee(t.location.href),P=(ye=e.env)!=null?ye:"live";if(!e.env)try{new URLSearchParams(t.location.search).has("test")&&(P="test")}catch{}let W=Be(document.referrer),m=e.enabled!==!1,h=null,v=0,p=[],f=null,E=new Set;e.onEvent&&E.add(e.onEvent);let k=[],b,w=!0;function q(){var _;let i=z(t);!i||i===b||(b=i,w=!i.ready,(_=i.ready)==null||_.then(()=>{b===i&&(w=!0,le())},()=>{b===i&&(w=!0)}))}function ce(){q();try{if(!b)return!1;let i=b.get();return!!b.denied&&b.denied("analytics")||!!i&&i.c.analytics===!1}catch{return!1}}function ue(i){E.forEach(_=>{try{_(i)}catch{}})}function G(i){try{if(q(),!b||!ie(t,s))return;se(t,s)?D()&&K(t.document,s)===null&&He(t,s,Ue()):i&&ze(t,s)}catch{}}function le(){if(G(!0),ce())p=[],k=[],M();else{if(w&&k.length>0){let i=k;k=[],i.forEach(ue)}p.length>0&&N()}}function D(){if(!m)return!1;let i=t.navigator;return i&&(i.globalPrivacyControl===!0||i.webdriver===!0)?!1:!ce()}function M(){f!==null&&clearTimeout(f),f=null}function Qe(){var i;f===null&&(f=setTimeout(()=>{f=null,N()},$t),(i=f.unref)==null||i.call(f))}function et(i){try{if(typeof fetch=="function"){fetch(d,{method:"POST",body:i,keepalive:!0,credentials:"omit",headers:{"Content-Type":"text/plain"}}).catch(()=>{});return}}catch{}try{let _=t.navigator;_&&typeof _.sendBeacon=="function"&&_.sendBeacon(d,new Blob([i],{type:"text/plain"}))}catch{}}function N(i=!1){try{if(M(),p.length===0)return;if(!D()){p=[];return}if(!w)return;G(w);let _=ae(t,s),a=_?p.map(x=>({...x,client_id:_})):p;p=[],Lt(s,a,i).forEach(x=>et(x.body))}catch{}}function pe(i,_,a){var be,ve,Ee,ke,Se,Ce,we,Te,xe,Ae,Pe;if(!D())return;let x=te(i,_);if(!x.ok){o("dropped",i,x.reason);return}let $=ee(t.location.href),Y={event_id:a!=null&&a.event_id&&We.test(a.event_id)?a.event_id:Rt(),event:i,ts:Date.now(),schema_version:1,env:P,source:g,channel:y,sdk:T,page_id:S,page_type:(a==null?void 0:a.page_type)!==void 0?a.page_type:h,host:(be=$==null?void 0:$.host)!=null?be:null,path:a!=null&&a.path?O(a.path.split(/[?#]/)[0]):(ve=$==null?void 0:$.path)!=null?ve:null,referrer_host:W,utm_source:(Ee=u==null?void 0:u.utm_source)!=null?Ee:null,utm_medium:(ke=u==null?void 0:u.utm_medium)!=null?ke:null,utm_campaign:(Se=u==null?void 0:u.utm_campaign)!=null?Se:null,utm_content:(Ce=u==null?void 0:u.utm_content)!=null?Ce:null,utm_term:(we=u==null?void 0:u.utm_term)!=null?we:null,ref_code:(Te=u==null?void 0:u.ref_code)!=null?Te:null,product_id:(xe=a==null?void 0:a.product_id)!=null?xe:null,variant_id:(Ae=a==null?void 0:a.variant_id)!=null?Ae:null,order_ref:(Pe=a==null?void 0:a.order_ref)!=null?Pe:null,props:x.props};a!=null&&a.event_id&&!We.test(a.event_id)&&o("ignored invalid event_id",i),g==="dashboard"&&e.visitorId&&(Y.visitor_id=e.visitorId);let he=De(Y);if(!he.ok){o("dropped",i,he.reason);return}let Z=Y;w?ue(Z):k.push(Z),p.push(Z),p.length>=It?N():Qe()}let de=()=>N(!0),fe=()=>{document.visibilityState==="hidden"&&N(!0)},U=()=>le();return t.addEventListener("pagehide",de),document.addEventListener("visibilitychange",fe),t.addEventListener("bitsnap:consent",U),t.addEventListener("bitsnap:consent:ready",U),q(),G(w),{track(i,_,a){try{pe(i,_,a)}catch{}},page(i,_){try{i!==void 0&&(h=i),pe("page_view",{landing:v++===0},_)}catch{}},clientId(i){try{return i!==void 0&&Q(i)!==s?null:D()?ae(t,s):null}catch{return null}},flush:()=>N(),setEnabled(i){m=!!i,m||(p=[],k=[],M())},configure(i){try{(i.env==="live"||i.env==="test")&&(P=i.env),typeof i.endpoint=="string"&&i.endpoint&&(d=c(i.endpoint))}catch{}},onEvent(i){return E.add(i),()=>void E.delete(i)},destroy(){p=[],k=[],M(),E.clear(),t.removeEventListener("pagehide",de),document.removeEventListener("visibilitychange",fe),t.removeEventListener("bitsnap:consent",U),t.removeEventListener("bitsnap:consent:ready",U)}}}var Dt=["storefront","dashboard","script"],Mt=["hosted","custom_domain","embed","panel"],Ut=/^[A-Za-z0-9_-]{22}$/;function Fe(e,t,n){return e.includes(t)?t:n}function Xe(e){try{if(typeof window=="undefined")return;let t=window.bitsnap;if(t!=null&&t.loaded)return t;let n=m=>(e==null?void 0:e.getAttribute(`data-${m}`))||void 0,r=n("env"),o=Fe(Dt,n("source"),"script"),s=Fe(Mt,n("channel"),"embed"),c=o==="dashboard",d=n("visitor-id"),g=n("project")?Ze({projectKey:n("project"),env:r==="live"||r==="test"?r:void 0,endpoint:n("endpoint"),source:o,channel:s,visitorId:c&&d&&Ut.test(d)?d:void 0}):B,y=n("route-template"),T=n("page-type"),S=Ye(T)?T:void 0,u;if(c){let m=S!=null?S:"app",h;u={track:(v,p,f)=>{var E;return g.track(v,p,{...f,page_type:(E=f==null?void 0:f.page_type)!=null?E:m})},page:(v,p)=>{var E,k,b;let f=O(((k=(E=p==null?void 0:p.path)!=null?E:y)!=null?k:Je(location.pathname)).split(/[?#]/)[0]);g.track("app_page_view",h&&h!==f?{route:f,previous_route:h}:{route:f},{...p,page_type:(b=v!=null?v:p==null?void 0:p.page_type)!=null?b:m,path:f}),h=f},loaded:!0}}else u={track:(m,h,v)=>g.track(m,h,v),page:(m,h)=>g.page(m!==void 0?m:S,h),loaded:!0};let P=m=>{try{let[h,...v]=Array.prototype.slice.call(m);(h==="track"||h==="page")&&u[h](...v)}catch{}},W=Array.isArray(t==null?void 0:t.q)?t.q:[];return window.bitsnap=u,W.forEach(P),u.q={push(...m){return m.forEach(P),0}},n("auto")!=="off"&&re(()=>u.page(S!=null?S:null)),u}catch{return}}var jt=new Set(["products","orders","customers","coupons","discounts","projects","users","members","invoices","returns","carts","subscriptions","pages","posts","courses","lessons","notifications","automations","webhooks","integrations","themes","newsletters","campaigns","forms","categories","collections","variants","tags","reviews","templates","payments","shipping","tests","partners"]),Ht=new Set(["new","create","add","edit","import","export","list","settings","stats","overview","all","archive","archived","drafts","preview","duplicate","bulk","search"]),zt=/^[A-Za-z0-9_]{3,24}$/;function Je(e){let t=O(e).split("/");return t.map((n,r)=>{var s;if(!n||n.startsWith(":"))return n;if(/\d/.test(n))return":id";let o=(s=t[r-1])==null?void 0:s.toLowerCase();return o&&jt.has(o)&&!Ht.has(n.toLowerCase())&&zt.test(n)?":id":n}).join("/")}typeof document!="undefined"&&Xe(document.currentScript);return st(Kt);})();
package/dist/index.d.mts CHANGED
@@ -201,6 +201,12 @@ type CheckoutTexts = {
201
201
  paymentMethodManualDescription: string;
202
202
  /** Shown with a selected manual option that includes BLIK to a phone number. */
203
203
  paymentMethodManualBlikNote: string;
204
+ /** Cash on delivery option. */
205
+ paymentMethodCod: string;
206
+ /** Hint under the cash on delivery option. */
207
+ paymentMethodCodDescription: string;
208
+ /** Error shown when the shop refused cash on delivery for the order. */
209
+ paymentMethodCodUnavailable: string;
204
210
  };
205
211
 
206
212
  type BitsnapCartProps = {
@@ -415,9 +421,10 @@ type Err = {
415
421
  declare function Err(message: string, type?: ErrTypes, data?: unknown): Err;
416
422
 
417
423
  /**
418
- * The buyer's choice between paying online and paying the seller by hand
419
- * (bank transfer or "BLIK przelew na telefon"), offered when the seller turned
420
- * on "show at checkout" for the manual payment gateway.
424
+ * The buyer's choice between paying online, paying the seller by hand (bank
425
+ * transfer or "BLIK przelew na telefon") and paying the courier on delivery,
426
+ * offered when the seller turned on "show at checkout" for the manual payment
427
+ * gateway or offers cash on delivery.
421
428
  *
422
429
  * `POST /public-commerce/payment-methods` takes the body of `/buy` and answers
423
430
  * `{ success: true, choice: null }` (nothing to choose) or
@@ -426,10 +433,11 @@ declare function Err(message: string, type?: ErrTypes, data?: unknown): Err;
426
433
  * timeout) counts as "nothing to choose", so the cart buys as before.
427
434
  */
428
435
 
429
- type PaymentMethod = "online" | "manual";
436
+ /** `cod` is cash on delivery: the buyer pays the courier (Poland only, shipped carts). */
437
+ type PaymentMethod = "online" | "manual" | "cod";
430
438
  type ManualAccountType = "bankTransfer" | "blik";
431
439
  type PaymentMethodChoice = {
432
- /** In the seller's order; the first one is selected by default. */
440
+ /** In the seller's order (cash on delivery last); the first one is selected by default. */
433
441
  methods: PaymentMethod[];
434
442
  /** How the manual option is paid; decides its label. */
435
443
  manualAccountTypes: ManualAccountType[];
@@ -522,6 +530,7 @@ declare const linkRequestSchema: z__default.ZodObject<{
522
530
  paymentMethod: z__default.ZodOptional<z__default.ZodEnum<{
523
531
  online: "online";
524
532
  manual: "manual";
533
+ cod: "cod";
525
534
  }>>;
526
535
  couponCode: z__default.ZodOptional<z__default.ZodString>;
527
536
  redirect: z__default.ZodOptional<z__default.ZodObject<{
@@ -553,8 +562,9 @@ declare namespace Bitsnap {
553
562
  function hideCart(): void;
554
563
  }
555
564
  /**
556
- * Whether the buyer may choose between paying online and paying the seller by
557
- * transfer / BLIK to a phone number, for the cart `/buy` would get. `null`
565
+ * Whether the buyer may choose between paying online, paying the seller by
566
+ * transfer / BLIK to a phone number and paying on delivery, for the cart
567
+ * `/buy` would get. `null`
558
568
  * means nothing to choose, also when the request fails.
559
569
  */
560
570
  declare function getPaymentMethodChoice(request: LinkRequest): Promise<PaymentMethodChoice | null>;
package/dist/index.d.ts CHANGED
@@ -201,6 +201,12 @@ type CheckoutTexts = {
201
201
  paymentMethodManualDescription: string;
202
202
  /** Shown with a selected manual option that includes BLIK to a phone number. */
203
203
  paymentMethodManualBlikNote: string;
204
+ /** Cash on delivery option. */
205
+ paymentMethodCod: string;
206
+ /** Hint under the cash on delivery option. */
207
+ paymentMethodCodDescription: string;
208
+ /** Error shown when the shop refused cash on delivery for the order. */
209
+ paymentMethodCodUnavailable: string;
204
210
  };
205
211
 
206
212
  type BitsnapCartProps = {
@@ -415,9 +421,10 @@ type Err = {
415
421
  declare function Err(message: string, type?: ErrTypes, data?: unknown): Err;
416
422
 
417
423
  /**
418
- * The buyer's choice between paying online and paying the seller by hand
419
- * (bank transfer or "BLIK przelew na telefon"), offered when the seller turned
420
- * on "show at checkout" for the manual payment gateway.
424
+ * The buyer's choice between paying online, paying the seller by hand (bank
425
+ * transfer or "BLIK przelew na telefon") and paying the courier on delivery,
426
+ * offered when the seller turned on "show at checkout" for the manual payment
427
+ * gateway or offers cash on delivery.
421
428
  *
422
429
  * `POST /public-commerce/payment-methods` takes the body of `/buy` and answers
423
430
  * `{ success: true, choice: null }` (nothing to choose) or
@@ -426,10 +433,11 @@ declare function Err(message: string, type?: ErrTypes, data?: unknown): Err;
426
433
  * timeout) counts as "nothing to choose", so the cart buys as before.
427
434
  */
428
435
 
429
- type PaymentMethod = "online" | "manual";
436
+ /** `cod` is cash on delivery: the buyer pays the courier (Poland only, shipped carts). */
437
+ type PaymentMethod = "online" | "manual" | "cod";
430
438
  type ManualAccountType = "bankTransfer" | "blik";
431
439
  type PaymentMethodChoice = {
432
- /** In the seller's order; the first one is selected by default. */
440
+ /** In the seller's order (cash on delivery last); the first one is selected by default. */
433
441
  methods: PaymentMethod[];
434
442
  /** How the manual option is paid; decides its label. */
435
443
  manualAccountTypes: ManualAccountType[];
@@ -522,6 +530,7 @@ declare const linkRequestSchema: z__default.ZodObject<{
522
530
  paymentMethod: z__default.ZodOptional<z__default.ZodEnum<{
523
531
  online: "online";
524
532
  manual: "manual";
533
+ cod: "cod";
525
534
  }>>;
526
535
  couponCode: z__default.ZodOptional<z__default.ZodString>;
527
536
  redirect: z__default.ZodOptional<z__default.ZodObject<{
@@ -553,8 +562,9 @@ declare namespace Bitsnap {
553
562
  function hideCart(): void;
554
563
  }
555
564
  /**
556
- * Whether the buyer may choose between paying online and paying the seller by
557
- * transfer / BLIK to a phone number, for the cart `/buy` would get. `null`
565
+ * Whether the buyer may choose between paying online, paying the seller by
566
+ * transfer / BLIK to a phone number and paying on delivery, for the cart
567
+ * `/buy` would get. `null`
558
568
  * means nothing to choose, also when the request fails.
559
569
  */
560
570
  declare function getPaymentMethodChoice(request: LinkRequest): Promise<PaymentMethodChoice | null>;