Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import mdx from "@astrojs/mdx";
import sitemap from "@astrojs/sitemap";
import tailwindcss from "@tailwindcss/vite";
import { defineConfig } from "astro/config";
import deleteUnusedImages from "astro-delete-unused-images";
import compress from "astro-compress";
import deleteUnusedImages from "astro-delete-unused-images";

export default defineConfig({
site: "https://istanbul.python.pizza",
Expand Down
1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
"astro": "^7.3.5",
"astro-compress": "^2.4.3",
"astro-delete-unused-images": "^1.0.3",
"date-fns": "^4.4.0",
"sharp": "^0.35.5",
"tailwindcss": "^4.3.3",
"zod": "^4.6.5"
Expand Down
8 changes: 0 additions & 8 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file modified public/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/social-image.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/socials/facebook.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/socials/instagram.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/socials/linkedin.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/socials/mastodon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/socials/twitter.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/sponsors/bilus.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/assets/city.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/assets/organizers/cemrehan-cavdar.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/assets/organizers/ege-akman.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/assets/organizers/kader-miyanyedi.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/assets/organizers/ozge-cinko.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/speakers/agata-skamruk.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/speakers/ahmet-burak-ozyurt.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/speakers/aleksandar-milosevic.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/assets/speakers/ayse-bilge-ince.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/speakers/cheuk-ting-ho.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/speakers/dmitry-orlyakov.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/speakers/duhan-gunsel.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/speakers/erhan-bute.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/speakers/ogulcan-dogan.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/speakers/onuralp-sezer.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/speakers/placeholder.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/speakers/rimantas-zukaitis.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/speakers/suayip-uzulmez.jpeg
Binary file modified src/assets/venue/startgate-amfi-lobby.jpeg
Binary file modified src/assets/venue/startgate-amfi-tiers.jpeg
Binary file modified src/assets/venue/startgate-amfi-wide.jpeg
Binary file modified src/assets/venue/startgate-front.jpeg
Binary file modified src/assets/venue/startgate-terrace-night.jpeg
Binary file modified src/assets/venue/startgate-terrace-view.jpeg
2 changes: 1 addition & 1 deletion src/components/Header.astro
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
import { getImage } from "astro:assets";
import Logo from "@components/Logo.astro";
import cityBg from "@assets/city.jpg";
import Logo from "@components/Logo.astro";
import { menuItems } from "@data/navigation";

const optimizedCityBg = await getImage({
Expand Down
37 changes: 26 additions & 11 deletions src/components/ScheduleCard.astro
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
---
import type { ImageMetadata } from "astro";
import { Image } from "astro:assets";
import { formatSessionTime } from "@data/schedule";
import SocialLink from "@components/SocialLink.astro";
import { formatSessionTime } from "@data/schedule";
import type { ImageMetadata } from "astro";

interface Link {
url: string;
Expand All @@ -24,6 +24,9 @@ interface Session {
when?: string;
until?: string;
isKeynote?: boolean;
isHighlight?: boolean;
description?: string;
language?: "EN" | "TR";
}

interface Props {
Expand All @@ -41,23 +44,31 @@ const timeRange = session.when
: null;

const isInfo = Boolean(session.label);
const languageNames = { EN: "English", TR: "Turkish" };
const photos = speakers.flatMap((s) =>
s.image ? [{ src: s.image, name: s.name }] : [],
);
const multiPhoto = photos.length > 1;
const photoCol = multiPhoto ? "7.5rem" : "10.625rem";
const photoCol = multiPhoto ? "7.5rem" : "11.5rem";
const gridCols = invert ? `1fr ${photoCol}` : `${photoCol} 1fr`;
---

<div class="relative mt-12">
<div class="relative mt-8">
{isInfo ? (
<div class="stripe-badge px-8 py-6 md:px-24 md:py-8 rounded-[2.4rem] md:rounded-full bg-primary text-white text-base md:text-xl text-center">
<div
class:list={[
"stripe-badge flex items-center justify-center px-8 py-4 md:px-24 rounded-[2.4rem] md:rounded-full bg-primary text-white text-center",
session.isHighlight
? "min-h-28 md:min-h-30 text-xl md:text-3xl font-semibold shadow-[0_8px_32px_-12px_#ed4337]"
: "text-base md:text-xl",
]}
>
{session.label}
</div>
) : (
<div
class:list={[
"rounded-[3.2rem] md:rounded-[4rem] shadow-[0_4px_28px_-8px_#cac9c9] p-6 md:p-10 flex flex-col items-center md:gap-6",
"rounded-[2rem] md:rounded-[2.5rem] shadow-[0_4px_28px_-8px_#cac9c9] p-5 md:px-8 md:py-5 flex flex-col items-center md:gap-x-6 md:gap-y-2",
session.isKeynote ? "border-[3px] border-primary shadow-[0_8px_32px_-12px_#ed4337]" : "border border-gray-100",
photos.length > 0 ? "md:grid md:items-center md:justify-items-center" : "",
]}
Expand All @@ -67,15 +78,15 @@ const gridCols = invert ? `1fr ${photoCol}` : `${photoCol} 1fr`;
<div
class:list={[
"relative flex items-center justify-center mb-4 md:mb-0 row-[1/span_2]",
multiPhoto ? "w-18 h-18 md:w-30 md:h-30" : "w-16 h-16 md:w-38 md:h-38",
multiPhoto ? "w-18 h-18 md:w-30 md:h-30" : "w-20 h-20 md:w-42 md:h-42",
invert ? "md:order-2 md:col-start-2" : "md:col-start-1",
]}
>
{photos.map((photo, i) => (
<Image
src={photo.src}
alt={photo.name}
width={320}
width={480}
format="avif"
class:list={[
"rounded-full object-cover",
Expand All @@ -91,7 +102,7 @@ const gridCols = invert ? `1fr ${photoCol}` : `${photoCol} 1fr`;

<h2
class:list={[
"w-full text-text font-mono font-medium text-lg md:text-xl leading-snug m-0 mb-3 md:mb-2 wrap-break-word",
"w-full text-text font-mono font-normal text-lg md:text-xl leading-snug m-0 mb-3 md:mb-2 wrap-break-word",
photos.length > 0 && (invert ? "md:col-start-1" : "md:col-start-2"),
]}
>
Expand All @@ -107,15 +118,17 @@ const gridCols = invert ? `1fr ${photoCol}` : `${photoCol} 1fr`;
{session.isKeynote && (
<span class="text-primary font-mono text-base font-medium">Keynote speaker</span>
)}
{session.description && <span>{session.description}</span>}
{speakers.map((speaker) => (
<span class="inline-flex items-center gap-1 flex-wrap justify-center">
<span class="inline-flex items-center gap-2 flex-wrap justify-center">
<span>{speaker.name}</span>
{speaker.links?.map((link) => (
<SocialLink
url={link.url}
icon={link.icon}
label={link.label}
ariaLabel={`${speaker.name} ${link.label}`}
size={22}
/>
))}
</span>
Expand All @@ -127,11 +140,13 @@ const gridCols = invert ? `1fr ${photoCol}` : `${photoCol} 1fr`;
{timeRange && (
<span
class:list={[
"absolute top-0 left-1/2 -translate-x-1/2 -translate-y-1/2 px-3 py-1.5 rounded-full font-mono text-sm md:text-base whitespace-nowrap shadow-[0_4px_16px_-8px_#464444] z-10",
"absolute top-0 left-1/2 -translate-x-1/2 -translate-y-1/2 px-2.5 py-1 leading-none rounded-full font-mono text-sm md:text-base whitespace-nowrap shadow-[0_4px_16px_-8px_#464444] z-10",
isInfo ? "bg-white text-primary" : "bg-primary text-white",
]}
title={session.language && languageNames[session.language]}
>
{timeRange}
{session.language && ` · ${session.language}`}
</span>
)}
</div>
2 changes: 1 addition & 1 deletion src/components/ZoomableImage.astro
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
import type { ImageMetadata } from "astro";
import { Image } from "astro:assets";
import type { ImageMetadata } from "astro";

interface Props {
src: ImageMetadata;
Expand Down
41 changes: 33 additions & 8 deletions src/content.config.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,34 @@
import { defineCollection } from "astro:content";
import { z } from "zod";
import { file, glob } from "astro/loaders";
import { z } from "zod";

const linkSchema = z.object({
url: z.url(),
icon: z.string(),
label: z.string(),
});
// icon and label for each known platform; links render in this order
const platforms: Record<string, { icon: string; label: string }> = {
github: { icon: "/socials/github.svg", label: "GitHub" },
x: { icon: "/socials/twitter.png", label: "X" },
linkedin: { icon: "/socials/linkedin.png", label: "LinkedIn" },
mastodon: { icon: "/socials/mastodon.png", label: "Mastodon" },
website: { icon: "/socials/website.svg", label: "Website" },
};
const platformOrder = Object.keys(platforms);
const platformRank = (key: string) => {
const i = platformOrder.indexOf(key.toLowerCase());
return i === -1 ? platformOrder.length : i;
};

// `links: { github: <url>, x: <url>, ... }` in frontmatter becomes [{ url, icon, label }];
// any other key comes last, with the website icon and the key as its label
const linksSchema = z.record(z.string(), z.url()).transform((links) =>
Object.entries(links)
.sort(([a], [b]) => platformRank(a) - platformRank(b))
.map(([key, url]) => ({
url,
...(platforms[key.toLowerCase()] ?? {
icon: platforms.website.icon,
label: key,
}),
})),
);

const speakers = defineCollection({
loader: glob({ pattern: "**/*.md", base: "./src/content/speakers" }),
Expand All @@ -18,7 +40,7 @@ const speakers = defineCollection({
image: image().optional(),
keynoter: z.boolean().optional(),
order: z.number().default(Number.MAX_SAFE_INTEGER),
links: z.array(linkSchema).optional(),
links: linksSchema.optional(),
})
.refine((s) => !s.keynoter || s.image, {
message: "keynote speakers need an image",
Expand All @@ -32,7 +54,7 @@ const organizers = defineCollection({
z.object({
name: z.string(),
image: image(),
links: z.array(linkSchema).optional(),
links: linksSchema.optional(),
}),
});

Expand All @@ -43,6 +65,9 @@ const sessionSchema = z.object({
when: z.string().optional(),
until: z.string().optional(),
isKeynote: z.boolean().optional(),
isHighlight: z.boolean().optional(),
description: z.string().optional(),
language: z.enum(["EN", "TR"]).optional(),
});

const schedule = defineCollection({
Expand Down
12 changes: 3 additions & 9 deletions src/content/organizers/cemrehan-cavdar.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,7 @@
name: Cemrehan Çavdar
image: ../../assets/organizers/cemrehan-cavdar.jpeg
links:
- url: https://github.com/cemrehancavdar
icon: /socials/github.svg
label: GitHub
- url: https://www.linkedin.com/in/cemrehancavdar/
icon: /socials/linkedin.png
label: LinkedIn
- url: https://x.com/cemrehancavdar
icon: /socials/twitter.png
label: X
github: https://github.com/cemrehancavdar
x: https://x.com/cemrehancavdar
linkedin: https://www.linkedin.com/in/cemrehancavdar/
---
16 changes: 4 additions & 12 deletions src/content/organizers/ege-akman.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,8 @@
name: Ege Akman
image: ../../assets/organizers/ege-akman.jpeg
links:
- url: https://github.com/egeakman
icon: /socials/github.svg
label: GitHub
- url: https://x.com/egeakmn
icon: /socials/twitter.png
label: X
- url: https://www.linkedin.com/in/egeakman/
icon: /socials/linkedin.png
label: LinkedIn
- url: https://mastodon.social/@egeakman
icon: /socials/mastodon.png
label: Mastodon
github: https://github.com/egeakman
x: https://x.com/egeakmn
linkedin: https://www.linkedin.com/in/egeakman/
mastodon: https://mastodon.social/@egeakman
---
12 changes: 3 additions & 9 deletions src/content/organizers/kader-miyanyedi.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,7 @@
name: Kader Miyanyedi
image: ../../assets/organizers/kader-miyanyedi.jpeg
links:
- url: https://github.com/kadermiyanyedi
icon: /socials/github.svg
label: GitHub
- url: https://x.com/laekhesis
icon: /socials/twitter.png
label: X
- url: https://www.linkedin.com/in/kadermiyanyedi/
icon: /socials/linkedin.png
label: LinkedIn
github: https://github.com/kadermiyanyedi
x: https://x.com/laekhesis
linkedin: https://www.linkedin.com/in/kadermiyanyedi/
---
10 changes: 3 additions & 7 deletions src/content/organizers/organizer.md.example
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
---
name: Example Organizer
image: ../../assets/organizers/example.jpg
links:
- url: https://example.com
icon: /socials/website.svg
label: Website
- url: https://github.com/example
icon: /socials/github.svg
label: GitHub
links: # optional; github, x, linkedin, mastodon, website get their own icon, any other key (e.g. blog) gets the website icon
github: https://github.com/example
website: https://example.com
---
12 changes: 3 additions & 9 deletions src/content/organizers/ozge-cinko.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,7 @@
name: Özge Çinko
image: ../../assets/organizers/ozge-cinko.jpeg
links:
- url: https://github.com/ozgecinko
icon: /socials/github.svg
label: GitHub
- url: https://x.com/ozgecinko
icon: /socials/twitter.png
label: X
- url: https://www.linkedin.com/in/ozgecinko/
icon: /socials/linkedin.png
label: LinkedIn
github: https://github.com/ozgecinko
x: https://x.com/ozgecinko
linkedin: https://www.linkedin.com/in/ozgecinko/
---
Loading
Loading