# config.json – slik endrer du Daily Case uten å kode

All tekst, alle premier og odds, farger, hjul-innstillinger, partner-plassen og tilstandene på admincase.nextdeposits.com leses fra **én fil**: `config.json` (ligger ved siden av denne fila).

## Tre måter å endre på

1. **På siden.** Trykk **Rediger** i den grå linja øverst og klikk på en tekst. Skriv den nye teksten og trykk Enter. Skyvere, farger, premier og partner finner du under **Kontroller**.
   Endringene vises med en gang, men bare i din nettleser. Trykk **Kopier config** (eller **Last ned config.json**), lim det inn i chatten til DOFFEN VM og skriv «bruk denne configen». Da legges den inn i `public/config.json`, og alle ser den.
2. **I chatten.** Skriv hva du vil ha, for eksempel «sett varigheten til 5 sekunder» eller «endre knappen til Open today's case».
3. **Direkte i fila** (for den som vil): rediger `/root/claude-x/admincase/public/config.json`. Endringen er live med en gang, uten omstart. Sjekk at fila fortsatt er gyldig JSON.

Hver endring DOFFEN VM gjør, lagres med dato i `/root/claude-x/admincase/historikk/`. Slik ruller du tilbake: `cp -a historikk/<tid>-<merke>/. public/`

**Lokale endringer.** Står det «Endringer i denne nettleseren» øverst, viser siden din egen kladd og ikke `config.json`. Trykk **Forkast** for å se fila igjen.

## Feltene

### Toppnivå
| Felt | Hva det gjør | Eksempel |
|---|---|---|
| `name` | Navnet overalt: menyen, tittelen og X-teksten. Brukes som `{name}` i tekstene. | `"Daily Case"` |
| `url` | Adressen som står på annonsebildene. | `"nextdeposits.com/daily-case"` |
| `shareUrl` | Lenka som havner i X-posten (`{url}`). Må være en adresse som virker, med `https://`. Bytt til `https://nextdeposits.com/daily-case` ved lansering. | `"https://admincase.nextdeposits.com/"` |
| `version` | Bare et nummer for oss, påvirker ingenting. | `1` |

### `copy` – all tekst (engelsk på siden)
Plassholdere som fylles inn automatisk:
- `{name}`: navnet.
- `{prize}`: gevinsten, f.eks. «$25 BTC».
- `{time}`: nedtellingen, f.eks. «14:32:10».
- `{ev}`: forventet verdi per case.
- `{lose}`: sjansen for å ikke vinne.
- `{day}`: streak-dagen.
- `{url}`: adressen.

Tom tekst (`""`) skjuler elementet.

| Felt | Hvor det står |
|---|---|
| `navBadge` | Menypunktet i headeren (prikken vises når casen er klar) |
| `navBadgeReadyAria` | Det skjermlesere hører når casen er klar |
| `kicker` | Liten grønn mono-linje over tittelen (tom = skjult) |
| `title` | Sidetittelen |
| `subline` | Linja under tittelen (maks én–to linjer) |
| `legal` | «No purchase necessary …»-linja. Den skal stå godt synlig. |
| `breadcrumbHome` | «Home» i brødsmulestien |
| `quickOpen`, `sound` | Bryterne ved knappen |
| `streakLabel` | «Day 3 of 7» |
| `streakHint` | Forklaringen når man holder musa over streaken |
| `oddsTitle`, `oddsColPrize`, `oddsColPaid`, `oddsColValue`, `oddsColChance` | Oddstabellen |
| `oddsEv` | Linja under tabellen (`{ev}`, `{lose}`) |
| `fairLink` | Lenka «Verify a case» |
| `won.heading`, `won.sub` | Gevinstkortet etter hjulet |
| `lost.heading`, `lost.sub` | Tapskortet («Better luck tomorrow»). `lost.heading` står også på de tomme flisene på hjulet. |
| `share.button`, `share.line` | «Post on X»-knappen og linja ved siden av |
| `share.win`, `share.big`, `share.loss` | Lister med X-tekster. Det velges en tilfeldig tekst hver gang, og `big` brukes ved stor gevinst. Plassholdere: `{prize}`, `{day}`, `{url}`. Nevn alltid @NextDeposits, aldri et casino. |
| `share.textWin`, `share.textLoss` | Reservetekst hvis listene er tomme |
| `tiers.big`, `tiers.jackpot` | Teksten som lyser over hjulet ved stor gevinst og jackpot |
| `claim.*` | Alle tekstene i claim-skjemaet |
| `ariaResult` | Det skjermlesere hører når hjulet stopper |
| `states.<tilstand>.button` | Knappeteksten i hver tilstand |
| `states.<tilstand>.note` | Linja øverst i panelet i hver tilstand |
| `states.notEligible.check1..3` | Sjekklista i «not eligible» |
| `signInNote` | Det som står når man trykker «Sign in» (innlogging er ikke bygd) |

Tilstandene er `loggedOut`, `notEligible`, `newUser`, `ready`, `rolling`, `won`, `lost`, `countdown`, `streakBroken` og `error`. Velg tilstand i «Tilstand»-menyen øverst på siden.

### `prizes` – premier og odds
En liste der hver premie har:
- `label`: teksten på flisa.
- `usd`: verdien i dollar. 0 betyr trøstepremie (se `consolation`).
- `coin`: den lille linja under teksten på flisa.
- `chance`: sjansen i prosent. Sjansene bør bli 100 til sammen.
- `tier`: fargen. Fargen følger nå NIVÅET (se `theme.tiers`). Den gamle `tier`-fargen brukes bare hvis `tierOverride: true` står på premien (settes av seg selv når du bruker fargevelgeren i Kontroller).
- `kind`: tegningen på flisa: `btc`, `sats`, `usdc`, `usdc3`, `cash`, `giftcard`, `giftcard-gold`, `watch`, `console`, `phone`, `headphones`, `laptop`, `ticket`, `fragment`, `boost`, `xp` (og `empty` uten kind). De gamle navnene `iphone`, `gamepad`, `buds`, `bolt`, `star` og `shard` virker som før.
- `jackpot`: `true` på den ene toppremien som skal få folie-ramme og jackpot-lyd (standard: premien med høyest `usd`).
- `name`: hele navnet i resultatkortet og i oddstabellen.
- `paid`: kolonnen «Paid in» i tabellen.
- `note`: linja under navnet i resultatkortet.

Forventet verdi og tabellen regnes ut av seg selv. En fysisk premie (`phone`, `console`, `watch`, `headphones`, `laptop`, og de gamle navnene) får et claim-skjema med bare e-post.
```json
{ "label": "iPhone", "usd": 1200, "coin": "OR $1,200", "chance": 0.001, "tier": "#f6c857", "kind": "phone", "jackpot": true, "name": "iPhone", "paid": "Shipped or USDC", "note": "We'll email you today. It ships within 30 business days." }
```

### `consolation` – flisa som erstatter «Better luck tomorrow»
- `active`: hvilken som brukes: `shard`, `ticket`, `boost`, `xp` eller `luck` (den gamle).
- `variants`: hver har `label` (på flisa), `kind` (tegning), `coin`, `name`, `heading` og `sub` i resultatkortet (`{time}` blir nedtellingen) og `tier` (farge).
- Prøv dem i hjulgalleriet, eller legg `?loss=ticket` på adressen.

### `art` – egne bilder i stedet for de innebygde tegningene
- `art.skinImages`: bakgrunn per design, for eksempel `{"neon": "assets/skins/neon.webp"}`.
- `art.banners`: `{"big": "assets/banners/big.png", "jackpot": "assets/banners/jackpot.png"}` erstatter tekstene «Big win» og «Jackpot».
- Premiebildene styres av `assets/prizes/manifest.json` (ikke config.json): `{"iphone": {"1x": "iphone.png", "2x": "iphone@2x.png"}}`. Står en premie der, brukes bildet i stedet for tegningen. Fila fylles av `tools/ingest-assets.mjs` når bilder legges i `assets/gpt-inbox/`.

### `claim`
`claim.enabled` slår claim-skjemaet etter gevinst av eller på. `claim.minUsd` er grensen (1) for når skjemaet vises: mindre gevinster går til en saldo. Tekstene står under `copy.claim`. Skjemaet er en prototype: det sjekker e-post og adresse, men sender ingenting.

### `wheel` – hjulet
Standardverdiene er valgt fra målingene i refs.md. Se specen, «Hjulet».

| Felt | Hva | Standard |
|---|---|---|
| `format` | `reel` (vannrett), `slot` (vertikal), `wheel` (lykkehjul) eller `cards` (velg et kort) | `reel` |
| `skin` | Utseendet på hjulet: `classic`, `neon`, `vault`, `cs` eller `holo` | `cs` |
| `anim` | Hvordan hjulet stopper: `classic`, `longGlide`, `tease`, `fakeStop` eller `slowmo`. Tid og retning er like for alle utfall (ellers lekker bildet og lyden resultatet). | `classic` |
| `fx` | Effekter ved gevinst: `flash`, `shake`, `confetti`, `sparks`, `coins`, `rays`, `banner`, `countUp`, `blur` | alle unntatt `blur` |
| `tiers` | Grensene i dollar for gevinstnivåene: `good` (1), `big` (25) og `jackpot` (500). Hvert nivå gir sterkere effekter og lyd. | `{1, 25, 500}` |
| `durationMs` | Hvor lenge hjulet går (Tease og falsk stopp legger til 1–3 s) | 6000 |
| `easing` | Bremsekurven | `cubic-bezier(0.165, 0.84, 0.44, 1)` |
| `startDelayMs` | Pause før start | 0 |
| `resultDelayMs` | Pause etter stopp | 150 |
| `centerMs` | Glidning til midten av vinnerflisa etter stopp (0 = av) | 500 |
| `tiles` | Antall fliser på hjulet | 40 |
| `landIndex` | Flisa resultatet lander på | 35 |
| `tileW`, `tileH` | Flisstørrelse på desktop i px | 176 / 176 |
| `tileWMobile`, `tileHMobile` | Flisstørrelse på mobil i px | 120 / 120 |
| `gap` | Mellomrom mellom flisene i px | 8 |
| `edgeMinPct` | Stoppet havner minst så mange % inn i flisa | 15 |
| `fadePx` | Uttoning i kantene | 96 |
| `markerW`, `markerColor` | Markørstreken | 2 / `#f6c857` |
| `nearMiss` | Legger toppremien rett etter stoppet (0 = av, anbefalt) | 0 |
| `settlePx` | Skyter forbi og glir tilbake (0 = av) | 0 |
| `fillerLoseWeight` | Bare med `fillMode: weighted`: hvor mange trøstefliser det er på hjulet i forhold til premieflisene | 2.5 |
| `fillMode` | `odds` fyller hjulet etter oddsen (ærlig). `weighted` viser flere premier enn oddsen (pynt, bare som lab-valg). | `odds` |
| `decoys` | `true` plasserer lokkeflis ved siden av resultatet i Tease og Falsk stopp. Lab-eksperiment, skal stå `false` i drift. | `false` |
| `winScale`, `winGlowPx` | Hvor mye vinnerflisa vokser og lyser | 1.05 / 30 |
| `cardDelayMs`, `cardPopMs` | Pause før item-kortet, og hvor raskt det spretter inn | 350 / 420 |
| `quickOpenMs` | Varighet med Quick open på (kan slås på midt i spinnet) | 1000 |

### `sound`
Lyden er AV som standard, starter aldri uten at besøkende har trykket eller tastet, og er laget i tre øyeblikk: **åpne** (ved klikket), **oppbygging** (stigende lyd, et pust og 140 ms stillhet før resultatet, helt lik for alle utfall) og **avsløring** (den eneste lyden som vet resultatet). Nivå 4 og jackpot har en egen stinger. Regler og tall står i `docs/SOUND-SPEC.md`.
- `defaultOn`: om lyden er på for nye besøkende (standard `false`).
- `volume`: 0–1 (standard 0.8). 0 betyr stille. Besøkende har egen volumglider på siden.
- `tick`: tikk under rulling. `stop`: oppbygging før resultatet (av = bare pusten). `win`: gevinstlyder fra nivå 1 (av = oppbyggingen bare slutter, ingenting villedende spilles). Nivå 0 (ingen premie) har alltid en flat, tørr settle.
- `tickMinMs`: minste tid mellom to tikk (45).
- `anticipationMs`: oppbyggingen før resultatet, 1000–1800 (0 = bare pusten).
- `bed`: rulle-susingen som følger farten. `rareStinger`: egen stinger for nivå 4 og jackpot.
- `ui`, `count`, `readyChime`: grensesnittlyder. `count` (tell-opp på beløpet) og `readyChime` (kime når neste case er klar) er av som standard.
- `haptics`: standard for vibrasjon (Android). Besøkende velger selv, og den er av som standard.
- `samples`: valgfrie CC0-lag (av).
- `guardrails`: bare dokumentasjon. Motoren lar seg ikke slå av: oppbyggingen kan ikke avsløre resultatet, tap høres aldri ut som gevinst, ingen nesten-treff-lyd.
- Teksten ved Åpne-knappen når lyden er av står i `copy.soundHint` (og `soundHintOn`, `soundHintDismiss`). Den kan lukkes og huskes.

### `payouts` – feeden «Recent payouts»
Feeden viser bare rader fra ledger-fila `payouts.json` (bygd av `tools/payout-add.py`), aldri påfunn. Finnes fila ikke, viser labben DEMO-eksempler (`payouts.demo.json`) med tydelig DEMO-merke. Demo vises aldri på andre verter enn labben og lager aldri lyd.
- `enabled`: viser feeden (over «What's in the case»).
- `ledgerUrl`, `demoUrl`, `labDemo`: filene, og om labben får vise DEMO når ekte ledger mangler.
- `maxRows`, `pollSeconds`, `rowGapMs`: antall rader, hvor ofte fila hentes, minste tid mellom nye rader.
- `toast`, `toastMs`, `toastSound`: milepæl-toast (ikke modal, 7 s) og kimen for ekte milepæler.
- `downloadHref`: valgfri lenke «Download the ledger».
- Tekstene `copy.payouts.title` og `copy.payouts.scope` kan endres; resten av feedens tekst ligger i `assets/payouts.js`.

### `streak` og `giveaway`
- `streak.enabled`, `streak.days`: viser streaken (standard 7 dager).
- `giveaway.enabled`: viser «Post on X» og giveaway-linja.

### `partner` – casino-plassen (Featured)
| Felt | Hva |
|---|---|
| `enabled` | Viser eller skjuler plassen |
| `heading`, `label`, `cta`, `terms`, `disclosure` | Tekstene. `label` er «Featured». Tom `disclosure` betyr ingen linje. |
| `showIn` | Hvilke tilstander plassen vises i, f.eks. `["won", "lost", "countdown"]` |
| `placementWin`, `placementLoss`, `placementWait` | Placement-navnene i `/go/<slug>?p=…` når det kobles til nettsiden |
| `operators` | Casinoene. Hver har `slug`, `name`, `logo`, `offer`, `terms` og `countries`. `countries` er landene casinoet kan vises i, med samme regler som TopPick. «Besøker fra» øverst på siden filtrerer listen, og `byCountry` velger landets toppvalg (samme regel som TopPick; `null` betyr ingen plass i det landet). |

På admincase peker lenkene til plassholdere (`#placeholder-go/...`), ikke til ekte casinolenker.

### `lab`
Gjelder bare lekeplassen:
- `defaultState`, `defaultCountry`: hva siden starter med.
- `countries`: landene i menyen.
- `countdownStartSec`: hvor mye tid nedtellingen starter med i «countdown».

### `theme` – farger
- `default`: `"dark"` eller `"light"`.
- `dark` og `light`: hex-farger for nettsidens tokens. Bruk de samme fargene som nettsiden, så det ikke ser påklistret ut.
- `tiers`: fargen per gevinstnivå (0 ingen premie, 1 liten, 2 god, 3 stor, 4 topp). Rammene, nålene og resultatkortet følger disse. Navnene står i `copy.tierName.*` og `copy.tierAria.*`.

| Token | Brukes til |
|---|---|
| `accent` | Grønne knapper |
| `royal` | Grønne lenker og markeringer |
| `surface` | Kortene |
| `featured` | Den oransje casino-knappen |
| `reel-bg` | Bakgrunnen bak hjulet |

### `ads`
Overskrift og undertekst på annonsebildene (`spin`, `win`, `lose`, `odds`). Bildene lages fra lekeplassen med `?ad=spin&w=1200&h=675`.

## Nyttige adresser
| Adresse | Hva du får |
|---|---|
| `/?state=lost&country=FI` | Siden i en bestemt tilstand og et bestemt land |
| `/?clean=1` | Uten admin-linja |
| `/?nolocal=1` | Ignorerer endringer i nettleseren og viser config.json slik den er |
| `/?edit=1` | Rediger-modus på med en gang |
| `/?ad=win&w=1080&h=1080` | Et annonsebilde |
