Every token, type step, spacing value, radius, elevation and layout metric that the match-analysis page actually ships with — read off the two live prototypes, not off Figma. One foundation, two pages: pre-game and in-play are the same design system; the in-play page adds exactly one token and one hero block. §10 is the complete delta.
The foundations layer is almost entirely CSS — colour, type, spacing, radius and elevation carry no images. These are the only assets the two pages reference for foundation-level chrome (brand mark, sport icons, flags, ad creatives); every other image belongs to a component that has its own handover (§11).
foxbet-logo.png
wc2026logo.png
flagcdn · nl.png
flagcdn · jp.png
skins/…_400_left.webp
skins/…_400_right.webpNotes
Flags are placeholders from flagcdn — in production the crest comes from the
feed, in the same box. The two ad skins are native 400 × 1000 creatives and are never resampled
(§8). The path case matters: every reference is lowercase assets/… — a capitalised
Assets/… works on Windows and dies on the CDN.
This is the foundations handover for the analysis page: the values a developer binds once and then never types again. It is written from the shipped prototypes, so it describes what the page does, not what an earlier spec intended.
| Layer | Owner | Rule |
|---|---|---|
| Foundations — colour, type, spacing, radius, elevation, breakpoints | This document | Bind these to your design-system variables. Nothing here is copied per component. |
| Individual components — odds CTA, tips, form bubbles, phase, pitch, TV logos, LED wall | Their own handovers (§11) | Each one is the single source of truth for its own geometry. If it disagrees with this page, it wins. |
| Data, endpoints, formulas | HANDOFF.md |
Not repeated here. Foundations are presentation only. |
foxbet-responsive.html (pre-game) and foxbet-responsive-live.html (in-play).Shown at 65% scale. Countdown in the hero.
Shown at 65% scale. LIVE badge + score/clock instead of the countdown.
This is the literal :root of the pre-game page. Everything downstream
reads through it; there are no second definitions of these values anywhere in the file.
/* ===== foxbet design system tokens ===== */ :root{ --accent:#FD3A01; /* Primary 500 */ --accent2:#CB2F01; /* Primary 600 — links / special text */ --acc:#CB2F01; /* alias the component handovers' CSS expects */ --ember:#FF7700; /* Secondary 500 */ --gold:#FFB200; /* Tertiary 500 */ --dark:#1A1A1A; /* Base 950 — dark surfaces */ --ink:#1A1A1A; /* Base 950 — primary text */ --mut:#666666; /* Base 700 — secondary text */ --line:#E6E6E6; /* Base 200 — borders */ --fill:#F2F2F2; /* Base 100 — fills */ --page:#FFFFFF; /* Base 50 — page */ --win:#027A48; /* Success 700 */ --winsoft:#D1FADF; /* Success 100 */ --err:#D92D20; /* Error 600 */ --errdark:#912018; /* Error 800 */ --live:#D92D20; /* IN-PLAY PAGE ONLY — live-state red (Error 600) */ --eeep:#1A3362; /* ΕΕΕΠ regulatory navy */ /* featured bookmaker (Stoiximan) — swap per featured operator */ --stoix:#0055FF; --stoix700:#003399; --stoix800:#002266; --stoixlt:#99BBFF; /* families */ --disp:'Roboto',system-ui,-apple-system,'Segoe UI',sans-serif; --body:'Roboto',system-ui,-apple-system,'Segoe UI',sans-serif; --num :'Roboto Mono',ui-monospace,'SFMono-Regular',Menlo,monospace; } /* declared later, next to the tips component it serves */ :root{--prd-disp:'Roboto Condensed','Roboto Condensed Fallback',var(--body)}
--live:#D92D20 exists only on the in-play page. Nothing else about the foundations
differs between pre-game and in-play — same palette, same ramp, same spacing, same shell.--disp and --body are the same family today.
They are kept as two tokens because display type is allowed to diverge later; bind both, and do not
collapse them into one in your CSS.No token is an invented hex. Each one is a step of the Foxbet ramps, so binding them to your design-system variables is a rename, not a translation.
| Token | Value | DS step | Used for |
|---|---|---|---|
--accent | #FD3A01 | Primary 500 | Brand primary, CTA gradient end, active states, links on dark |
--accent2 / --acc | #CB2F01 | Primary 600 | Links and special text on light surfaces |
--ember | #FF7700 | Secondary 500 | CTA gradient start |
--gold | #FFB200 | Tertiary 500 | Ratings, gold rank, hero link hover |
--ink / --dark | #1A1A1A | Base 950 | Primary text; app bar, desktop nav and footer surfaces |
--mut | #666666 | Base 700 | Secondary text, inactive tabs, paused live pill |
--line | #E6E6E6 | Base 200 | Every border and divider |
--fill | #F2F2F2 | Base 100 | Tab-strip track, inert fills |
--page | #FFFFFF | Base 50 | Page and card surface |
--win / --winsoft | #027A48 #D1FADF | Success 700 / 100 | Wins, positive deltas, won-tip state |
--err / --errdark | #D92D20 #912018 | Error 600 / 800 | Losses, lost-tip state, YouTube button |
--live | #D92D20 | Error 600 | In-play only — LIVE dot and score pill |
--eeep | #1A3362 | Regulatory navy | ΕΕΕΠ · 21+ strip (§12) |
--stoix …800 | #0055FF #003399 #002266 #99BBFF | Bookmaker brand | The featured operator's own palette — swap all four when the featured operator changes |
Every primary action on the page is the same brand gradient. It appears at
two angles and that is deliberate — 135deg on boxes, 90deg on the wide
sign-in pill:
background:linear-gradient(135deg,var(--ember),var(--accent)); /* Prim-Sec 45 — buttons, chips, active tabs */ background:linear-gradient(90deg,#FD3A01,#FF7700); /* Prim-Sec 90 — sign-in pill */ background:linear-gradient(180deg,#333333,var(--dark)); /* dark chrome: desktop nav, overlays */
These appear as literal hexes in the page because they are used once or twice each. They are all real ramp steps — bind them, don't re-pick them:
Primary ramp — #FFEBE6/#FFD8CC are the soft peach
card backgrounds and borders (promo cards, «Σχόλια αγώνα», the empty-state medallion).
Base ramp — the full grey range is in use. #CCCCCC is the placeholder
hatch and the desktop footer text, #B3B3B3 the breadcrumb separator,
#4D4D4D/#333333 the dark-chrome gradient stops.
Semantic. Text on a semantic background always uses the Dark step
(#912018 / #7A2E0E / #054F31), never the 500/600 fill colour.
#0055FF and its ramp), the ΕΕΕΠ navy
#1A3362, the sponsor/operator brand colours inside the odds CTA, and the two national
team colours used by the win-probability bar (they come from the feed, per team).Three families are loaded, and each has exactly one job. There is no fourth.
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;600;700 &family=Roboto+Condensed:wght@700&family=Roboto+Mono:wght@400;500;700&display=swap" rel="stylesheet">
| Token | Family | Weights loaded | Job |
|---|---|---|---|
--body / --disp | Roboto | 400 · 500 · 600 · 700 | All UI and copy. Confirmed as the brand font from live foxbet.gr. |
--num | Roboto Mono | 400 · 500 · 700 | Every number that must align or read as data: odds, scores, clocks, percentages, table figures. |
--prd-disp | Roboto Condensed | 700 | One job only — the tips component's display line. Falls back to --body. |
.vp-reg, the regulatory line
inside the verdict card, is Verdana 12.27px / 19px. That is Figma's value kept verbatim
because the rendering of regulatory copy is the thing being signed off. Do not normalise it into the
Roboto scale.Counted across the pre-game stylesheet. The page lives at the small end of the scale on purpose — it is a dense data page, and 12px (Text Tiny) is its workhorse:
| Size | Declarations | DS name | Where |
|---|---|---|---|
| 24px | 7 | H1 mobile / H2 desktop | Hero team score, biggest numbers |
| 20px | 5 | H2 mobile / H3 desktop | Live score, empty-state headline |
| 18px | 6 | H3 mobile / H4 desktop, Text Large | Card headlines |
| 16px | 17 | H4/H5, Text Regular | Body copy, editorial paragraphs, countdown digits |
| 14px | 58 | H6, Text Small | Secondary copy, buttons, sign-in, live clock |
| 13px | 6 | — | Dense table cells |
| 12px | 209 | Text Tiny | The page's default: tabs, labels, section titles, table figures, chips, breadcrumb |
| 11px | 21 | below the ramp | Micro-labels inside compact controls |
| 10px | 8 | below the ramp | Legends, footnote captions |
| 9px | 4 | below the ramp | Timeline minute markers only |
font-size is overridden inside the desktop media query). The only responsive type
change is the form bubbles' label at ≤429.98px (10.5px inside a 20px bubble).| Weight | Declarations | Use |
|---|---|---|
| 700 Bold | 233 | The default for anything labelled, numeric or interactive. A data page is bold by default. |
| 600 Semibold | 56 | Secondary labels, breadcrumb, status bar |
| 400 Regular | 15 | Running editorial copy |
| 500 Medium | 10 | Rare — inside component handovers that specify it |
font-weight:800 appears once, on the winner's goals in the in-play
final score — Roboto 700 is the heaviest weight loaded, so that renders as synthetic bold. Treat it
as an emphasis flag, not a fifth weight.
| letter-spacing | Applies to |
|---|---|
1.4px | Section titles (.secttl) — uppercase, 12px/700. This is the page's signature label style. |
1px | Uppercase placeholder tags, small caps chrome |
.5px | Numeric strings in Roboto Mono (scores, clocks) and the status bar |
.2px – .4px | Tabs and buttons — and dropped to 0 on mobile tabs to buy horizontal room |
-.1px | One long team-name row. Never used to fix layout elsewhere. |
Eight declarations use non-integer or off-ramp sizes. All eight are intentional and each has an owner; there are no others, so anything else off-ramp in your port is a bug:
| Size | Selector | Why |
|---|---|---|
12.27px | .vp-reg | Verdana regulatory line, Figma verbatim |
15px | .nx-h | The «Άλλοι αγώνες» section heading — between Text Small and Text Large |
13.5px | .nx card title | «Άλλοι αγώνες» cross-navigation cards |
12.5px (×3) | .nx-c-n, .nx-c-t, .nx link | Same block — one notch under Text Tiny so three lines fit the card |
11.5px | .nx counter badge | Sits on a 20px line-height badge |
10.5px | .formdots .fd ≤429.98px | Form bubble label inside a 20px bubble |
9.5px | .nx LIVE badge | Smallest label on the page |
Name = px ÷ 4. The page uses the bottom of the scale almost exclusively, because everything is a dense row or a chip.
| Step | px | gap uses | Where |
|---|---|---|---|
| 1 | 4px | 64 | Inside chips, between an icon and its label |
| 2 | 8px | 105 | The default gap — between rows, cells, controls |
| 3 | 12px | 30 | Card padding, block separation, section side gutters |
| 4 | 16px | 6 | Section top padding, rail widget gap, wide-phone gutters |
| 5 | 20px | 2 | Desktop nav internal gap, first-section breathing room |
| 6 | 24px | — | Desktop shell padding and column gap |
.sec{padding:16px 0 0}. No side gutters on the section itself; the
content inside pads to 12px, and to 16px on phones ≥430px, back to 12px ≤340px.12px left/right, matching the section content.4px so content tucks under the
tab strip; the first Ανάλυση block instead gets 20px because it follows the verdict card.6px — «Δες
περισσότερα» hugs the paragraph it expands rather than floating halfway to the next block;
9px/10px — the dev-remote widgets in the desktop rail, which are prototype
furniture and do not ship; 3px/2px — the mobile tab strip's own
padding, tightened to fit more tabs (§9). Everything else is a multiple of 4.| DS name | Value | Uses | Applied to |
|---|---|---|---|
| Radius Small | 4px | 64 | Flags, badges, inline markers, the ΕΕΕΠ box, the .secttl bar |
| Radius Regular (default) | 8px | 51 | Buttons, tabs, sub-tabs, inputs, icon squares |
| Radius Circle | 50% | 43 | Avatars, form bubbles, dots, medallions |
| Radius Large | 16px | 39 | Cards, panels, the tab-strip track, the desktop content frame |
| Radius Pill | 999px | 28 | Chips, pills, sign-in, primary CTAs |
| — | 12px | 12 | Nested cards inside a 16px card — one step in, not a new token |
1000px, 50px,
100px and 100% all appear a handful of times and mean nothing more than
"pill" or "circle" — map them to --radius-pill / --radius-circle.
6px, 3px, 2px and 10px appear on sub-8px chrome
(dots, hairline markers, small hatched chips); keep them literal rather than inventing tokens.
32px and 24px exist only on the phone-mockup frame, which does not ship.Four of the page's shadows are design-system styles; the rest are two page-local elevations reused consistently. Both are worth binding as variables because they recur.
| Shadow | Uses | DS name | Purpose |
|---|---|---|---|
2px 2px 5px rgba(0,0,0,.05) | 7 | Shadow Small | Resting card lift |
4px 4px 20px rgba(253,58,1,.10) | 2 | Shadow Color | Branded elevation on emphasised cards |
0 0 0 2px rgba(253,58,1,.40) | 10 | Focus State Shadow | The brand focus ring — keep it, it is the page's only focus affordance |
0 4px 14px -10px rgba(80,40,10,.15) | 11 | page-local | The standard card elevation of this page — a warm, tight, mostly-negative-spread lift. Bind it once. |
0 6px 16px -4px rgba(253,58,1,.6) · 0 8px 18px -6px rgba(253,58,1,.55) | 5 | page-local | The glow under a primary CTA — always brand-tinted, never neutral |
0 1px 2px / 0 1px 3px rgba(0,0,0,.2–.3) | 15 | page-local | Hairline lift on small images: flags, crests, dots |
inset 3px 0 0 <colour> | 6 | page-local | The left status rib on a row — semantic colour, done as an inset shadow so it does not affect layout |
backdrop-filter
appears nowhere in either page — if your port introduces it for a sticky bar, that is a new design
decision, not a port.One responsive page, one breakpoint that matters. Below it the page is the mobile design at full width; at and above it the same content gets the foxbet.gr shell around it.
| Query | Rules | What it does |
|---|---|---|
min-width:1200px | 19 | The breakpoint. Desktop nav, breadcrumb bar, widgets rail, ad skins, fixed footer; the mobile app bar and bottom nav are hidden. |
max-width:1199.98px / 1199px | 15 | Mobile/tablet: full-bleed page, no shell, tightened tab strip. |
min-width:430px · max-width:340px | 2 | Section gutters 16px on large phones, 12px on small ones. |
max-width:1400px · 1280px | 2 | Narrow desktop: drop the ad skins, then un-centre the nav links. Rail and content stay. |
max-width:429.98px | 1 | Form-bubble label steps down (§4). |
prefers-reduced-motion:reduce | 14 | Every animation on the page has an off switch. Port all fourteen. |
hover:hover | 2 | Hover behaviours are gated so touch devices get the tap behaviour instead. |
| Element | Metric | Note |
|---|---|---|
| Top nav | 64px fixed, z-index:200 | Height published as --dnav-h; the ad skins pin to it. Two rows: logo · centred menu · actions, then the league pills. |
| Nav / breadcrumb container | min(1192px, 100% - 48px) | So the logo, pills and breadcrumb start on the same column as the rail. |
| Breadcrumb bar | 40px | Replaces the mobile in-column breadcrumb. |
| Content group | 1180px = 876 main + 12 gap + 292 rail | flex:0 0 auto — never squeezed. Direction is row-reverse: rail markup first, rendered left. |
| Main column | max-width:876px, 16px radius, 1px --line border | Elevation 0 24px 60px -30px rgba(0,0,0,.45). |
| Widgets rail | 292px, gap 16px | The live site's sidebar width. |
| Ad skins | 400 × 1000 native, position:fixed under the nav | object-fit:none — never resampled. Offset calc(50% + 598px); overflowing the viewport is intended and body{overflow-x:clip} absorbs it. |
| Footer | 42px fixed, dark, carries the ΕΕΕΠ row | z-index:200. |
| Shell padding | 0 24px 64px, column gap 24px |
.dlayout,.dcenter{display:contents}. That is what lets one markup serve both layouts —
keep it, or the mobile view inherits a stray flex context..secttl) — the page's signature.secttl{display:flex;align-items:center;gap:8px;font-size:12px;font-weight:700; letter-spacing:1.4px;text-transform:uppercase;color:var(--ink);margin:0 0 12px;padding:0 12px;} .secttl::before{content:"";width:4px;height:14px;border-radius:4px; background:linear-gradient(var(--ember),var(--accent));} /* vertical brand rib */
The optional «more» affordance on the right is 12px/700 in --accent,
text-transform:none and letter-spacing:.2px — it opts out of the uppercase treatment.
Primary (.tabs/.tab) | Secondary (.subtabs/.subtab) | |
|---|---|---|
| Track | --fill background, 1px --line, radius 16px, padding 4px | No track — sits on --page, gap 4px |
| Item | 12px/700, padding 8px 16px, radius 8px, --mut | 12px/700, padding 4px 8px, radius 8px, 1px --line, white |
| Active | Brand gradient, white text | Brand gradient, white text, glow 0 6px 14px -7px rgba(253,58,1,.5) |
| Overflow | Horizontal scroll + snap, desktop drag-to-scroll, fade + «›» affordance | Horizontal scroll, sticky under the pinned header |
| Mobile tightening | gap 8→4, track padding 4→3, item padding 16→6, letter-spacing .2→0, affordance 46→30px | — |
/* every action/CTA on mobile is exactly 33px tall — a deliberate brand choice, below the 44px touch-target guideline. Text is centred by flex, not by padding. */ .signin,.sheet-btn,.tab,.allgroups,.formbtn,.readmore{ height:33px;min-height:33px;padding-top:0;padding-bottom:0; display:inline-flex;align-items:center;justify-content:center;line-height:1;}
--stickyH--stickyH on <html> (0 when unpinned).top:var(--stickyH,140px) on mobile, top:calc(64px + var(--stickyH,0px))
on desktop where the nav is also fixed..stickteams, 12px/700, 20×14 crests)..phone
border/notch), the status bar, the dev remotes in the rail, the placeholder hatch (.phx)
and the Super League demo button are not part of the design system and do not ship. Everything
else in this section does.The in-play page is the pre-game page with the countdown replaced by a live state. Foundations-wise it adds one token and 17 class names; there is nothing else. Anything else that differs between the two files is drift and should be reconciled.
| Addition | Spec |
|---|---|
--live:#D92D20 | Error 600. The only new token. |
.livebadge + .lvdot | Pulsing dot pinned at hero top:13px left:15px, z-index:6; dot 11px, shadow 0 2px 6px rgba(0,0,0,.5). Pulse = livepulse 1.5s scaling to 3.2× and fading. Has a reduced-motion off switch. |
.ls-pill | Phase label. Pill, --live fill, white 12px/700, letter-spacing .5px, padding 4px 8px, embedded 5px dot. |
.ls-score | --num 20px/700, white, line-height 1, letter-spacing .5px. Separator at 60% white. |
.ls-clock | --num 14px/700, white. |
.rest modifier | Paused/ended phases (ΗΜΧ · ΛΗΞΗ Κ.Δ. · ΤΕΛΙΚΟ): pill and dot turn #666666 and the pulse stops. A pulsing dot on a stopped match reads as "still playing" — that is the whole point of the state. |
.lv-win · .ls-clock.fin | ΤΕΛΙΚΟ: the winner's goals go heavier, the clock drops to 70% white. |
.lvwrap | Live-stream/tracker panel. aspect-ratio:16/9, min-height:220px, radius 16px, 1px --line, standard card elevation. Reserves its space so the panel does not reflow when a third-party embed finally paints; an iframe inherits the box and needs no width/height of its own. |
.lvrail · .lvph · .lvph-n · .glbar · .glbtn · .glrow · .glnote · .glph · .glfx* | Dev remotes and the goal-effect demo — prototype only, do not ship. Listed so you can recognise and drop them. |
foxbet-responsive.html and foxbet-responsive-live.html. The only
permitted difference is countdown vs live score/clock. A foundations change that lands in one file
only is a bug in both.These are not specified here. Each link is the single source of truth for that component's geometry, states and variants — read the deployed handover before building, and when it disagrees with any other document, it wins.
| Component | Handover | Appears on |
|---|---|---|
| Odds CTA (ART-378) | foxbet-odds-cta.pages.dev | Both — verdict card, odds rows, sponsor slots |
| Predictions / Tips | foxbet-predictions.pages.dev | Both — the tip card inside the verdict box |
| Form bubbles (ART-379) | foxbet-form-bubbles.pages.dev | Both — hero, team cards, tables |
| Φάση αγώνα (live states) | foxbet-fasi-agwna.pages.dev | In-play — hero pill and every live row |
| TV channel logos | foxbet-tv-logos.pages.dev | Both — broadcaster row. Light surfaces only. |
| Ενδεκάδες (the pitch) | foxbet-endekades.pages.dev | Both — probable lineups |
| «Αναλύσεις ημέρας» widget | foxbet-analyseis-imeras.pages.dev | Desktop rail |
| ΕΕΕΠ regulatory footer | fbnew-5ow.pages.dev/handover-footer-eeep | Both — mandatory (§12) |
--eeep #1A3362,
12px/700, letter-spacing .3px, padding 8px 12px. In the content column the box is
radius 8px with a 22px age circle (1.5px white border); the compact
.eeep-sm variant drops the circle to 18px.4px with a
17px circle, and the full regulatory sentence sits beside it as plain footer text.ΑΡΜΟΔΙΟΣ ΡΥΘΜΙΣΤΗΣ ΕΕΕΠ | ΚΙΝΔΥΝΟΣ ΕΘΙΣΜΟΥ & ΑΠΩΛΕΙΑΣ ΠΕΡΙΟΥΣΙΑΣ | ΕΟΠΑΕ – ΓΡΑΜΜΗ
ΣΥΜΒΟΥΛΕΥΤΙΚΗΣ: 1114 | ΠΑΙΞΕ ΥΠΕΥΘΥΝΑ. Do not shorten it.0 0 0 2px rgba(253,58,1,.40) is present on every
interactive element — it is the page's only focus affordance.--stickyH drives every sticky offset, and tab jumps re-measure after layout settles.prefers-reduced-motion blocks ported, including the live pulse.assets/….foxbet-responsive.html and foxbet-responsive-live.html at 1440px and 390px.
Component geometry lives in the per-component handovers listed in §11; data contracts and formulas live
in HANDOFF.md.