// Regler — tabbed rule sections for trios / quads / killrace / liga / switcharoo.

const RULES = {
  killrace: [
    { h: "FORMAT — CMG KILL RACE", body: [
      "Killrace-turneringer følger CheckMate Gaming (CMG) sitt offisielle Kill Race-regelsett.",
      "Laget med flest kills på tvers av spilte maps vinner. Placement teller ikke direkte.",
      "Map 3-host: avgjøres av hvilket lag som hadde flest kombinerte kills på map 1 + 2.",
      "Min. 80 spillere kreves for å starte BR-game (gjelder ikke Resurgence-modes).",
    ]},
    { h: "PC + PLATFORM-REGEL", body: [
      "Aksepterer en PC-spiller en match med 'PC Players Not Allowed' MÅ matchen kanselleres umiddelbart — gjelder både Live Supported og Ticket Supported.",
      "Hvis matchen startes/spilles ut → utfallet står, uansett hvilke plattformer som ble brukt.",
    ]},
    { h: "STREAM-KRAV — LIVE SUPPORTED MATCHES", body: [
      "Du er ansvarlig for å streame HVER match med Past Broadcasts ENABLED — uansett om motstander ber om det eller ikke.",
      "Kan motstander ikke vise stream-bevis før match-start → behandle det som no-show. Dispute → request admin i match chat.",
      "Admin kan i noen tilfeller godkjenne stream på sitt skjønn (i match chat).",
      "Hver spiller er ansvarlig for at motstander har riktig game-audio + comms FØR matchen fullføres. Fullført map replayes IKKE på grunn av audio-issues.",
    ]},
    { h: "STREAM-KRAV — TICKET SUPPORT MATCHES", body: [
      "Hvert lag er ansvarlig for at ALLE PC-spillere streamer med Past Broadcasts ENABLED før start.",
      "Matcher spilt ut i sin helhet TELLER, uansett om de ble streamet eller ikke.",
      "Kan motstander ikke vise stream-bevis før match-start → behandle som no-show. Laget forfeit'er hvert map om stream ikke er tilgjengelig i no-show-perioden.",
    ]},
    { h: "PAST BROADCASTS (ENABLING)", body: [
      "Etter aktivering av Past Broadcasts MÅ du slå streamen av og på igjen for at innstillingen lagres.",
      "Spillere MÅ la Past Broadcasts stå oppe MINIMUM 24 timer etter matchen — sikrer bevis ved hacking-anklager.",
    ]},
    { h: "ANTI-CHEAT (ZERO TOLERANCE)", body: [
      "Bruk av cheats / 3rd party software/device = PERMANENT BAN fra plattformen.",
      "Admin kan kreve ekstra bevis fra mistenkte. Manglende bevis = ban eller forfeit av matchen.",
    ]},
    { h: "NO SHOW — LIVE SUPPORTED", body: [
      "Hver match har 10 minutter fra avtalt tidspunkt på å joine/hoste. Etter det → klikk 'no show' + 'request administrator'.",
      "Admin gir motstander en ekstra frist (varierer på admins skjønn). Brudd på admin-frist = forfeit av map/match.",
    ]},
    { h: "NO SHOW — TICKET SUPPORTED", body: [
      "10 min fra avtalt tid på å joine/hoste. Mellom maps: 5 min på join/invite.",
      "Hvis motstander ikke joiner innen 10 min: bevis kreves (minimum 5 min video fra 5-10 min etter match-start, MED timestamps).",
      "Inkluder forsøk på å invite/joine i videoen. Timestamps (bevis på klokkeslett) er PÅKREVD.",
      "Trenger du å spille flere maps: 5-min video PER map (ny videoperiode for hver map).",
      "Beste bevis er full live-stream fra din kanal. VOD-bevis må ha timestamps fra incidentet — ellers ignoreres det.",
    ]},
    { h: "HOSTING OG TIES", body: [
      "Map 3-host: laget med flest kombinerte kills på map 1+2 er host.",
      "Tie i kills: matchen MÅ replayes inntil en vinner kommer frem.",
      "Tie i survival: laget med flest kills vinner mapen.",
    ]},
    { h: "DISCONNECTS — LIVE SUPPORT", body: [
      "Teammate disconnect: hvis du fortsatt kan vinne matematisk, MÅ du forlate spillet umiddelbart. Replay krever gyldig disconnect-bevis i match chat.",
      "Server-disconnect mens du leder i kills → replay fra kill-count på det tidspunktet. Ta bevis av scoreboard umiddelbart.",
      "Dev Error / Scan and Repair → replay fra kill-count på disconnect-tidspunktet. Teammate som fortsatt er inne MÅ forlate.",
      "Intensjonell disconnect for å få replay = forfeit + ban fra plattformen.",
    ]},
    { h: "DISCONNECTS — TICKET SUPPORT", body: [
      "Teammate disconnect: hvis du fortsatt kan vinne matematisk, MÅ du forlate spillet umiddelbart.",
      "Server-disconnect mens du leder i kills → replay fra kill-count på det tidspunktet (ta bevis umiddelbart).",
      "Dev Error / Scan and Repair → replay fra kill-count på disconnect. Teammate fortsatt inne MÅ forlate.",
      "Intensjonell disconnect = forfeit + ban.",
    ]},
    { h: "LAG / PACKET LOSS", body: [
      "Du har til flyet er ferdig med sin planlagte rute på å forlate lobbyen pga. server-lag eller packet loss.",
      "Bevis MÅ gis til admin. Du kan ikke forlate matchen uten grunn.",
    ]},
    { h: "GLITCHES — LIVE SUPPORT", body: [
      "In-game glitch: bevis kreves for replay. Du MÅ forlate spillet umiddelbart etter glitchen for å få replay.",
      "FPS/texture glitch som påvirker spillet negativt: du har til flyet er ferdig med ruten på å forlate lobbyen.",
      "FPS/texture glitch mid-game: request admin i match chat + lever clip for vurdering.",
    ]},
    { h: "GLITCHES — TICKET SUPPORT", body: [
      "In-game glitch: bevis kreves for replay.",
      "FPS/texture glitch: du har til flyet er ferdig med ruten på å forlate lobbyen.",
      "FPS/texture glitch mid-game: spill matchen ferdig og lever bevis via match dispute ticket.",
      "Admin avgjør om hel-replay eller replay fra kill-count basert på alvorlighet.",
    ]},
    { h: "KILLS ETTER DØD + RESETS", body: [
      "30 sek etter at siste spiller på laget er fullt drept (ikke knocked) avgjør score vinneren.",
      "Pull motstander ut av spillet innen 30 sek etter at de knocker en enemy = risiko for forfeit.",
      "Replay-bonus: spillere som IKKE brukte gulag/respawn-token i original-matchen får +1 kill bonus i replay.",
      "Forlate tidlig mens du er død — uten grunn — kan gi replay eller forfeit (admins skjønn).",
    ]},
    { h: "RESTRICTED ITEMS", body: [
      "FORBUDT: Gulag Kit, Redeploy Kit, Reinforcement Flare.",
      "Plukker du opp et restricted item ved uhell → mist gulag og/eller down deg selv ved respawn.",
      "Free redeploy ved start: TILLATT. Plukke opp ekstra redeploy-tokens og bruke dem = forfeit.",
    ]},
    { h: "SABOTAGE OG GRIEFING", body: [
      "Sabotage = handling som forverrer motstanders gameplay. Forfeit krever direkte påvirkning på matchens utfall (du må matematisk kunne vinne).",
      "I motstanders vehicle: du godtar driverens handlinger (fly ut av zone, fly inn i bygg, hoppe ut osv.).",
      "FORBUDT: excessive ping for å overstyrre lyd, skyte uten grunn på motstanders lokasjon, callout i proximity chat, skyte balloon/zipline (når aktivt brukt).",
      "Mange former for sabotage finnes — hold avstand til motstander for å unngå disputes.",
    ]},
    { h: "GAMEPLAY-EVENTER", body: [
      "Helikoptre: TILLATT som default, med mindre annet er spesifisert i match details. Brudd = map forfeit.",
      "Redeploy Towers (BO Royale): revive teammate via tower er TILLATT.",
      "Begge dine spillere døde + motstander bruker redeploy tower → du MÅ down deg selv umiddelbart ved respawn. Får du kills etter at laget er fullt dødt = risiko for forfeit.",
      "Jailbreak: når begge i laget er fullt døde (ikke gulag) er det final score. Etter det MÅ du down deg selv ved respawn (floating med parachute er strikt forbudt).",
      "Go Again event: max én gulag per match. Får du kill etter Go Again → down deg selv umiddelbart, killen teller ikke.",
    ]},
    { h: "FORBUDT TAKTIKK", body: [
      "Killing AFKs: vente til slutten av flylinjen for å drepe AFK-spillere er IKKE tillatt. Bevis kreves.",
      "Taking knocks hostage: holde motstanders knock for å stjele kill er IKKE tillatt.",
      "Loadout glitches: droppe våpen i pre-game lobby og lande på dem ved match-start er BANNET i ALLE Warzone-matcher.",
      "Lande på random loadout-våpen fra annen spiller er OK — kun planlagt drop er forbudt.",
    ]},
    { h: "DØD TIL HACKER — LIVE SUPPORT", body: [
      "Mistanke om hacker: spill matchen ut, lever bevis til admin i match chat etterpå.",
      "Bekreftet hacker → matchen replayes fra score-tidspunktet det skjedde.",
      "Forlate matchen for tidlig pga. mistenkt hacker (som ikke er bekreftet) = forfeit. Alle matcher skal fullføres.",
    ]},
    { h: "DØD TIL HACKER — TICKET SUPPORT", body: [
      "Mistanke om hacker: spill matchen ut, kommuniser med motstander om bevis.",
      "Bekreftet hacker → matchen replayes fra score-tidspunktet det skjedde.",
      "Forlate tidlig uten bekreftelse = forfeit. Alle matcher skal fullføres.",
    ]},
    { h: "SUBMITTING PROOF", body: [
      "Alle bevis MÅ være i video-format. Bruk konsollens DVR-feature — ellers risikerer du 'Insufficient proof'.",
      "Bevis må vise hele scoreboard med gamertags og all relevant game-info, klart nok for staff å lese.",
      "Kan du ikke gi gyldig bevis: risiko for loss eller replay.",
      "Conversations utenfor CMG er IKKE gyldig bevis (Twitter, PM, Skype, Xbox Live/PSN-meldinger).",
    ]},
    { h: "ACTIVISION ID", body: [
      "Activision ID MÅ matche eksakt slik det vises i Call of Duty-profilen din, inkludert #-nummer.",
      "ID mismatch på match details → behandle som no-show.",
      "Activision ID finnes: top right av multiplayer-meny, eller Options → Account → Activision Account.",
      "Match spilt ferdig med feil ID = utfall står (du kan ikke disputere etterpå).",
      "Admin kan i noen tilfeller godkjenne gamertag via live support — motstander varsles.",
    ]},
    { h: "KILDE", body: [
      "Reglene er basert på CheckMate Gaming (CMG) sitt offisielle Kill Race-regelsett.",
      "WZN følger CMG-formatet for Killrace-turneringer.",
      "Kontakt #regler på Discord ved tvil — admin har siste ord.",
    ]},
  ],
  "liga-bigmap": [
    { h: "FORMAT — WSOW BIG MAP (TRIOS)", body: [
      "Big Map-ligaen følger WSOW (World Series of Warzone) 2025-formatet — operatør: ESL FACEIT Group.",
      "Lagstørrelse: Trios (3 spillere per lag). Maks 50 lag (150 spillere) per lobby.",
      "Game mode: Battle Royale på Big Map. Primær map: Verdansk. Sekundær: Avalon.",
      "Struktur: Open Phase → Group Qualifier → Last Chance Qualifier → Global Final.",
      "Open Phase: ubegrenset spill, kun topp 10 scores teller for avansement.",
      "Group Qualifier: 100 lag delt i 4 grupper á 25, hver gruppe spiller 15 maps.",
    ]},
    { h: "SCORING — KILLS × PLACEMENT (BIG MAP-MULTIPLIERS)", body: [
      "1 poeng per kill (inkludert Gulag-kills). Multipliseres med placement-faktor:",
      "1. plass: × 2.0  |  2.–5. plass: × 1.8  |  6.–10. plass: × 1.6",
      "11.–20. plass: × 1.4  |  21.–35. plass: × 1.2  |  36.–50. plass: × 1.0",
      "Eksempel: 10 kills og 1. plass = 10 × 2.0 = 20 WSOW Points.",
      "Akkumulert score over hele fasen avgjør rangering. Beste maps teller mot total.",
    ]},
    { h: "TIEBREAKERS", body: [
      "1) Totalt antall kills på tvers av alle maps (uten multiplier).",
      "2) Høyeste kill-count i én enkelt map.",
      "3) Høyeste plassering i én enkelt map.",
      "4) Spiller med flest individuelle kills i én map blant de uavgjorte lagene.",
      "5) Administration bestemmer ellers etter eget skjønn.",
    ]},
    { h: "ROSTER-REGLER", body: [
      "Lagstørrelse: trios (3 hovedspillere). Coach/substitutter ikke automatisk tillatt — krever admin-godkjenning.",
      "Roster Lock: endringer mulig fram til slutten av Open Phase. Etter dette kreves skriftlig godkjenning.",
      "Endring etter Open Phase = hele lagets WSOW Points resettes.",
      "Kun finalt roster får WSOW Points tildelt. Hver spiller kun ett lag per sesong.",
    ]},
    { h: "STREAMING OG POV-KRAV", body: [
      "Obligatorisk livestream på YouTube, Twitch eller Facebook.",
      "Facecam (webcam) PÅ hele turneringen — må peke mot ansiktet under Open Qualifier, LCQ og Global Final.",
      "Lyd: uforvrengt lyd anbefalt (påkrevd for kapteiner). Musikk i stream er IKKE tillatt.",
      "Stream delay kan kreves — Administration kunngjør før hver turnering.",
      "Hvis stream blir utilgjengelig kan Administration gi penalty eller diskvalifikasjon.",
    ]},
    { h: "UTSTYR OG INPUT", body: [
      "Plattformer: PS4, PS5, Xbox One, Xbox Series X|S, Windows PC. Cross-play må være aktivert.",
      "Tillatt: mus + tastatur, eller hvilken som helst kompatibel controller.",
      "FORBUDT: turbo-controllere, macro-controllere, makro-tastatur.",
      "Brudd: lag mister alle poeng og premier, diskvalifiseres fra turnering.",
      "Administration kan inspisere utstyr når som helst.",
    ]},
    { h: "ANTI-CHEAT OG INTEGRITET", body: [
      "RICOCHET (Activisions anti-cheat) må være aktivt. Klarering kan kreves før turnering.",
      "Brudd på integritet: collusion/match-fixing, DDoS, account-sharing/boosting, bot-bruk, drop-hacking, ghosting, stream-sniping, win-trading.",
      "Sanksjoner: penalty points (1 % premie-reduksjon hver), point-tap, diskvalifikasjon, ban inntil 5 år.",
    ]},
    { h: "OPPFØRSEL OG CODE OF CONDUCT", body: [
      "Høyeste integritet og fair play. Profesjonell og sportslig opptreden påkrevd.",
      "FORBUDT: obscene/offensive gester, banneord i player handles/chat, vold/trusler/intimidering, destruktiv adferd, politiske/personlige meldinger.",
      "Squad branding: ingen tredjeparts IP eller geografiske betegnelser uten godkjenning.",
      "Brudd: point-tap, diskvalifikasjon, ban fra framtidige turneringer, juridisk forfølging ved alvorlige brudd.",
    ]},
    { h: "OFFISIELL DOKUMENTASJON", body: [
      "Full WSOW 2025 Official Rules (versjon 1.1): se Drive-mappen → official_2025_wsow_rules.pdf",
      "Drive: https://drive.google.com/drive/folders/1Ltyp3hp8qXzU1-1XfFLI3OMiU1nHRV0_",
      "Operatør: ESL FACEIT Group. Administrert av Activision Publishing, Inc.",
    ]},
  ],
  "liga-smallmap": [
    { h: "FORMAT — EWC RESURGENCE (TRIOS)", body: [
      "Small Map-ligaen følger Call of Duty Warzone Resurgence Series-formatet — EWC 2026-kvalifiseringene.",
      "Lagstørrelse: Trios (3 spillere per lag). Game mode: Ranked Play — Resurgence.",
      "Maps: Haven's Hollow og Rebirth Island.",
      "Struktur: Open Qualifier (opptil 4 runder) → Regional Final.",
      "Hver runde består av 5 drops. Top 8 per lobby går videre til neste runde.",
      "16 lag fra Europa-regionen avanserer til Regional Final.",
    ]},
    { h: "SCORING — KILLS × PLACEMENT (SMALL MAP-MULTIPLIERS)", body: [
      "1 poeng per kill. Multipliseres med placement-faktor basert på trio-plassering:",
      "1. plass: × 1.6  |  2.–5. plass: × 1.4  |  6.–10. plass: × 1.2  |  11.–16. plass: × 1.0",
      "Eksempel: 12 kills og 3. plass = 12 × 1.4 = 16.8 poeng.",
      "Akkumulert score på tvers av alle maps avgjør rangering i runden.",
    ]},
    { h: "TIEBREAKERS", body: [
      "1) Totalt antall kills på tvers av alle maps (uten multiplier).",
      "2) Høyeste kill-count i én enkelt map.",
      "3) Høyeste plassering i én enkelt map.",
      "4) Spiller med flest individuelle kills i én map blant de uavgjorte lagene.",
    ]},
    { h: "ROSTER OG KVALIFISERING", body: [
      "Alle spillere må være 18+ ved første match.",
      "Roster Lock: gjelder fra start av Open Qualifier. Ingen endringer uten skriftlig admin-godkjenning.",
      "Maks 1 coach per lag. Coach kan ikke være spiller eller staff for annet lag i samme turnering.",
      "Substitusjoner: kun ved nødstilfelle med admin-godkjenning. Endringer er permanente.",
      "Hver spiller kun ett lag og én region per sesong. Mixed-region: 2/3 spillere må være fra samme region.",
    ]},
    { h: "STREAMING OG POV-KRAV", body: [
      "Alle spillere må livestreame in-game POV gjennom hele turneringen.",
      "Facecam: PÅKREVD og må peke mot ansiktet hele tiden.",
      "VODs: må være offentlig synlige.",
      "60-sekunders delay: anbefalt i Open Qualifier, OBLIGATORISK i Regional Final.",
      "Tillatte plattformer: YouTube, Twitch, Facebook, Kick.",
      "Manglende stream: advarsel først, så penalty points, til slutt diskvalifikasjon.",
    ]},
    { h: "UTSTYR OG INPUT", body: [
      "Plattformer: PS4, PS5, Xbox One, Xbox Series X|S, Windows PC. Cross-play påkrevd.",
      "Tillatt: mus + tastatur eller controller.",
      "FORBUDT: turbo-controllere og macro-aktivert utstyr.",
      "Brudd: umiddelbar diskvalifikasjon av hele laget + forfeit av alle poeng/premier.",
    ]},
    { h: "MAP-RESTART OG BUGS", body: [
      "Når laget har forlatt pre-game-lobby og er på flyet, regnes mapen som startet — ingen restart.",
      "Minor bugs: spill gjennom.",
      "Major bugs (massiv disconnect, game-altering): admin kan beslutte restart.",
      "Forlate pågående map: kan miste alle poeng for den mapen.",
    ]},
    { h: "ANTI-CHEAT OG SANKSJONER", body: [
      "Aktivt RICOCHET trust-rating påkrevd. Mistanke om cheats → umiddelbar suspendering.",
      "Penalty points: hvert point = 1 % reduksjon i premiepenger.",
      "Cheating: result voided, diskvalifikasjon, ban inntil 5 år.",
      "Konkurranse-manipulasjon / bestikkelser: diskvalifikasjon + ban 1–2 år + bot.",
      "Match fixing: ban inntil 5 år + voiding av resultater.",
    ]},
    { h: "OPPFØRSEL OG CODE OF CONDUCT", body: [
      "Verdier: Compassion, Integrity, Respect, Courage.",
      "Ingen hate speech, harassment, doxing, stalking — verken i lobby, Discord, stream eller noen annen kanal.",
      "Spam, raiding eller forstyrrelse av andre lags streams er forbudt.",
      "Teaming (samarbeid mellom lag i samme lobby) er forbudt.",
      "Brudd: penalty points → ban fra framtidige EWC events.",
    ]},
    { h: "MATCH POINT, OPPRYKK OG NEDRYKK", body: [
      "Match Point: laget med >1 full matchday-potensiell margin (60+ poeng forsprang) bærer merket.",
      "Ingen kunstig terskel — baseres på reelt gap.",
      "Sesongslutt: topp 2 fra Div. 2 rykker opp. Bunn 2 fra Div. 1 rykker ned.",
      "4+ no-shows = ekskludert fra opprykks-beregning.",
    ]},
    { h: "OFFISIELL DOKUMENTASJON", body: [
      "Full EWC 2026 Resurgence Series Rulebook: se Drive-mappen.",
      "Drive: https://drive.google.com/drive/folders/1Ltyp3hp8qXzU1-1XfFLI3OMiU1nHRV0_",
      "Original Google Doc: docs.google.com/document/d/1er-Ad82XGgxqMbqPxXPDt1sYz7iYi-tH97U3tt00mdM",
      "Operatør: ESL FACEIT Group. Administrert av EWC Foundation.",
    ]},
  ],
  switcharoo: [
    { h: "FORMAT — 2v2 BATTLE ROYALE KILL RACE", body: [
      "WZN 2v2-turneringer følger CMG (CheckMate Gaming) sitt 2v2 BR Kill Race-format.",
      "2 spillere per lag. Double-elim bracket: BO3 Winners / BO2 Losers / BO5 Grand Final.",
      "Resurgence map (Rebirth, Vondel eller Haven's Hollow) — kunngjøres før hver turnering.",
      "Cross-platform: PS4/PS5, Xbox One/Series, Windows PC, Switch. Cross-play må være aktivert.",
    ]},
    { h: "2V2 SWITCHAROO-VARIANT", body: [
      "Switcharoo er en spesialvariant der solo-spillere melder seg på individuelt og parres tilfeldig av admin via Spin the Wheel.",
      "Selve turneringsformatet (CMG 2v2 BR Kill Race, double-elim) er identisk — kun pairingen er random.",
      "Respinn (live på stream): 100 kr per spinn, kostnaden DOBLES per nye spinn. Vipps anonymt til turnerings-host.",
      "Odd antall spillere → én BYE. Pairing publiseres på Discord før kampstart.",
    ]},
    { h: "SCORING — KILL RACE", body: [
      "Laget med flest totale kills over alle spilte maps i matchen vinner.",
      "Kills i Losers Bracket carry-over: kills fra forrige map teller med i sluttsummen for den runden.",
      "Map 3-host avgjøres av hvilket lag som hadde flest kombinerte kills på map 1 + 2.",
      "Ved uavgjort kills må mapen replayes inntil en vinner er bestemt.",
    ]},
    { h: "STREAM-KRAV (ALLE PC-SPILLERE)", body: [
      "Du er ansvarlig for å streame HVER match med Past Broadcasts ENABLED — uansett om motstander ber om det eller ikke.",
      "Kan motstander ikke vise stream-bevis før match-start → behandle det som no-show. Dispute → request admin i match chat.",
      "Stream-audio: hver spiller er ansvarlig for at motstander har riktig game audio + comms FØR matchen fullføres. Fullført map replayes IKKE på grunn av audio-issues.",
      "Past Broadcasts må stå oppe i MINIMUM 24 timer etter matchen — sikrer bevis ved hacking-anklager.",
      "Guaranteed/Elite-turneringer: motstander kan be om monitor-cam ved forespørsel.",
    ]},
    { h: "ANTI-CHEAT (ZERO TOLERANCE)", body: [
      "Bruk av cheats / 3rd party software/device = PERMANENT BAN fra plattformen.",
      "Admin kan kreve ekstra bevis fra mistenkte. Manglende bevis = ban eller forfeit av matchen.",
      "Dør du til mistenkt hacker: spill matchen ut, levér bevis til admin etterpå.",
      "Bekreftet hacker → matchen replayes fra score-tidspunktet det skjedde.",
      "Forlate matchen for tidlig pga. mistenkt hacker (som ikke er bekreftet) = risiko for forfeit.",
    ]},
    { h: "NO SHOW + HOST + TIES", body: [
      "Hver match har 10 minutter fra avtalt tidspunkt på å joine/hoste. Etter det → klikk 'no show' + 'request administrator'.",
      "Admin gir motstander en ekstra frist. Brudd på admin-frist = forfeit av map/match.",
      "Map 3-host: laget med flest kombinerte kills på map 1+2 er host.",
      "Uavgjort i kills: matchen MÅ replayes inntil en vinner kommer frem.",
    ]},
    { h: "DISCONNECTS, LAG OG GLITCHES", body: [
      "Teammate disconnect: hvis du fortsatt kan vinne matematisk, MÅ du forlate spillet umiddelbart. Replay krever gyldig disconnect-bevis.",
      "Server-disconnect mens du leder i kills → replay fra kill-count på det tidspunktet (ta bevis av scoreboard umiddelbart).",
      "Dev Error / Scan and Repair → replay fra kill-count på disconnect-tidspunktet. Teammate som fortsatt er inne MÅ forlate.",
      "Intensjonell disconnect for å få replay = forfeit + ban fra plattformen.",
      "Lag / Packet Loss: du har til flyet er ferdig med planlagt rute på å forlate lobbyen. Krever bevis til admin.",
      "Glitches (FPS/texture): bevis i video-format må leveres. Replay-avgjørelse er på admins skjønn.",
    ]},
    { h: "KILLS ETTER DØD + REPLAYS", body: [
      "30 sekunder etter at siste spiller på laget er fullt drept (ikke knocked) avgjør score vinneren.",
      "Pull motstander ut av spillet innen 30 sek etter at de knocker en enemy = risiko for forfeit.",
      "Replay-bonus: spillere som IKKE brukte gulag/respawn-token i original-matchen får +1 kill bonus i replay.",
    ]},
    { h: "RESTRICTED ITEMS", body: [
      "FORBUDT: Gulag Kit, Redeploy Kit, Reinforcement Flare.",
      "Plukker du opp et restricted item ved uhell → mist gulag og/eller down deg selv ved respawn.",
      "Free redeploy ved start: TILLATT. Plukke opp ekstra redeploy-tokens og bruke dem = forfeit.",
    ]},
    { h: "SABOTAGE OG GRIEFING", body: [
      "Sabotage = handling som forverrer motstanders gameplay. Forfeit krever direkte påvirkning på matchens utfall.",
      "Eksempler: fly ut av zone, fly inn i bygg, hoppe ut av vehicle med motstander, excessive ping for å overstyrre lyd.",
      "FORBUDT: skyte på motstanders lokasjon uten grunn, callout i proximity chat, skyte balloon/zipline (når aktivt brukt).",
      "I motstanders vehicle: du godtar driverens handlinger. Vehicle-griefing (sprenge biler for å forstyrre) = forfeit av kills.",
      "Mange former for sabotage finnes — hold avstand til motstanders posisjon for å unngå disputes.",
    ]},
    { h: "GAMEPLAY-EVENTER", body: [
      "Helikoptre: TILLATT som default, med mindre annet er spesifisert i match details. Brudd = map forfeit.",
      "Redeploy Towers (BO Royale): revive teammate via tower er TILLATT.",
      "Begge dine spillere døde + motstander bruker redeploy tower → du MÅ down deg selv umiddelbart ved respawn.",
      "Jailbreak: når begge i laget er fullt døde (ikke gulag) er det final score. Jailbreak etter det → du MÅ down deg selv.",
      "Go Again event: max én gulag per match. Får du kill etter Go Again uten å dø → down deg selv umiddelbart, kill teller ikke.",
    ]},
    { h: "FORBUDT TAKTIKK", body: [
      "Killing AFKs: vente til slutten av flylinjen for å drepe AFK-spillere er IKKE tillatt. Bevis kreves.",
      "Taking knocks hostage: holde motstanders knock for å stjele kill er IKKE tillatt.",
      "Loadout glitches: droppe våpen i pre-game lobby og lande på dem ved match-start er BANNET i alle Warzone-matcher.",
      "Lande på random loadout-våpen fra annen spiller er OK — kun planlagt drop er forbudt.",
      "Min 80 spillere kreves for å starte BR-game. Telles ikke for resurgence-modes.",
    ]},
    { h: "SUBMITTING PROOF + ACTIVISION ID", body: [
      "Alle bevis MÅ være i video-format. Bruk konsollens DVR-feature — ellers risikerer du 'Insufficient proof'.",
      "Bevis må vise hele scoreboard med gamertags og all relevant info.",
      "Conversations utenfor CMG er IKKE gyldig bevis (Twitter, PM, Skype, Xbox Live/PSN-meldinger).",
      "Activision ID MÅ matche eksakt slik det vises i Call of Duty-profilen din, inkludert #-nummer.",
      "ID mismatch på match details → behandle som no-show. Match spilt ferdig med feil ID = utfall står.",
      "Activision ID finnes: top right av multiplayer-meny, eller Options → Account → Activision Account.",
    ]},
    { h: "DISPUTES OG RAPPORTERING (WZN-SPESIFIKT)", body: [
      "Lag har 10 minutter etter match-slutt til å rapportere resultat via score-submit-portalen.",
      "For å disputere: si fra til admin FØR neste game starter. Disputes etter ny game startet aksepteres ikke.",
      "Dispute krever video/screenshot-bevis lastet opp via score-submit.",
      "Admin verifiserer disputes innen 24 timer — beslutningen er bindende.",
    ]},
    { h: "OPPFØRSEL (WZN-SPESIFIKT)", body: [
      "Ingen rasisme, sexisme, hate speech, targeted harassment eller doxing — verken in-game, Discord eller stream.",
      "Toxicity, throwing, sabotasje av makker = advarsel først, så ban.",
      "Vis respekt for motstandere og admins. Brudd kan utestenge deg fra fremtidige WZN-turneringer.",
    ]},
    { h: "KILDE", body: [
      "Reglene er basert på CheckMate Gaming (CMG) sitt offisielle 2v2 BR Kill Race-regelsett.",
      "WZN følger CMG-formatet for alle 2v2-turneringer (inkludert Switcharoo-varianten).",
      "Kontakt #regler på Discord ved tvil — admin har siste ord.",
    ]},
  ],
};

const RULE_TABS = [
  { id: "switcharoo",     label: "2V2 (CMG)",        code: "5.1" },
  { id: "killrace",       label: "KILLRACE (CMG)",   code: "5.2" },
  { id: "liga-bigmap",    label: "LIGA · BIG MAP",   code: "5.3" },
  { id: "liga-smallmap",  label: "LIGA · SMALL MAP", code: "5.4" },
];

const ReglerPage = ({ accent }) => {
  const [tab, setTab] = React.useState("switcharoo");
  const [search, setSearch] = React.useState("");
  const sq = search.trim().toLowerCase();

  // Søke-modus: filtrer på tvers av alle tabs
  const searchResults = sq.length > 1 ? RULE_TABS.flatMap(tabItem => {
    const secs = (RULES[tabItem.id] || []).filter(r =>
      r.h.toLowerCase().includes(sq) ||
      r.body.some(line => line.toLowerCase().includes(sq))
    );
    return secs.map(r => ({ ...r, tabLabel: tabItem.label, tabCode: tabItem.code }));
  }) : [];
  const isSearching = sq.length > 1;

  const rules = RULES[tab];
  const tabMeta = RULE_TABS.find(t => t.id === tab);

  return (
    <>
      <PageHeader
        eyebrow="RULES / 05"
        title={<>REG<span style={{ color: accent }}>LER</span>.</>}
        sub="Hvordan vi spiller — gjelder for alle turneringer og kommende liga. Trios er kjernen, alt annet bygger på det."
        accent={accent}
      />

      {/* Søkefelt */}
      <section style={{ padding: "24px 48px", borderBottom: "1px solid var(--line)", background: "var(--bg-1)" }}>
        <div style={{ position: "relative", maxWidth: 480 }}>
          <input
            value={search}
            onChange={e => setSearch(e.target.value)}
            placeholder="SØK I REGLER…"
            style={{
              width: "100%", padding: "12px 16px 12px 44px",
              background: "var(--bg-2)", border: "1px solid var(--line-2)",
              color: "var(--text)", fontFamily: "var(--font-mono)", fontSize: 13,
              letterSpacing: "0.08em", outline: "none", boxSizing: "border-box",
            }}
          />
          <span style={{ position: "absolute", left: 14, top: "50%", transform: "translateY(-50%)", color: "var(--text-faint)", fontSize: 16 }}>⌕</span>
          {search && <button onClick={() => setSearch("")} style={{ position: "absolute", right: 12, top: "50%", transform: "translateY(-50%)", background: "none", border: "none", color: "var(--text-faint)", cursor: "pointer", fontSize: 18 }}>×</button>}
        </div>
      </section>

      {/* Tabs — skjules under søk */}
      {!isSearching && (
        <section style={{
          padding: "24px 48px 0",
          borderBottom: "1px solid var(--line)",
          display: "flex", gap: 0,
        }}>
          {RULE_TABS.map(t => {
            const active = tab === t.id;
            return (
              <button key={t.id} onClick={() => setTab(t.id)} style={{
                padding: "16px 22px",
                background: active ? "var(--bg-1)" : "transparent",
                border: "1px solid var(--line)",
                borderBottom: active ? "none" : "1px solid var(--line)",
                fontFamily: "var(--font-stencil)", fontSize: 14, letterSpacing: "0.06em",
                color: active ? accent : "var(--text-dim)",
                cursor: "pointer",
                marginRight: -1, marginBottom: -1,
                display: "flex", flexDirection: "column", gap: 4, alignItems: "flex-start",
              }}>
                <span style={{
                  fontFamily: "var(--font-mono)", fontSize: 10, color: active ? accent : "var(--text-faint)", letterSpacing: "0.15em",
                }}>§ {t.code}</span>
                <span>{t.label}</span>
              </button>
            );
          })}
        </section>
      )}

      {/* Søkeresultater */}
      {isSearching ? (
        <section style={{
          padding: "56px 48px",
          background: "var(--bg-1)",
          borderBottom: "1px solid var(--line)",
        }}>
          {searchResults.length === 0 ? (
            <div style={{
              fontFamily: "var(--font-mono)", fontSize: 13, color: "var(--text-faint)",
              letterSpacing: "0.18em", padding: "48px 0", textAlign: "center",
            }}>
              INGEN RESULTATER FOR '{sq.toUpperCase()}'
            </div>
          ) : (
            <div style={{ display: "flex", flexDirection: "column", gap: 32 }}>
              {(() => {
                // Grupper etter tab
                const grouped = {};
                searchResults.forEach(r => {
                  const key = r.tabLabel;
                  if (!grouped[key]) grouped[key] = { label: r.tabLabel, code: r.tabCode, sections: [] };
                  grouped[key].sections.push(r);
                });
                return Object.values(grouped).map(group => (
                  <div key={group.label}>
                    <div style={{
                      fontFamily: "var(--font-mono)", fontSize: 10, color: accent, letterSpacing: "0.25em",
                      marginBottom: 16, padding: "6px 12px", border: `1px solid ${accent}`,
                      display: "inline-block",
                    }}>§ {group.code} · {group.label}</div>
                    <div style={{ display: "flex", flexDirection: "column", gap: 20 }}>
                      {group.sections.map((r, i) => (
                        <div key={r.h + i}>
                          <h3 style={{
                            fontFamily: "var(--font-stencil)", fontSize: 20, letterSpacing: "0.04em",
                            margin: "0 0 10px", color: "var(--text)",
                          }}>{r.h}</h3>
                          <ol style={{ listStyle: "none", padding: 0, margin: 0, display: "flex", flexDirection: "column", gap: 8 }}>
                            {r.body.map((line, j) => (
                              <li key={j} style={{
                                display: "grid", gridTemplateColumns: "40px 1fr", gap: 12, alignItems: "baseline",
                              }}>
                                <span style={{ fontFamily: "var(--font-mono)", fontSize: 11, color: "var(--text-faint)", letterSpacing: "0.15em" }}>{String(j+1).padStart(2,"0")}</span>
                                <span style={{ fontFamily: "var(--font-body)", fontSize: 15, color: "var(--text-dim)", lineHeight: 1.65 }}>{line}</span>
                              </li>
                            ))}
                          </ol>
                        </div>
                      ))}
                    </div>
                  </div>
                ));
              })()}
            </div>
          )}
        </section>
      ) : (
        /* Rules content */
        <section style={{
          padding: "56px 48px",
          background: "var(--bg-1)",
          borderBottom: "1px solid var(--line)",
        }}>
          <div style={{
            display: "grid", gridTemplateColumns: "300px 1fr", gap: 64, alignItems: "flex-start",
          }}>
            <div style={{ position: "sticky", top: 100 }}>
              <div style={{
                fontFamily: "var(--font-mono)", fontSize: 11, color: accent, letterSpacing: "0.25em", marginBottom: 10,
              }}>SEKSJON {tabMeta.code}</div>
              <h2 style={{
                fontFamily: "var(--font-stencil)", fontSize: 48, letterSpacing: "0.02em", lineHeight: 0.98,
                margin: 0,
              }}>{tabMeta.label}</h2>
              <div style={{ width: 60, height: 4, background: accent, marginTop: 18 }} />

              <div style={{
                marginTop: 28, padding: "14px 18px",
                border: "1px dashed var(--line-2)",
                fontFamily: "var(--font-mono)", fontSize: 11, color: "var(--text-dim)",
                letterSpacing: "0.12em", lineHeight: 1.6,
              }}>
                <div style={{ color: "var(--text-faint)", marginBottom: 6 }}>SIST OPPDATERT</div>
                <div>19.05.2026</div>
                <div style={{ marginTop: 12, color: "var(--text-faint)" }}>SPØRSMÅL?</div>
                <div style={{ color: accent }}>#regler på Discord</div>
              </div>
            </div>

            <div style={{ display: "flex", flexDirection: "column", gap: 28 }}>
              {rules.map((r, i) => (
                <div key={r.h}>
                  <div style={{
                    display: "flex", alignItems: "baseline", gap: 14,
                    paddingBottom: 12, borderBottom: "1px solid var(--line)", marginBottom: 16,
                  }}>
                    <span style={{
                      fontFamily: "var(--font-mono)", fontSize: 11, color: accent,
                      letterSpacing: "0.15em", padding: "3px 8px", border: `1px solid ${accent}`,
                    }}>{tabMeta.code}.{String(i+1).padStart(2,"0")}</span>
                    <h3 style={{
                      fontFamily: "var(--font-stencil)", fontSize: 22, letterSpacing: "0.04em", margin: 0,
                    }}>{r.h}</h3>
                  </div>
                  <ol style={{
                    listStyle: "none", padding: 0, margin: 0,
                    display: "flex", flexDirection: "column", gap: 12,
                  }}>
                    {r.body.map((line, j) => (
                      <li key={j} style={{
                        display: "grid", gridTemplateColumns: "40px 1fr", gap: 12, alignItems: "baseline",
                      }}>
                        <span style={{
                          fontFamily: "var(--font-mono)", fontSize: 11, color: "var(--text-faint)",
                          letterSpacing: "0.15em",
                        }}>{String(j+1).padStart(2, "0")}</span>
                        <span style={{
                          fontFamily: "var(--font-body)", fontSize: 15.5, color: "var(--text-dim)",
                          lineHeight: 1.65,
                        }}>{line}</span>
                      </li>
                    ))}
                  </ol>
                </div>
              ))}

              {/* Footer note */}
              <div style={{
                marginTop: 24, padding: "20px 24px",
                border: `1px solid ${accent}`, background: "rgba(255,107,53,0.04)",
                display: "grid", gridTemplateColumns: "auto 1fr auto", gap: 18, alignItems: "center",
              }}>
                <div style={{
                  fontFamily: "var(--font-stencil)", fontSize: 12, padding: "4px 10px",
                  background: accent, color: "var(--bg-0)", letterSpacing: "0.08em",
                }}>NB</div>
                <div style={{
                  fontFamily: "var(--font-body)", fontSize: 14, color: "var(--text-dim)",
                }}>
                  Reglene oppdateres mellom turneringer hvis vi finner ting som ikke fungerer.
                  Endringer annonseres på Discord 3 dager før neste turnering.
                </div>
                <a href="#" style={{
                  padding: "10px 16px", border: `1px solid ${accent}`, color: accent,
                  fontFamily: "var(--font-stencil)", fontSize: 12, letterSpacing: "0.06em",
                  textDecoration: "none",
                }}>SE ENDRINGSLOGG →</a>
              </div>
            </div>
          </div>
        </section>
      )}
    </>
  );
};

window.WZN_RULES = RULES;

Object.assign(window, { ReglerPage });
