diff --git a/src/components/schedule/break.astro b/src/components/schedule/break.astro index b5ec0d0a6..fef0be4ab 100644 --- a/src/components/schedule/break.astro +++ b/src/components/schedule/break.astro @@ -10,18 +10,32 @@ const { time, title, style, className }: Props = Astro.props; const label = [time, title].filter(Boolean).join(" "); --- -
+
{time && `${time} `} {title}
diff --git a/src/components/schedule/day.astro b/src/components/schedule/day.astro index 696327f9d..7f9b2bd9a 100644 --- a/src/components/schedule/day.astro +++ b/src/components/schedule/day.astro @@ -4,7 +4,6 @@ import { type CollectionEntry, getCollection } from "astro:content"; import Break from "@components/schedule/break.astro"; import Session from "@components/schedule/session.astro"; import { addMinutes, differenceInMinutes, parseISO } from "date-fns"; -import Headline from "@components/ui/Headline.astro"; import { formatInTimeZone } from "date-fns-tz"; @@ -380,9 +379,8 @@ const dateText = format(date, "eeee - do MMMM"); --- -
- +
+

{dateText}

@@ -479,7 +477,7 @@ const dateText = format(date, "eeee - do MMMM");
@@ -487,19 +485,17 @@ const dateText = format(date, "eeee - do MMMM");
+ diff --git a/src/components/schedule/session.astro b/src/components/schedule/session.astro index 6e62b7f2c..bcd55cbaa 100644 --- a/src/components/schedule/session.astro +++ b/src/components/schedule/session.astro @@ -28,29 +28,9 @@ const hasFooter = true; ---
-
{ session.rooms.length === 1 && ( @@ -62,18 +42,6 @@ const hasFooter = true; }
- - + Read more
diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro index 9652187d6..7be86dd8b 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/Layout.astro @@ -11,6 +11,8 @@ import "@fortawesome/fontawesome-free/css/all.min.css"; import "@styles/tailwind.css"; import "@styles/global.css"; import "@styles/search.css"; +import "@styles/ep2026-theme.css"; +import "@styles/markdown.css"; export interface Props { @@ -39,6 +41,7 @@ const hideFooter = Astro.props.hideFooter ?? false; + @@ -48,7 +51,7 @@ const hideFooter = Astro.props.hideFooter ?? false; } -
+
{currentPath !== "/" && ( - - - + + + +
+
- +

{headline}

- Mark talks as favorites by opening their details and tapping the ❤️ icon. Your selections are saved locally and will only be visible on this device. +
💚 Mark talks as favorites by opening their details and tapping the ❤️ icon. Your selections are saved locally and will only be visible on this device.
+
+
diff --git a/src/styles/ep2026-theme.css b/src/styles/ep2026-theme.css new file mode 100644 index 000000000..bd5bef058 --- /dev/null +++ b/src/styles/ep2026-theme.css @@ -0,0 +1,474 @@ +/* ============================================================ + EP2026 Design Theme + Ported from website-ep2026-new design system + ============================================================ */ + +/* RESET & BASE */ +/* ============ */ +*, +*::before, +*::after { + box-sizing: border-box; +} + +:root { + /* Core brand */ + /* ========== */ + --ep-bg: #080002; + --ep-red: #d4003a; + --ep-red-on-dark: #ff1a4a; + --ep-indigo: #4a0018; + --ep-magenta: #800020; + --ep-accent: #f0c040; + --ep-white: #ffffff; + --ep-cream: #fff5f0; + --ep-dark2: #0e0004; + --ep-dark3: #0a0003; + + /* RGB channel triples (for composable rgba) */ + /* ========================================= */ + --ep-accent-rgb: 240, 192, 64; + --ep-info: #5ab0e0; + --ep-info-rgb: 90, 176, 224; + --ep-w: 255, 255, 255; + + /* White text levels */ + /* ================= */ + --ep-text-primary: rgba(255, 255, 255, 0.93); + --ep-text-secondary: rgba(255, 255, 255, 0.78); + --ep-text-muted: rgba(255, 255, 255, 0.7); + --ep-text-faint: rgba(255, 255, 255, 0.6); + + /* White decorative (borders, surfaces) */ + /* ==================================== */ + --ep-border: rgba(255, 255, 255, 0.1); + --ep-border-strong: rgba(255, 255, 255, 0.15); + --ep-border-bright: rgba(255, 255, 255, 0.25); + --ep-surface-faint: rgba(255, 255, 255, 0.03); + --ep-surface-subtle: rgba(255, 255, 255, 0.05); + --ep-surface-medium: rgba(255, 255, 255, 0.08); + + /* Black shadows */ + /* ============= */ + --ep-black-75: rgba(0, 0, 0, 0.75); + --ep-black-70: rgba(0, 0, 0, 0.7); + --ep-black-50: rgba(0, 0, 0, 0.5); + --ep-black-40: rgba(0, 0, 0, 0.4); + --ep-black-30: rgba(0, 0, 0, 0.3); + --ep-black-15: rgba(0, 0, 0, 0.15); + + /* CTA red gradient */ + /* ================ */ + --ep-cta-red: #d62020; + --ep-cta-red-dark: #8a0020; + --ep-cta-mid: #a8002d; + --ep-cta-end: #700020; + + /* CTA text on colored buttons */ + /* =========================== */ + --ep-cta-text: #0d1a2a; + --ep-cta-text-warm: #f0ede8; + + /* Grays */ + /* ===== */ + --ep-gray-ee: #eeeeee; + --ep-gray-88: #888888; + --ep-gray-37: #374151; + --ep-gray-22: #222222; + + /* Red / green accents */ + /* =================== */ + --ep-red-f0: #f04040; + --ep-red-cc: #cc3030; + --ep-green-2e: #2ecc71; + --ep-green-25: #25a85d; + --ep-green-light: #6fd66f; + --ep-red-light: #e07070; + --ep-green-1a: #1a5c2a; + + /* Schedule room bg */ + /* ================ */ + --ep-sched-room-bg: #1e3456; + + /* Section backgrounds */ + /* =================== */ + --ep-bg-section: #080f1a; + --ep-bg-section-alt: #070b14; + --ep-bg-dark: #0a0a1a; + --ep-bg-card: #3d1a2a; + + /* Footer gradient */ + /* =============== */ + --ep-footer-g1: #0c1628; + --ep-footer-g2: #142744; + --ep-footer-g3: #1a1a3a; + --ep-footer-g4: #0f1a2e; + + /* Overlay */ + /* ======= */ + --ep-overlay-dark: rgba(10, 10, 20, 0.95); + + /* Links */ + /* ===== */ + --ep-link-color: var(--ep-accent); + --ep-link-hover: var(--ep-white); +} + +/* Dark theme base styles */ +/* ====================== */ +body.ep2026-theme { + background: var(--ep-bg); + color: var(--ep-white); + font-family: "Inter Tight", system-ui, sans-serif; + font-size: 18px; + line-height: 1.6; + overflow-x: hidden; +} + +.ep2026-theme h1, +.ep2026-theme h2, +.ep2026-theme h3 { + font-family: "Inter Tight", system-ui, sans-serif; + font-weight: 700; + letter-spacing: -0.02em; +} + +.ep2026-theme a { + color: var(--ep-link-color); + text-decoration: underline; +} + +.ep2026-theme a:hover { + color: var(--ep-link-hover); +} + +/* ============================================================ + SCHEDULE DARK THEME + ============================================================ */ + +/* Schedule section wrapper */ +.ep-sched-section { + background: + radial-gradient(circle, var(--ep-surface-medium) 1px, transparent 1px), + linear-gradient( + 135deg, + var(--ep-footer-g1) 0%, + var(--ep-footer-g2) 40%, + var(--ep-footer-g3) 70%, + var(--ep-footer-g4) 100% + ); + background-size: + 24px 24px, + 100% 100%; + color: var(--ep-white); +} + +.ep-sched-inner { + max-width: 1400px; + margin: 0 auto; + padding: 2rem 1.5rem; +} + +/* Day title */ +.ep-sched-day-title { + font-family: "Inter Tight", system-ui, sans-serif; + font-weight: 500; + font-size: clamp( + 1.75rem, + 1.75rem + (100vw - 20rem) * (2.25 - 1.75) / (45 - 20), + 2.25rem + ); + line-height: 1.25; + color: var(--ep-white); + margin-bottom: 1.5rem; + padding-top: 1rem; + padding-bottom: 1rem; +} + +/* Room headers row */ +.ep-sched-room-headers { + display: grid; + gap: 4px; + margin-bottom: 4px; +} + +.ep-sched-room-header { + background: var(--ep-sched-room-bg); + color: var(--ep-text-primary); + font-size: 0.85rem; + font-weight: 700; + text-align: center; + padding: 0.5rem 0.3rem; + border-radius: 4px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +/* Schedule grid container */ +.ep-sched-grid { + display: grid; + gap: 4px; +} + +/* Time slots */ +.ep-sched-time { + font-family: "Inter Tight", system-ui, sans-serif; + font-size: 0.85rem; + font-weight: 700; + color: var(--ep-accent); + padding: 0.4rem 0.4rem 0.4rem 0; + text-align: right; + align-self: start; +} + +.ep-sched-time h2 { + font-family: "Inter Tight", system-ui, sans-serif; + font-size: 0.85rem; + font-weight: 700; + color: var(--ep-accent); + margin: 0; +} + +/* Session cards */ +.ep-session { + background: var(--ep-surface-subtle); + border: 1px solid var(--ep-border); + border-radius: 6px; + padding: 0.5rem 0.6rem; + display: flex; + flex-direction: column; + gap: 0.15rem; + transition: + border-color 0.2s, + background 0.2s; + color: var(--ep-white); + font-family: "Inter Tight", system-ui, sans-serif; + position: relative; + overflow: hidden; +} + +.ep-session:hover { + border-color: var(--ep-accent); + background: #0f1a2e !important; + z-index: 10; + transition: + border-color 0.1s ease-in-out, + background 0.1s ease-in-out; +} + +.ep-session h2 { + font-family: "Inter Tight", system-ui, sans-serif; + font-size: 0.82rem; + font-weight: 600; + line-height: 1.3; + color: var(--ep-white); + margin: 0; + padding: 0; +} + +.ep-session header { + padding: 0; + margin-bottom: 0.1rem; +} + +.ep-session .room-info { + font-size: 0.72rem; + color: var(--ep-text-muted); + font-weight: 500; + text-align: left; +} + +.ep-session footer { + font-size: 0.75rem; + color: var(--ep-text-secondary); + margin-top: 0.2rem; + padding: 0; +} + +.ep-session .read-more { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; +} + +.ep-session .read-more:focus { + outline: 2px solid var(--ep-accent); + outline-offset: 2px; + border-radius: 6px; +} + +/* Session levels */ +.ep-session.beginner { + background: + repeating-linear-gradient( + -45deg, + transparent, + transparent 4px, + rgba(50, 180, 50, 0.2) 4px, + rgba(50, 180, 50, 0.2) 6px + ), + var(--ep-surface-subtle); +} + +.ep-session.advanced { + background: + repeating-linear-gradient( + -45deg, + transparent, + transparent 4px, + rgba(200, 50, 50, 0.2) 4px, + rgba(200, 50, 50, 0.2) 6px + ), + var(--ep-surface-subtle); +} + +/* Breaks */ +.ep-break { + display: flex; + align-items: center; + justify-content: center; + text-align: center; + background: rgba(255, 150, 0, 0.06); + border: 2px solid rgba(255, 150, 0, 0.18); + border-radius: 6px; + padding: 0.4rem 0.8rem; + font-family: "Inter Tight", system-ui, sans-serif; + font-size: 0.85rem; + color: var(--ep-text-secondary); + font-weight: 500; +} + +.ep-break.room-change { + background: var(--ep-surface-subtle); + border: 1px dashed var(--ep-border); + color: var(--ep-text-muted); + font-weight: 400; + font-size: 0.75rem; +} + +.ep-break.day-end { + background: #2d3548; + border: 1px solid rgba(255, 255, 255, 0.08); + border-radius: 4px; + color: rgba(255, 255, 255, 0.55); + font-size: 0.9rem; + margin: 0.5rem 0; + padding: 0.5rem 1rem; + text-align: center; +} + +/* Posters section */ +.ep-posters { + text-align: center; + border: 2px solid var(--ep-accent); + border-radius: 6px; + background: rgba(var(--ep-accent-rgb), 0.04); +} + +.ep-posters h2 { + font-family: "Inter Tight", system-ui, sans-serif; + font-weight: 700; + font-size: 0.8rem; + color: var(--ep-accent); + padding: 0.4rem 0.5rem; + margin: 0; +} + +/* Header sticky bar */ +.ep-sched-header { + position: sticky; + top: 0; + background: var(--ep-bg); + z-index: 20; +} + +.ep-sched-header > div > div { + padding: 8px; + font-weight: 700; + font-size: 0.85rem; + color: var(--ep-white); + font-family: "Inter Tight", system-ui, sans-serif; +} + +/* Scrollbar styling for dark theme */ +.ep2026-theme ::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +.ep2026-theme ::-webkit-scrollbar-track { + background: var(--ep-dark2); +} + +.ep2026-theme ::-webkit-scrollbar-thumb { + background: var(--ep-surface-medium); + border-radius: 4px; +} + +.ep2026-theme ::-webkit-scrollbar-thumb:hover { + background: var(--ep-border-strong); +} + +/* Note / info box */ +.ep-note { + background: rgba(var(--ep-accent-rgb), 0.08); + border: 1px solid rgba(var(--ep-accent-rgb), 0.2); + border-radius: 6px; + padding: 0.8rem 1rem; + color: var(--ep-text-secondary); + font-family: "Inter Tight", system-ui, sans-serif; + font-size: 0.95rem; +} + +/* Headline styles */ +.ep-headline { + font-family: "Inter Tight", system-ui, sans-serif; + font-weight: 500; + font-size: clamp( + 2.25rem, + 2.25rem + (100vw - 20rem) * (3 - 2.25) / (45 - 20), + 3rem + ); + line-height: 1.25; + color: var(--ep-white); + margin-bottom: 1.5rem; +} + +.ep-headline a, +.ep-sched-day-title a { + color: inherit; + text-decoration: none; +} + +.ep-headline a:hover, +.ep-sched-day-title a:hover { + text-decoration: underline; +} + +/* Responsive adjustments */ +@media (max-width: 800px) { + .ep-sched-time h2 { + font-size: 1rem; + text-align: center; + color: var(--ep-text-secondary); + } + + .ep-session h2 { + font-size: 0.9rem; + } + + .ep-session .room-info { + font-size: 0.8rem; + } +} + +/* Reduced motion */ +@media (prefers-reduced-motion: reduce) { + .ep-session { + transition: none; + } +}