From 11606eeea707a4a182b64ae5d238b5ada598df42 Mon Sep 17 00:00:00 2001 From: Daria Grudzien Date: Tue, 23 Jun 2026 14:06:24 -0700 Subject: [PATCH 1/7] draft of bingo card --- src/components/island/BingoCard.svelte | 399 +++++++++++++++++++++++++ src/components/sections/bingo.astro | 41 +++ src/layouts/Layout.astro | 5 +- src/pages/bingo.astro | 54 ++++ src/pages/index.astro | 2 + 5 files changed, 499 insertions(+), 2 deletions(-) create mode 100644 src/components/island/BingoCard.svelte create mode 100644 src/components/sections/bingo.astro create mode 100644 src/pages/bingo.astro diff --git a/src/components/island/BingoCard.svelte b/src/components/island/BingoCard.svelte new file mode 100644 index 000000000..23766338b --- /dev/null +++ b/src/components/island/BingoCard.svelte @@ -0,0 +1,399 @@ + + +
+

+ {checkedCount === 0 + ? "Click each edition you’ve attended" + : checkedCount === 25 + ? '🎉 You attended all 25 editions!' + : `${checkedCount} of 25 attended`} +

+ +
+ {#each editions as edition, i} + + {/each} +
+ + +
+ + diff --git a/src/components/sections/bingo.astro b/src/components/sections/bingo.astro new file mode 100644 index 000000000..e7afcbaa1 --- /dev/null +++ b/src/components/sections/bingo.astro @@ -0,0 +1,41 @@ +--- +import Section2 from "@ui/Section2.astro"; +import Display from "@ui/Display.astro"; +import BingoCard from "@components/island/BingoCard.svelte"; +--- + + +
+ + Have you
been there? +
+
+ + +
+ + diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro index bf9196832..60ed1dd01 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/Layout.astro @@ -30,13 +30,14 @@ import "@styles/light-theme.css"; export interface Props { title: string; description: string; + image?: string; hideHeader?: boolean; hideFooter?: boolean; } const currentPath = Astro.url.pathname; -const { title, description } = Astro.props; +const { title, description, image } = Astro.props; if (!title || !description) { throw new Error(`${Astro.url.pathname} Both 'title' and 'description' must be set.`); @@ -51,7 +52,7 @@ const hideFooter = Astro.props.hideFooter ?? false; - + diff --git a/src/pages/bingo.astro b/src/pages/bingo.astro new file mode 100644 index 000000000..350469ea7 --- /dev/null +++ b/src/pages/bingo.astro @@ -0,0 +1,54 @@ +--- +import Layout from "@layouts/Layout.astro"; +import Section2 from "@ui/Section2.astro"; +import BingoCard from "@components/island/BingoCard.svelte"; +--- + + + +
+
+

EuroPython
Bingo

+

+ 25 editions. 13 cities. One community.
+ How many have you attended? +

+
+ + +
+
+
+ + diff --git a/src/pages/index.astro b/src/pages/index.astro index 7b338812f..2d0f76a65 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -15,6 +15,7 @@ import EuroSciPy from "@sections/euroscipy.astro"; import CommunityPartners from "@sections/community-partners.astro"; import MediaPartners from "@sections/media-partners.astro"; import Connect from "@sections/connect.astro"; +import Bingo from "@sections/bingo.astro"; --- + From 58c56fa85fa5954027238592a65688a75684f916 Mon Sep 17 00:00:00 2001 From: Daria Grudzien Date: Tue, 23 Jun 2026 14:29:21 -0700 Subject: [PATCH 2/7] fix linkedin sharing --- src/components/island/BingoCard.svelte | 34 ++++++++++++++++---------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/components/island/BingoCard.svelte b/src/components/island/BingoCard.svelte index 23766338b..fd75ad743 100644 --- a/src/components/island/BingoCard.svelte +++ b/src/components/island/BingoCard.svelte @@ -59,14 +59,15 @@ const BINGO_PAGE_URL = 'https://ep2026.europython.eu/bingo'; function shareLinkedIn() { + const text = buildShareText() + '\n\n' + BINGO_PAGE_URL; window.open( - `https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent(BINGO_PAGE_URL)}`, + `https://www.linkedin.com/feed/?shareActive=true&text=${encodeURIComponent(text)}`, '_blank', 'noopener,noreferrer' ); } function shareX() { - const text = buildShareText() + '\n#EuroPython #Python'; + const text = buildShareText(); window.open( `https://twitter.com/intent/tweet?text=${encodeURIComponent(text)}&url=${encodeURIComponent(PAGE_URL)}`, '_blank', 'noopener,noreferrer' @@ -74,7 +75,7 @@ } function shareBlueSky() { - const text = `${buildShareText()}\n#EuroPython #Python\n${PAGE_URL}`; + const text = `${buildShareText()}\n\n${PAGE_URL}`; window.open( `https://bsky.app/intent/compose?text=${encodeURIComponent(text)}`, '_blank', 'noopener,noreferrer' @@ -82,7 +83,7 @@ } function shareMastodon() { - const text = `${buildShareText()}\n#EuroPython #Python\n${PAGE_URL}`; + const text = `${buildShareText()}\n\n${PAGE_URL}`; window.open( `https://shareopenly.org/share/?url=${encodeURIComponent(PAGE_URL)}&text=${encodeURIComponent(text)}`, '_blank', 'noopener,noreferrer' @@ -102,11 +103,9 @@ canvas.height = H; const ctx = canvas.getContext('2d'); - /* background */ ctx.fillStyle = '#0b1121'; ctx.fillRect(0, 0, W, H); - /* title */ ctx.fillStyle = '#f0c040'; ctx.font = 'bold 30px system-ui, sans-serif'; ctx.textAlign = 'center'; @@ -127,12 +126,10 @@ const isChecked = checked[i]; const isCurrent = ed.year === 2026; - /* cell bg */ ctx.fillStyle = isChecked ? '#f0c040' : isCurrent ? '#111d36' : '#0d1520'; roundRect(ctx, x + 3, y + 3, CELL - 6, CELL - 6, 2); ctx.fill(); - /* cell border — dashed approximation via dotted segments */ ctx.strokeStyle = isChecked ? '#d4a830' : isCurrent ? '#2a4a80' : 'rgba(255,255,255,0.12)'; ctx.lineWidth = 1; ctx.setLineDash([4, 4]); @@ -140,13 +137,11 @@ ctx.stroke(); ctx.setLineDash([]); - /* year */ ctx.fillStyle = isChecked ? '#0b1121' : '#ffffff'; ctx.font = `bold 21px system-ui, sans-serif`; ctx.textAlign = 'center'; ctx.fillText(ed.year.toString(), x + CELL / 2, y + CELL * 0.46); - /* city */ ctx.fillStyle = isChecked ? 'rgba(11,17,33,0.65)' : 'rgba(255,255,255,0.55)'; ctx.font = `12px system-ui, sans-serif`; ctx.fillText(ed.city, x + CELL / 2, y + CELL * 0.68); @@ -176,7 +171,7 @@

{checkedCount === 0 - ? "Click each edition you’ve attended" + ? "Click each edition you've attended" : checkedCount === 25 ? '🎉 You attended all 25 editions!' : `${checkedCount} of 25 attended`} @@ -217,9 +212,12 @@ - +

@@ -320,7 +318,7 @@ opacity: 0.7; } -.cell-now { + .cell-now { font-size: clamp(0.45rem, 1vw, 0.6rem); font-weight: 700; text-transform: uppercase; @@ -354,6 +352,7 @@ flex-wrap: wrap; gap: 0.5rem; justify-content: center; + align-items: center; } .share-btn { @@ -387,6 +386,15 @@ color: oklch(0.6 0.23 10); } + .share-btn--save { + width: auto; + padding: 0 0.875rem; + font-size: 0.8rem; + font-weight: 600; + font-family: inherit; + letter-spacing: 0.02em; + } + /* ── responsive ── */ @media (max-width: 540px) { .bingo-grid { gap: 5px; } From 088291ee1887aeac0f15a95edc75b555b5665632 Mon Sep 17 00:00:00 2001 From: Daria Grudzien Date: Thu, 25 Jun 2026 15:35:17 -0700 Subject: [PATCH 3/7] wip --- public/media/bingo/basel-2.svg | 21 ++++ public/media/bingo/basel.svg | 21 ++++ public/media/bingo/berlin-2.svg | 19 ++++ public/media/bingo/berlin.svg | 19 ++++ public/media/bingo/bilbao-2.svg | 13 +++ public/media/bingo/bilbao.svg | 13 +++ public/media/bingo/birmingham-2.svg | 15 +++ public/media/bingo/birmingham.svg | 15 +++ public/media/bingo/charleroi-2.svg | 19 ++++ public/media/bingo/charleroi.svg | 19 ++++ public/media/bingo/dublin-2.svg | 20 ++++ public/media/bingo/dublin.svg | 20 ++++ public/media/bingo/edinburgh.svg | 24 +++++ public/media/bingo/florence-2.svg | 23 +++++ public/media/bingo/florence-3.svg | 23 +++++ public/media/bingo/florence.svg | 23 +++++ public/media/bingo/geneva-2.svg | 21 ++++ public/media/bingo/geneva.svg | 21 ++++ public/media/bingo/gothenburg-2.svg | 17 ++++ public/media/bingo/gothenburg.svg | 17 ++++ public/media/bingo/krakow-2.svg | 21 ++++ public/media/bingo/krakow.svg | 21 ++++ public/media/bingo/online.svg | 12 +++ public/media/bingo/prague-2.svg | 22 +++++ public/media/bingo/prague-3.svg | 22 +++++ public/media/bingo/prague.svg | 22 +++++ public/media/bingo/rimini-2.svg | 16 +++ public/media/bingo/rimini.svg | 16 +++ public/media/bingo/vilnius-2.svg | 19 ++++ public/media/bingo/vilnius.svg | 19 ++++ src/components/island/BingoCard.svelte | 129 +++++++++++++++++-------- 31 files changed, 661 insertions(+), 41 deletions(-) create mode 100644 public/media/bingo/basel-2.svg create mode 100644 public/media/bingo/basel.svg create mode 100644 public/media/bingo/berlin-2.svg create mode 100644 public/media/bingo/berlin.svg create mode 100644 public/media/bingo/bilbao-2.svg create mode 100644 public/media/bingo/bilbao.svg create mode 100644 public/media/bingo/birmingham-2.svg create mode 100644 public/media/bingo/birmingham.svg create mode 100644 public/media/bingo/charleroi-2.svg create mode 100644 public/media/bingo/charleroi.svg create mode 100644 public/media/bingo/dublin-2.svg create mode 100644 public/media/bingo/dublin.svg create mode 100644 public/media/bingo/edinburgh.svg create mode 100644 public/media/bingo/florence-2.svg create mode 100644 public/media/bingo/florence-3.svg create mode 100644 public/media/bingo/florence.svg create mode 100644 public/media/bingo/geneva-2.svg create mode 100644 public/media/bingo/geneva.svg create mode 100644 public/media/bingo/gothenburg-2.svg create mode 100644 public/media/bingo/gothenburg.svg create mode 100644 public/media/bingo/krakow-2.svg create mode 100644 public/media/bingo/krakow.svg create mode 100644 public/media/bingo/online.svg create mode 100644 public/media/bingo/prague-2.svg create mode 100644 public/media/bingo/prague-3.svg create mode 100644 public/media/bingo/prague.svg create mode 100644 public/media/bingo/rimini-2.svg create mode 100644 public/media/bingo/rimini.svg create mode 100644 public/media/bingo/vilnius-2.svg create mode 100644 public/media/bingo/vilnius.svg diff --git a/public/media/bingo/basel-2.svg b/public/media/bingo/basel-2.svg new file mode 100644 index 000000000..226608124 --- /dev/null +++ b/public/media/bingo/basel-2.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/basel.svg b/public/media/bingo/basel.svg new file mode 100644 index 000000000..553fc0e30 --- /dev/null +++ b/public/media/bingo/basel.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/berlin-2.svg b/public/media/bingo/berlin-2.svg new file mode 100644 index 000000000..19430054d --- /dev/null +++ b/public/media/bingo/berlin-2.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/berlin.svg b/public/media/bingo/berlin.svg new file mode 100644 index 000000000..b062ad972 --- /dev/null +++ b/public/media/bingo/berlin.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/bilbao-2.svg b/public/media/bingo/bilbao-2.svg new file mode 100644 index 000000000..4d7e712aa --- /dev/null +++ b/public/media/bingo/bilbao-2.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/bilbao.svg b/public/media/bingo/bilbao.svg new file mode 100644 index 000000000..dbdc1a734 --- /dev/null +++ b/public/media/bingo/bilbao.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/birmingham-2.svg b/public/media/bingo/birmingham-2.svg new file mode 100644 index 000000000..8cf64d760 --- /dev/null +++ b/public/media/bingo/birmingham-2.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/birmingham.svg b/public/media/bingo/birmingham.svg new file mode 100644 index 000000000..adbff9edf --- /dev/null +++ b/public/media/bingo/birmingham.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/charleroi-2.svg b/public/media/bingo/charleroi-2.svg new file mode 100644 index 000000000..9ac634a07 --- /dev/null +++ b/public/media/bingo/charleroi-2.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/charleroi.svg b/public/media/bingo/charleroi.svg new file mode 100644 index 000000000..49708a315 --- /dev/null +++ b/public/media/bingo/charleroi.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/dublin-2.svg b/public/media/bingo/dublin-2.svg new file mode 100644 index 000000000..72259ef24 --- /dev/null +++ b/public/media/bingo/dublin-2.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/dublin.svg b/public/media/bingo/dublin.svg new file mode 100644 index 000000000..0cb4a403f --- /dev/null +++ b/public/media/bingo/dublin.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/edinburgh.svg b/public/media/bingo/edinburgh.svg new file mode 100644 index 000000000..8de469018 --- /dev/null +++ b/public/media/bingo/edinburgh.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/florence-2.svg b/public/media/bingo/florence-2.svg new file mode 100644 index 000000000..3f8dee76f --- /dev/null +++ b/public/media/bingo/florence-2.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/florence-3.svg b/public/media/bingo/florence-3.svg new file mode 100644 index 000000000..a10073640 --- /dev/null +++ b/public/media/bingo/florence-3.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/florence.svg b/public/media/bingo/florence.svg new file mode 100644 index 000000000..dbb199691 --- /dev/null +++ b/public/media/bingo/florence.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/geneva-2.svg b/public/media/bingo/geneva-2.svg new file mode 100644 index 000000000..00c79fe53 --- /dev/null +++ b/public/media/bingo/geneva-2.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/geneva.svg b/public/media/bingo/geneva.svg new file mode 100644 index 000000000..df381867c --- /dev/null +++ b/public/media/bingo/geneva.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/gothenburg-2.svg b/public/media/bingo/gothenburg-2.svg new file mode 100644 index 000000000..b6e6a5958 --- /dev/null +++ b/public/media/bingo/gothenburg-2.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/gothenburg.svg b/public/media/bingo/gothenburg.svg new file mode 100644 index 000000000..86601934b --- /dev/null +++ b/public/media/bingo/gothenburg.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/krakow-2.svg b/public/media/bingo/krakow-2.svg new file mode 100644 index 000000000..2ab445c6c --- /dev/null +++ b/public/media/bingo/krakow-2.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/krakow.svg b/public/media/bingo/krakow.svg new file mode 100644 index 000000000..055dd455f --- /dev/null +++ b/public/media/bingo/krakow.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/online.svg b/public/media/bingo/online.svg new file mode 100644 index 000000000..2dcd1f9ae --- /dev/null +++ b/public/media/bingo/online.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/prague-2.svg b/public/media/bingo/prague-2.svg new file mode 100644 index 000000000..aa500454d --- /dev/null +++ b/public/media/bingo/prague-2.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/prague-3.svg b/public/media/bingo/prague-3.svg new file mode 100644 index 000000000..209131ea3 --- /dev/null +++ b/public/media/bingo/prague-3.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/prague.svg b/public/media/bingo/prague.svg new file mode 100644 index 000000000..a8f9e92b0 --- /dev/null +++ b/public/media/bingo/prague.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/rimini-2.svg b/public/media/bingo/rimini-2.svg new file mode 100644 index 000000000..cecf9f69b --- /dev/null +++ b/public/media/bingo/rimini-2.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/rimini.svg b/public/media/bingo/rimini.svg new file mode 100644 index 000000000..ce86db339 --- /dev/null +++ b/public/media/bingo/rimini.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/vilnius-2.svg b/public/media/bingo/vilnius-2.svg new file mode 100644 index 000000000..cf3b49d39 --- /dev/null +++ b/public/media/bingo/vilnius-2.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/vilnius.svg b/public/media/bingo/vilnius.svg new file mode 100644 index 000000000..7a92eb016 --- /dev/null +++ b/public/media/bingo/vilnius.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/components/island/BingoCard.svelte b/src/components/island/BingoCard.svelte index fd75ad743..b3018f337 100644 --- a/src/components/island/BingoCard.svelte +++ b/src/components/island/BingoCard.svelte @@ -2,31 +2,31 @@ const STORAGE_KEY = 'ep-bingo-checked'; const editions = [ - { year: 2002, city: 'Charleroi' }, - { year: 2003, city: 'Charleroi' }, - { year: 2004, city: 'Gothenburg' }, - { year: 2005, city: 'Gothenburg' }, - { year: 2006, city: 'CERN, Geneva' }, - { year: 2007, city: 'Vilnius' }, - { year: 2008, city: 'Vilnius' }, - { year: 2009, city: 'Birmingham' }, - { year: 2010, city: 'Birmingham' }, - { year: 2011, city: 'Florence' }, - { year: 2012, city: 'Florence' }, - { year: 2013, city: 'Florence' }, - { year: 2014, city: 'Berlin' }, - { year: 2015, city: 'Bilbao' }, - { year: 2016, city: 'Bilbao' }, - { year: 2017, city: 'Rimini' }, - { year: 2018, city: 'Edinburgh' }, - { year: 2019, city: 'Basel' }, - { year: 2020, city: 'Online' }, - { year: 2021, city: 'Online' }, - { year: 2022, city: 'Dublin' }, - { year: 2023, city: 'Prague' }, - { year: 2024, city: 'Prague' }, - { year: 2025, city: 'Prague' }, - { year: 2026, city: 'Kraków' }, + { year: 2002, city: 'Charleroi', icon: '/media/bingo/charleroi.svg' }, + { year: 2003, city: 'Charleroi', icon: '/media/bingo/charleroi-2.svg' }, + { year: 2004, city: 'Gothenburg', icon: '/media/bingo/gothenburg.svg' }, + { year: 2005, city: 'Gothenburg', icon: '/media/bingo/gothenburg-2.svg' }, + { year: 2006, city: 'CERN, Geneva',icon: '/media/bingo/geneva.svg' }, + { year: 2007, city: 'Vilnius', icon: '/media/bingo/vilnius.svg' }, + { year: 2008, city: 'Vilnius', icon: '/media/bingo/vilnius-2.svg' }, + { year: 2009, city: 'Birmingham', icon: '/media/bingo/birmingham.svg' }, + { year: 2010, city: 'Birmingham', icon: '/media/bingo/birmingham-2.svg' }, + { year: 2011, city: 'Florence', icon: '/media/bingo/florence.svg' }, + { year: 2012, city: 'Florence', icon: '/media/bingo/florence-2.svg' }, + { year: 2013, city: 'Florence', icon: '/media/bingo/florence-3.svg' }, + { year: 2014, city: 'Berlin', icon: '/media/bingo/berlin.svg' }, + { year: 2015, city: 'Bilbao', icon: '/media/bingo/bilbao.svg' }, + { year: 2016, city: 'Bilbao', icon: '/media/bingo/bilbao-2.svg' }, + { year: 2017, city: 'Rimini', icon: '/media/bingo/rimini.svg' }, + { year: 2018, city: 'Edinburgh', icon: '/media/bingo/edinburgh.svg' }, + { year: 2019, city: 'Basel', icon: '/media/bingo/basel.svg' }, + { year: 2020, city: 'Online', icon: '/media/bingo/online.svg' }, + { year: 2021, city: 'Online', icon: '/media/bingo/online.svg' }, + { year: 2022, city: 'Dublin', icon: '/media/bingo/dublin.svg' }, + { year: 2023, city: 'Prague', icon: '/media/bingo/prague.svg' }, + { year: 2024, city: 'Prague', icon: '/media/bingo/prague-2.svg' }, + { year: 2025, city: 'Prague', icon: '/media/bingo/prague-3.svg' }, + { year: 2026, city: 'Kraków', icon: '/media/bingo/krakow.svg' }, ]; function loadChecked() { @@ -188,11 +188,18 @@ aria-label={`${edition.year} ${edition.city}${checked[i] ? ' — attended' : ''}`} role="gridcell" > - {edition.year} - {edition.city} - {#if edition.year === 2026} - Now! - {/if} +
+
+ {edition.year} + {edition.city} + {#if edition.year === 2026} + Now! + {/if} +
+
+ +
+
{/each} @@ -247,21 +254,53 @@ /* ── cell ── */ .bingo-cell { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; aspect-ratio: 1; border: 1px dashed var(--color-border); border-radius: 2px; background: var(--color-surface-faint); cursor: pointer; transition: border-color 0.15s, background 0.15s, transform 0.15s; - padding: 8px 6px; - gap: 3px; text-align: center; font-family: inherit; -webkit-tap-highlight-color: transparent; + perspective: 600px; + } + + .card-inner { + width: 100%; + height: 100%; + position: relative; + transform-style: preserve-3d; + transition: transform 0.45s ease; + } + + .card-inner.flipped { + transform: rotateY(180deg); + } + + .card-face { + position: absolute; + inset: 0; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + backface-visibility: hidden; + -webkit-backface-visibility: hidden; + padding: 8px 6px; + gap: 3px; + } + + .card-back { + transform: rotateY(180deg); + padding: 0; + background: var(--color-surface-faint); + } + + .cell-icon { + width: 100%; + height: 100%; + object-fit: cover; } .bingo-cell:hover { @@ -281,19 +320,26 @@ border-color: var(--color-border-bright); } - /* checked state */ + /* checked state — background lives on the front face only, not the button */ .bingo-cell.checked { - background: var(--color-accent); border-style: solid; - border-color: var(--color-accent-hover); + border-color: var(--color-border); + } + + .bingo-cell.checked .card-front { + background: var(--color-accent); } .bingo-cell.checked:hover { - border-color: var(--color-accent-hover); - background: var(--color-accent-hover); + border-color: var(--color-border); + background: var(--color-surface-faint); transform: translateY(-3px); } + .bingo-cell.checked:hover .card-front { + background: var(--color-accent-hover); + } + /* ── cell text ── */ .cell-year { font-size: clamp(1rem, 2.5vw, 1.35rem); @@ -403,5 +449,6 @@ @media (prefers-reduced-motion: reduce) { .bingo-cell { transition: border-color 0.15s, background 0.15s; } .bingo-cell:hover { transform: none; } + .card-inner { transition: none; } } From d37fd72ca373ea73dbdaa9226a4c9fe9d919fb91 Mon Sep 17 00:00:00 2001 From: Daria Grudzien Date: Thu, 25 Jun 2026 16:20:41 -0700 Subject: [PATCH 4/7] add city icons --- public/media/bingo/berlin-2.svg | 19 ----- public/media/bingo/berlin.svg | 45 ++++++---- public/media/bingo/online-2.svg | 12 +++ src/components/island/BingoCard.svelte | 113 +++++++++++++++++++------ src/pages/bingo.astro | 1 - 5 files changed, 130 insertions(+), 60 deletions(-) delete mode 100644 public/media/bingo/berlin-2.svg create mode 100644 public/media/bingo/online-2.svg diff --git a/public/media/bingo/berlin-2.svg b/public/media/bingo/berlin-2.svg deleted file mode 100644 index 19430054d..000000000 --- a/public/media/bingo/berlin-2.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/media/bingo/berlin.svg b/public/media/bingo/berlin.svg index b062ad972..be6767d8a 100644 --- a/public/media/bingo/berlin.svg +++ b/public/media/bingo/berlin.svg @@ -1,19 +1,34 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/online-2.svg b/public/media/bingo/online-2.svg new file mode 100644 index 000000000..2ebc30ebe --- /dev/null +++ b/public/media/bingo/online-2.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/components/island/BingoCard.svelte b/src/components/island/BingoCard.svelte index b3018f337..1405a41da 100644 --- a/src/components/island/BingoCard.svelte +++ b/src/components/island/BingoCard.svelte @@ -21,7 +21,7 @@ { year: 2018, city: 'Edinburgh', icon: '/media/bingo/edinburgh.svg' }, { year: 2019, city: 'Basel', icon: '/media/bingo/basel.svg' }, { year: 2020, city: 'Online', icon: '/media/bingo/online.svg' }, - { year: 2021, city: 'Online', icon: '/media/bingo/online.svg' }, + { year: 2021, city: 'Online', icon: '/media/bingo/online-2.svg' }, { year: 2022, city: 'Dublin', icon: '/media/bingo/dublin.svg' }, { year: 2023, city: 'Prague', icon: '/media/bingo/prague.svg' }, { year: 2024, city: 'Prague', icon: '/media/bingo/prague-2.svg' }, @@ -90,7 +90,7 @@ ); } - function downloadImage() { + async function downloadImage() { const COLS = 5; const CELL = 130; const PAD = 28; @@ -98,12 +98,46 @@ const W = COLS * CELL + PAD * 2; const H = COLS * CELL + PAD * 2 + HEADER_H; + // Resolve actual CSS variables from the page so the export matches the current theme + const style = getComputedStyle(document.documentElement); + const resolve = (v) => style.getPropertyValue(v).trim(); + + // Background colour: use the section background from the live theme + const sectionBgRaw = resolve('--color-section-bg'); + const bgColor = sectionBgRaw || '#f0f1f4'; + + // Detect whether we are in light mode (section-bg is light) + // so we can pick appropriately contrasting cell colours. + const isLight = document.documentElement.classList.contains('light'); + + const cellFill = isLight ? 'rgba(0,0,0,0.025)' : '#0d1520'; + const cellFillCur = isLight ? 'rgba(0,0,0,0.04)' : '#111d36'; + const cellBorder = isLight ? 'rgba(0,0,0,0.1)' : 'rgba(255,255,255,0.12)'; + const cellBorderCur = isLight ? 'rgba(0,0,0,0.22)' : '#2a4a80'; + const cellBorderChk = isLight ? 'rgba(0,0,0,0.1)' : '#f0c040'; + const yearColor = isLight ? 'rgba(0,0,0,0.87)' : 'rgba(255,255,255,0.93)'; + const cityColor = isLight ? 'rgba(0,0,0,0.4)' : 'rgba(255,255,255,0.6)'; + const subtitleColor = isLight ? 'rgba(0,0,0,0.4)' : 'rgba(255,255,255,0.4)'; + + // Preload SVG icons for checked cells (matches the flipped card-back shown on screen) + const images = await Promise.all( + editions.map((ed, i) => { + if (!checked[i]) return Promise.resolve(null); + return new Promise((resolve) => { + const img = new Image(); + img.onload = () => resolve(img); + img.onerror = () => resolve(null); + img.src = ed.icon; + }); + }) + ); + const canvas = document.createElement('canvas'); canvas.width = W; canvas.height = H; const ctx = canvas.getContext('2d'); - ctx.fillStyle = '#0b1121'; + ctx.fillStyle = bgColor; ctx.fillRect(0, 0, W, H); ctx.fillStyle = '#f0c040'; @@ -111,10 +145,10 @@ ctx.textAlign = 'center'; ctx.fillText('EuroPython Bingo', W / 2, PAD + 34); - ctx.fillStyle = 'rgba(255,255,255,0.4)'; + ctx.fillStyle = subtitleColor; ctx.font = '13px system-ui, sans-serif'; ctx.fillText( - `${checkedCount} of 25 editions attended · ep2026.europython.eu/#bingo`, + `${checkedCount} of 25 editions attended · ep2026.europython.eu/bingo`, W / 2, PAD + 60 ); @@ -125,26 +159,53 @@ const y = HEADER_H + PAD + row * CELL; const isChecked = checked[i]; const isCurrent = ed.year === 2026; - - ctx.fillStyle = isChecked ? '#f0c040' : isCurrent ? '#111d36' : '#0d1520'; - roundRect(ctx, x + 3, y + 3, CELL - 6, CELL - 6, 2); - ctx.fill(); - - ctx.strokeStyle = isChecked ? '#d4a830' : isCurrent ? '#2a4a80' : 'rgba(255,255,255,0.12)'; - ctx.lineWidth = 1; - ctx.setLineDash([4, 4]); - roundRect(ctx, x + 3, y + 3, CELL - 6, CELL - 6, 2); - ctx.stroke(); - ctx.setLineDash([]); - - ctx.fillStyle = isChecked ? '#0b1121' : '#ffffff'; - ctx.font = `bold 21px system-ui, sans-serif`; - ctx.textAlign = 'center'; - ctx.fillText(ed.year.toString(), x + CELL / 2, y + CELL * 0.46); - - ctx.fillStyle = isChecked ? 'rgba(11,17,33,0.65)' : 'rgba(255,255,255,0.55)'; - ctx.font = `12px system-ui, sans-serif`; - ctx.fillText(ed.city, x + CELL / 2, y + CELL * 0.68); + const cx = x + 3, cy = y + 3, cw = CELL - 6, ch = CELL - 6; + + if (isChecked && images[i]) { + // Checked: show SVG city icon (matches the flipped card-back on screen) + ctx.fillStyle = cellFill; + roundRect(ctx, cx, cy, cw, ch, 2); + ctx.fill(); + + ctx.strokeStyle = cellBorderChk; + ctx.lineWidth = 1.5; + ctx.setLineDash([]); + roundRect(ctx, cx, cy, cw, ch, 2); + ctx.stroke(); + + ctx.save(); + roundRect(ctx, cx, cy, cw, ch, 2); + ctx.clip(); + ctx.drawImage(images[i], cx, cy, cw, ch); + ctx.restore(); + } else { + // Unchecked: text card (matches the card-front on screen) + ctx.fillStyle = isCurrent ? cellFillCur : cellFill; + roundRect(ctx, cx, cy, cw, ch, 2); + ctx.fill(); + + ctx.strokeStyle = isCurrent ? cellBorderCur : cellBorder; + ctx.lineWidth = 1; + ctx.setLineDash([4, 4]); + roundRect(ctx, cx, cy, cw, ch, 2); + ctx.stroke(); + ctx.setLineDash([]); + + ctx.fillStyle = yearColor; + ctx.font = `bold 21px system-ui, sans-serif`; + ctx.textAlign = 'center'; + ctx.fillText(ed.year.toString(), x + CELL / 2, y + CELL * 0.46); + + ctx.fillStyle = cityColor; + ctx.font = `12px system-ui, sans-serif`; + ctx.fillText(ed.city, x + CELL / 2, y + CELL * 0.65); + + if (isCurrent) { + ctx.fillStyle = '#f0c040'; + ctx.font = `bold 9px system-ui, sans-serif`; + ctx.fillText('NOW!', x + CELL / 2, y + CELL * 0.82); + } + } }); const link = document.createElement('a'); @@ -223,6 +284,7 @@ @@ -434,6 +496,7 @@ .share-btn--save { width: auto; + gap: 0.375rem; padding: 0 0.875rem; font-size: 0.8rem; font-weight: 600; diff --git a/src/pages/bingo.astro b/src/pages/bingo.astro index 350469ea7..a579b7b93 100644 --- a/src/pages/bingo.astro +++ b/src/pages/bingo.astro @@ -7,7 +7,6 @@ import BingoCard from "@components/island/BingoCard.svelte";
From ac7486f2cab02ffcec8cf90abad2a5970d5a8233 Mon Sep 17 00:00:00 2001 From: Daria Grudzien Date: Thu, 25 Jun 2026 16:26:36 -0700 Subject: [PATCH 5/7] add date and city to icons --- src/components/island/BingoCard.svelte | 70 ++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src/components/island/BingoCard.svelte b/src/components/island/BingoCard.svelte index 1405a41da..2cac60c6e 100644 --- a/src/components/island/BingoCard.svelte +++ b/src/components/island/BingoCard.svelte @@ -2,31 +2,31 @@ const STORAGE_KEY = 'ep-bingo-checked'; const editions = [ - { year: 2002, city: 'Charleroi', icon: '/media/bingo/charleroi.svg' }, - { year: 2003, city: 'Charleroi', icon: '/media/bingo/charleroi-2.svg' }, - { year: 2004, city: 'Gothenburg', icon: '/media/bingo/gothenburg.svg' }, - { year: 2005, city: 'Gothenburg', icon: '/media/bingo/gothenburg-2.svg' }, - { year: 2006, city: 'CERN, Geneva',icon: '/media/bingo/geneva.svg' }, - { year: 2007, city: 'Vilnius', icon: '/media/bingo/vilnius.svg' }, - { year: 2008, city: 'Vilnius', icon: '/media/bingo/vilnius-2.svg' }, - { year: 2009, city: 'Birmingham', icon: '/media/bingo/birmingham.svg' }, - { year: 2010, city: 'Birmingham', icon: '/media/bingo/birmingham-2.svg' }, - { year: 2011, city: 'Florence', icon: '/media/bingo/florence.svg' }, - { year: 2012, city: 'Florence', icon: '/media/bingo/florence-2.svg' }, - { year: 2013, city: 'Florence', icon: '/media/bingo/florence-3.svg' }, - { year: 2014, city: 'Berlin', icon: '/media/bingo/berlin.svg' }, - { year: 2015, city: 'Bilbao', icon: '/media/bingo/bilbao.svg' }, - { year: 2016, city: 'Bilbao', icon: '/media/bingo/bilbao-2.svg' }, - { year: 2017, city: 'Rimini', icon: '/media/bingo/rimini.svg' }, - { year: 2018, city: 'Edinburgh', icon: '/media/bingo/edinburgh.svg' }, - { year: 2019, city: 'Basel', icon: '/media/bingo/basel.svg' }, - { year: 2020, city: 'Online', icon: '/media/bingo/online.svg' }, - { year: 2021, city: 'Online', icon: '/media/bingo/online-2.svg' }, - { year: 2022, city: 'Dublin', icon: '/media/bingo/dublin.svg' }, - { year: 2023, city: 'Prague', icon: '/media/bingo/prague.svg' }, - { year: 2024, city: 'Prague', icon: '/media/bingo/prague-2.svg' }, - { year: 2025, city: 'Prague', icon: '/media/bingo/prague-3.svg' }, - { year: 2026, city: 'Kraków', icon: '/media/bingo/krakow.svg' }, + { year: 2002, city: 'Charleroi', icon: '/media/bingo/charleroi.svg', bg: '#1003A3' }, + { year: 2003, city: 'Charleroi', icon: '/media/bingo/charleroi-2.svg', bg: '#FB471F' }, + { year: 2004, city: 'Gothenburg', icon: '/media/bingo/gothenburg.svg', bg: '#1003A3' }, + { year: 2005, city: 'Gothenburg', icon: '/media/bingo/gothenburg-2.svg', bg: '#FB471F' }, + { year: 2006, city: 'CERN, Geneva',icon: '/media/bingo/geneva.svg', bg: '#1003A3' }, + { year: 2007, city: 'Vilnius', icon: '/media/bingo/vilnius.svg', bg: '#1003A3' }, + { year: 2008, city: 'Vilnius', icon: '/media/bingo/vilnius-2.svg', bg: '#FB471F' }, + { year: 2009, city: 'Birmingham', icon: '/media/bingo/birmingham.svg', bg: '#1003A3' }, + { year: 2010, city: 'Birmingham', icon: '/media/bingo/birmingham-2.svg', bg: '#FB471F' }, + { year: 2011, city: 'Florence', icon: '/media/bingo/florence.svg', bg: '#1003A3' }, + { year: 2012, city: 'Florence', icon: '/media/bingo/florence-2.svg', bg: '#FB471F' }, + { year: 2013, city: 'Florence', icon: '/media/bingo/florence-3.svg', bg: '#008624' }, + { year: 2014, city: 'Berlin', icon: '/media/bingo/berlin.svg', bg: '#1003A3' }, + { year: 2015, city: 'Bilbao', icon: '/media/bingo/bilbao.svg', bg: '#1003A3' }, + { year: 2016, city: 'Bilbao', icon: '/media/bingo/bilbao-2.svg', bg: '#FB471F' }, + { year: 2017, city: 'Rimini', icon: '/media/bingo/rimini.svg', bg: '#1003A3' }, + { year: 2018, city: 'Edinburgh', icon: '/media/bingo/edinburgh.svg', bg: '#1003A3' }, + { year: 2019, city: 'Basel', icon: '/media/bingo/basel.svg', bg: '#1003A3' }, + { year: 2020, city: 'Online', icon: '/media/bingo/online.svg', bg: '#1003A3' }, + { year: 2021, city: 'Online', icon: '/media/bingo/online-2.svg', bg: '#FB471F' }, + { year: 2022, city: 'Dublin', icon: '/media/bingo/dublin.svg', bg: '#1003A3' }, + { year: 2023, city: 'Prague', icon: '/media/bingo/prague.svg', bg: '#1003A3' }, + { year: 2024, city: 'Prague', icon: '/media/bingo/prague-2.svg', bg: '#FB471F' }, + { year: 2025, city: 'Prague', icon: '/media/bingo/prague-3.svg', bg: '#008624' }, + { year: 2026, city: 'Kraków', icon: '/media/bingo/krakow.svg', bg: '#1003A3' }, ]; function loadChecked() { @@ -257,8 +257,10 @@ Now! {/if}
-
+
+ {edition.year} + {edition.city}
@@ -355,14 +357,20 @@ .card-back { transform: rotateY(180deg); - padding: 0; - background: var(--color-surface-faint); } .cell-icon { - width: 100%; - height: 100%; - object-fit: cover; + width: 50%; + aspect-ratio: 1; + object-fit: contain; + } + + .card-back .cell-year { + color: white; + } + + .card-back .cell-city { + color: rgba(255, 255, 255, 0.7); } .bingo-cell:hover { From 6c6fc85b4e0634eaae79ce06d13d3c952ef8d5a2 Mon Sep 17 00:00:00 2001 From: Daria Grudzien Date: Thu, 25 Jun 2026 17:20:24 -0700 Subject: [PATCH 6/7] fix sharing button --- src/components/island/BingoCard.svelte | 35 ++++++++++++++++++-------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/src/components/island/BingoCard.svelte b/src/components/island/BingoCard.svelte index 2cac60c6e..81fa95367 100644 --- a/src/components/island/BingoCard.svelte +++ b/src/components/island/BingoCard.svelte @@ -52,14 +52,14 @@ const attended = editions.filter((_, i) => checked[i]).map(e => `${e.year} ${e.city}`); const count = attended.length; const base = `I've attended ${count} EuroPython conference${count !== 1 ? 's' : ''}! 🐍`; - return count > 0 ? `${base}\n${attended.join(' · ')}` : base; + const body = count > 0 ? `${base}\n\n${attended.join(' · ')}` : base; + return `${body}\n\nWhat about you: ${BINGO_PAGE_URL}`; } - const PAGE_URL = 'https://ep2026.europython.eu/#bingo'; - const BINGO_PAGE_URL = 'https://ep2026.europython.eu/bingo'; + const BINGO_PAGE_URL = 'https://ep2026.europython.eu/#bingo'; function shareLinkedIn() { - const text = buildShareText() + '\n\n' + BINGO_PAGE_URL; + const text = buildShareText(); window.open( `https://www.linkedin.com/feed/?shareActive=true&text=${encodeURIComponent(text)}`, '_blank', 'noopener,noreferrer' @@ -69,13 +69,13 @@ function shareX() { const text = buildShareText(); window.open( - `https://twitter.com/intent/tweet?text=${encodeURIComponent(text)}&url=${encodeURIComponent(PAGE_URL)}`, + `https://twitter.com/intent/tweet?text=${encodeURIComponent(text)}`, '_blank', 'noopener,noreferrer' ); } function shareBlueSky() { - const text = `${buildShareText()}\n\n${PAGE_URL}`; + const text = buildShareText(); window.open( `https://bsky.app/intent/compose?text=${encodeURIComponent(text)}`, '_blank', 'noopener,noreferrer' @@ -83,9 +83,9 @@ } function shareMastodon() { - const text = `${buildShareText()}\n\n${PAGE_URL}`; + const text = buildShareText(); window.open( - `https://shareopenly.org/share/?url=${encodeURIComponent(PAGE_URL)}&text=${encodeURIComponent(text)}`, + `https://shareopenly.org/share/?url=${encodeURIComponent(BINGO_PAGE_URL)}&text=${encodeURIComponent(text)}`, '_blank', 'noopener,noreferrer' ); } @@ -162,8 +162,8 @@ const cx = x + 3, cy = y + 3, cw = CELL - 6, ch = CELL - 6; if (isChecked && images[i]) { - // Checked: show SVG city icon (matches the flipped card-back on screen) - ctx.fillStyle = cellFill; + // Checked: bg colour + icon at 50% + year + city (matches card-back on screen) + ctx.fillStyle = ed.bg; roundRect(ctx, cx, cy, cw, ch, 2); ctx.fill(); @@ -173,11 +173,24 @@ roundRect(ctx, cx, cy, cw, ch, 2); ctx.stroke(); + const iconSize = Math.round(cw * 0.5); + const ix = cx + Math.round((cw - iconSize) / 2); + const iy = cy + Math.round(ch * 0.08); ctx.save(); roundRect(ctx, cx, cy, cw, ch, 2); ctx.clip(); - ctx.drawImage(images[i], cx, cy, cw, ch); + ctx.drawImage(images[i], ix, iy, iconSize, iconSize); ctx.restore(); + + const yearY = iy + iconSize + Math.round(ch * 0.12); + ctx.fillStyle = 'white'; + ctx.font = `bold 18px system-ui, sans-serif`; + ctx.textAlign = 'center'; + ctx.fillText(ed.year.toString(), x + CELL / 2, yearY); + + ctx.fillStyle = 'rgba(255,255,255,0.7)'; + ctx.font = `11px system-ui, sans-serif`; + ctx.fillText(ed.city, x + CELL / 2, yearY + Math.round(ch * 0.13)); } else { // Unchecked: text card (matches the card-front on screen) ctx.fillStyle = isCurrent ? cellFillCur : cellFill; From de5fd27ceb1ab4f19a0d1497972e4588153b21d3 Mon Sep 17 00:00:00 2001 From: Daria Grudzien Date: Fri, 26 Jun 2026 19:03:23 -0700 Subject: [PATCH 7/7] updated icons --- public/media/bingo/basel-2.svg | 21 --- public/media/bingo/basel.svg | 91 ++++++++++--- public/media/bingo/bilbao-2.svg | 13 -- public/media/bingo/bilbao.svg | 25 ++-- public/media/bingo/birmingham-2.svg | 15 --- public/media/bingo/birmingham.svg | 42 ++++-- public/media/bingo/charleroi-2.svg | 19 --- public/media/bingo/dublin-2.svg | 20 --- public/media/bingo/dublin.svg | 63 ++++++--- public/media/bingo/edinburgh.svg | 86 +++++++++--- public/media/bingo/florence-2.svg | 23 ---- public/media/bingo/florence-3.svg | 23 ---- public/media/bingo/florence.svg | 16 ++- public/media/bingo/geneva-2.svg | 21 --- public/media/bingo/geneva.svg | 33 ++--- public/media/bingo/gothenburg-2.svg | 17 --- public/media/bingo/gothenburg.svg | 18 +-- public/media/bingo/krakow-2.svg | 21 --- public/media/bingo/krakow.svg | 23 +--- public/media/bingo/prague-2.svg | 22 --- public/media/bingo/prague-3.svg | 22 --- public/media/bingo/prague.svg | 37 +++--- .../media/bingo/{online-2.svg => remote.svg} | 6 +- public/media/bingo/rimini-2.svg | 16 --- public/media/bingo/rimini.svg | 17 +-- public/media/bingo/vilnius-2.svg | 19 --- public/media/bingo/vilnius.svg | 21 +-- src/components/island/BingoCard.svelte | 125 ++++++++---------- 28 files changed, 344 insertions(+), 531 deletions(-) delete mode 100644 public/media/bingo/basel-2.svg delete mode 100644 public/media/bingo/bilbao-2.svg delete mode 100644 public/media/bingo/birmingham-2.svg delete mode 100644 public/media/bingo/charleroi-2.svg delete mode 100644 public/media/bingo/dublin-2.svg delete mode 100644 public/media/bingo/florence-2.svg delete mode 100644 public/media/bingo/florence-3.svg delete mode 100644 public/media/bingo/geneva-2.svg delete mode 100644 public/media/bingo/gothenburg-2.svg delete mode 100644 public/media/bingo/krakow-2.svg delete mode 100644 public/media/bingo/prague-2.svg delete mode 100644 public/media/bingo/prague-3.svg rename public/media/bingo/{online-2.svg => remote.svg} (86%) delete mode 100644 public/media/bingo/rimini-2.svg delete mode 100644 public/media/bingo/vilnius-2.svg diff --git a/public/media/bingo/basel-2.svg b/public/media/bingo/basel-2.svg deleted file mode 100644 index 226608124..000000000 --- a/public/media/bingo/basel-2.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/media/bingo/basel.svg b/public/media/bingo/basel.svg index 553fc0e30..45ad33fea 100644 --- a/public/media/bingo/basel.svg +++ b/public/media/bingo/basel.svg @@ -1,21 +1,76 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/bilbao-2.svg b/public/media/bingo/bilbao-2.svg deleted file mode 100644 index 4d7e712aa..000000000 --- a/public/media/bingo/bilbao-2.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/media/bingo/bilbao.svg b/public/media/bingo/bilbao.svg index dbdc1a734..150581ce3 100644 --- a/public/media/bingo/bilbao.svg +++ b/public/media/bingo/bilbao.svg @@ -1,13 +1,18 @@ - - - - - - - - - - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/birmingham-2.svg b/public/media/bingo/birmingham-2.svg deleted file mode 100644 index 8cf64d760..000000000 --- a/public/media/bingo/birmingham-2.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/media/bingo/birmingham.svg b/public/media/bingo/birmingham.svg index adbff9edf..37afb06f9 100644 --- a/public/media/bingo/birmingham.svg +++ b/public/media/bingo/birmingham.svg @@ -1,15 +1,33 @@ - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/charleroi-2.svg b/public/media/bingo/charleroi-2.svg deleted file mode 100644 index 9ac634a07..000000000 --- a/public/media/bingo/charleroi-2.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/media/bingo/dublin-2.svg b/public/media/bingo/dublin-2.svg deleted file mode 100644 index 72259ef24..000000000 --- a/public/media/bingo/dublin-2.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/media/bingo/dublin.svg b/public/media/bingo/dublin.svg index 0cb4a403f..fd258b5af 100644 --- a/public/media/bingo/dublin.svg +++ b/public/media/bingo/dublin.svg @@ -1,20 +1,49 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/edinburgh.svg b/public/media/bingo/edinburgh.svg index 8de469018..431f8443c 100644 --- a/public/media/bingo/edinburgh.svg +++ b/public/media/bingo/edinburgh.svg @@ -1,24 +1,68 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/florence-2.svg b/public/media/bingo/florence-2.svg deleted file mode 100644 index 3f8dee76f..000000000 --- a/public/media/bingo/florence-2.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/media/bingo/florence-3.svg b/public/media/bingo/florence-3.svg deleted file mode 100644 index a10073640..000000000 --- a/public/media/bingo/florence-3.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/media/bingo/florence.svg b/public/media/bingo/florence.svg index dbb199691..2cf2f11e0 100644 --- a/public/media/bingo/florence.svg +++ b/public/media/bingo/florence.svg @@ -13,11 +13,15 @@ - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/geneva-2.svg b/public/media/bingo/geneva-2.svg deleted file mode 100644 index 00c79fe53..000000000 --- a/public/media/bingo/geneva-2.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/media/bingo/geneva.svg b/public/media/bingo/geneva.svg index df381867c..af78fff58 100644 --- a/public/media/bingo/geneva.svg +++ b/public/media/bingo/geneva.svg @@ -1,21 +1,14 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/gothenburg-2.svg b/public/media/bingo/gothenburg-2.svg deleted file mode 100644 index b6e6a5958..000000000 --- a/public/media/bingo/gothenburg-2.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/media/bingo/gothenburg.svg b/public/media/bingo/gothenburg.svg index 86601934b..8e7c56a89 100644 --- a/public/media/bingo/gothenburg.svg +++ b/public/media/bingo/gothenburg.svg @@ -1,17 +1,5 @@ - + + Feskekôrka - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/public/media/bingo/krakow-2.svg b/public/media/bingo/krakow-2.svg deleted file mode 100644 index 2ab445c6c..000000000 --- a/public/media/bingo/krakow-2.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/media/bingo/krakow.svg b/public/media/bingo/krakow.svg index 055dd455f..480bed6d6 100644 --- a/public/media/bingo/krakow.svg +++ b/public/media/bingo/krakow.svg @@ -1,21 +1,6 @@ - + - - - - - - - - - - - - - - - - - - + + + \ No newline at end of file diff --git a/public/media/bingo/prague-2.svg b/public/media/bingo/prague-2.svg deleted file mode 100644 index aa500454d..000000000 --- a/public/media/bingo/prague-2.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/media/bingo/prague-3.svg b/public/media/bingo/prague-3.svg deleted file mode 100644 index 209131ea3..000000000 --- a/public/media/bingo/prague-3.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/media/bingo/prague.svg b/public/media/bingo/prague.svg index a8f9e92b0..91f9af2f7 100644 --- a/public/media/bingo/prague.svg +++ b/public/media/bingo/prague.svg @@ -1,22 +1,19 @@ - + + Prague Astronomical Clock - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/media/bingo/online-2.svg b/public/media/bingo/remote.svg similarity index 86% rename from public/media/bingo/online-2.svg rename to public/media/bingo/remote.svg index 2ebc30ebe..2dcd1f9ae 100644 --- a/public/media/bingo/online-2.svg +++ b/public/media/bingo/remote.svg @@ -1,12 +1,12 @@ - + - + - + \ No newline at end of file diff --git a/public/media/bingo/rimini-2.svg b/public/media/bingo/rimini-2.svg deleted file mode 100644 index cecf9f69b..000000000 --- a/public/media/bingo/rimini-2.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/media/bingo/rimini.svg b/public/media/bingo/rimini.svg index ce86db339..5e67f4682 100644 --- a/public/media/bingo/rimini.svg +++ b/public/media/bingo/rimini.svg @@ -1,16 +1,5 @@ - + + Arco d'Augusto - - - - - - - - - - - - - + \ No newline at end of file diff --git a/public/media/bingo/vilnius-2.svg b/public/media/bingo/vilnius-2.svg deleted file mode 100644 index cf3b49d39..000000000 --- a/public/media/bingo/vilnius-2.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/media/bingo/vilnius.svg b/public/media/bingo/vilnius.svg index 7a92eb016..779e82125 100644 --- a/public/media/bingo/vilnius.svg +++ b/public/media/bingo/vilnius.svg @@ -1,19 +1,6 @@ - + + Vilnius Cathedral Bell Tower - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/src/components/island/BingoCard.svelte b/src/components/island/BingoCard.svelte index 81fa95367..a6d7f2cf2 100644 --- a/src/components/island/BingoCard.svelte +++ b/src/components/island/BingoCard.svelte @@ -2,31 +2,31 @@ const STORAGE_KEY = 'ep-bingo-checked'; const editions = [ - { year: 2002, city: 'Charleroi', icon: '/media/bingo/charleroi.svg', bg: '#1003A3' }, - { year: 2003, city: 'Charleroi', icon: '/media/bingo/charleroi-2.svg', bg: '#FB471F' }, - { year: 2004, city: 'Gothenburg', icon: '/media/bingo/gothenburg.svg', bg: '#1003A3' }, - { year: 2005, city: 'Gothenburg', icon: '/media/bingo/gothenburg-2.svg', bg: '#FB471F' }, - { year: 2006, city: 'CERN, Geneva',icon: '/media/bingo/geneva.svg', bg: '#1003A3' }, - { year: 2007, city: 'Vilnius', icon: '/media/bingo/vilnius.svg', bg: '#1003A3' }, - { year: 2008, city: 'Vilnius', icon: '/media/bingo/vilnius-2.svg', bg: '#FB471F' }, - { year: 2009, city: 'Birmingham', icon: '/media/bingo/birmingham.svg', bg: '#1003A3' }, - { year: 2010, city: 'Birmingham', icon: '/media/bingo/birmingham-2.svg', bg: '#FB471F' }, - { year: 2011, city: 'Florence', icon: '/media/bingo/florence.svg', bg: '#1003A3' }, - { year: 2012, city: 'Florence', icon: '/media/bingo/florence-2.svg', bg: '#FB471F' }, - { year: 2013, city: 'Florence', icon: '/media/bingo/florence-3.svg', bg: '#008624' }, - { year: 2014, city: 'Berlin', icon: '/media/bingo/berlin.svg', bg: '#1003A3' }, - { year: 2015, city: 'Bilbao', icon: '/media/bingo/bilbao.svg', bg: '#1003A3' }, - { year: 2016, city: 'Bilbao', icon: '/media/bingo/bilbao-2.svg', bg: '#FB471F' }, - { year: 2017, city: 'Rimini', icon: '/media/bingo/rimini.svg', bg: '#1003A3' }, - { year: 2018, city: 'Edinburgh', icon: '/media/bingo/edinburgh.svg', bg: '#1003A3' }, - { year: 2019, city: 'Basel', icon: '/media/bingo/basel.svg', bg: '#1003A3' }, - { year: 2020, city: 'Online', icon: '/media/bingo/online.svg', bg: '#1003A3' }, - { year: 2021, city: 'Online', icon: '/media/bingo/online-2.svg', bg: '#FB471F' }, - { year: 2022, city: 'Dublin', icon: '/media/bingo/dublin.svg', bg: '#1003A3' }, - { year: 2023, city: 'Prague', icon: '/media/bingo/prague.svg', bg: '#1003A3' }, - { year: 2024, city: 'Prague', icon: '/media/bingo/prague-2.svg', bg: '#FB471F' }, - { year: 2025, city: 'Prague', icon: '/media/bingo/prague-3.svg', bg: '#008624' }, - { year: 2026, city: 'Kraków', icon: '/media/bingo/krakow.svg', bg: '#1003A3' }, + { year: 2002, city: 'Charleroi', icon: '/media/bingo/charleroi.svg', bg: '#1003A3' }, + { year: 2003, city: 'Charleroi', icon: '/media/bingo/charleroi.svg', bg: '#1003A3' }, + { year: 2004, city: 'Gothenburg', icon: '/media/bingo/gothenburg.svg', bg: '#1003A3' }, + { year: 2005, city: 'Gothenburg', icon: '/media/bingo/gothenburg.svg', bg: '#1003A3' }, + { year: 2006, city: 'CERN, Geneva',icon: '/media/bingo/geneva.svg', bg: '#1003A3' }, + { year: 2007, city: 'Vilnius', icon: '/media/bingo/vilnius.svg', bg: '#1003A3' }, + { year: 2008, city: 'Vilnius', icon: '/media/bingo/vilnius.svg', bg: '#1003A3' }, + { year: 2009, city: 'Birmingham', icon: '/media/bingo/birmingham.svg', bg: '#1003A3' }, + { year: 2010, city: 'Birmingham', icon: '/media/bingo/birmingham.svg', bg: '#1003A3' }, + { year: 2011, city: 'Florence', icon: '/media/bingo/florence.svg', bg: '#1003A3' }, + { year: 2012, city: 'Florence', icon: '/media/bingo/florence.svg', bg: '#1003A3' }, + { year: 2013, city: 'Florence', icon: '/media/bingo/florence.svg', bg: '#1003A3' }, + { year: 2014, city: 'Berlin', icon: '/media/bingo/berlin.svg', bg: '#1003A3' }, + { year: 2015, city: 'Bilbao', icon: '/media/bingo/bilbao.svg', bg: '#1003A3' }, + { year: 2016, city: 'Bilbao', icon: '/media/bingo/bilbao.svg', bg: '#1003A3' }, + { year: 2017, city: 'Rimini', icon: '/media/bingo/rimini.svg', bg: '#1003A3' }, + { year: 2018, city: 'Edinburgh', icon: '/media/bingo/edinburgh.svg', bg: '#1003A3' }, + { year: 2019, city: 'Basel', icon: '/media/bingo/basel.svg', bg: '#1003A3' }, + { year: 2020, city: 'Online', icon: '/media/bingo/online.svg', bg: '#1003A3' }, + { year: 2021, city: 'Online', icon: '/media/bingo/online.svg', bg: '#1003A3' }, + { year: 2022, city: 'Dublin', icon: '/media/bingo/dublin.svg', bg: '#1003A3' }, + { year: 2023, city: 'Prague', icon: '/media/bingo/prague.svg', bg: '#1003A3' }, + { year: 2024, city: 'Prague', icon: '/media/bingo/prague.svg', bg: '#1003A3' }, + { year: 2025, city: 'Prague', icon: '/media/bingo/prague.svg', bg: '#1003A3' }, + { year: 2026, city: 'Kraków', icon: '/media/bingo/krakow.svg', bg: '#1003A3' }, ]; function loadChecked() { @@ -182,15 +182,15 @@ ctx.drawImage(images[i], ix, iy, iconSize, iconSize); ctx.restore(); - const yearY = iy + iconSize + Math.round(ch * 0.12); + const cityY = iy + iconSize + Math.round(ch * 0.12); ctx.fillStyle = 'white'; - ctx.font = `bold 18px system-ui, sans-serif`; + ctx.font = `bold 13px system-ui, sans-serif`; ctx.textAlign = 'center'; - ctx.fillText(ed.year.toString(), x + CELL / 2, yearY); + ctx.fillText(ed.city, x + CELL / 2, cityY); ctx.fillStyle = 'rgba(255,255,255,0.7)'; - ctx.font = `11px system-ui, sans-serif`; - ctx.fillText(ed.city, x + CELL / 2, yearY + Math.round(ch * 0.13)); + ctx.font = `12px system-ui, sans-serif`; + ctx.fillText(ed.year.toString(), x + CELL / 2, cityY + Math.round(ch * 0.14)); } else { // Unchecked: text card (matches the card-front on screen) ctx.fillStyle = isCurrent ? cellFillCur : cellFill; @@ -204,14 +204,14 @@ ctx.stroke(); ctx.setLineDash([]); - ctx.fillStyle = yearColor; - ctx.font = `bold 21px system-ui, sans-serif`; + ctx.fillStyle = cityColor; + ctx.font = `bold 14px system-ui, sans-serif`; ctx.textAlign = 'center'; - ctx.fillText(ed.year.toString(), x + CELL / 2, y + CELL * 0.46); + ctx.fillText(ed.city, x + CELL / 2, y + CELL * 0.44); - ctx.fillStyle = cityColor; - ctx.font = `12px system-ui, sans-serif`; - ctx.fillText(ed.city, x + CELL / 2, y + CELL * 0.65); + ctx.fillStyle = yearColor; + ctx.font = `13px system-ui, sans-serif`; + ctx.fillText(ed.year.toString(), x + CELL / 2, y + CELL * 0.62); if (isCurrent) { ctx.fillStyle = '#f0c040'; @@ -263,17 +263,17 @@ role="gridcell" >
-
- {edition.year} +
{edition.city} + {edition.year} {#if edition.year === 2026} Now! {/if}
- {edition.year} {edition.city} + {edition.year}
@@ -378,11 +378,11 @@ object-fit: contain; } - .card-back .cell-year { + .card-back .cell-city { color: white; } - .card-back .cell-city { + .card-back .cell-year { color: rgba(255, 255, 255, 0.7); } @@ -403,48 +403,40 @@ border-color: var(--color-border-bright); } - /* checked state — background lives on the front face only, not the button */ + /* checked state */ .bingo-cell.checked { border-style: solid; border-color: var(--color-border); } - .bingo-cell.checked .card-front { - background: var(--color-accent); - } - .bingo-cell.checked:hover { border-color: var(--color-border); background: var(--color-surface-faint); transform: translateY(-3px); } - .bingo-cell.checked:hover .card-front { - background: var(--color-accent-hover); - } - /* ── cell text ── */ - .cell-year { - font-size: clamp(1rem, 2.5vw, 1.35rem); - font-weight: 800; - letter-spacing: -0.02em; + .cell-city { + font-size: clamp(0.75rem, 1.9vw, 1.05rem); + font-weight: 700; color: var(--color-text-primary); - line-height: 1; + line-height: 1.1; } - .bingo-cell.checked .cell-year { - color: var(--color-on-accent); + .cell-year { + font-size: clamp(0.65rem, 1.5vw, 0.85rem); + font-weight: 500; + letter-spacing: -0.01em; + color: var(--color-text-faint); + line-height: 1; } - .cell-city { - font-size: clamp(0.6rem, 1.4vw, 0.75rem); - color: var(--color-text-faint); - line-height: 1.1; + .bingo-cell.checked .card-front .cell-city { + color: white; } - .bingo-cell.checked .cell-city { - color: var(--color-on-accent); - opacity: 0.7; + .bingo-cell.checked .card-front .cell-year { + color: rgba(255, 255, 255, 0.7); } .cell-now { @@ -457,9 +449,8 @@ margin-top: 1px; } - .bingo-cell.checked .cell-now { - color: var(--color-on-accent); - opacity: 0.6; + .bingo-cell.checked .card-front .cell-now { + color: rgba(255, 255, 255, 0.6); } /* ── share ── */