No description
  • JavaScript 78.7%
  • CSS 12.8%
  • HTML 8.5%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-09-18 14:39:06 +02:00
app.js Endringer i finalerangering 2026-09-18 14:39:06 +02:00
browser.test.cjs Endringer i finalerangering 2026-09-18 14:39:06 +02:00
index.html Endringer i finalerangering 2026-09-18 14:39:06 +02:00
OVERLEVERING.md Endringer i finalerangering 2026-09-18 14:39:06 +02:00
README.md Endringer i finalerangering 2026-09-18 14:39:06 +02:00
screen-host.js Endringer i finalerangering 2026-09-18 14:39:06 +02:00
screen.css nytt storskjermvindu 2026-09-18 11:44:38 +02:00
screen.html Endringer i finalerangering 2026-09-18 14:39:06 +02:00
screen.js Endringer i finalerangering 2026-09-18 14:39:06 +02:00
style.css Endringer i finalerangering 2026-09-18 14:39:06 +02:00
timer-ui.js nytt storskjermvindu 2026-09-18 11:44:38 +02:00
timer.js Initial commit 2026-09-15 15:25:01 +02:00
timer.test.js Initial commit 2026-09-15 15:25:01 +02:00
tournament.js Endringer i finalerangering 2026-09-18 14:39:06 +02:00
tournament.test.js Endringer i finalerangering 2026-09-18 14:39:06 +02:00

Kampklar

Et lokalt turneringsverktøy på norsk. Åpne index.html i en moderne nettleser. Ingen installasjon, server eller internett er nødvendig. Alle ressurser ligger i prosjektet.

Bruk

  1. Velg antall lag, skriv inn lagnavn og angi antall samtidige kamper.
  2. Velg utslagsturnering, gruppespill + sluttspill eller alle mot alle. Ved gruppespill velger du antall grupper og hvor mange lag som går videre fra hver gruppe. Slå eventuelt på ekstrakamper og/eller bronsefinale, og trykk «Trekk lag og start turnering».
  3. Start en klar kamp og klikk på laget som vinner. Gruppepoeng og sluttspill oppdateres automatisk.
  4. «Rett vinner» endrer en registrert vinner etter bekreftelse. Avhengige kamper nullstilles. Ved retting av en gruppekamp settes begge sluttspill opp på nytt; øvrige gruppekamper bevares.
  5. Eksporter JSON som sikkerhetskopi, eller importer filen på en annen maskin for å fortsette.

Lagnavn beholdes i oppsettet når du reduserer antall lag og øker det igjen, også etter omlasting. Bare valgt antall lag tas med ved start. Åpne gruppelister beholdes ved kampoppdateringer, og tastaturfokus følger samme kamp når knappene endres. Hvis kampen ikke lenger har en synlig knapp, flyttes fokus til kampsentralen.

Ved utslagsturnering uten gruppespill fordeles frirunder tilfeldig og teller ikke som spilte kamper. Med ekstrakamper deltar lag som taper sin første spilte kamp i et eget utslagsspill etter hovedfinalen. Dette gir alle minst to spilte kamper når ekstraspillet fullføres. Ved bare ett kvalifisert lag (kan skje med to eller tre lag) deltar hovedvinneren som motstander i ekstrakampen. Retting i hovedturneringen nullstiller også tapersluttspillet i denne modusen. Tapersluttspillet påvirker ikke turneringsvinneren.

Én turnering er aktiv om gangen. Bruk separate JSON-filer for forskjellige spill. «Nytt oppsett» lar deg beholde navn og innstillinger, men fjerner trekning og resultater etter bekreftelse. Verktøyet støtter 2–64 lag, og er først og fremst utformet for 5–10.

Lagring

Oppsett og resultater lagres automatisk i nettleserens localStorage. Tilgjengeligheten for lokale filer varierer mellom nettlesere, og data følger ikke automatisk med hvis du flytter filene, bytter nettleser eller maskin. Ta JSON-sikkerhetskopi før du lukker en viktig turnering. Nettsiden varsler dersom lagring feiler. JSON-import valideres før gjeldende turnering erstattes.

Gruppespill + sluttspill

  • Lag trekkes tilfeldig til jevnest mulig grupper, med minst to lag i hver. Alle møter alle i egen gruppe én gang.
  • Velg hvor mange som går videre fra hver gruppe. Antallet kan ikke overstige størrelsen på den minste gruppen, og det må være minst to lag totalt i hovedsluttspillet. Oppsettet viser antall kamper før start.
  • Én seier gir ett poeng. Ved poenglikhet telles seire i innbyrdes kamper mellom alle lagene med samme poengsum. Ved fortsatt likhet avgjør en tilfeldig loddrekkefølge som trekkes ved opprettelse og lagres i JSON. Den endres ikke ved omlasting eller retting. Lavere loddnummer vinner; numrene vises når lodd avgjør en ferdig gruppetabell.
  • Hovedsluttspillet settes opp når alle gruppekamper er ferdige. Gruppevinnere seedes først, deretter andreplasser osv.; innenfor samme plassering brukes grupperekkefølgen. Frirunder går til høyere seedede lag. To grupper med to videre gir 1. plass i gruppe 1 mot 2. plass i gruppe 2, og omvendt. Andre gruppeantall bruker et vanlig seedet kamptre; det garanterer ikke at lag fra samme gruppe unngår hverandre.
  • Valgfrie ekstrakamper er et separat utslagsspill for lag som ikke går videre. Det opprettes bare dersom minst to lag er aktuelle, og kan spilles samtidig med hovedsluttspillet. Retting i hovedsluttspillet påvirker ikke dette ekstraspillet.
  • Retting av en gruppekamp nullstiller begge sluttspill etter bekreftelse. De opprettes på nytt fra oppdaterte gruppeplasseringer; øvrige gruppekamper og loddrekkefølgen bevares.

Gruppetabellene avgjør kvalifisering. Resultatoversikten nederst viser plasseringer fra finalene og status for øvrige lag. Seire fra alle deler av turneringen vises som statistikk.

Alle mot alle

  • Alle lag møter hverandre én gang. Oppsettet viser totalt antall kamper før start; 8 lag gir 28 kamper. Støtter 2–64 lag.
  • «Ekstrakamper for tapende lag» og «Bronsefinale» slås av og deaktiveres. De forblir avslått dersom du bytter tilbake til en annen turneringsform.
  • Én seier gir ett poeng. Tabellen viser plassering, lag, spilte kamper, seire, tap, poeng og innbyrdes seire. Pågående kamper teller ikke.
  • Ved poenglikhet telles seire i innbyrdes kamper mellom alle lagene med samme poengsum, én gang uten ny beregning for undergrupper. Ved fortsatt likhet deles plasseringen (for eksempel 1, 1, 3), med alfabetisk visning innenfor delt plass. Ingen loddtrekning.
  • Tabellen er foreløpig til alle kampene er ferdige. Da kåres førsteplassen som turneringsvinner; delt førsteplass gir flere vinnere.
  • Kampsentralen viser pågående og klare kamper. «Alle kamper» kan åpnes for å vise og rette tidligere resultater. Retting oppdaterer tabellen og eventuell vinner uten å endre andre kamper.
  • Samtidighetsgrensen gjelder, og samme lag kan ikke spille flere kamper samtidig. Det opprettes ikke sluttspill.
  • Lagring, omlasting, import/eksport og «Nytt oppsett» støttes som for andre turneringsformer. Alle mot alle bruker JSON-versjon 4, som eldre programutgaver ikke kan åpne. Denne utgaven kan fortsatt importere versjon 1–3.

Bronsefinale

«Bronsefinale» er et eget valg under ekstrakamper i oppsettet, avslått som standard. Det kan brukes med utslagsturnering og gruppespill + sluttspill og samtidig med ekstrakamper. Det krever minst fire lag i hovedsluttspillet (ved gruppespill: minst fire lag videre totalt).

Taperne av hovedsluttspillets to semifinaler møtes om tredjeplassen. Kampen blir spilleklar når begge semifinalene er ferdige og kan spilles før, samtidig med eller etter finalen. Samtidighetsgrensen gjelder, og samme lag kan ikke spille bronsefinale og ekstrakamp samtidig. Bronsevinneren vises i egen seksjon som tredjeplass og får én seier i statistikken. Taperen av bronsefinalen får fjerdeplass. Hovedfinalen avgjør turneringsvinneren.

Retting av en semifinale eller en tidligere kamp som påvirker den nullstiller bronsefinalen. Retting av en gruppekamp nullstiller også bronsefinalen sammen med sluttspillene. Retting av selve finalen eller ekstraspillet bevarer bronsefinalen; retting av bronsefinalen påvirker ikke andre kamper.

Valget beholdes ved «Nytt oppsett». Turneringer med bronsefinale eksporteres som JSON-versjon 3; denne utgaven kan fortsatt importere versjon 1 og 2 uten bronsefinale. Eldre utgaver av programmet kan ikke åpne versjon 3.

Resultatoversikt og sluttplassering

I utslagsturnering og gruppespill + sluttspill vises Resultatoversikt med plass, lag, status, spilte kamper og seire.

  • Hovedfinalens vinner får førsteplass, og taperen får andreplass.
  • Bronsefinalens vinner får tredjeplass, og taperen får fjerdeplass.
  • Hver plassering vises først når den aktuelle finalen er ferdig. Bronseplassene kan være avgjort før hovedfinalen.
  • Uten bronsefinale vises semifinaletaperne som «Utslått i semifinale», uten numerisk plass. Andre utslåtte lag vises med utslagsrunde eller «Utslått i gruppespill».
  • Underveis vises status som «I gruppespill», «Videre til sluttspill», «I hovedsluttspillet», «Klar for finale» eller «Skal spille bronsefinale». Pågående finaler merkes som pågående.
  • Spilte kamper og seire inkluderer gruppespill, hovedsluttspill, bronsefinale og ekstraspill. Frirunder teller ikke. Statistikken avgjør ikke sluttplasseringen, og ekstraspillet endrer aldri hovedplasseringene.
  • Avgjorte numeriske plasser vises først, deretter aktive lag, så utslåtte lag etter hvor langt de kom. Alfabetisk rekkefølge innen samme status er bare for visning.

Oversikten beregnes fra kampresultatene og oppdateres ved retting, angring, import og omlasting. Hvis en finale nullstilles, fjernes også dens tidligere plasseringer frem til kampen avgjøres igjen. Alle mot alle beholder poengtabellen og muligheten for delte plasseringer og vinnere.

Kampkø, lagnavn og angring

Kampsentralen viser alle pågående kamper og opptil fire anbefalte neste kamper uten overlappende lag. Lag med færrest spilte kamper prioriteres: først lavest kampantall for det mest aktive laget i paret, deretter lavest samlet antall. Frirunder teller ikke. Ved likhet brukes eksisterende kamprekkefølge. «Vis alle klare kamper» lar deg velge selv; kapasitet og opptatte lag kontrolleres fortsatt.

«Endre lagnavn» åpner en dialog for skrivefeil eller nye navn. Navnet må være unikt, ha 1–60 tegn og kan ikke være tomt. ID, trekning og resultater beholdes. Navnet oppdateres i alle oversikter, JSON-eksport og ved «Nytt oppsett».

«Angre» gjenoppretter tilstanden før siste start, stopp, vinnerregistrering, retting eller navneendring. Det omfatter også senere kamper og trekninger som ble nullstilt ved retting. Det er ett angresteg, uten «Gjør om». Avbrutte, ugyldige eller uendrede handlinger beholder angresteget. Eksport påvirker det ikke. Omlasting, vellykket import og «Nytt oppsett» tømmer historikken. Timeren påvirkes ikke.

Ved poenglikhet vises en utfellbar forklaring under lagnavnet. Den viser hvilke lag som sammenlignes, innbyrdes seire og eventuelle loddnumre. Forklaringene er foreløpige til relevante kamper er ferdige. Reglene er uendret: gruppespill bruker innbyrdes og lodd, alle mot alle bruker innbyrdes og delt plassering, resultatoversikten i turneringer med finaler bruker finaleplassering og utslagsstatus uten poenglikhetsforklaringer.

Storskjerm

Trykk «Åpne storskjerm» under en aktiv turnering. Et eget publikums­vindu åpnes på samme maskin. Flytt vinduet til en tilkoblet skjerm og trykk «Fullskjerm» der. Arrangørvinduet brukes fortsatt til å styre kamper og timer. Hvis nettleseren blokkerer vinduet, tillat sprettoppvinduer og prøv igjen.

Storskjermen viser pågående kamper, anbefalte neste kamper, tabell, timer og eventuelle turneringsvinnere. Gruppespill viser gruppetabeller frem til alle gruppekamper er ferdige og bytter deretter til resultatoversikten. Alle mot alle viser hovedtabellen; utslagsturnering viser resultatoversikten. Statistikk i resultatoversikten merkes «Seire». Lange tabeller deles i sider med åtte lag, og pågående kamper deles i sider med fire. Sidene byttes hvert tiende sekund.

Visningen er skrivebeskyttet. Timeren følger arrangøren og spiller ikke egen alarmlyd. Arrangørvinduet må holdes åpent. Hvis forbindelsen forsvinner eller vinduet suspenderes, merkes publikumsvisningen som frakoblet etter omtrent 6,5 sekunder, og timer og sidebytte fryses. Når oppdateringer kommer tilbake, synkroniseres visningen automatisk. Etter omlasting av arrangørvinduet: trykk «Åpne storskjerm» igjen. Den separate timerens vanlige regel gjelder fortsatt: omlasting avslutter nedtellingen.

Alle filene, inkludert screen.html, må ligge sammen. Kommunikasjonen skjer direkte mellom lokale vinduer uten server eller nettverk. Storskjermen har ingen egen lagring.

Separat timer

Åpne fanen «Timer» øverst. Timeren kan brukes uten turnering, og fortsetter mens du registrerer kamper i turneringsfanen. Gjenværende tid vises også ved faneknappen.

  • Velg 0–99 minutter og 0–59 sekunder (minst ett sekund). Standard er fem minutter.
  • Trykk «Start», «Pause», «Fortsett» eller «Tilbakestill». Tilbakestilling stopper nedtellingen og går tilbake til valgt tid. Tilbakestill før du endrer tid eller alarmer.
  • «Varsel før slutt» gir ett kort pip ved valgt antall sekunder igjen, standard åtte. Grensen må være kortere enn total varighet.
  • «Sluttalarm» gir tre korte pip ved null. Begge lydvalg er uavhengige og avslått som standard. Bruk «Test lyd» til å kontrollere lydavspilling.
  • Timeren stopper på 00:00 og viser «Tiden er ute», også uten lyd.

Timerinnstillingene lagres separat i nettleseren og følger ikke med i turneringens JSON-fil. Omlasting eller lukking avslutter aktiv nedtelling; neste åpning starter med valgt varighet, klar til start. Turneringens omstart, import og kampregistrering påvirker ikke timeren.

Lyd genereres lokalt uten lydfiler eller nettverk. Nettleser, dempet lyd eller hvilemodus kan hindre alarmen. Etter suspensjon oppdateres tiden fra sluttidspunktet uten å spille varsler som er blitt forsinket med ett sekund eller mer. Siden viser beskjed hvis lyd eller lagring ikke er tilgjengelig.

Utvikling og tester

Vanlig HTML, CSS og JavaScript, uten eksterne avhengigheter eller byggetrinn. tournament.js inneholder turneringsreglene; app.js håndterer visning og lagring. Utslagsturneringer uten bronsefinale bruker fortsatt JSON version: 1, og tidligere filer kan importeres. Gruppeturneringer uten bronsefinale bruker version: 2 med gruppeinnstillinger, gruppelag, lagret loddrekkefølge og gruppekamper i tillegg til sluttspill. Eldre utgaver av nettsiden kan ikke åpne versjon 2. Turneringer med bronsefinale bruker version: 3, med eksplisitt turneringsform, bronze: true og bronzeMatch. Alle mot alle bruker version: 4, mode: 'round-robin' og en samlet matches-liste. main er tom, extra og bronzeMatch er null, og extras og bronze er false. Det lagres ingen loddrekkefølge. Ukjente versjoner avvises.

Kjør logikktestene med Node.js 18 eller nyere:

node --test tournament.test.js timer.test.js

Nettlesertester

browser.test.cjs er en repeterbar utviklingstest med Playwright og Chromium. Selve nettsiden har fortsatt ingen eksterne avhengigheter. Testen bruker isolerte nettleservinduer, lokal filåpning og deaktivert nettverk, og sjekker blant annet angring, navneendring, kampkø, storskjerm, timer, frakobling og mobilvisning.

Installer testverktøy i en separat mappe (bruk en Node-versjon som støttes av din Playwright-utgave):

npm install --prefix /tmp/kampklar-tests playwright
PLAYWRIGHT_BROWSERS_PATH=/tmp/kampklar-browsers node /tmp/kampklar-tests/node_modules/playwright/cli.js install chromium
NODE_PATH=/tmp/kampklar-tests/node_modules PLAYWRIGHT_BROWSERS_PATH=/tmp/kampklar-browsers node browser.test.cjs

Testen er kontrollert med Playwright 1.51.1. Sett eventuelt SCREENSHOTS_DIR=/tmp/kampklar-review for å lagre skjermbilder. Linux-maskiner må ha Chromiums systembiblioteker installert. Logikktestene krever fortsatt bare Node.