# Startblock – lektionsformat (v2) ## Lektionspaket (.startblock) – rekommenderat Ett lektionspaket är en vanlig **zip-fil** med filändelsen `.startblock`: ``` L1-losenord-ak3.startblock ├── lektion.json ← lektionen (formatet nedan) └── media/ ← riktiga filer: jpg/png/gif/webp/svg, mp4/webm, mp3/ogg/wav/m4a, pdf ├── instruktionskort-A5.pdf └── ... ``` - Block pekar på filer i paketet med relativ sökväg: `"src": "media/instruktionskort-A5.pdf"`. - YouTube, X-inlägg och länkar ligger kvar som URL:er i `lektion.json` (de bäddas in från nätet). - Paketet kan döpas om till `.zip` och öppnas i vilket zip-program som helst; filerna är i sitt originalformat. - **Import** (startsidan: filväljare eller dra-och-släpp) packar upp till webbläsarens IndexedDB: lektionen som JSON, varje mediafil som Blob. Inga data:-URL:er och ingen 5 MB-gräns som i localStorage. - **Export** packar lektionen plus de mediafiler den faktiskt använder till en ny `.startblock`. - I redigeringen hamnar uppladdade bilder, gif:ar, videor, ljud och PDF:er som `media/`. - Gamla lektioner i localStorage (v1, med data:-URL:er) migreras automatiskt till IndexedDB vid första besöket; data:-URL:er blir filer i `media/`. Originalet sparas under nyckeln `startblock.lektioner.migrerad`. - Stora videor gör paketet tungt. Över ~100 MB varnar appen; lägg hellre upp sådana som olistade på YouTube. ## Serverlektioner Lägg filen i `lektioner/` och lista den i `lektioner/index.json`. Både paket och ren JSON stöds: `{"lektioner": ["L1-losenord-ak3.startblock", "annan.json"]}`. ## Ren JSON (v1, stöds fortfarande) En lektion kan också vara en enskild JSON-fil (UTF-8). Den kan då bara referera till media via URL, sökväg på servern eller data:-URL (data:-URL:er görs om till media-filer vid import). ```json { "id": "l1-losenord-ak3", "titel": "Byta lösenord", "serie": "Digital teknik", "nummer": 1, "grupp": "Åk 3", "minuter": 40, "datum": "2026-11-03", "block": [ { "typ": "rubrik", "text": "Byta lösenord" } ] } ``` Alla block får också ha `minuter` (visas i lärarläget) och `not` (lärarnotering till blocket, syns bara i lärarläget). Fält för elevtavlan (alla valfria): - `dold` (bool) – objektet döljs på elevtavlan (`#/elev/`) men syns nedtonat för läraren. - `standardOppen` (bool) – för video, ljud, YouTube, X, PDF, timer, steg och länk: kortet är utfällt från start för eleverna. Varje elevs egna öppna/stängda kort sparas sedan lokalt i webbläsaren (`localStorage`, nyckel `startblock.oppna.`). - `bid` (sträng) – stabilt id för objektet, skapas automatiskt. Elevtavlan visar aldrig planeringsdata: inga `minuter`, `not`, `lararnot`-block eller dolda objekt. Lärarläget (`#/vis/`) är samma objekt plus planeringen, och med "Redigera tavlan" kan läraren lägga till, ta bort (med ångra), flytta (dra och släpp), dölja och redigera objekt direkt på tavlan. | typ | fält | |---|---| | `rubrik` | `text`, `undertext?` | | `text` | `text` (markdown-light: `**fet**`, `*kursiv*`, `` `kod` ``, `[text](url)`, `- lista`, `1. lista`, `## rubrik`) | | `bild` | `src` (`media/…`, URL eller data:image/…; gif fungerar), `alt`, `bildtext?` | | `youtube` | `url` (watch, youtu.be, shorts, embed; `t=` stöds), `titel?` → youtube-nocookie.com/embed | | `x` | `url` (x.com eller twitter.com) → officiell widgets.js, länk som reserv | | `lank` | `url`, `text`, `beskrivning?` | | `pdf` | `src` (`media/fil.pdf`, `lektioner/fil.pdf` eller URL), `titel?` | | `video` | `src` (`media/fil.mp4`/`.webm` eller URL), `titel?`, `bildtext?`, `affisch?` (bild), `loop?` (bool) → HTML5 `