Κάρτα πρόγνωσης: τίτλος επιλογής, δύο γραμμές ομάδων με ώρα ή σκορ, chip διοργάνωσης και ένα odds CTA σε
υποδοχή. Πηγή: Figma component set «Tip» 4036:171711, σελίδα «Tips» 8328:288198.
Και οι 10 παραλλαγές αποδίδονται στο ακριβές ύψος του frame τους.
Όλα τα αρχεία βρίσκονται στον φάκελο Assets/ δίπλα σε αυτή τη σελίδα. Κάθε chip ανοίγει το αρχείο απευθείας.
Εμβλήματα ομάδων
Διοργανώσεις & άθλημα
Εικονίδια αποτελέσματος
Λογότυπα στοιχηματικών (από το odds-cta)
Κάθε specimen έχει το πλάτος του frame του στο Figma, ώστε τα ύψη να είναι άμεσα συγκρίσιμα.
Τρεις άξονες: data-variant (επιφάνεια) × data-bet (τύπος στοιχήματος)
× data-cta (ποιο CTA μπαίνει στην υποδοχή). Η δηλωμένη παραλλαγή αποφασίζει — ΟΧΙ το πλάτος
του viewport, όπως και στο Form Bubbles.
| id | Περιγραφή | variant | bet | cta |
|---|---|---|---|---|
mobile-v5 | Mobile - CTA V5 stacked 100x68 (Figma default) | data-variant="mobile" | data-bet="single" | data-cta="v5" |
desktop-v4 | Desktop - CTA V4 pill, slot-stretched to 48 (Figma default) | data-variant="desktop" | data-bet="single" | data-cta="v4" |
sidebar-v4 | Sidebar - CTA V4 full-width 40 (Figma default) | data-variant="sidebar" | data-bet="single" | data-cta="v4" |
mobile-v1 | Mobile - CTA V1 (added, not in Figma) | data-variant="mobile" | data-bet="single" | data-cta="v1" |
desktop-v1 | Desktop - CTA V1 (added, not in Figma) | data-variant="desktop" | data-bet="single" | data-cta="v1" |
mobile-v4 | Mobile - CTA V4 pill | data-variant="mobile" | data-bet="single" | data-cta="v4" |
desktop-v5 | Desktop - CTA V5 stacked | data-variant="desktop" | data-bet="single" | data-cta="v5" |
mobile-bb | Mobile - bet builder, CTA V1 bare | data-variant="mobile" | data-bet="bb" | data-cta="v1" |
mobile-outright | Mobile - outright, no teams | data-variant="mobile" | data-bet="outright" | data-cta="v5" |
desktop-bb | Desktop - bet builder, CTA V4 + divider + stake | data-variant="desktop" | data-bet="bb" | data-cta="v4" |
desktop-outright | Desktop - outright, CTA V4 + divider + stake | data-variant="desktop" | data-bet="outright" | data-cta="v4" |
.prd-cta — 100px κεντραρισμένη σε mobile, 240px δεξιά σε desktop.
Το sidebar είναι όμως άλλη κάρτα, όχι στενό desktop.Κάθε παραλλαγή αποδίδεται στο ακριβές ύψος του frame της στο Figma. Μέτρηση σε Chromium στο πλάτος του frame, μόνο ορατό περιεχόμενο.
| Παραλλαγή | Ύψος | Σημείωση |
|---|---|---|
mobile-open-single-v5 | 134px | 134 |
mobile-lost-single-v5 | 134px | 134 |
mobile-won-single-v5 | 134px | 134 |
desktop-open-single-v4 | 122px | ΣΚΟΠΙΜΑ ΜΙΚΡΟΤΕΡΗ από το frame των 134 (1.3.0, εγκεκριμένο): το cols layout βάζει την ώρα δίπλα στις ομάδες, άρα η στήλη του αγώνα χρειάζεται 3 σειρές και όχι 4 |
sidebar-open-v4 | 171px | 171 |
mobile-open-bb | 222px | 222 (unchanged after the CTA swap to V1) |
mobile-open-outright-v5 | 98px | 98 (74 content + 24 padding, with the master's stake and divider off) |
desktop-open-bb | 262px | 262 |
desktop-open-outright | 138px | 138 |
border (το Figma το ζωγραφίζει ΜΕΣΑ στο frame)·
ο .prd-hr έχει μηδενικό ύψος (pseudo-element, όχι border-top)·
και τα h3/p χρειάζονται margin:0.Το component.html είναι template με {{key}}. Ο renderer είναι
σκόπιμα χωρίς λογική: ό,τι τελειώνει σε _html είναι έτοιμο κομμάτι markup. Κενή τιμή = η ενότητα
δεν εμφανίζεται.
| Κλειδί | Τι είναι |
|---|---|
{{pick}} | Ο τίτλος της επιλογής — Roboto Condensed Bold 16/24. Υποχρεωτικός: στα V4/V5 δεν υπάρχει label μέσα στο control, άρα αυτός είναι η μόνη λεζάντα της αγοράς. |
{{icon_html}} | .prd-ic 14×14 — εικονίδιο αποτελέσματος (won/lost). Κενό στα open. |
{{descTop_html}} | .prd-desc ΠΑΝΩ από τον τίτλο. Χρησιμοποιείται από το outright. |
{{descMid_html}} | .prd-desc ΑΝΑΜΕΣΑ σε τίτλο και ομάδες. Θέση του sidebar. |
{{legs_html}} | .prd-legs — τα σκέλη του bet builder (28px ανά σκέλος). |
{{teams_html}} | .prd-teams — δύο .prd-team. Κενό στο outright. |
{{when_html}} | Μέσα στο .prd-when: ώρα έναρξης (open) ή .prd-sc σκορ (won/lost). |
{{leagueName}} {{sportIcon}} {{leagueFlag}} | Το chip διοργάνωσης. |
{{label_html}} | .prd-lbl — έξτρα chip, μόνο στο outright. |
{{divider_html}} | .prd-hr — διάστικτη γραμμή, μηδενικού ύψους. |
{{stake_html}} | .prd-stake — «Ποντάρισμα / Πιθανό Κέρδος», 20px. |
{{meta_html}} | Ό,τι κάθεται στη γραμμή του chip διοργάνωσης: το pill δώρου (.prd-gift) και/ή ο δείκτης ποντάρισμα → Πιθανή επιστροφή (.prd-meta). Είναι δύο ξεχωριστά πράγματα — μη τα ενώσεις σε ένα chip. Δες 3C για το ποια παραλλαγή παίρνει τι. |
{{ctaGift_html}} | 1.2.0 — το pill δώρου μέσα στο slot του control, δηλαδή κάτω από το control και κεντραρισμένο σε αυτό. Εδώ το βάζουν όλες οι mobile παραλλαγές. Βάζεις το markup σε ΕΝΑ από τα δύο slots — η θέση είναι απόφαση δεδομένων. |
{{leagueHref}} | 1.2.0 — το href του chip διοργάνωσης. Οι ομάδες παίρνουν το δικό τους href μέσα από το {{teams_html}}. |
{{cta_html}} | Το control από το odds-cta. Το predictions ΔΕΝ δηλώνει ποτέ .modd ή .bodd. |
Τρία πράγματα μπήκαν εδώ, και το κρίσιμο είναι πού ζει το καθένα: το pill δώρου αλλάζει θέση και μέγεθος ανά παραλλαγή, ο δείκτης ποντάρισμα → Πιθανή επιστροφή έμεινε μόνο στις desktop κάρτες, και οι ομάδες και η διοργάνωση είναι πλέον links.
Η θέση είναι απόφαση δεδομένων, όχι CSS: βάλε το markup στο slot που θέλεις. Το μέγεθος δεν είναι θέμα γούστου — το ορίζει η αριθμητική του container.
| Παραλλαγή | Slot | Θέση | Μέγεθος | Γιατί όχι μεγαλύτερο |
|---|---|---|---|---|
desktop data-layout="cols" | {{meta_html}} |
στο merged lane, κάτω από το control | 32px, glyph 18 | Είναι το πραγματικό μέγεθος του Figma (6174:37488). Το lane είναι 108px με control 48 — χωράει, άρα εδώ δεν υπάρχει απόκλιση. |
| mobile (single, bb) | {{ctaGift_html}} |
κάτω από το control, κεντραρισμένο σε αυτό, +10px | 26px, glyph 15 | Slot 110 − control 68 − gap 10 = ταβάνι 32px. Το 26 αφήνει 6px περιθώριο. |
| sidebar | {{meta_html}} |
στη γραμμή του chip, δεξιά (margin-left:auto) | 20px | Η γραμμή είναι 20px. Ένα pixel πάνω και σπάει το 171. |
| bb / outright | {{meta_html}} |
στη γραμμή του chip, μετά το chip | 20px | Ίδιος λόγος — γραμμή 20px. |
Το UI του pill είναι Figma 6174:37488 («Buttons», Tertiary Light): radius
1000, 1px #B3B3B3, fill #FFFFFF0D, Roboto
12/500 #1A1A1A, το δικό του glyph δώρου + ένας αριθμός.
Δεν είναι κουμπί — ανακοινώνει, δεν πατιέται· το control μένει το μόνο πατήσιμο
στοιχείο της κάρτας.
.prd-when κρατά δύο score chips 20px αντί για τη γραμμή έναρξης των 16px, και 24+40+22+20 με τρία gaps 2px κάνει 112 σε κουτί 110. Υποχωρούν τα gaps (row-gap:0 στο .is-won/.is-lost), ποτέ τα chips — τα chips είναι μέρος της επαληθευμένης γεωμετρίας, τα gaps όχι. Επίσης: το .prd-ttl μένει display:flex εδώ — ως block, το 14×24 .prd-ic των won/lost σπρώχνει τον τίτλο σε δεύτερη γραμμή και η κάρτα μετρά 160. Βρέθηκε από τον πρώτο καταναλωτή (σελίδα ανάλυσης), όχι από example — το component δεν έχει desktop won/lost example.Ζει μόνο στις δύο desktop cols κάρτες. Το mobile και το
sidebar δεν τον έχουν καθόλου· τα bb / outright δεν τον είχαν ποτέ, γιατί
τυπώνουν ήδη «Ποντάρισμα / Πιθανό Κέρδος» από κάτω
({{stake_html}}) — οι ίδιοι αριθμοί δεν εμφανίζονται δύο φορές.
auto), ώστε το 10.00 να κάθεται ακριβώς πάνω από το 21.20.--mut για τις λέξεις, 12/700 --ink για τους
αριθμούς. Η επιστροφή δεν είναι hero — ίδιο βάρος με το ποντάρισμα..prd-meta-v--win (--win) για την επιστροφή, .prd-meta-v--loss (--err) για το ποντάρισμα που χάθηκε (π.χ. −10.00). Είναι modifiers στην τιμή, όχι νέα στοιχεία: η γραμμή, τα labels και η γεωμετρία μένουν ίδια, άρα τίποτα δεν μετακινείται. Μετρημένη αντίθεση στη λευκή κάρτα: 5.41 και 4.83 — και τα δύο περνούν AA στα 12px, και είναι δηλωμένα στο component.json.Κάθε .prd-team είναι <a> προς τη σελίδα ανάλυσης του
αγώνα· το chip είναι <a class="prd-lg" href="{{leagueHref}}"> προς
τη διοργάνωση. Τα hrefs των examples είναι placeholders — τα δίνει η σελίδα.
text-decoration και outline — ποτέ
border, padding ή αλλαγή βάρους. Αυτό το component έχει σπάσει έτσι: ένα
a{border-bottom:1px} της σελίδας πρόσθεσε 1px σε κάθε control και
χάλασε τα μετρημένα frames. Γι' αυτό υπάρχει και το border:0 εδώ.
Επίσης :focus-visible, όχι :focus.| Keyframe | Ρολόι | Τι κάνει |
|---|---|---|
prd-gift-ring | 6s | Καμπανάκι, όχι loop: όλο το swing (14° → −11° → 8° → −5° → 2°) τελειώνει μέσα στο πρώτο 12% και τα υπόλοιπα ~5s είναι ακινησία. Pivot στο 15% από πάνω, σαν κάτι που κρέμεται. |
prd-gift-glow | 6s, ίδιο | Το περίγραμμα «ανασαίνει» μαζί με το swing, ώστε να διαβάζονται ως ένα γεγονός και όχι ως δύο πράγματα που κουνιούνται ασύνδετα. |
prd-gift-sweep | 2.8s, συνεχές | Χρώμα που περνά μέσα από το pill: φαρδιά, μαλακή μπάντα στο 26% του
--acc. Επειδή δεν σταματά ποτέ, πρέπει να μένει διακριτικό —
γρήγορο ή κορεσμένο sweep σε μόνιμη κίνηση δεν διαβάζεται ως προσφορά, διαβάζεται
ως χαλασμένη σελίδα. Χρειάζεται overflow:hidden για να κοπεί στο
radius. |
prefers-reduced-motion τα σβήνει
όλα και το sweep το αφαιρεί αντί να το παγώσει στη μέση της διαδρομής. Animation
που δεν απενεργοποιείται είναι accessibility defect, και εδώ όλα είναι διακοσμητικά.color-mix() — το
μόνο «σύγχρονο» feature του component (Chrome 111+, Safari 16.2+, Firefox 113+).
Τα δύο εικονίδια του δείκτη (κέρμα, τάση) δεν προέρχονται από Figma — δεν υπάρχει
node· ακολουθούν το idiom του glyph του δώρου.1.3.1: το κελί κάθεται ακριβώς δίπλα στα ονόματα (12px), όχι στο δεξί άκρο της στήλης — το .prd-teams γίνεται flex:0 1 auto και «αγκαλιάζει» το περιεχόμενό του. Στο mobile μένει το flex:1 0 0 του Figma, που σπρώχνει το κελί δεξιά.
Στο cols layout η ώρα ήταν δική της σειρά στο τέλος της στήλης του αγώνα. Για το
«Σάβ 23:00» δούλευε· για settled κάρτα όχι: το ίδιο κελί κρατά τότε δύο score
chips, ένα ανά ομάδα, και μόνο του σε γραμμή δεν κάθονταν πια απέναντι από τις ομάδες
τους. Τώρα το .prd-mid είναι κανονικό grid cell (όχι
display:contents) και κρατά ομάδες + κελί ώρας μαζί, όπως στο mobile.
row-gap:0 στα .is-won/.is-lost
για να χωρέσουν τα 20px chips όπου η ώρα ήθελε 16. Με το κελί δίπλα στις ομάδες, open και
settled έχουν ίδια γεωμετρία — το hack έφυγε τελείως.min-height και
το row-gap ανέβηκε 2 → 4px: ο «προϋπολογισμός 8px» υπήρχε μόνο όσο η κάρτα ήταν
καρφωμένη στα 110 περιεχομένου.Το anchor είναι το .prd-teams — το στοιχείο που υπήρχε ήδη — άρα
δεν προστέθηκε wrapper και δεν άλλαξε κανένα box. Και τα δύο ονόματα υπογραμμίζονται
μαζί στο hover, ώστε να διαβάζεται ως ένας στόχος.
Το CTA δεν υλοποιείται εδώ. Έρχεται από το odds-cta μέσα στην υποδοχή
.prd-cta. Απαιτείται odds-cta >= 4.0.0. Μοναδική πηγή αλήθειας: foxbet-odds-cta.pages.dev.
cta_html κουβαλά το δικό του class="bo" wrapper, γιατί η οικογένεια V4/V5 είναι scoped κάτω από .bo — και το predictions δεν επιτρέπεται να δηλώσει κλάση bo (κανόνας prefix)..modd — καμία επιπλέον κλάση — και η απόδοση μπαίνει σε .od, όχι .modd-od. Έτσι το δημοσιεύει το handover: κάρτα 41px που μεγαλώνει από 88.67px. Ένα V1 χωρίς label (bet builder) δεν θέλει τίποτα άλλο: το .modd-card κεντράρει από μόνο του και χωρίς .modd-sel δεν υπάρχει hairline να χωρίσει τίποτα.#1C1F56, χρώμα που δεν αντιστοιχεί σε καμία στοιχηματική και δεν είναι μία από τις 5 παραλλαγές — αντικαταστάθηκε με V1 ώστε το tip να χρησιμοποιεί μόνο πραγματικές παραλλαγές του component.Η κατάσταση διεκπεραίωσης μπαίνει ως κλάση στην κάρτα και βάφει την αριστερή γραμμή.
| Κλάση | Γραμμή | Figma | Κελί ώρας |
|---|---|---|---|
.is-open | --ink | #444444 | ώρα έναρξης |
.is-won | --win | #4CAF50 | .prd-sc σκορ |
.is-lost | --err | #EF5350 | .prd-sc σκορ |
Χρησιμοποιούμενα tokens: --ink --mut --line --fill --body --win --err ·
instance var --prd-disp (Roboto Condensed — δεν υπάρχει token στο tokens.css).
Λυμένα
<h3> — η κάρτα ζει μέσα σε λίστα/ενότητα, οπότε το επίπεδο προσαρμόζεται στη σελίδα υποδοχής.aria-hidden="true".title + aria-label στο <a> είναι υποχρεωτικά.alt — η κατάσταση δεν επικοινωνείται μόνο με χρώμα.alt="": το όνομα της ομάδας υπάρχει ήδη ως κείμενο δίπλα.tokens/tokens.css, μετά odds-cta/component.css, μετά odds-cta/component-brand.css (για V4/V5), μετά predictions/component.css. Η σειρά έχει σημασία.--prd-disp σε Roboto Condensed στη σελίδα υποδοχής μέχρι να μπει token.data-variant, data-bet, data-cta στο .prd — μη βασίζεσαι στο viewport..modd + .od. Στα V4/V5: βάλε το class="bo" wrapper.cols κάρτες είναι σκόπιμα 122 (δες 3D).[...document.images].filter(i => !i.complete || !i.naturalWidth).