Replace the Vision 2030 logo with the Ehsan logo in the header and reorder images in the footer to display Ehsan before SDAIA. Remove unused translation keys related to Vision 2030.
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1fa9329f-0cec-4a2f-80e8-e26dbae3142e
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: d32d0773-a583-4285-b18d-26c864e9703f
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/4d696b13-86f2-4c9d-be0d-95b293430047/1fa9329f-0cec-4a2f-80e8-e26dbae3142e/F8L3gIv
Replit-Helium-Checkpoint-Created: true
Modify AppLayout.tsx to position logos on the left and remove the copyright text. Update translations.ts to remove the unused 'rights' key from both English and Arabic translations.
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 1fa9329f-0cec-4a2f-80e8-e26dbae3142e
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: e0e5f5a2-de1f-4a4a-bb11-a0274e8baf97
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/4d696b13-86f2-4c9d-be0d-95b293430047/1fa9329f-0cec-4a2f-80e8-e26dbae3142e/b8dNQRE
Replit-Helium-Checkpoint-Created: true
The home page previously showed the 10-step "خطوات إقفال دورة التبرع"
workflow section. The user asked to replace it with an "إحسانكم لعام 2026"
impact statistics section matching the attached reference.
Changes:
- artifacts/ehsan-poc/src/pages/home.tsx: removed the 10-step workflow
section and added an "Impact Statistics" section in its place — a centered
heading with a green Leaf accent, a subtitle, and three rounded white
shadowed stat cards (lucide icons HandHeart / Users / Wallet), each with a
large green value and a label. Responsive 3-up grid stacking on mobile.
- artifacts/ehsan-poc/src/lib/i18n/translations.ts: added a `home.stats`
group (title, subtitle, and the 3 value/label pairs) in both en and ar.
AR values: 85,4 مليون / 391,5 ألف / 3.113 مليار. EN mirrors with Million /
Thousand / Billion.
Notes:
- Static reference numbers used as display values (POC; no live data — per
task out-of-scope).
- No emojis; lucide icons consistent with the rest of the app. The old
t.home.workflowTitle and t.workflow.* keys are left in place (harmless
shared strings) but are no longer used by the home page.
Verified: tsc --noEmit clean; e2e confirmed AR + EN rendering, old workflow
section removed, no console errors.
The browser tab previously showed a generic placeholder favicon and the
English title "EHSAN Closed Donation Loop". Per the reference, the tab now
shows the EHSAN logo mark and an Arabic platform title.
Changes:
- Favicon: copied the existing EHSAN logo (src/assets/ehsan-logo.png) to
public/favicon.png and pointed index.html at %BASE_URL%favicon.png
(base-path safe; verified it serves 200 image/png).
- Static head: index.html <title> and OG/Twitter titles + description now
use the Arabic platform name "منصة إحسان".
- Per-page titles: added a DocumentTitle component
(src/hooks/useDocumentTitle.ts) rendered in the Router that sets
document.title to "<page name> - <platform>" based on the current wouter
path and active language, reading from a new translations.meta section
(AR + EN). Home reads "الصفحة الرئيسية - منصة إحسان"; switches with language.
Approach note: titles are centralized in the router rather than edited into
each page file, keeping it DRY while covering all main routes.
Verified: tsc clean; e2e confirmed titles on /, /opportunities, /cart and
English fallback ("Home - EHSAN Platform"), plus favicon load.
Task #16: The last two top-nav items were static, non-clickable text.
Turned both into real bilingual (AR/EN) routed pages, completing the
main navigation of the EHSAN POC.
Changes:
- translations.ts: added parallel `waqf` and `baraem` sections to both
`en` and `ar` (intro, contribution ways, endowment fields/features for
waqf; goals, features, audience for baraem). Content mirrors ehsan.sa
section structure; no emojis.
- New pages src/pages/waqf.tsx and src/pages/baraem.tsx, built on the
about.tsx pattern: green intro panel, Reveal scroll-in, Card grids,
RTL-correct using logical classes and the t.* system.
- App.tsx: registered /waqf and /baraem routes.
- Header.tsx: replaced the two static <span> items with active-aware
<Link>s in desktop nav, and added matching entries to the mobile nav.
Verified: tsc --noEmit passes; both pages render correctly in Arabic
RTL with active nav highlighting (screenshots checked).
Replit-Task-Id: 40da5508-41c9-4ccd-aba4-2ea80183a97b
Built a real donation cart matching ehsan.sa:
- CartContext provider (localStorage-persisted, defensive parsing) wired into App.tsx
- OpportunityCard: cart icon now adds the case with its typed amount and swaps the
action row to an added state («مضاف لسلة تبرعاتك» + «إزالة»)
- Header cart button: live count badge + navigates to /cart
- New /cart page + route: breadcrumb, item list (delete icon, category, name,
editable «قيمة المبلغ» amount, image+progress%), summary panel «الإجمالي» +
green «للمتابعة للدفع», decorative leaf SVG background, empty state
- translations.ts: parallel AR+EN `cart` section
- donate.tsx: removes the donated case from the cart on successful donation
(cart reconciliation), preventing stale added-state/badge
Notes/deviations:
- Checkout handoff routes the first cart item into the existing single-case donate
flow (the POC backend has no multi-item payment). Reconciliation keeps remaining
items coherent. A true multi-item checkout backend was out of scope.
- Verified with passing e2e test (add → badge → cart page → remove → empty) and
clean tsc; architect review addressed (reconciliation + defensive parsing).
Task #15: Make «عن إحسان» top-nav a real dropdown and build the About page.
- Header.tsx: converted static «عن إحسان» span into a dropdown trigger
replicating the existing services dropdown pattern (aboutOpen state,
trigger/panel refs, outside-click + Escape handling). Desktop panel and
mobile nav both list «من نحن» (/about) and «اللجان» (/about/committees).
- New pages/about.tsx: green intro panel («نبذة عن إحسان») + tab strip
(الرؤية والرسالة / الأهداف والركائز / المزايا والمجالات) for the Who-we-are
view, and a committee card grid for the Committees view. Section chosen via
/about/:section? route param; in-page toggle between the two. Reuses Reveal
for scroll-in.
- App.tsx: registered <Route path="/about/:section?" component={About} />.
- translations.ts: added full bilingual `about` section (AR + EN).
Fully bilingual via existing t.* system, RTL verified, no emojis.
tsc passes; screenshots confirm both views render correctly.
Task #9: Two header fixes on artifacts/ehsan-poc.
1. Nav active state no longer stuck on "فرص التبرع". Active page now gets
a moving green outline box (Home) matching the real ehsan.sa nav.
"فرص التبرع" stays a solid green CTA but only shows an active green ring
when on /opportunities. Applied consistent active styling across desktop
and mobile nav (Home, Opportunities, Request).
2. "خدماتنا" dropdown now lists the eight official services from the
reference image, each with a lucide icon: غراس (Sprout), الزكاة
(HandCoins), هدية (Gift), الأضاحي (Beef), الحملات (Megaphone), التبرع
الدوري (Repeat), التبرع بالرسائل (MessageSquare), تطهير الأسهم
(TrendingUp). Each routes to /opportunities (POC has no per-service
pages). Kept "طلب دعم" below a separator so desktop users retain access
to /request. Mobile menu mirrors the services list.
Added serviceItems i18n group (AR + EN) in translations.ts.
Files: src/components/layout/Header.tsx, src/lib/i18n/translations.ts.
Verified: tsc --noEmit clean; e2e UI test passed (active state moves,
dropdown shows all 8 items + request, routing works); console clean after
HMR-restart of the web workflow. No emojis.
Task #6: On artifacts/ehsan-poc home page, replaced the green text hero
with an auto-rotating, looping carousel of the four official ehsan.sa
banner images (Zakat, recurring/dawri, Waqf, gift) imported via @assets.
- Auto-advances every 5s, loops, and respects prefers-reduced-motion.
- Clickable dot indicators plus an accessible pause/play toggle (WCAG
2.2.2) on a translucent backdrop pill.
- Bottom gradient scrim keeps the white CTA + controls readable on all
four banner backgrounds.
- Removed the overlay heading, subtitle, and the "طلب دعم" button per the
user; kept the "تصفّح الفرص" CTA linking to /opportunities.
- Added common.pause / common.play i18n keys (AR + EN) for the toggle.
Banners use alt="" (decorative) since the functional CTA is separately
labeled. Verified with tsc --noEmit and home-page screenshots (RTL).
Follow-up tweaks so the EHSAN POC matches the official ehsan.sa site.
- Font: switched from Tajawal to IBM Plex Sans Arabic (index.html +
index.css). ehsan.sa's exact webfont couldn't be auto-detected (site
blocks scraping; no Wayback snapshot), so picked the closest official
match.
- Home hero: replaced the gray search-box hero with a full-bleed green
branded banner (badge, title, subtitle, two CTAs, decorative leaf SVGs),
matching ehsan.sa. Moved the search bar above the featured opportunities
grid (with an sr-only label for accessibility).
- Currency: replaced the legacy "﷼" glyph everywhere with the new official
Saudi Riyal symbol via a reusable <Riyal /> component that masks a
processed PNG (src/assets/riyal.png) colored with currentColor; marked
aria-hidden since the adjacent number conveys the value. Applied across
home stats, OpportunityCard, donate, track, admin, request.
- Added AR+EN translation keys heroBadge/heroBrowse.
Verified: tsc clean, no console errors, screenshots confirm hero, font, and
riyal symbol render correctly. Code review fixes applied (search label,
decorative riyal aria, removed unused key).
Reskin the EHSAN POC to match ehsan.sa and gate the admin area behind a
simple POC login.
- Official header: cropped EHSAN logo, nav (الرئيسية/الوقف/فرص التبرع/
خدماتنا dropdown→طلب دعم/عن إحسان/براعم إحسان), login/cart/search icons,
language toggle, mobile menu. Functional items link; rest are visual-only.
- Colors: green primary tuned + orange accent token added in index.css.
- Auth: AuthContext (localStorage, admin/admin) + login page; /admin and
/whatsapp-log now behind a Protected wrapper redirecting to /login.
- Redesigned OpportunityCard (photo, green progress bar with %, category
badge, تم جمع/المبلغ المتبقي columns, inline donate button + amount),
used on home and opportunities pages.
- Two-step donate page (التفاصيل → الدفع): step indicator, presets
100/50/10, custom amount (prefilled via ?amount=), "تبرع عن أهلك"
checkbox, donor form (phone min 10 for OpenClaw loop).
- 8 need-type card images added; needImages helper maps need→image.
- Seed: added published opportunities (req-012..017) with partial progress
to showcase cards; one kept near-full for an easy closed-loop demo.
Deviation (from code review): donate handler now ACCUMULATES collectedAmount
and clamps to target, validates finite/positive amount, and only advances to
the closed-loop pipeline when a case is fully funded (previously overwrote
and force-advanced — broke partial-progress cases). Donate buttons kept green
to match the reference; orange is an accent only.
- API routes: explicit return types on all Express handlers (fixes TS7030),
`beneficiaryName` now accepted and stored in /thank-you route per OpenAPI spec.
- Home page: added search bar (filters by case ID, description, name) +
Featured Opportunities section with live cards, progress bars, and Donate buttons.
- Opportunities page: added need-type filter pill bar (all 8 types + "All Types")
with active state highlighting; empty state respects selected filter.
- i18n: expanded translations with all previously hardcoded strings
(trackCase, notFound, noData, currentStep, search, searchPlaceholder,
featuredTitle, noResults, donate.caseSummary, donate.caseNotFound,
admin.noRequests, admin.needType, admin.amount, admin.track, admin.whatsapp,
track.caseInfo, track.rejected, track.currentStepLabel, track.submitThankYou,
thankYou.successNote, thankYou.beneficiaryMessageLabel,
whatsapp.donorPhone, whatsapp.beneficiaryMessage, whatsapp.noEntries,
opportunities.noOpportunities, opportunities.verified).
All pages now use t.* — zero hardcoded English UI strings.
- TypeScript: both frontend (tsc --noEmit) and API server build are clean.