SPB Git

Repository Public

Commit

Home and footer: icon links to MacLustr, Working Papers, HTR and Skills

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
simon-pierre boucher committed · Nov 10, 2026 parent b410985
3 changed files +105 −0 Browse files
modified app/page.tsx +2 −0
@@ -5,6 +5,7 @@
5 5 Mail: contact@spboucher.ai
6 6 */
7 7
8 +import { PlatformLinks } from "@/components/platform-links";
8 9 import Image from "next/image";
9 10 import Link from "next/link";
10 11 import {
@@ -190,6 +191,7 @@ export default function HomePage() {
190 191 GitHub
191 192 </a>
192 193 </div>
194 + <PlatformLinks className="mt-6 max-w-2xl" />
193 195 <div className="mt-6 flex flex-col gap-1 text-sm text-muted-foreground sm:flex-row sm:gap-6">
194 196 <a
195 197 href="mailto:simon-pierre.boucher@uqo.ca"
added components/platform-links.tsx +101 −0
@@ -0,0 +1,101 @@
1 +/*
2 + platform-links.tsx
3 + spboucher.ai Web
4 + Author: Simon-Pierre Boucher
5 + Mail: contact@spboucher.ai
6 +*/
7 +
8 +import { Cpu, Library, PenLine, Sparkles, type LucideIcon } from "lucide-react";
9 +
10 +import { cn } from "@/lib/utils";
11 +
12 +/** Sister sites, shown as icon links on the home page and in the footer. */
13 +export const platformLinks: {
14 + href: string;
15 + label: string;
16 + hint: string;
17 + icon: LucideIcon;
18 +}[] = [
19 + {
20 + href: "https://maclustr.spboucher.ai",
21 + label: "MacLustr",
22 + hint: "Apple Silicon compute cluster",
23 + icon: Cpu,
24 + },
25 + {
26 + href: "https://wp.spboucher.ai",
27 + label: "Papers",
28 + hint: "Research observatory and interactive reader",
29 + icon: Library,
30 + },
31 + {
32 + href: "https://htr.spboucher.ai",
33 + label: "HTR",
34 + hint: "Human Text Reconstruction",
35 + icon: PenLine,
36 + },
37 + {
38 + href: "https://skills.spboucher.ai",
39 + label: "Skills",
40 + hint: "Skills library",
41 + icon: Sparkles,
42 + },
43 +];
44 +
45 +/** `tiles`: labelled icon tiles (home hero). `icons`: compact icon-only squares (footer). */
46 +export function PlatformLinks({
47 + variant = "tiles",
48 + className,
49 +}: {
50 + variant?: "tiles" | "icons";
51 + className?: string;
52 +}) {
53 + if (variant === "icons") {
54 + return (
55 + <>
56 + {platformLinks.map(({ href, label, hint, icon: Icon }) => (
57 + <a
58 + key={href}
59 + href={href}
60 + target="_blank"
61 + rel="noopener noreferrer"
62 + aria-label={`${label} — ${hint}`}
63 + title={`${label} — ${hint}`}
64 + className="inline-flex h-8 w-8 items-center justify-center border border-foreground/15 bg-card text-muted-foreground transition-all hover:-translate-y-px hover:border-foreground/50 hover:text-foreground"
65 + >
66 + <Icon className="h-3.5 w-3.5" aria-hidden="true" />
67 + </a>
68 + ))}
69 + </>
70 + );
71 + }
72 + return (
73 + <nav
74 + aria-label="Platforms"
75 + className={cn("grid grid-cols-2 gap-2 sm:grid-cols-4", className)}
76 + >
77 + {platformLinks.map(({ href, label, hint, icon: Icon }) => (
78 + <a
79 + key={href}
80 + href={href}
81 + target="_blank"
82 + rel="noopener noreferrer"
83 + title={hint}
84 + className="group flex items-center gap-2.5 border border-foreground/15 bg-card px-3 py-2.5 transition-all hover:-translate-y-px hover:border-primary/60 hover:shadow-sm"
85 + >
86 + <span className="inline-flex h-8 w-8 shrink-0 items-center justify-center border border-primary/25 bg-primary/5 text-primary transition-colors group-hover:bg-primary group-hover:text-primary-foreground">
87 + <Icon className="h-4 w-4" aria-hidden="true" />
88 + </span>
89 + <span className="min-w-0">
90 + <span className="block truncate text-sm font-medium leading-tight">
91 + {label}
92 + </span>
93 + <span className="block truncate font-mono text-[0.6rem] uppercase tracking-[0.12em] text-muted-foreground">
94 + {href.replace("https://", "").replace(".spboucher.ai", "")}
95 + </span>
96 + </span>
97 + </a>
98 + ))}
99 + </nav>
100 + );
101 +}
modified components/site-footer.tsx +2 −0
@@ -5,6 +5,7 @@
5 5 Mail: contact@spboucher.ai
6 6 */
7 7
8 +import { PlatformLinks } from "@/components/platform-links";
8 9 import Link from "next/link";
9 10 import { Github, Mail } from "lucide-react";
10 11
@@ -47,6 +48,7 @@ export function SiteFooter() {
47 48 >
48 49 <Github className="h-3.5 w-3.5" aria-hidden="true" />
49 50 </a>
51 + <PlatformLinks variant="icons" />
50 52 </div>
51 53 </div>
52 54
53 55
Menu

Theme