summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuval Adam <_@yuv.al>2025-06-12 22:27:42 +0200
committerYuval Adam <_@yuv.al>2025-06-12 22:27:42 +0200
commitf1bb6bc52f8e5b2ccd54ba7c5a36f2359628f83c (patch)
tree7dcfdd39845244115371a0c029b09be0f3e849eb
parent27053ad40121adcf08603c7d7c9c3f48af5246f5 (diff)
Extract NameLink
-rw-r--r--src/components/NameLink.astro42
-rw-r--r--src/pages/index.astro63
2 files changed, 56 insertions, 49 deletions
diff --git a/src/components/NameLink.astro b/src/components/NameLink.astro
new file mode 100644
index 0000000..8ceb7e1
--- /dev/null
+++ b/src/components/NameLink.astro
@@ -0,0 +1,42 @@
+---
+interface Props {
+ name: {
+ data: {
+ name: string;
+ domain: string;
+ url?: string;
+ candidate?: boolean;
+ };
+ };
+ size?: 'large' | 'small';
+}
+
+const { name, size = 'large' } = Astro.props;
+const nameParts = name.data.name.toLowerCase().split(" ");
+const domain = name.data.domain.replace(".", "");
+const url = name.data.url || `https://${name.data.domain}`;
+
+const sizeClasses = {
+ large: 'text-2xl',
+ small: 'text-xl'
+};
+---
+
+<span class={sizeClasses[size]}>
+ {nameParts.map((part, index) => (
+ <>
+ {index > 0 && " "}
+ {part === domain ? (
+ <a
+ href={url}
+ class="text-blue-600 hover:text-blue-800 hover:underline"
+ rel={name.data.candidate ? "nofollow" : undefined}
+ >
+ {name.data.domain}
+ </a>
+ ) : (
+ <span>{part}</span>
+ )}
+ </>
+ ))}
+</span> \ No newline at end of file
diff --git a/src/pages/index.astro b/src/pages/index.astro
index 1981ec1..9dfc1ee 100644
--- a/src/pages/index.astro
+++ b/src/pages/index.astro
@@ -1,5 +1,6 @@
---
import { getCollection } from "astro:content";
+import NameLink from "../components/NameLink.astro";
import "../styles/global.css";
@@ -34,59 +35,23 @@ const candidates = allNames.filter(name => name.data.candidate === true);
<h2 class="pt-8 text-2xl font-bold">💎 Members</h2>
<ul class="list-none pl-0">
- {members.map((name) => {
- const nameParts = name.data.name.toLowerCase().split(" ");
- const domain = name.data.domain.replace(".", "");
- const url = name.data.url || `https://${name.data.domain}`;
-
- return (
- <li class="mb-3">
- <div class="text-2xl">
- {nameParts.map((part, index) => (
- <>
- {index > 0 && " "}
- {part === domain ? (
- <a href={url} class="text-blue-600 hover:text-blue-800 hover:underline">
- {name.data.domain}
- </a>
- ) : (
- <span>{part}</span>
- )}
- </>
- ))}
- </div>
- <div class="text-gray-600 font-serif mt-1">{name.data.title}</div>
- </li>
- );
- })}
+ {members.map((name) => (
+ <li class="mb-3">
+ <div class="text-2xl">
+ <NameLink name={name} size="large" />
+ </div>
+ <div class="text-gray-600 font-serif mt-1">{name.data.title}</div>
+ </li>
+ ))}
</ul>
<h2 class="pt-8 text-2xl font-bold">⭐ Candidates</h2>
<ul class="pl-0 flex flex-wrap justify-between">
- {candidates.map((name) => {
- const nameParts = name.data.name.toLowerCase().split(" ");
- const domain = name.data.domain.replace(".", "");
- const url = name.data.url || `https://${name.data.domain}`;
-
- return (
- <li class="mb-3 inline-block pr-3">
- <span class="text-xl">
- {nameParts.map((part, index) => (
- <>
- {index > 0 && " "}
- {part === domain ? (
- <a href={url} class="text-blue-600 hover:text-blue-800 hover:underline" rel="nofollow">
- {name.data.domain}
- </a>
- ) : (
- <span>{part}</span>
- )}
- </>
- ))}
- </span>
- </li>
- );
- })}
+ {candidates.map((name) => (
+ <li class="mb-3 inline-block pr-3">
+ <NameLink name={name} size="small" />
+ </li>
+ ))}
</ul>
<hr class="mt-8 border-gray-200">