2026-09-11 02:46:56 +02:00
|
|
|
/* ============================================================================
|
|
|
|
|
DEFAULT INFORMATION ARCHITECTURE
|
|
|
|
|
----------------------------------------------------------------------------
|
2026-10-05 17:32:06 +02:00
|
|
|
The top-level destinations from the Figma navigation (frame 20:236) and
|
2026-09-11 02:46:56 +02:00
|
|
|
ToR 3.2. The app shell normally feeds `items` to <Navigation /> from the
|
|
|
|
|
Strapi site-settings single type; this module is the typed fallback that
|
|
|
|
|
renders when Strapi has not been wired yet.
|
|
|
|
|
|
|
|
|
|
It does NOT own the slugs: ~/lib/route-slugs is the one table the route
|
|
|
|
|
config is built from, and `NAV_PATHS` below is constrained to it.
|
|
|
|
|
|
|
|
|
|
Arabic copy is taken verbatim from the Arabic mega-menu frame (334:639).
|
|
|
|
|
========================================================================= */
|
|
|
|
|
|
|
|
|
|
import type { RouteSlugKey, RouteSlugs } from "~/lib/route-slugs";
|
|
|
|
|
|
|
|
|
|
import { buildLocalizedHref, type Locale } from "../LanguageSwitcher";
|
|
|
|
|
|
|
|
|
|
import type { NavItem, NavigationStrings, NavigationStringsByLocale } from "./types";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Unprefixed route paths. Both locales share the Latin slugs; the locale lives
|
|
|
|
|
* in the prefix (/en/contact, /ar/contact), never in the slug.
|
|
|
|
|
*
|
|
|
|
|
* The `satisfies` clause pins every entry to the slug `ROUTE_SLUGS` registers
|
|
|
|
|
* the route under - home's empty slug yielding "/" - so this table cannot
|
|
|
|
|
* drift away from the URLs the app actually serves, and cannot gain or lose a
|
|
|
|
|
* section without ~/lib/route-slugs gaining or losing one first.
|
|
|
|
|
*/
|
|
|
|
|
export const NAV_PATHS = {
|
|
|
|
|
home: "/",
|
|
|
|
|
about: "/about",
|
2026-10-05 17:32:06 +02:00
|
|
|
legacy: "/legacy",
|
2026-09-11 02:46:56 +02:00
|
|
|
whatWeDo: "/what-we-do",
|
|
|
|
|
activities: "/activities-and-initiatives",
|
|
|
|
|
events: "/events-calendar",
|
|
|
|
|
applications: "/applications-and-opportunities",
|
|
|
|
|
news: "/news-and-updates",
|
|
|
|
|
contact: "/contact",
|
|
|
|
|
resources: "/resources-and-publications",
|
|
|
|
|
knowledgeHub: "/knowledge-hub",
|
|
|
|
|
} as const satisfies { readonly [K in RouteSlugKey]: `/${RouteSlugs[K]}` };
|
|
|
|
|
|
|
|
|
|
export type NavPathKey = keyof typeof NAV_PATHS;
|
|
|
|
|
|
|
|
|
|
type LabelKey =
|
|
|
|
|
| NavPathKey
|
|
|
|
|
| "aboutAndStrategy"
|
|
|
|
|
| "engagementAndOpportunities"
|
|
|
|
|
| "knowledgeAndImpact";
|
|
|
|
|
|
|
|
|
|
const LABELS: Record<Locale, Record<LabelKey, string>> = {
|
|
|
|
|
en: {
|
|
|
|
|
home: "Home",
|
|
|
|
|
aboutAndStrategy: "About and Strategy",
|
|
|
|
|
about: "About",
|
2026-10-05 17:32:06 +02:00
|
|
|
legacy: "SHARP Legacy",
|
2026-09-11 02:46:56 +02:00
|
|
|
whatWeDo: "What We Do",
|
|
|
|
|
activities: "Activities and Initiatives",
|
|
|
|
|
engagementAndOpportunities: "Engagement and Opportunities",
|
|
|
|
|
events: "Events Calendar",
|
|
|
|
|
applications: "Applications and Opportunities",
|
|
|
|
|
news: "News and Updates",
|
|
|
|
|
contact: "Contact",
|
|
|
|
|
knowledgeAndImpact: "Knowledge and Impact",
|
|
|
|
|
resources: "Resources and Publications",
|
|
|
|
|
knowledgeHub: "Knowledge Hub",
|
|
|
|
|
},
|
|
|
|
|
ar: {
|
|
|
|
|
home: "الرئيسية",
|
|
|
|
|
aboutAndStrategy: "عن المشروع والاستراتيجية",
|
|
|
|
|
about: "عن المشروع",
|
2026-10-05 17:32:06 +02:00
|
|
|
legacy: "إرث شارب",
|
2026-09-11 02:46:56 +02:00
|
|
|
whatWeDo: "ماذا نفعل",
|
|
|
|
|
activities: "الأنشطة والمبادرات",
|
|
|
|
|
engagementAndOpportunities: "المشاركة والفرص",
|
|
|
|
|
events: "تقويم الفعاليات",
|
|
|
|
|
applications: "التطبيقات والفرص",
|
|
|
|
|
news: "الأخبار والمستجدات",
|
|
|
|
|
contact: "اتصل بنا",
|
|
|
|
|
knowledgeAndImpact: "المعرفة والتأثير",
|
|
|
|
|
resources: "الموارد والمنشورات",
|
|
|
|
|
knowledgeHub: "مركز المعرفة",
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* The default navigation for a locale, with every href already prefixed.
|
|
|
|
|
* Returns a fresh array so a caller may safely sort or splice it.
|
|
|
|
|
*/
|
|
|
|
|
export function getDefaultNavItems(locale: Locale): NavItem[] {
|
|
|
|
|
const label = LABELS[locale];
|
|
|
|
|
const href = (key: NavPathKey) => buildLocalizedHref(NAV_PATHS[key], locale);
|
|
|
|
|
|
|
|
|
|
return [
|
|
|
|
|
{ id: "home", label: label.home, href: href("home") },
|
|
|
|
|
{
|
|
|
|
|
id: "about-and-strategy",
|
|
|
|
|
label: label.aboutAndStrategy,
|
|
|
|
|
children: [
|
|
|
|
|
{ id: "about", label: label.about, href: href("about") },
|
2026-10-05 17:32:06 +02:00
|
|
|
{ id: "legacy", label: label.legacy, href: href("legacy") },
|
2026-09-11 02:46:56 +02:00
|
|
|
{ id: "what-we-do", label: label.whatWeDo, href: href("whatWeDo") },
|
|
|
|
|
{ id: "activities", label: label.activities, href: href("activities") },
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: "engagement-and-opportunities",
|
|
|
|
|
label: label.engagementAndOpportunities,
|
|
|
|
|
children: [
|
|
|
|
|
{ id: "events", label: label.events, href: href("events") },
|
|
|
|
|
{ id: "applications", label: label.applications, href: href("applications") },
|
|
|
|
|
{ id: "news", label: label.news, href: href("news") },
|
|
|
|
|
{ id: "contact", label: label.contact, href: href("contact") },
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: "knowledge-and-impact",
|
|
|
|
|
label: label.knowledgeAndImpact,
|
|
|
|
|
children: [
|
|
|
|
|
{ id: "resources", label: label.resources, href: href("resources") },
|
|
|
|
|
{ id: "knowledge-hub", label: label.knowledgeHub, href: href("knowledgeHub") },
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* EU visibility is mandatory on every page. "Funded by the European Union" is
|
|
|
|
|
* the prescribed wording; the Figma text layer reads "European nation", which
|
|
|
|
|
* is a typo in the design file and is corrected here.
|
|
|
|
|
*/
|
|
|
|
|
export const NAVIGATION_STRINGS: NavigationStringsByLocale = {
|
|
|
|
|
en: {
|
|
|
|
|
primaryNavLabel: "Main navigation",
|
|
|
|
|
openMenu: "Open menu",
|
|
|
|
|
closeMenu: "Close menu",
|
|
|
|
|
homeLinkLabel: "SHARP-ER home",
|
2026-09-16 20:32:56 +02:00
|
|
|
languageMenuLabel: "Language",
|
2026-09-11 02:46:56 +02:00
|
|
|
euStatement: "Funded by the European Union",
|
|
|
|
|
euEmblemAlt: "",
|
|
|
|
|
},
|
|
|
|
|
ar: {
|
|
|
|
|
primaryNavLabel: "التنقل الرئيسي",
|
|
|
|
|
openMenu: "فتح القائمة",
|
|
|
|
|
closeMenu: "إغلاق القائمة",
|
|
|
|
|
homeLinkLabel: "الصفحة الرئيسية لمشروع SHARP-ER",
|
2026-09-16 20:32:56 +02:00
|
|
|
languageMenuLabel: "اللغة",
|
2026-09-11 02:46:56 +02:00
|
|
|
euStatement: "بتمويل من الاتحاد الأوروبي",
|
|
|
|
|
euEmblemAlt: "",
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export function getNavigationStrings(
|
|
|
|
|
locale: Locale,
|
|
|
|
|
overrides?: Partial<NavigationStrings>,
|
|
|
|
|
): NavigationStrings {
|
|
|
|
|
return { ...NAVIGATION_STRINGS[locale], ...overrides };
|
|
|
|
|
}
|