Files
sharper.ly/apps/web/app/components/ui/Footer/content.ts
T
2026-09-11 02:46:56 +02:00

203 lines
8.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ============================================================================
Footer - typed defaults
----------------------------------------------------------------------------
Draft copy is taken from docs/SHARPER_Website_Draft_Section_EN_AR.docx and the
communication guideline; the section names are the ten-section IA. Everything
here is a default only - Strapi will supply the same shapes later, so nothing
below may be imported by anything except <Footer />'s own prop defaults.
========================================================================= */
import { ROUTE_SLUGS } from "~/lib/route-slugs";
import type {
FooterCopy,
FooterLinkGroup,
FooterLocale,
FooterPartner,
FooterSocialLink,
} from "./types";
/* ---------------------------------------------------------------------------
Assets - exported from Figma (frames 312:4012, 84:4483, 228:2984) and
committed under apps/web/public/assets/. Two cuts of every piece of baked
ink: the plain one for a light surface, `*-inverse` for a dark one.
------------------------------------------------------------------------ */
export const FOOTER_ASSETS = {
/** SHARP-ER wordmark, designed 334x46 (figma 317:5571 / 317:7812). */
wordmark: "/assets/sharp-er-wordmark.png",
wordmarkInverse: "/assets/sharp-er-wordmark-inverse.png",
/** EU emblem, designed 48x32 (figma 22:5358 / 238:2323). */
euEmblem: "/assets/eu-emblem.png",
euEmblemInverse: "/assets/eu-emblem-inverse.png",
} as const;
/** Designed CSS pixels of the wordmark inside the footer brand column. */
export const FOOTER_WORDMARK_SIZE = { width: 196, height: 27 } as const;
/** Designed CSS pixels of the EU emblem (figma "european union", 48x32). */
export const FOOTER_EU_EMBLEM_SIZE = { width: 48, height: 32 } as const;
/* ---------------------------------------------------------------------------
Route slugs
The footer only ever builds `/{locale}/{slug}`, and the slugs come from the
ONE source of truth the route config itself is built from - redeclaring them
here is how the footer ended up linking at five pages that do not exist.
Re-exported under the old name so the barrel keeps its public surface.
------------------------------------------------------------------------ */
export const FOOTER_ROUTE_SLUGS = ROUTE_SLUGS;
const path = (locale: FooterLocale, slug: string): string => `/${locale}/${slug}`;
/* ---------------------------------------------------------------------------
Copy
------------------------------------------------------------------------ */
export const DEFAULT_FOOTER_COPY: Readonly<Record<FooterLocale, FooterCopy>> = {
en: {
tagline: "Shared Action on Rule of Law Progress – Exit Route",
description:
"A nationwide initiative supporting Libya’s civil society, local institutions and communities in advancing justice, accountability and good governance. Running from December 2025 to December 2027.",
euStatement: "This project is funded by the European Union",
euEmblemAlt: "Emblem of the European Union",
implementedByLabel: "Implemented by",
socialHeading: "Follow SHARP-ER",
homeLabel: "SHARP-ER — home",
navLabel: "Site sections",
},
ar: {
tagline: "العمل المشترك لتعزيز سيادة القانون – مسار الخروج",
description:
"مبادرة وطنية تدعم المجتمع المدني والمؤسسات المحلية والمجتمعات الليبية في تعزيز العدالة والمساءلة والحوكمة الرشيدة. يمتد المشروع من ديسمبر 2025 إلى ديسمبر 2027.",
euStatement: "هذا المشروع ممول من الاتحاد الأوروبي",
euEmblemAlt: "شعار الاتحاد الأوروبي",
implementedByLabel: "الجهات المنفّذة",
socialHeading: "تابعوا SHARP-ER",
homeLabel: "SHARP-ER — الصفحة الرئيسية",
navLabel: "أقسام الموقع",
},
};
/* ---------------------------------------------------------------------------
Sitemap columns - the three IA groups. "Home" is not repeated as a link
because the wordmark above the columns already points at it.
------------------------------------------------------------------------ */
const LINK_GROUPS: Readonly<
Record<FooterLocale, readonly FooterLinkGroup[]>
> = {
en: [
{
id: "about-and-strategy",
heading: "About and Strategy",
links: [
{ label: "About", href: path("en", FOOTER_ROUTE_SLUGS.about) },
{ label: "What We Do", href: path("en", FOOTER_ROUTE_SLUGS.whatWeDo) },
{
label: "Activities and Initiatives",
href: path("en", FOOTER_ROUTE_SLUGS.activities),
},
],
},
{
id: "engagement-and-opportunities",
heading: "Engagement and Opportunities",
links: [
{ label: "Events Calendar", href: path("en", FOOTER_ROUTE_SLUGS.events) },
{
label: "Applications and Opportunities",
href: path("en", FOOTER_ROUTE_SLUGS.applications),
},
{ label: "News and Updates", href: path("en", FOOTER_ROUTE_SLUGS.news) },
{ label: "Contact", href: path("en", FOOTER_ROUTE_SLUGS.contact) },
],
},
{
id: "knowledge-and-impact",
heading: "Knowledge and Impact",
links: [
{
label: "Resources and Publications",
href: path("en", FOOTER_ROUTE_SLUGS.resources),
},
{ label: "Knowledge Hub", href: path("en", FOOTER_ROUTE_SLUGS.knowledgeHub) },
],
},
],
ar: [
{
id: "about-and-strategy",
heading: "عن المشروع والاستراتيجية",
links: [
{ label: "عن المشروع", href: path("ar", FOOTER_ROUTE_SLUGS.about) },
{ label: "ماذا نفعل", href: path("ar", FOOTER_ROUTE_SLUGS.whatWeDo) },
{ label: "الأنشطة والمبادرات", href: path("ar", FOOTER_ROUTE_SLUGS.activities) },
],
},
{
id: "engagement-and-opportunities",
heading: "المشاركة والفرص",
links: [
{ label: "التقويم الزمني للفعاليات", href: path("ar", FOOTER_ROUTE_SLUGS.events) },
{ label: "طلبات وفرص المشاركة", href: path("ar", FOOTER_ROUTE_SLUGS.applications) },
{ label: "الأخبار والمستجدات", href: path("ar", FOOTER_ROUTE_SLUGS.news) },
{ label: "تواصل معنا", href: path("ar", FOOTER_ROUTE_SLUGS.contact) },
],
},
{
id: "knowledge-and-impact",
heading: "المعرفة والأثر",
links: [
{ label: "الموارد والمنشورات", href: path("ar", FOOTER_ROUTE_SLUGS.resources) },
{ label: "مركز المعرفة", href: path("ar", FOOTER_ROUTE_SLUGS.knowledgeHub) },
],
},
],
};
/** The three IA sitemap columns for a locale. */
export function defaultFooterLinkGroups(
locale: FooterLocale,
): readonly FooterLinkGroup[] {
return LINK_GROUPS[locale];
}
/* ---------------------------------------------------------------------------
Consortium logos - shown together, never standalone (communication guideline).
Sizes are the designed boxes from figma frame 228:2984.
------------------------------------------------------------------------ */
export const DEFAULT_FOOTER_PARTNERS: readonly FooterPartner[] = [
{
id: "acted",
name: "Acted",
src: "/assets/partner-acted.png",
srcInverse: "/assets/partner-acted-inverse.png",
width: 86,
height: 24,
},
{
id: "uec",
name: "United Efforts Consultancy (UEC)",
src: "/assets/partner-uec.png",
srcInverse: "/assets/partner-uec-inverse.png",
width: 24,
height: 24,
},
{
id: "sbe",
name: "Stichting Bureau Ensemble (SBE)",
src: "/assets/partner-sbe.png",
srcInverse: "/assets/partner-sbe-inverse.png",
width: 43,
height: 24,
},
];
/* ---------------------------------------------------------------------------
Social profiles
DELIBERATELY EMPTY. The draft copy names Facebook as the only confirmed
channel and leaves its URL a placeholder, so there is no handle here that
the project is known to own - and shipping a guessed one from an EU-funded
site would point readers at an account somebody else may control.
Real profiles arrive through the `socialLinks` prop (Strapi); the footer's
`links.length > 0` guard drops the whole row until they do.
------------------------------------------------------------------------ */
export const DEFAULT_FOOTER_SOCIAL_LINKS: readonly FooterSocialLink[] = [];