diff --git a/public/.gitkeep.tmp b/public/.gitkeep.tmp
new file mode 100644
index 0000000..e69de29
diff --git a/public/assets/CourseView-CGpDyAB2.js b/public/assets/CourseView-CGpDyAB2.js
new file mode 100644
index 0000000..3e433ff
--- /dev/null
+++ b/public/assets/CourseView-CGpDyAB2.js
@@ -0,0 +1 @@
+import{_ as N}from"./PageHead.vue_vue_type_script_setup_true_lang-CVKjTVKY.js";import{_ as R}from"./LoadState.vue_vue_type_script_setup_true_lang-DSR9TsRc.js";import{_ as B}from"./ReadingItem.vue_vue_type_script_setup_true_lang-CRhTE-3U.js";import{d as D,p as S,q as V,A as q,c as a,h as m,i as y,r as T,E as A,G as F,o as t,F as r,b as d,m as z,a as e,t as n,e as i,y as p,s as f,k as M,x as j,B as C}from"./index-D9iqzjLD.js";import{F as P,b as O,a as $,T as Z,c as G}from"./format-bcE-cYHJ.js";const K={class:"card"},W={style:{margin:"0",display:"grid","grid-template-columns":"auto 1fr",gap:"4px 16px"}},Y={style:{margin:"0"}},H={style:{margin:"0"},class:"mono small"},I={style:{margin:"0"}},J={style:{margin:"0"}},Q={key:0,style:{margin:"10px 0 0"}},U={key:1,style:{margin:"10px 0 0"}},X=["href"],ee={class:"section","aria-labelledby":"sess-h"},se={class:"section-head"},te={class:"muted small"},ae={key:0,class:"rows"},le={class:"row-main"},oe={class:"title"},ne={class:"when"},ie={class:"muted small"},re={key:0},de={key:1,class:"badge online",style:{"margin-left":"6px"}},ue={key:2,class:"badge onsite",style:{"margin-left":"6px"}},_e={key:3},ce={key:1,class:"empty"},me={class:"section","aria-labelledby":"read-h"},ye={class:"section-head"},pe={class:"muted small"},ge={class:"rows"},ve={class:"rows"},he={key:1,class:"empty"},ke={class:"section","aria-labelledby":"mat-h"},fe={class:"section-head"},be={class:"muted small"},we={key:0,class:"rows"},xe={class:"muted small"},Be={class:"badge"},Te={key:0},ze={key:1,class:"empty"},Re=D({__name:"CourseView",props:{id:{}},setup(E){const g=E,c=S(),l=T(null),v=T("");async function h(){l.value=null,v.value="";try{l.value=await A.course(Number(g.id))}catch(u){v.value=F(u)}}V(()=>{h(),c.loadReadings()}),q(()=>g.id,()=>{h()});const _=f(()=>c.allReadings.filter(u=>u.course_id===Number(g.id))),b=f(()=>_.value.filter(u=>u.is_required)),w=f(()=>_.value.filter(u=>!u.is_required)),L=Date.now();return(u,o)=>{const x=M("router-link");return t(),a("div",null,[m(R,{ready:!!l.value,error:v.value,onRetry:o[0]||(o[0]=s=>h())},{default:y(()=>[l.value?(t(),a(r,{key:0},[m(N,{eyebrow:`${d(P)[l.value.form]} · semestr ${l.value.semester}`,title:l.value.name},{default:y(()=>[m(x,{class:"btn small ghost",to:"/przedmioty"},{default:y(()=>[...o[1]||(o[1]=[z("← Przedmioty",-1)])]),_:1})]),_:1},8,["eyebrow","title"]),e("section",K,[e("dl",W,[l.value.lecturer?(t(),a(r,{key:0},[o[2]||(o[2]=e("dt",{class:"muted"},"Prowadzący",-1)),e("dd",Y,n(l.value.lecturer),1)],64)):i("",!0),l.value.code?(t(),a(r,{key:1},[o[3]||(o[3]=e("dt",{class:"muted"},"Kod",-1)),e("dd",H,n(l.value.code),1)],64)):i("",!0),l.value.ects?(t(),a(r,{key:2},[o[4]||(o[4]=e("dt",{class:"muted"},"ECTS",-1)),e("dd",I,n(l.value.ects),1)],64)):i("",!0),l.value.assessment?(t(),a(r,{key:3},[o[5]||(o[5]=e("dt",{class:"muted"},"Zaliczenie",-1)),e("dd",J,n(l.value.assessment),1)],64)):i("",!0),l.value.elective_group?(t(),a(r,{key:4},[o[6]||(o[6]=e("dt",{class:"muted"},"Wybór",-1)),o[7]||(o[7]=e("dd",{style:{margin:"0"}},[e("span",{class:"badge alert"},"do wyboru")],-1))],64)):i("",!0)]),l.value.description?(t(),a("p",Q,n(l.value.description),1)):i("",!0),l.value.syllabus_url?(t(),a("p",U,[e("a",{href:l.value.syllabus_url,target:"_blank",rel:"noopener noreferrer"},"Sylabus",8,X)])):i("",!0)]),e("section",ee,[e("div",se,[o[8]||(o[8]=e("h2",{id:"sess-h"},"Zajęcia",-1)),e("span",te,n(l.value.sessions.length),1)]),l.value.sessions.length?(t(),a("ul",ae,[(t(!0),a(r,null,p(l.value.sessions,s=>(t(),a("li",{key:s.id,class:j({past:Date.parse(s.ends_at)${_(c)}`)),e=e.replace(/\[([^\]\n]+)\]\(([^()\s]*(?:\([^()\s]*\)[^()\s]*)*)\)/g,(i,c,r)=>{const p=T(r),a=S(_(c));if(!p)return s(a);const n=/^https?:/i.test(p)?' target="_blank" rel="noopener noreferrer nofollow"':"";return s(`${a}`)}),e=S(_(e)),e.replace(/\u0000(\d+)\u0000/g,(i,c)=>t[Number(c)]??"")}function S(o){return o.replace(/\*\*([^*\n]+)\*\*/g,"$1").replace(/(^|[\s(])\*([^*\n]+)\*(?=$|[\s).,;:!?])/g,"$1$2").replace(/(^|[\s(])_([^_\n]+)_(?=$|[\s).,;:!?])/g,"$1$2")}function q(o){if(!o)return"";const t=o.replace(/\r\n?/g,`
+`).split(`
+`),s=[];let e=0;const i=r=>r.trim()==="",c=r=>/^(#{1,6})\s/.test(r)||/^```/.test(r)||/^>\s?/.test(r)||/^\s*([-*+]|\d+[.)])\s+/.test(r)||/^(-{3,}|\*{3,}|_{3,})\s*$/.test(r);for(;e${_(n.join(`
+`))}`);continue}const p=/^(#{1,6})\s+(.*?)\s*#*\s*$/.exec(r);if(p){const n=Math.min(p[1].length+1,6);s.push(`
"),e++;continue}if(/^>\s?/.test(r)){const n=[];for(;e${q(n.join(`
+`))}
`);continue}const a=/^\s*([-*+]|\d+[.)])\s+(.*)$/.exec(r);if(a){const n=/\d/.test(a[1]),v=[];for(;e${v.join("")}
`:`${v.join("")}
`);continue}const m=[r];for(e++;e
F?Fe(d,b,_,!0,!1,P):$(h,m,y,b,_,x,A,R,P)},Et=(d,h,m,y,b,_,x,A,R)=>{let E=0;const F=h.length;let P=d.length-1,L=F-1;for(;E<=P&&E<=L;){const H=d[E],W=h[E]=R?ft(h[E]):tt(h[E]);if(rn(H,W))w(H,W,m,null,b,_,x,A,R);else break;E++}for(;E<=P&&E<=L;){const H=d[P],W=h[L]=R?ft(h[L]):tt(h[L]);if(rn(H,W))w(H,W,m,null,b,_,x,A,R);else break;P--,L--}if(E>P){if(E<=L){const H=L+1,W=H