)
}
diff --git a/src/app/projects/shapes.tsx b/src/app/projects/shapes.tsx
new file mode 100644
index 0000000..35d9031
--- /dev/null
+++ b/src/app/projects/shapes.tsx
@@ -0,0 +1,97 @@
+import { Shape } from "@/components/shapes"
+
+/**
+ * `left` offsets below are expressed as `calc(50% + Npx)`, i.e. relative to the
+ * horizontal center of the section rather than its left edge. The projects
+ * content is itself center-anchored (not width-capped), so anchoring shapes to
+ * the edge would make them drift away from the content on screens wider or
+ * narrower than the 1728px/402px Figma reference frames.
+ *
+ * `top` is relative to the top of the section each component is mounted in
+ * (CommunityNews, Collection, Upload, Deprecated), not to the page. Every
+ * section on this page uses `min-h-screen` (fluid height, depends on the viewport)
+ * — each shape below is therefore scoped and `top`-anchored to the section it
+ * visually belongs to, rather than using cumulative page offsets.
+ */
+
+export function CommunityNewsShapes() {
+ return (
+
+ )
+}
diff --git a/src/assets/shapes/hero-glow.svg b/src/assets/shapes/hero-glow.svg
new file mode 100644
index 0000000..98a159b
--- /dev/null
+++ b/src/assets/shapes/hero-glow.svg
@@ -0,0 +1,30 @@
+
diff --git a/src/assets/shapes/projects-glow.svg b/src/assets/shapes/projects-glow.svg
new file mode 100644
index 0000000..07df19c
--- /dev/null
+++ b/src/assets/shapes/projects-glow.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/components/conditional-global-shapes.tsx b/src/components/conditional-global-shapes.tsx
new file mode 100644
index 0000000..d034b7e
--- /dev/null
+++ b/src/components/conditional-global-shapes.tsx
@@ -0,0 +1,26 @@
+"use client"
+
+import { usePathname } from "next/navigation"
+import { Shape } from "@/components/shapes"
+
+const HIDDEN_EXACT = ["/"]
+
+/**
+ * Generic top-of-page decorative shapes, reused on every page that doesn't
+ * define its own (e.g. the homepage, which has a Figma-accurate composition).
+ */
+export function ConditionalGlobalShapes() {
+ const pathname = usePathname()
+ if (HIDDEN_EXACT.includes(pathname)) return null
+
+ return (
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/components/footer/index.tsx b/src/components/footer/index.tsx
index f403e40..7ccad65 100644
--- a/src/components/footer/index.tsx
+++ b/src/components/footer/index.tsx
@@ -4,11 +4,13 @@ import { FiFacebook, FiGithub, FiInstagram, FiLinkedin } from "react-icons/fi"
import discord from "@/assets/icons/discord.svg"
import telegram from "@/assets/icons/telegram.svg"
import { CardMultipleIcons } from "../card-multiple-icons"
+import { FooterShapes } from "./shapes"
export function Footer() {
return (
-
-
+
PoliNetwork 2016-{new Date().getFullYear()} - All rights reserved
diff --git a/src/components/footer/shapes.tsx b/src/components/footer/shapes.tsx
new file mode 100644
index 0000000..6299352
--- /dev/null
+++ b/src/components/footer/shapes.tsx
@@ -0,0 +1,12 @@
+import { Shape } from "@/components/shapes"
+
+export function FooterShapes() {
+ return (
+
+ {/* Desktop Shapes */}
+
+
+
+
+ )
+}
diff --git a/src/components/home/hero.tsx b/src/components/home/hero.tsx
index ff1152f..22bfccb 100644
--- a/src/components/home/hero.tsx
+++ b/src/components/home/hero.tsx
@@ -2,10 +2,13 @@ import Link from "next/link"
import { FiNavigation, FiUserPlus } from "react-icons/fi"
import { Button } from "../ui/button"
import { GroupSearch } from "./group-search"
+import { HomeHeroShapes } from "./shapes"
export function Hero() {
return (
-
+
+
+
Trova gruppi, risorse e supporto tra gli studenti del Polimi
diff --git a/src/components/home/shapes.tsx b/src/components/home/shapes.tsx
new file mode 100644
index 0000000..a1667be
--- /dev/null
+++ b/src/components/home/shapes.tsx
@@ -0,0 +1,72 @@
+import { Shape } from "@/components/shapes"
+
+/**
+ * `left` offsets below are expressed as `calc(50% + Npx)`, i.e. relative to the
+ * horizontal center of the section rather than its left edge. The homepage
+ * content is itself center-anchored (not width-capped), so anchoring shapes to
+ * the edge would make them drift away from the content on screens wider or
+ * narrower than the 1728px/402px Figma reference frames.
+ *
+ * `top` is relative to the top of the section each component is mounted in
+ * (Materials or Projects), not to the page. Materials and Projects/AboutUs
+ * used to share one absolute layer with cumulative offsets, but AboutUs uses
+ * `min-h-screen` (fluid height, depends on the viewport) — if a shape ever
+ * needs to sit inside AboutUs, mount it scoped to that section too, the same
+ * way this file already splits Materials from Projects. Otherwise any
+ * mismatch between a fluid section's real height and Figma's fixed height
+ * assumption compounds into every shape positioned after it (e.g. shapes
+ * drifting away from their section when the browser is zoomed out — see
+ * src/app/projects/shapes.tsx, which had exactly this bug).
+ */
+
+export function HomeHeroShapes() {
+ return (
+