Files
sharper.ly/apps/web/app/routes/_page-kit/copy.ts
T
IllusionandClaude Opus 5 8464c24fb1 Match the home page to Figma frame 253:4799
The page resembled the design but had drifted in every band. Ported it
section by section against the measured frame.

Hero (253:4800)
- Add the SHARP wordmark above the headline. The frame paints "SHARP"
  only, not the full SHARP-ER lockup the navigation carries, so this is
  the SHARP mark on its own, as vector (extracted from the brand
  guideline artwork) at its true 273px rather than an upscaled PNG.
- Drop the leading project name from the headline in both locales: the
  wordmark above now carries it, as the frame composes it.
- Stop the lead paragraph rendering by default. The frame's subheading
  node is hidden, but the code fell back to the site description, so a
  paragraph always appeared.
- Fallback CTAs become "Discover SHARP-ER" / "Explore Our Work", 24px
  apart. Both the CMS and fallback paths now render through one HeroCta,
  so an editor-authored secondary CTA gets the designed white treatment
  instead of the dark-surface outline.
- The picture loses its radius and gains the frame's two flat washes and
  wide band.

Figures band
- 253:4835 is hidden="true" in the frame, so the band and its "figures
  still being confirmed" placeholder no longer render. It appears only
  once the CMS supplies real numbers.

Launch (361:10853)
- Heading renders at Display/Small instead of Heading/H2. SectionHeader
  gains `size` since display-sm was reachable only via titleAs="h1".
- The three-paragraph story becomes the frame's single centred lead with
  its four bold runs, which needed a ProseRun copy shape - a flat string
  cannot carry emphasis.
- The captions were Card.Content links with images and action labels;
  the frame draws plain centred Heading/H2 text.
- Add the three-up photo strip that bleeds past the page and clips.
- Remove the funding line, which the frame does not draw in this band.
  EU visibility still stands via the nav badge and footer statement.

Partners (393:14754)
- Heading moves from centred to start-aligned, up to Display/Small.
- Tiles move to the sunken surface (they were lighter than the page; the
  design has them darker), lose their border, 8px -> 4px radius, padding
  on the inline start only, logo 48 -> 70px, name to Body/Large Bold.

Footer
- Black ground via a new --surface-footer token, a top rule, links up to
  Body/Large Bold 18/28 at 24px spacing, and column headings to
  Body/Small Bold on --text-tertiary.
- Keeps the real IA from ROUTE_SLUGS rather than frame 140:7814's
  labels, which name six pages that do not exist.

Tokens
- New tier-1 steps for values the design uses and the ramps lacked
  (--color-black-a20, --color-green-200-a12, --opacity-50) and tier-2
  --overlay-picture-shade / --overlay-picture-tint for the hero wash.

copy.ts now names the Figma frame as the source for the home strings.
The Arabic launch lead is rebuilt from the approved Arabic column to
carry the English frame's meaning and is marked (ar-draft) pending
client sign-off - the file has no Arabic home frame to work from.

Verified: typecheck and build green, no raw hex or tier-1 token in
components/routes, no physical-direction utility, 141 i18n keys at
parity, both locales rendered and checked for RTL mirroring.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-14 12:38:05 +02:00

416 lines
20 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.
/* ============================================================================
PAGE COPY - EN / AR
----------------------------------------------------------------------------
SOURCE
Home page Figma frame 253:4799 "Home-en" is the source of truth.
The headline (I253:4800;228:2609), the launch heading
(I361:10853;361:11147), the one-paragraph launch lead
with its four bold runs (I361:10853;349:8838) and the
three captions are transcribed from that frame, NOT
from docs/SHARPER Home Page .docx - the design condenses
the draft, and the draft itself is headed "Placeholder
text for design purposes - not final copy".
Everything else docs/SHARPER_Website_Draft_Section_EN_AR.docx
(sections 1, 2 and 9), which carries both columns, so
no string below is a machine translation of the other
except where a comment says so.
TRANSLATION STATUS
The Figma file has NO Arabic home frame - only the navigation and the
footer are drawn in Arabic - so the Arabic home strings marked (ar-draft)
are rebuilt from the approved Arabic column of the docx to carry the
English Figma meaning. They are NOT client-approved wording and should be
signed off before launch.
WHY IT LIVES IN THE CODE
This is page prose, not UI chrome, so it does not belong in the i18n
catalogue (which holds labels only). It is the FALLBACK: every field is
overridden by the matching Strapi field the moment an editor fills it in,
and the pages read `cms ?? draft`.
WHAT IS DELIBERATELY ABSENT
Figures. The draft marks every number "TBD" and says they must not be
published until confirmed, so there is no statistic anywhere in this file.
Figma hides the home page's figures band outright (frame 253:4835 is
hidden="true"), so the band renders only once the CMS `stats` component
supplies real numbers, and nothing stands in for it until then.
========================================================================= */
import type { Locale } from "~/i18n";
/** A title plus its description - a pillar, a workstream, a principle. */
export interface TitledCopy {
readonly title: string;
readonly description: string;
}
/** One consortium member and the role the draft assigns it. */
export interface ConsortiumCopy {
readonly name: string;
readonly role: string;
}
/**
* A run of prose that may carry emphasis. Figma sets four phrases of the launch
* lead in Bold on a lighter base run (349:8838), which a flat string cannot
* express - a plain string is the base weight, `{ em }` is the bold run.
*/
export type ProseRun = string | { readonly em: string };
export interface HomeCopy {
readonly heroHeadline: string;
readonly statsHeading: string;
readonly launchHeading: string;
/** One paragraph, as the design draws it - not the full three-part story. */
readonly launchLead: readonly ProseRun[];
readonly mechanismsHeading: string;
readonly mechanisms: readonly string[];
readonly partnersHeading: string;
readonly partnersEmpty: string;
}
export interface AboutCopy {
readonly heroHeadline: string;
readonly lead: string;
readonly body: string;
readonly consortiumHeading: string;
readonly consortium: readonly ConsortiumCopy[];
readonly pillarsHeading: string;
readonly pillars: readonly TitledCopy[];
readonly legacyHeading: string;
readonly legacyBody: string;
readonly legacyLinkLabel: string;
readonly fundingNote: string;
}
export interface WhatWeDoCopy {
readonly heroHeadline: string;
readonly lead: string;
readonly workstreamsHeading: string;
readonly workstreamsIntro: string;
readonly workstreams: readonly TitledCopy[];
readonly valuesLabel: string;
readonly values: readonly string[];
readonly principlesHeading: string;
readonly principles: string;
}
export interface ContactCopy {
readonly heroHeadline: string;
readonly lead: string;
readonly formHeading: string;
readonly formIntro: string;
readonly detailsHeading: string;
readonly generalEnquiries: string;
readonly websiteLabel: string;
readonly websiteHref: string;
readonly websiteText: string;
readonly contactPending: string;
readonly consortiumHeading: string;
readonly consortiumEmpty: string;
readonly sendAnother: string;
readonly errorSummaryTitle: string;
readonly errorTooLong: string;
readonly honeypotLabel: string;
readonly organisationHint: string;
}
export interface PageCopy {
readonly home: HomeCopy;
readonly about: AboutCopy;
readonly whatWeDo: WhatWeDoCopy;
readonly contact: ContactCopy;
}
/* ---------------------------------------------------------------------------
ENGLISH
------------------------------------------------------------------------ */
const EN: PageCopy = {
home: {
/* The frame's wordmark above the headline carries the project name, so
the headline itself does not repeat it (figma I253:4800;228:2609). */
heroHeadline: "Project Officially Launches in Libya",
statsHeading: "SHARP-ER in numbers",
launchHeading: "The Journey of SHARP-ER Launch",
launchLead: [
"The SHARP-ER project officially launched on ",
{ em: "Tuesday, June 30" },
", joining representatives from the ",
{ em: "European Union Delegation" },
", key ",
{ em: "Libyan Ministries" },
", and ",
{ em: "local civil society partners" },
". The event marked the launch of the project’s official website and the Call for Expression of Interest (EOI).",
],
mechanismsHeading: "What the launch set in motion",
mechanisms: [
"Building local capacity and skills",
"Fostering cross-sector partnerships",
"Supporting municipal and community-led initiatives",
],
partnersHeading: "Meet Our Partners",
partnersEmpty:
"Partner organisations will be listed here as they join the SHARP-ER network.",
},
about: {
heroHeadline: "Strengthening the Rule of Law, Together",
lead: "SHARP-ER (Shared Action on Rule of Law Progress – Exit Route) is a nationwide initiative supporting Libya’s civil society, local institutions, and communities in advancing justice, accountability, and good governance.",
body: "Running from December 2025 to December 2027, SHARP-ER is implemented by Acted, in consortium with United Efforts Consultancy (UEC) and Stichting Bureau Ensemble (SBE), and funded by the European Union. The project works nationwide across Libya, partnering with civil society organisations, municipalities, and community leaders to strengthen access to justice, build the capacity of civil society to hold institutions accountable, and improve local governance and service delivery.",
consortiumHeading: "The consortium",
consortium: [
{
name: "Acted",
role: "Lead implementing partner — overall project management and civil society sub-projects",
},
{
name: "United Efforts Consultancy (UEC)",
role: "Network strengthening, dialogue, and peer-learning",
},
{
name: "Stichting Bureau Ensemble (SBE)",
role: "Research, perception data, and knowledge publications",
},
],
pillarsHeading: "Where we focus",
pillars: [
{
title: "Strengthening Rule of Law",
description:
"Supporting local institutions to improve access to justice and transparency",
},
{
title: "Empowering Civil Society",
description:
"Building the capacity of CSOs to strengthen their role in oversight and accountability",
},
{
title: "Supporting Local Governance",
description:
"Enhancing collaboration between municipalities and local actors to improve service delivery",
},
],
legacyHeading: "Building on SHARP I and II",
legacyBody:
"SHARP-ER builds on the foundation of SHARP I and II (2019–2024), carrying its network of civil society partners and its dialogue practice into a new phase focused on sustainability and exit.",
legacyLinkLabel: "Read about the SHARP legacy",
fundingNote: "Funded by the European Union.",
},
whatWeDo: {
heroHeadline: "A Participatory Approach to Justice and Governance",
lead: "We work directly with civil society, municipalities, and communities — not around them.",
workstreamsHeading: "Our areas of work",
workstreamsIntro: "SHARP-ER is organised around four connected areas of work:",
workstreams: [
{
title: "Capacity Building",
description:
"Training civil society organisations and local actors on governance, justice, and management, and equipping the SHARP network with peer-to-peer learning.",
},
{
title: "Institutional Support",
description:
"Strengthening the systems, procedures, and dialogue channels that connect local institutions with the people they serve.",
},
{
title: "Community Initiatives",
description:
"Funding and supporting CSO-led sub-projects, Policy-to-Rights (P2R) projects, and human-security initiatives designed and driven by local actors.",
},
{
title: "Dialogue and Coordination",
description:
"Running SUQ (Search, Understand, Question) dialogues and Civil Society Law Sessions that bring civic and government actors to the same table.",
},
],
valuesLabel: "What guides us",
values: [
"Dialogue",
"Community Leadership",
"Learning",
"Inclusion",
"Responsibility & Accountability",
],
principlesHeading: "How we work",
principles:
"Our approach rests on four principles: working with local actors, promoting sustainable — not one-off — solutions, connecting civil society with institutions, and supporting gradual, realistic institutional reform.",
},
contact: {
heroHeadline: "Get in Touch",
lead: "Questions about SHARP-ER, a partnership, or a specific activity? Reach out.",
formHeading: "Send us a message",
formIntro:
"Fill in the form and the SHARP-ER team will come back to you by email.",
detailsHeading: "Contact details",
generalEnquiries: "General enquiries",
websiteLabel: "Website",
websiteHref: "https://sharper.ly",
websiteText: "sharper.ly",
contactPending:
"The project’s general enquiries address will be published here once it is confirmed. In the meantime, use the form and your message will reach the team.",
consortiumHeading: "Consortium contacts",
consortiumEmpty:
"Contact details for Acted Libya, United Efforts Consultancy and Stichting Bureau Ensemble will be published here once they are confirmed.",
sendAnother: "Send another message",
errorSummaryTitle: "Please check the form",
errorTooLong: "This answer is too long.",
honeypotLabel: "Leave this field empty",
organisationHint: "The organisation you are writing on behalf of, if any.",
},
};
/* ---------------------------------------------------------------------------
ARABIC (MSA)
The prose below is the Arabic column of the same two documents, verbatim.
The few strings the documents do not provide - section headings such as
"شركاؤنا", and the three launch captions, which exist only in the English
Figma frame - are translated from the approved English and stay inside the
vocabulary the Arabic draft already uses.
------------------------------------------------------------------------ */
const AR: PageCopy = {
home: {
/* (ar-draft) matches the English frame: the wordmark names the project. */
heroHeadline: "انطلاق المشروع رسميًا في ليبيا",
statsHeading: "SHARP-ER بالأرقام",
launchHeading: "مسيرة إطلاق مشروع SHARP-ER",
launchLead: [
"انطلقت رسميًا فعاليات مشروع SHARP-ER يوم ",
{ em: "الثلاثاء 30 يونيو" },
"، بمشاركة ممثلين عن ",
{ em: "بعثة الاتحاد الأوروبي" },
"، وعدد من ",
{ em: "الوزارات الليبية" },
"، إلى جانب ",
{ em: "شركاء المجتمع المدني المحليين" },
". وشهد الحدث إطلاق الموقع الإلكتروني الرسمي للمشروع والدعوة للتعبير عن الاهتمام (EOI).",
],
mechanismsHeading: "ما الذي أطلقه هذا الحدث",
mechanisms: [
"بناء القدرات والمهارات المحلية",
"تعزيز الشراكات بين القطاعات",
"دعم المبادرات البلدية والمبادرات المجتمعية",
],
partnersHeading: "تعرّف على شركائنا",
partnersEmpty:
"ستُدرج المنظمات الشريكة هنا فور انضمامها إلى شبكة SHARP-ER.",
},
about: {
heroHeadline: "نحو تعزيز سيادة القانون، معًا",
lead: "SHARP-ER (العمل المشترك لتعزيز سيادة القانون – مسار الخروج) هو مبادرة وطنية تدعم المجتمع المدني والمؤسسات المحلية والمجتمعات الليبية في تعزيز العدالة والمساءلة والحوكمة الرشيدة.",
body: "يمتد المشروع من ديسمبر 2025 إلى ديسمبر 2027، ويُنفَّذ من قِبل منظمة Acted بالشراكة مع United Efforts Consultancy (UEC) وStichting Bureau Ensemble (SBE)، وبتمويل من الاتحاد الأوروبي. يعمل المشروع على مستوى ليبيا بأكملها، بالتعاون مع منظمات المجتمع المدني والبلديات والقيادات المجتمعية، من أجل تحسين الوصول إلى العدالة، وبناء قدرات المجتمع المدني على مساءلة المؤسسات، وتحسين الحوكمة المحلية وتقديم الخدمات.",
consortiumHeading: "الائتلاف المنفّذ",
consortium: [
{
name: "Acted",
role: "الشريك المنفّذ الرئيسي — الإدارة العامة للمشروع والمشاريع الفرعية لمنظمات المجتمع المدني",
},
{
name: "United Efforts Consultancy (UEC)",
role: "تعزيز الشبكة، والحوار، والتعلّم بين الأقران",
},
{
name: "Stichting Bureau Ensemble (SBE)",
role: "البحث، وبيانات الاستطلاع، والمنشورات المعرفية",
},
],
pillarsHeading: "محاور تركيزنا",
pillars: [
{
title: "تعزيز سيادة القانون",
description:
"دعم المؤسسات المحلية لتحسين الوصول إلى العدالة وتعزيز الشفافية",
},
{
title: "تمكين المجتمع المدني",
description:
"بناء قدرات منظمات المجتمع المدني لتعزيز دورها في الرقابة والمساءلة",
},
{
title: "دعم الحوكمة المحلية",
description:
"تعزيز التعاون بين البلديات والجهات الفاعلة المحلية لتحسين تقديم الخدمات",
},
],
legacyHeading: "استكمالًا لمشروعي SHARP الأول والثاني",
legacyBody:
"يبني SHARP-ER على الأساس الذي أرساه مشروعا SHARP الأول والثاني (2019–2024)، حاملًا معه شبكة الشركاء من المجتمع المدني وممارسة الحوار إلى مرحلة جديدة تركّز على الاستدامة ومسار الخروج.",
legacyLinkLabel: "اطّلع على إرث مشروع SHARP",
fundingNote: "بتمويل من الاتحاد الأوروبي.",
},
whatWeDo: {
heroHeadline: "نهج تشاركي في العدالة والحوكمة",
lead: "نعمل مباشرة مع المجتمع المدني والبلديات والمجتمعات المحلية، لا من حولها.",
workstreamsHeading: "محاور عملنا",
workstreamsIntro: "يقوم عمل SHARP-ER على أربعة محاور مترابطة:",
workstreams: [
{
title: "بناء القدرات",
description:
"تدريب منظمات المجتمع المدني والجهات المحلية على الحوكمة والعدالة والإدارة، وتزويد شبكة SHARP بالتعلّم بين الأقران.",
},
{
title: "الدعم المؤسسي",
description:
"تعزيز الأنظمة والإجراءات وقنوات الحوار التي تربط المؤسسات المحلية بالمجتمعات التي تخدمها.",
},
{
title: "المبادرات المجتمعية",
description:
"تمويل ودعم مشاريع فرعية تقودها منظمات المجتمع المدني، ومشاريع “من السياسة إلى الحقوق” (P2R)، ومبادرات الأمن البشري التي يصممها الفاعلون المحليون ويقودونها.",
},
{
title: "الحوار والتنسيق",
description:
"تنظيم حوارات SUQ (ابحث، افهم، اسأل) وجلسات قانون المجتمع المدني التي تجمع الفاعلين المدنيين والحكوميين حول طاولة واحدة.",
},
],
valuesLabel: "ما يوجّه عملنا",
values: [
"الحوار",
"القيادة المجتمعية",
"التعلّم",
"الشمول",
"المساءلة والمسؤولية",
],
principlesHeading: "كيف نعمل",
principles:
"يسترشد عملنا بأربعة مبادئ: العمل مع الفاعلين المحليين، وتعزيز الحلول المستدامة لا الآنية، والربط بين المجتمع المدني والمؤسسات، ودعم إصلاح مؤسسي تدريجي وواقعي.",
},
contact: {
heroHeadline: "تواصل معنا",
lead: "لديك استفسار حول SHARP-ER، أو شراكة محتملة، أو نشاط معيّن؟ راسلنا.",
formHeading: "أرسل لنا رسالة",
formIntro: "املأ النموذج وسيعاود فريق SHARP-ER التواصل معك عبر البريد الإلكتروني.",
detailsHeading: "بيانات التواصل",
generalEnquiries: "للاستفسارات العامة",
websiteLabel: "الموقع الإلكتروني",
websiteHref: "https://sharper.ly",
websiteText: "sharper.ly",
contactPending:
"سيُنشر هنا البريد الإلكتروني العام للمشروع فور تأكيده. وفي غضون ذلك، استخدم النموذج وستصل رسالتك إلى الفريق.",
consortiumHeading: "جهات اتصال الائتلاف",
consortiumEmpty:
"ستُنشر هنا بيانات التواصل الخاصة بـ Acted ليبيا، وUnited Efforts Consultancy، وStichting Bureau Ensemble فور تأكيدها.",
sendAnother: "إرسال رسالة أخرى",
errorSummaryTitle: "يرجى مراجعة النموذج",
errorTooLong: "هذه الإجابة طويلة جدًا.",
honeypotLabel: "اترك هذا الحقل فارغًا",
organisationHint: "المنظمة التي تراسلنا نيابةً عنها، إن وُجدت.",
},
};
const COPY: Readonly<Record<Locale, PageCopy>> = { en: EN, ar: AR };
/** The draft copy for a locale. Always defined for both published locales. */
export function pageCopy(locale: Locale): PageCopy {
return COPY[locale] ?? EN;
}