diff --git a/src/components/top/Sponsors.astro b/src/components/top/Sponsors.astro
new file mode 100644
index 0000000..715cebe
--- /dev/null
+++ b/src/components/top/Sponsors.astro
@@ -0,0 +1,91 @@
+---
+import SectionTitle from "../ui/SectionTitle.astro";
+import SponsorList from "./sponsor/SponsorList.astro";
+import GopherList from "./sponsor/GopherList.astro";
+import {
+ goldSponsors,
+ silverSponsors,
+ drinkSponsors,
+ lunchSponsors,
+ bronzeSponsors,
+ gopherSponsors,
+ toolSponsors,
+} from "./sponsors";
+
+if (
+ goldSponsors.length === 0 &&
+ silverSponsors.length === 0 &&
+ drinkSponsors.length === 0 &&
+ lunchSponsors.length === 0 &&
+ bronzeSponsors.length === 0 &&
+ gopherSponsors.length === 0 &&
+ toolSponsors.length === 0
+) {
+ return null;
+}
+---
+
+
+
+
diff --git a/src/components/top/sponsor/Dialog.astro b/src/components/top/sponsor/Dialog.astro
new file mode 100644
index 0000000..4afd6c9
--- /dev/null
+++ b/src/components/top/sponsor/Dialog.astro
@@ -0,0 +1,135 @@
+---
+import { Image } from "astro:assets";
+import type { Sponsor } from "../sponsors";
+import Tag from "../../ui/Tag.astro";
+import TextLink from "../../ui/TextLink.astro";
+
+import CloseIcon from "../../../assets/icons/close.svg";
+
+interface Props {
+ openId: string;
+ sponsorSectionTitle: string;
+ sponsor: Sponsor;
+}
+
+const { openId, sponsorSectionTitle, sponsor } = Astro.props;
+---
+
+
+
+
diff --git a/src/components/top/sponsor/GopherList.astro b/src/components/top/sponsor/GopherList.astro
new file mode 100644
index 0000000..81ed663
--- /dev/null
+++ b/src/components/top/sponsor/GopherList.astro
@@ -0,0 +1,90 @@
+---
+import { Image } from "astro:assets";
+import type { Sponsor } from "../sponsors";
+
+interface Props {
+ sponsors: Sponsor[];
+}
+
+const { sponsors } = Astro.props;
+
+if (sponsors.length === 0) {
+ return null;
+}
+---
+
+
+
+
diff --git a/src/components/top/sponsor/SponsorList.astro b/src/components/top/sponsor/SponsorList.astro
new file mode 100644
index 0000000..cbacc17
--- /dev/null
+++ b/src/components/top/sponsor/SponsorList.astro
@@ -0,0 +1,157 @@
+---
+import { Image } from "astro:assets";
+import type { Sponsor } from "../sponsors";
+import Dialog from "./Dialog.astro";
+
+interface Props {
+ size: "learge" | "medium" | "small";
+ sponsors: Sponsor[];
+ dialogSectionTitle?: string;
+}
+
+const { size, sponsors, dialogSectionTitle } = Astro.props;
+
+const sizeMap = {
+ learge: { width: 532, height: 280 },
+ medium: { width: 354, height: 164 },
+ small: { width: 208, height: 100 },
+};
+
+const { width, height } = sizeMap[size];
+
+if (sponsors.length === 0) {
+ return null;
+}
+---
+
+
+
+
diff --git a/src/components/top/sponsors.ts b/src/components/top/sponsors.ts
new file mode 100644
index 0000000..9050c99
--- /dev/null
+++ b/src/components/top/sponsors.ts
@@ -0,0 +1,77 @@
+import type { ImageMetadata } from "astro";
+
+export type Sponsor = {
+ name: string;
+ imageSrc: ImageMetadata;
+ dialog?: {
+ openId: string;
+ link: string;
+ description: string;
+ };
+};
+
+import img1 from "../../assets/footer_logo.svg";
+import img2 from "../../assets/page-header-gopher.png";
+
+export const goldSponsors: Sponsor[] = [
+ { name: "gold sponsor", imageSrc: img1 ,dialog:{openId:"gold1", link:"http://localhost:4321", description: "dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description."}},
+ { name: "gold sponsor", imageSrc: img1 ,dialog:{openId:"gold2", link:"", description: "dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description."}},
+ { name: "gold sponsor", imageSrc: img1 ,dialog:{openId:"gold3", link:"http://localhost:4321", description: ""}},
+ { name: "gold sponsor", imageSrc: img1 ,dialog:{openId:"gold4", link:"http://localhost:4321", description: "dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description."}},
+ { name: "gold sponsor", imageSrc: img1 ,dialog:{openId:"gold5", link:"http://localhost:4321", description: "dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description."}},
+ { name: "gold sponsor", imageSrc: img1 ,dialog:{openId:"gold6", link:"http://localhost:4321", description: "dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description."}},
+];
+
+export const silverSponsors: Sponsor[] = [
+ { name: "silver sponsor", imageSrc: img1 ,dialog:{openId:"silver1", link:"http://localhost:4321", description: "dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description."}},
+ { name: "silver sponsor", imageSrc: img1 ,dialog:{openId:"silver2", link:"", description: "dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description."}},
+ { name: "silver sponsor", imageSrc: img1 ,dialog:{openId:"silver3", link:"http://localhost:4321", description: ""}},
+ { name: "silver sponsor", imageSrc: img1 ,dialog:{openId:"silver4", link:"http://localhost:4321", description: "dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description."}},
+ { name: "silver sponsor", imageSrc: img1 ,dialog:{openId:"silver5", link:"http://localhost:4321", description: "dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description."}},
+ { name: "silver sponsor", imageSrc: img1 ,dialog:{openId:"silver6", link:"http://localhost:4321", description: "dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description."}},
+];
+
+export const lunchSponsors: Sponsor[] = [
+ { name: "lunch sponsor", imageSrc: img1 ,dialog:{openId:"lunch1", link:"http://localhost:4321", description: "dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description."}},
+ { name: "lunch sponsor", imageSrc: img1 ,dialog:{openId:"lunch2", link:"", description: "dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description."}},
+
+];
+
+export const drinkSponsors: Sponsor[] = [
+ { name: "drink sponsor", imageSrc: img1 ,dialog:{openId:"drink1", link:"http://localhost:4321", description: "dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description."}},
+ { name: "drink sponsor", imageSrc: img1 ,dialog:{openId:"drink2", link:"", description: "dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description. dummy description."}},
+];
+
+export const bronzeSponsors: Sponsor[] = [
+ { name: "bronze sponsor", imageSrc: img1 },
+ { name: "bronze sponsor", imageSrc: img1 },
+ { name: "bronze sponsor", imageSrc: img1 },
+ { name: "bronze sponsor", imageSrc: img1 },
+ { name: "bronze sponsor", imageSrc: img1 },
+ { name: "bronze sponsor", imageSrc: img1 },
+ { name: "bronze sponsor", imageSrc: img1 },
+ { name: "bronze sponsor", imageSrc: img1 },
+ { name: "bronze sponsor", imageSrc: img1 },
+ { name: "bronze sponsor", imageSrc: img1 },
+ { name: "bronze sponsor", imageSrc: img1 },
+ { name: "bronze sponsor", imageSrc: img1 },
+ { name: "bronze sponsor", imageSrc: img1 },
+];
+
+export const gopherSponsors: Sponsor[] = [
+ { name: "gopher sponsor", imageSrc: img2 },
+ { name: "gopher sponsor", imageSrc: img2 },
+ { name: "gopher sponsor", imageSrc: img2 },
+ { name: "gopher sponsor", imageSrc: img2 },
+ { name: "gopher sponsor", imageSrc: img2 },
+ { name: "gopher sponsor", imageSrc: img2 },
+ { name: "gopher sponsor", imageSrc: img2 },
+ { name: "gopher sponsor", imageSrc: img2 },
+ { name: "gopher sponsor", imageSrc: img2 },
+ { name: "gopher sponsor", imageSrc: img2 },
+ { name: "gopher sponsor", imageSrc: img2 },
+];
+
+export const toolSponsors: Sponsor[] = [
+ { name: "tool sponsor", imageSrc: img1 },
+];
diff --git a/src/components/ui/Tag.astro b/src/components/ui/Tag.astro
new file mode 100644
index 0000000..2819055
--- /dev/null
+++ b/src/components/ui/Tag.astro
@@ -0,0 +1,23 @@
+---
+type Props = {
+ text: string;
+};
+
+const { text } = Astro.props as Props;
+---
+
+
+ {text}
+
+
+
diff --git a/src/components/ui/TextLink.astro b/src/components/ui/TextLink.astro
index 89cc9be..d9c6608 100644
--- a/src/components/ui/TextLink.astro
+++ b/src/components/ui/TextLink.astro
@@ -7,6 +7,7 @@ type Props = {
isBlankLink?: boolean;
withArrowIcon?: boolean;
text: string;
+ isAccentColor?: boolean;
};
const {
@@ -14,6 +15,7 @@ const {
isBlankLink = false,
withArrowIcon = false,
text,
+ isAccentColor = false,
} = Astro.props as Props;
---
@@ -21,6 +23,7 @@ const {
href={href}
target={isBlankLink ? "_blank" : undefined}
rel={isBlankLink ? "noopener noreferrer" : undefined}
+ data-accent={isAccentColor || undefined}
>
{text}
{isBlankLink && }
@@ -39,6 +42,10 @@ const {
width: 100%;
}
+ a[data-accent] {
+ color: var(--text-accent);
+ }
+
a:hover {
color: var(--text-accent);
}
diff --git a/src/pages/index.astro b/src/pages/index.astro
index abd914e..caa7429 100644
--- a/src/pages/index.astro
+++ b/src/pages/index.astro
@@ -3,6 +3,7 @@ import About from "../components/top/About.astro";
import MainVisual from "../components/top/MainVisual.astro";
import SponsorRecruitment from "../components/top/SponsorRecruitment.astro";
import News from "../components/top/News.astro";
+import Sponsors from "../components/top/Sponsors.astro";
import Layout from "../layouts/Layout.astro";
---
@@ -12,5 +13,6 @@ import Layout from "../layouts/Layout.astro";
+