diff --git a/src/components/IconLinkCard.astro b/src/components/IconLinkCard.astro
new file mode 100644
index 0000000..10c23e1
--- /dev/null
+++ b/src/components/IconLinkCard.astro
@@ -0,0 +1,125 @@
+---
+// Icon + label + action link card. Shared by About and Contact.
+// Surface + hover-lift come from the global .card / .card--interactive classes.
+interface Props {
+ href?: string | null;
+ /** SVG path `d` for a 24×24 viewBox icon */
+ icon: string;
+ label: string;
+ action: string;
+}
+const { href, icon, label, action } = Astro.props;
+const external = !!href && href.startsWith('http');
+---
+
+
+
+
+
+ {label}
+ {action}
+ →
+
+
+
diff --git a/src/components/Stat.astro b/src/components/Stat.astro
new file mode 100644
index 0000000..10a4dbf
--- /dev/null
+++ b/src/components/Stat.astro
@@ -0,0 +1,28 @@
+---
+// A single number + label stat (hero counters, etc.).
+interface Props {
+ value: number | string;
+ label: string;
+}
+const { value, label } = Astro.props;
+---
+
+
+
+
diff --git a/src/components/Step.astro b/src/components/Step.astro
new file mode 100644
index 0000000..ec7917b
--- /dev/null
+++ b/src/components/Step.astro
@@ -0,0 +1,44 @@
+---
+// A numbered process step (see the Contribute page).
+interface Props {
+ n: string;
+ title: string;
+ body: string;
+}
+const { n, title, body } = Astro.props;
+---
+
+
+
+
diff --git a/src/pages/about.astro b/src/pages/about.astro
index ef3017a..e44f131 100644
--- a/src/pages/about.astro
+++ b/src/pages/about.astro
@@ -1,5 +1,6 @@
---
import BaseLayout from '@/layouts/BaseLayout.astro';
+import IconLinkCard from '@/components/IconLinkCard.astro';
import { SITE } from '@/lib/site';
const GITHUB_URL = 'https://github.com/HumbleBee14';
@@ -77,31 +78,14 @@ const links = [
- This site is open source, MIT-licensed for the code, and Creative Commons / All Rights
- Reserved per author for the writing. No paywalls, no popups, no "10x your ML career"
- funnels. Just notes from the workbench.
+ Everything here is © its respective author, all rights reserved. No paywalls, no popups, no
+ "10x your ML career" funnels. Just notes from the workbench.
@@ -205,122 +189,11 @@ const links = [
grid-template-columns: repeat(2, 1fr);
gap: 14px;
}
- .about-card {
- position: relative;
- display: grid;
- grid-template-columns: 56px 1fr 28px;
- grid-template-areas:
- 'icon label arrow'
- 'icon action arrow';
- column-gap: 16px;
- row-gap: 2px;
- align-items: center;
- padding: 22px;
- border: 1px solid var(--line);
- border-radius: var(--radius-lg);
- background: var(--paper-2);
- color: inherit !important;
- text-decoration: none;
- overflow: hidden;
- transition:
- transform 0.18s ease,
- border-color 0.18s ease,
- box-shadow 0.18s ease,
- background 0.18s ease;
- }
- .about-card {
- border-bottom: 1px solid var(--line);
- }
- .about-card::before {
- content: '';
- position: absolute;
- inset: 0 auto 0 0;
- width: 3px;
- background: var(--accent);
- transform: scaleY(0);
- transform-origin: top;
- transition: transform 0.22s ease;
- }
- .about-card:hover {
- transform: translateY(-2px);
- border-color: var(--accent);
- background: var(--paper);
- box-shadow: 0 8px 24px -14px color-mix(in srgb, var(--accent) 40%, transparent);
- }
- .about-card:hover::before {
- transform: scaleY(1);
- }
- .about-card:hover .about-action,
- .about-card:hover .about-arrow,
- .about-card:hover .about-icon {
- color: var(--accent);
- }
- .about-card:hover .about-icon {
- border-color: var(--accent);
- }
- .about-card:hover .about-arrow {
- transform: translateX(4px);
- }
-
- .about-icon {
- grid-area: icon;
- display: inline-flex;
- align-items: center;
- justify-content: center;
- width: 48px;
- height: 48px;
- border-radius: 10px;
- background: var(--paper);
- border: 1px solid var(--line);
- color: var(--ink-2);
- transition:
- color 0.15s ease,
- border-color 0.15s ease;
- }
- .about-icon svg {
- display: block;
- fill: currentColor;
- }
- .about-label {
- grid-area: label;
- font-family: var(--font-mono);
- font-size: 11px;
- text-transform: uppercase;
- letter-spacing: 0.1em;
- color: var(--ink-3);
- align-self: end;
- }
- .about-action {
- grid-area: action;
- font-family: var(--font-display);
- font-size: 20px;
- color: var(--ink);
- line-height: 1.15;
- word-break: break-word;
- align-self: start;
- transition: color 0.15s ease;
- }
- .about-arrow {
- grid-area: arrow;
- display: inline-flex;
- align-items: center;
- justify-content: center;
- font-family: var(--font-mono);
- font-size: 18px;
- color: var(--ink-3);
- transition:
- transform 0.18s ease,
- color 0.15s ease;
- }
-
@media (max-width: 620px) {
.about-links {
grid-template-columns: 1fr;
gap: 10px;
}
- .about-card {
- padding: 18px;
- }
.about-body {
font-size: 16px;
}
diff --git a/src/pages/authors/index.astro b/src/pages/authors/index.astro
index 10eab9d..e4c5027 100644
--- a/src/pages/authors/index.astro
+++ b/src/pages/authors/index.astro
@@ -50,7 +50,7 @@ const contributors = authors