Merge remote-tracking branch 'origin/main'
This commit is contained in:
@@ -1,311 +1,60 @@
|
||||
# README
|
||||
# NGO Website — ODOO4projects
|
||||
|
||||
Important: Update this README with every commit.
|
||||
**Project:** NGO marketing homepage and blog
|
||||
**URL:** [ngo.odoo4projects.com](https://ngo.odoo4projects.com)
|
||||
**Stack:** Static HTML · Tailwind CSS · Vanilla JS
|
||||
|
||||
Repository purpose
|
||||
- Project: NGO public website using Odoo-focused messaging and Odoo4Projects hosting service.
|
||||
- Goal: Fast, accessible marketing homepage and blog that ranks well, highlights transparency and minimal admin for NGOs, and promotes donor acquisition and retention.
|
||||
---
|
||||
|
||||
Repository rules
|
||||
- Blog posts are saved in blog.json (do not create separate backup files).
|
||||
- Do not create backups in the repo.
|
||||
## Repository Rules
|
||||
|
||||
CI:
|
||||
- CI: run linting, Tailwind build, accessibility checks, basic SEO checks, performance budget (build must verify page size and critical render time). (Keep CI config outside this README; note these checks are required.)
|
||||
- Blog posts live in `blog.json` — do not create separate backup files.
|
||||
- No backup files in the repo.
|
||||
- Update this README with every commit.
|
||||
|
||||
Main Page Blocks (ordered)
|
||||
1. Hero
|
||||
- Headline: Transparent
|
||||
giving.
|
||||
Minimal
|
||||
admin.
|
||||
Big
|
||||
impact.
|
||||
- Subheadline: Manage
|
||||
donors,
|
||||
communicate
|
||||
transparently,
|
||||
and
|
||||
focus
|
||||
on
|
||||
impact
|
||||
—
|
||||
Odoo
|
||||
made
|
||||
simple
|
||||
for
|
||||
NGOs.
|
||||
- Primary CTA: Donate
|
||||
/
|
||||
Support and secondary CTA: See
|
||||
donor
|
||||
management
|
||||
2. Trust & Numbers bar
|
||||
- Donor count, funds raised, projects completed, partner logos
|
||||
3. How it works (3 steps)
|
||||
- Step 1: Set up in minutes (little admin)
|
||||
- Step 2: Track donations & communicate (donor communication)
|
||||
- Step 3: Report impact (transparent reporting)
|
||||
4. Features (highlighted cards)
|
||||
- Donor Management (CRM + gift history)
|
||||
- Easy Communication (email, receipts, automated updates)
|
||||
- Transparent Reporting (dashboards, exports for donors)
|
||||
- Low Admin (templates, automation, minimal data entry)
|
||||
- Security & Compliance
|
||||
5. Impact Stories / Testimonials
|
||||
- Short stories with photos and metrics
|
||||
6. Blog highlights
|
||||
- Link to blog page, featured posts
|
||||
7. Call to Action block
|
||||
- Repeat primary CTA with trust indicators
|
||||
8. Footer
|
||||
- Contact, legal, social links, languages
|
||||
---
|
||||
|
||||
Languages:
|
||||
- Default: English
|
||||
- Additional: Spanish (es), French (fr) — prepare for translation-ready content
|
||||
## Page Structure
|
||||
|
||||
Technology Stack:
|
||||
- Tailwind CSS. Static-first, optimized HTML, semantic markup.
|
||||
| # | Block | Purpose |
|
||||
|---|-------|---------|
|
||||
| 1 | **Hero** | Headline, subheadline, free-trial CTA, key stats |
|
||||
| 2 | **Hot NGO Topics** | Three focused topic cards (transparency, communications, fundraising) |
|
||||
| 3 | **Blog** | Latest articles loaded dynamically from `blog.json` |
|
||||
| 4 | **Sign Up — Free Trial** | Email signup form, 4-week free trial, no credit card |
|
||||
| 5 | **Have a Meeting** | 30-minute consultation booking via Google Calendar |
|
||||
|
||||
SEO & Performance goals:
|
||||
- Fast page that ranks well: semantic HTML, structured data (schema.org), descriptive meta titles and descriptions, sitemap, robots.txt, optimized images (modern formats), critical CSS inlined, defer non-critical JS.
|
||||
- Focus keywords: NGO donor management, transparent donations, Odoo for NGOs, donor communication, minimal admin for charities
|
||||
---
|
||||
|
||||
Suggested meta and headings (to include on homepage):
|
||||
- Meta title (homepage): Odoo
|
||||
for
|
||||
NGOs
|
||||
—
|
||||
Transparent
|
||||
donor
|
||||
management
|
||||
with
|
||||
minimal
|
||||
admin
|
||||
- Meta description: Manage
|
||||
donors,
|
||||
communicate
|
||||
transparently,
|
||||
and
|
||||
report
|
||||
impact
|
||||
with
|
||||
minimal
|
||||
admin.
|
||||
Odoo
|
||||
solutions
|
||||
tailored
|
||||
for
|
||||
NGOs
|
||||
—
|
||||
fast,
|
||||
secure,
|
||||
and
|
||||
donor-friendly.
|
||||
- H1: Transparent
|
||||
donor
|
||||
management
|
||||
with
|
||||
minimal
|
||||
admin
|
||||
- H2 examples: How
|
||||
Odoo
|
||||
simplifies
|
||||
donor
|
||||
management, Features:
|
||||
Donor
|
||||
CRM,
|
||||
automated
|
||||
communication,
|
||||
impact
|
||||
reporting, Stories
|
||||
from
|
||||
our
|
||||
partners
|
||||
## CI Checks (required on every push)
|
||||
|
||||
Suggested CTAs (text variations):
|
||||
- Primary: Support
|
||||
now / Donate
|
||||
- Secondary: See
|
||||
donor
|
||||
management / Schedule
|
||||
a
|
||||
demo
|
||||
- Micro CTA: Download
|
||||
impact
|
||||
report
|
||||
- **HTML lint** — valid markup, no broken anchors
|
||||
- **JS lint** — no errors, no `console.error` left in production paths
|
||||
- **Tailwind build** — `npx tailwindcss -i ./src/input.css -o ./assets/site.css --minify` must exit 0
|
||||
- **Corporate design compliance:**
|
||||
- No CSS gradients — `gradient`, `bg-*-gradient`, `linear-gradient`, `radial-gradient` are forbidden
|
||||
- No CSS animations or keyframes — `animate-*`, `@keyframes`, transform-based `hover:translate-*` are forbidden
|
||||
- No blur or glassmorphism effects — `backdrop-blur`, `backdrop-filter` are forbidden
|
||||
- Colors must use the approved brand palette only: `brand-ink · brand-primary · brand-accent · brand-sunrise · brand-emerald · brand-snow · brand-smoke`
|
||||
- Images must be served from `odoo4projects.com`, `images.unsplash.com`, or local `assets/`
|
||||
- **Accessibility** — heading hierarchy (one `<h1>` per page), `alt` on all images, sufficient contrast (WCAG AA)
|
||||
- **Performance budget** — total page weight ≤ 200 KB (excluding cached fonts); critical render path ≤ 1 s on fast 3G
|
||||
- **SEO** — `<title>`, `<meta name="description">`, `<h1>`, canonical `<link>`, and JSON-LD structured data must be present
|
||||
|
||||
Content & SEO guidance (short):
|
||||
- Use clear, trust-building language. Highlight transparency, automated communications, and low admin burden.
|
||||
- Include one donor-focused success story on the homepage and link to deeper case studies in the blog.
|
||||
- Use structured snippets for stats (JSON-LD) for trust signals.
|
||||
---
|
||||
|
||||
Initial Blog Posts (to be saved into blog.json):
|
||||
- Filename: blog.json (root)
|
||||
- Initial entry (one object in the posts array):
|
||||
{
|
||||
id: how-odoo-makes-donor-management-easy,
|
||||
title: How
|
||||
Odoo
|
||||
makes
|
||||
donor
|
||||
management
|
||||
easy,
|
||||
date: 2026-03-24,
|
||||
author: Odoo4Projects
|
||||
-
|
||||
NGO
|
||||
team,
|
||||
categories: [donor-management, transparency, productivity],
|
||||
tags: [Odoo, donor
|
||||
communication, automation, minimal
|
||||
admin],
|
||||
excerpt: Learn
|
||||
how
|
||||
Odoo
|
||||
reduces
|
||||
administrative
|
||||
effort,
|
||||
improves
|
||||
donor
|
||||
communication,
|
||||
and
|
||||
increases
|
||||
transparency
|
||||
for
|
||||
NGOs.,
|
||||
content: Odoo
|
||||
makes
|
||||
donor
|
||||
management
|
||||
easy
|
||||
by
|
||||
centralizing
|
||||
donor
|
||||
data,
|
||||
automating
|
||||
receipts
|
||||
and
|
||||
updates,
|
||||
and
|
||||
generating
|
||||
transparent
|
||||
reports
|
||||
donors
|
||||
trust.
|
||||
With
|
||||
minimal
|
||||
admin
|
||||
required,
|
||||
NGOs
|
||||
can
|
||||
set
|
||||
up
|
||||
templates,
|
||||
schedule
|
||||
automated
|
||||
communications,
|
||||
and
|
||||
track
|
||||
gifts
|
||||
and
|
||||
commitments
|
||||
in
|
||||
one
|
||||
place.
|
||||
Donors
|
||||
receive
|
||||
timely
|
||||
receipts
|
||||
and
|
||||
impact
|
||||
updates
|
||||
that
|
||||
strengthen
|
||||
trust
|
||||
and
|
||||
retention.
|
||||
Odoo’s
|
||||
dashboards
|
||||
provide
|
||||
simple,
|
||||
exportable
|
||||
reports
|
||||
for
|
||||
accountability.
|
||||
The
|
||||
result:
|
||||
less
|
||||
time
|
||||
on
|
||||
admin,
|
||||
more
|
||||
time
|
||||
on
|
||||
mission.,
|
||||
featured: true
|
||||
}
|
||||
## Languages
|
||||
|
||||
Social media snippets (short, use for cards):
|
||||
- Tweet/LinkedIn (short): Reduce
|
||||
admin,
|
||||
increase
|
||||
trust.
|
||||
See
|
||||
how
|
||||
Odoo
|
||||
helps
|
||||
NGOs
|
||||
manage
|
||||
donors
|
||||
and
|
||||
report
|
||||
impact
|
||||
with
|
||||
transparency.
|
||||
Read:
|
||||
/blog/how-odoo-makes-donor-management-easy
|
||||
- Facebook/Instagram (longer): Spend
|
||||
less
|
||||
time
|
||||
on
|
||||
paperwork
|
||||
and
|
||||
more
|
||||
on
|
||||
impact.
|
||||
Odoo
|
||||
helps
|
||||
NGOs
|
||||
automate
|
||||
donor
|
||||
receipts,
|
||||
keep
|
||||
supporters
|
||||
updated,
|
||||
and
|
||||
produce
|
||||
clear
|
||||
impact
|
||||
reports
|
||||
—
|
||||
all
|
||||
with
|
||||
minimal
|
||||
admin.
|
||||
Learn
|
||||
more:
|
||||
/blog/how-odoo-makes-donor-management-easy
|
||||
| Code | Language |
|
||||
|------|----------|
|
||||
| `en` | English (default) |
|
||||
| `es` | Español |
|
||||
| `de` | Deutsch |
|
||||
|
||||
Notes for the designer (content only):
|
||||
- Keep layout simple and fast; prefer server-side rendered HTML where possible for SEO.
|
||||
- Provide components/placeholder content for each Main Page Block above.
|
||||
- Prefill the blog.json with the initial blog entry above.
|
||||
- Add README.md with this content and commit to repo root. Ensure README is updated on every future commit.
|
||||
All UI strings are managed via the inline `translations` object in `index.html`.
|
||||
|
||||
Deliverables (create and commit):
|
||||
1. README.md (prefilled as above)
|
||||
2. blog.json (prefilled with the initial entry)
|
||||
---
|
||||
|
||||
If you need any copy adjustments (tone, length, languages), ask and we will provide final texts. Thank you.
|
||||
## Focus Keywords
|
||||
|
||||
`NGO donor management` · `transparent donations` · `Odoo for NGOs` · `donor communication` · `minimal admin for charities`
|
||||
|
||||
@@ -1,555 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" class="scroll-smooth">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>🐻 NGO ERP Landingpage | ODOO4projects</title>
|
||||
<meta name="description" content="Purpose-built ERP platform for NGOs. Centralize programs, automate donor and grant reporting, and launch in weeks with ODOO4projects." />
|
||||
<meta name="keywords" content="NGO ERP system, nonprofit management software, ERP for NGOs, NGO operations platform, ODOO for nonprofits" />
|
||||
<link rel="icon" href="https://odoo4projects.com/web/image/website/1/favicon?unique=725c3af" />
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||
<link rel="preload" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" as="style" onload="this.onload=null;this.rel='stylesheet'" />
|
||||
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"></noscript>
|
||||
<link rel="preload" href="assets/site.css" as="style" onload="this.onload=null;this.rel='stylesheet'" />
|
||||
<noscript><link rel="stylesheet" href="assets/site.css"></noscript>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "WebPage",
|
||||
"name": "NGO ERP Landing",
|
||||
"about": "ERP for NGOs",
|
||||
"publisher": {
|
||||
"@type": "Organization",
|
||||
"name": "ODOO4projects",
|
||||
"logo": "https://odoo4projects.com/web/image/website/1/logo?unique=1be96c3"
|
||||
},
|
||||
"mainEntity": {
|
||||
"@type": "SoftwareApplication",
|
||||
"name": "ODOO4projects NGO ERP",
|
||||
"applicationCategory": "BusinessApplication",
|
||||
"operatingSystem": "Cloud",
|
||||
"offers": {
|
||||
"@type": "Offer",
|
||||
"price": "0",
|
||||
"priceCurrency": "USD",
|
||||
"description": "4-week free trial of NGO ERP workspace"
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<script defer data-domain="ngo.odoo4projects.com" src="https://plausible.odoo4projects.com/js/script.tagged-events.js"></script>
|
||||
<script>window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) }</script>
|
||||
|
||||
<style id="emoji-style">
|
||||
/* Emoji styling to match heading font and spacing */
|
||||
.emoji{font-family:inherit;font-size:1em;vertical-align:middle;margin-right:0.5rem;display:inline-block}
|
||||
</style>
|
||||
</head>
|
||||
<body class="bg-brand-snow text-brand-ink">
|
||||
<header class="bg-hero-gradient text-white">
|
||||
<div class="max-w-6xl mx-auto px-6 py-6 flex flex-wrap items-center justify-between gap-4">
|
||||
<div class="flex items-center gap-3">
|
||||
<img src="https://odoo4projects.com/web/image/website/1/logo?unique=1be96c3" alt="ODOO4projects logo" class="h-10 w-auto" />
|
||||
<span class="uppercase tracking-[0.3em] text-xs text-brand-smoke" data-i18n="hero-badge"></span>
|
||||
</div>
|
||||
<nav class="flex flex-wrap items-center gap-6 text-sm">
|
||||
<a href="#blog" class="hover:text-brand-sunrise transition" data-i18n="nav-resources"></a>
|
||||
<a href="#trial" class="hover:text-brand-sunrise transition" data-i18n="nav-trial"></a>
|
||||
</nav>
|
||||
<div class="flex items-center gap-3">
|
||||
<label for="lang-selector" class="sr-only">Language</label>
|
||||
<select id="lang-selector" class="bg-white/10 border border-white/30 text-sm rounded-full px-3 py-1.5 focus:outline-none focus:ring-2 focus:ring-brand-sunrise/70">
|
||||
<option value="en">English</option>
|
||||
<option value="es">Español</option>
|
||||
<option value="de">Deutsch</option>
|
||||
</select>
|
||||
<a href="https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ3DDbaiHFlhNhWySszAQoPXE_H73QLqYT3w7H9IYWC76RA_TgNIhLESjb4N7ep_D2D_OyW9q4-c" target="_blank" rel="noopener" class="px-5 py-2 bg-brand-sunrise text-brand-ink font-semibold rounded-full text-sm shadow-brand hover:translate-y-0.5 transition plausible-event-name=meeting" data-i18n="cta-meeting"></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="max-w-6xl mx-auto px-6 py-16 grid md:grid-cols-2 gap-12 items-center">
|
||||
<div>
|
||||
<p class="text-brand-sunrise font-semibold mb-4" data-i18n="hero-pill"></p>
|
||||
<h1 class="text-4xl md:text-5xl font-semibold leading-tight mb-6"><span class=\"emoji\" role=\"img\" aria-label=\"bear\">🐻</span> <span data-i18n=\"hero-headline\"></span></h1>
|
||||
<p class="text-lg text-white/80 mb-8" data-i18n="hero-subheadline"></p>
|
||||
<div class="flex flex-wrap gap-4">
|
||||
<a href="#trial" class="px-6 py-3 bg-brand-accent hover:bg-brand-sunrise text-brand-ink font-semibold rounded-full transition" data-i18n="cta-trial" data-event="cta:hero-trial"></a>
|
||||
</div>
|
||||
<div class="mt-10 grid grid-cols-2 gap-6 text-sm text-white/80">
|
||||
<div>
|
||||
<p class="text-3xl font-semibold text-white">38%</p>
|
||||
<p data-i18n="hero-stat1"></p>
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-3xl font-semibold text-white">2x</p>
|
||||
<p data-i18n="hero-stat2"></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bg-white/10 backdrop-blur-lg rounded-3xl p-8 shadow-brand">
|
||||
<div class="relative">
|
||||
<img src="https://images.unsplash.com/photo-1521737604893-d14cc237f11d?auto=format&fit=crop&w=900&q=80" alt="NGO team collaborating" class="rounded-2xl" />
|
||||
<div class="absolute -bottom-8 left-8 bg-white/90 text-brand-ink px-4 py-3 rounded-2xl shadow-lg">
|
||||
<p class="text-xs uppercase tracking-widest text-brand-primary mb-1" data-i18n="hero-card-title"></p>
|
||||
<p class="text-lg font-semibold" data-i18n="hero-card-headline"></p>
|
||||
<p class="text-sm text-brand-primary" data-i18n="hero-card-body"></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<section class="max-w-6xl mx-auto px-6 py-16 grid md:grid-cols-3 gap-8">
|
||||
<article class="bg-white rounded-2xl p-6 shadow-brand border border-brand-smoke">
|
||||
<h2 class="text-xl font-semibold mb-2" data-i18n="value1-title"></h2>
|
||||
<p class="text-sm text-brand-ink/80" data-i18n="value1-body"></p>
|
||||
</article>
|
||||
<article class="bg-white rounded-2xl p-6 shadow-brand border border-brand-smoke">
|
||||
<h2 class="text-xl font-semibold mb-2" data-i18n="value2-title"></h2>
|
||||
<p class="text-sm text-brand-ink/80" data-i18n="value2-body"></p>
|
||||
</article>
|
||||
<article class="bg-white rounded-2xl p-6 shadow-brand border border-brand-smoke">
|
||||
<h2 class="text-xl font-semibold mb-2" data-i18n="value3-title"></h2>
|
||||
<p class="text-sm text-brand-ink/80" data-i18n="value3-body"></p>
|
||||
</article>
|
||||
</section>
|
||||
|
||||
<section id="blog" class="bg-white py-20">
|
||||
<div class="max-w-6xl mx-auto px-6">
|
||||
<div class="flex flex-col md:flex-row md:items-end md:justify-between gap-6 mb-12">
|
||||
<div>
|
||||
<p class="text-sm uppercase tracking-[0.3em] text-brand-primary mb-3" data-i18n="blog-tagline"></p>
|
||||
<h2 class="text-3xl font-semibold" data-i18n="blog-title"></h2>
|
||||
<p class="text-brand-ink/80" data-i18n="blog-subtitle"></p>
|
||||
</div>
|
||||
<button id="blog-toggle" type="button" class="text-brand-accent font-semibold hover:underline underline-offset-4">Browse all articles →</button>
|
||||
</div>
|
||||
<div id="blog-grid" class="grid gap-6 md:grid-cols-3"></div>
|
||||
<p id="blog-error" class="text-sm text-brand-ink/70 mt-6 hidden"></p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="trial" class="bg-brand-ink text-white py-20">
|
||||
<div class="max-w-5xl mx-auto px-6 grid md:grid-cols-2 gap-12">
|
||||
<div>
|
||||
<p class="text-brand-sunrise text-sm uppercase tracking-[0.3em] mb-4" data-i18n="trial-tagline"></p>
|
||||
<h2 class="text-3xl font-semibold mb-4" data-i18n="trial-heading"></h2>
|
||||
<p class="text-white/80 mb-6" data-i18n="trial-body"></p>
|
||||
<ul class="space-y-4 text-sm text-white/80">
|
||||
<li class="flex gap-3"><span class="text-brand-emerald">✔</span><span data-i18n="trial-bullet1"></span></li>
|
||||
<li class="flex gap-3"><span class="text-brand-emerald">✔</span><span data-i18n="trial-bullet2"></span></li>
|
||||
<li class="flex gap-3"><span class="text-brand-emerald">✔</span><span data-i18n="trial-bullet3"></span></li>
|
||||
</ul>
|
||||
</div>
|
||||
<form class="bg-white text-brand-ink rounded-3xl p-8 shadow-brand space-y-5" data-event="form:trial">
|
||||
<label class="block text-sm font-medium">
|
||||
<span data-i18n="trial-label-email"></span>
|
||||
<input type="email" required class="mt-2 w-full rounded-2xl border border-brand-smoke px-4 py-3 focus:outline-none focus:ring-2 focus:ring-brand-accent" data-i18n-placeholder="trial-placeholder-email" />
|
||||
</label>
|
||||
<label class="block text-sm font-medium">
|
||||
<span data-i18n="trial-label-priority"></span>
|
||||
<select class="mt-2 w-full rounded-2xl border border-brand-smoke px-4 py-3 focus:outline-none focus:ring-2 focus:ring-brand-accent">
|
||||
<option data-i18n-option="priority-1"></option>
|
||||
<option data-i18n-option="priority-2"></option>
|
||||
<option data-i18n-option="priority-3"></option>
|
||||
<option data-i18n-option="priority-4"></option>
|
||||
</select>
|
||||
</label>
|
||||
<label class="block text-sm font-medium">
|
||||
<span data-i18n="trial-label-region"></span>
|
||||
<input type="text" class="mt-2 w-full rounded-2xl border border-brand-smoke px-4 py-3 focus:outline-none focus:ring-2 focus:ring-brand-accent" data-i18n-placeholder="trial-placeholder-region" />
|
||||
</label>
|
||||
<p class="text-xs text-brand-ink/70" data-i18n="trial-microcopy"></p>
|
||||
<button type="submit" class="w-full py-3 rounded-2xl bg-brand-accent text-brand-ink font-semibold" data-i18n="cta-trial"></button>
|
||||
<p class="text-xs text-brand-ink/60 text-center" data-i18n="trial-help"></p>
|
||||
</form>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="meeting" class="py-20 bg-white">
|
||||
<div class="max-w-5xl mx-auto px-6 grid md:grid-cols-2 gap-12 items-center">
|
||||
<div>
|
||||
<p class="uppercase text-xs tracking-[0.3em] text-brand-primary mb-3" data-i18n="meeting-tagline"></p>
|
||||
<h2 class="text-3xl font-semibold mb-4" data-i18n="meeting-heading"></h2>
|
||||
<p class="text-brand-ink/80 mb-6" data-i18n="meeting-body"></p>
|
||||
<ul class="space-y-4 text-sm text-brand-ink/80">
|
||||
<li class="flex gap-3"><span class="text-brand-primary">◎</span><span data-i18n="meeting-bullet1"></span></li>
|
||||
<li class="flex gap-3"><span class="text-brand-primary">◎</span><span data-i18n="meeting-bullet2"></span></li>
|
||||
<li class="flex gap-3"><span class="text-brand-primary">◎</span><span data-i18n="meeting-bullet3"></span></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="bg-brand-snow border border-brand-smoke rounded-3xl p-8 shadow-brand">
|
||||
<p class="text-sm text-brand-primary font-semibold mb-2" data-i18n="meeting-note-title"></p>
|
||||
<p class="text-brand-ink font-semibold text-xl mb-4" data-i18n="meeting-note-body"></p>
|
||||
<p class="text-sm text-brand-ink/70" data-i18n="meeting-note-hint"></p>
|
||||
<a href="https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ3DDbaiHFlhNhWySszAQoPXE_H73QLqYT3w7H9IYWC76RA_TgNIhLESjb4N7ep_D2D_OyW9q4-c" target="_blank" rel="noopener" class="inline-flex items-center gap-2 mt-4 text-sm font-semibold text-brand-primary hover:text-brand-accent plausible-event-name=meeting" data-i18n="meeting-note-cta"></a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<footer class="bg-brand-ink text-white py-10">
|
||||
<div class="max-w-6xl mx-auto px-6 flex flex-col md:flex-row gap-6 items-center justify-between text-sm">
|
||||
<p>© <span id="year"></span> <span data-i18n="footer-note"></span></p>
|
||||
<div class="flex gap-4">
|
||||
<a href="https://odoo4projects.com/support" class="hover:text-brand-sunrise" data-i18n="footer-support"></a>
|
||||
<a href="https://odoo4projects.com/legal" class="hover:text-brand-sunrise" data-i18n="footer-legal"></a>
|
||||
<a href="https://odoo4projects.com/contactus" class="hover:text-brand-sunrise" data-i18n="footer-contact"></a>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
const translations = {
|
||||
en: {
|
||||
'nav-resources': 'Resources',
|
||||
'nav-trial': 'Free Trial',
|
||||
'hero-badge': 'ERP FOR NGOs',
|
||||
'hero-pill': 'Unified NGO ERP Platform',
|
||||
'hero-headline': 'Simplify every mission workflow with an ERP built for NGOs',
|
||||
'hero-subheadline': 'Consolidate programs, automate donor and grant reporting, and give every field office the same source of truth. Launch in weeks with templates tailored to humanitarian and community-impact teams.',
|
||||
'cta-trial': 'Sign Up for Free Trial',
|
||||
'cta-meeting': 'Schedule a Meeting',
|
||||
'hero-stat1': 'Faster donor & grant reporting cycles',
|
||||
'hero-stat2': 'Increase in volunteer onboarding speed',
|
||||
'hero-card-title': 'Live KPI snapshot',
|
||||
'hero-card-headline': 'Program Impact Dashboard',
|
||||
'hero-card-body': 'Realtime budgets • Volunteer hours • Donor health',
|
||||
'value1-title': 'Transparency for Donors',
|
||||
'value1-body': 'Accounting-ready ledgers pair receipts with stories so donors see every peso without extra spreadsheets or calls.',
|
||||
'value2-title': 'Donor Management & Communications',
|
||||
'value2-body': 'Automation buddies queue thank-yous, newsletters, and SMS nudges so every supporter hears from you right on time.',
|
||||
'value3-title': 'International Fund Raising',
|
||||
'value3-body': 'Multilingual homepages, acquisition kanbans, and project trackers keep campaigns aligned across countries without rebuilding playbooks.',
|
||||
'blog-tagline': 'Insights for NGO leaders',
|
||||
'blog-title': 'Blog & resource hub',
|
||||
'blog-subtitle': 'Get your impulses with our entertaining playbooks.',
|
||||
'blog-link': 'Browse all articles →',
|
||||
'blog-all-open': 'Show fewer articles',
|
||||
'blog-read-more': 'Read more',
|
||||
'blog-show-less': 'Show less',
|
||||
'blog-error': 'Unable to load articles right now.',
|
||||
'trial-tagline': 'Sign up free trial',
|
||||
'trial-heading': 'Launch your NGO ERP sandbox in under 5 minutes',
|
||||
'trial-body': 'Experience localized NGO templates, donor CRM, and automation recipes. No credit card required—just choose your focus area and invite teammates.',
|
||||
'trial-bullet1': 'Pre-loaded NGO chart of accounts & grant tracking',
|
||||
'trial-bullet2': 'Automated donor receipts + impact dashboards',
|
||||
'trial-bullet3': 'Guided checklists for go-live within 30 days',
|
||||
'trial-label-email': 'Work email',
|
||||
'trial-placeholder-email': 'impact@yourngo.org',
|
||||
'trial-label-priority': 'Primary priority',
|
||||
'priority-1': 'Grant compliance reporting',
|
||||
'priority-2': 'Volunteer management',
|
||||
'priority-3': 'Donor CRM & fundraising',
|
||||
'priority-4': 'Finance & procurement',
|
||||
'trial-label-region': 'Country / region',
|
||||
'trial-placeholder-region': 'e.g., Paraguay, LATAM',
|
||||
'trial-microcopy': 'No credit card required. EU hosting & GDPR-ready.',
|
||||
'trial-help': 'Need help? Use the Schedule a Meeting button in the header to book a guided call.',
|
||||
'meeting-tagline': 'Have a meeting',
|
||||
'meeting-heading': 'See how your NGO can streamline operations, save time, and reduce errors',
|
||||
'meeting-body': 'A 30-minute live walkthrough tailored to your mission, covering localization, integrations, and governance. Walk away with a rollout roadmap.',
|
||||
'meeting-bullet1': 'Baseline automation scoring',
|
||||
'meeting-bullet2': 'Tech stack alignment & data migration plan',
|
||||
'meeting-bullet3': 'Budget templates & total cost forecast',
|
||||
'meeting-note-title': 'How scheduling works',
|
||||
'meeting-note-body': 'You will meet with an NGO consultant from ODOO4projects.',
|
||||
'meeting-note-hint': 'Use the Schedule a Meeting button in the header and tell us during booking which question we should prepare for.',
|
||||
'meeting-note-cta': 'Open booking calendar',
|
||||
'footer-note': 'ODOO4projects — Hosting for the AI generation',
|
||||
'footer-support': 'Support',
|
||||
'footer-legal': 'Legal',
|
||||
'footer-contact': 'Contact'
|
||||
},
|
||||
es: {
|
||||
'nav-resources': 'Recursos',
|
||||
'nav-trial': 'Prueba gratuita',
|
||||
'hero-badge': 'ERP PARA ONGs',
|
||||
'hero-pill': 'Plataforma ERP unificada para ONGs',
|
||||
'hero-headline': 'Simplifica cada misión con un ERP diseñado para ONGs',
|
||||
'hero-subheadline': 'Centraliza programas, automatiza reportes de donantes y subvenciones y ofrece a cada sede la misma fuente de verdad. Implementa en semanas con plantillas creadas para equipos humanitarios.',
|
||||
'cta-trial': 'Crear prueba gratuita',
|
||||
'cta-meeting': 'Agendar una reunión',
|
||||
'hero-stat1': 'Ciclos más rápidos de reportes a donantes y subvenciones',
|
||||
'hero-stat2': 'Mayor velocidad en la incorporación de voluntarios',
|
||||
'hero-card-title': 'Panel de KPIs en vivo',
|
||||
'hero-card-headline': 'Tablero de impacto programático',
|
||||
'hero-card-body': 'Presupuestos en tiempo real • Horas voluntarias • Salud de donantes',
|
||||
'value1-title': 'Transparencia para donantes',
|
||||
'value1-body': 'Libros contables listos unen recibos y relatos para que cada donante vea su aporte sin hojas extra.',
|
||||
'value2-title': 'Gestión y comunicación con donantes',
|
||||
'value2-body': 'Bots de automatización programan agradecimientos, boletines y SMS para que cada aliado reciba noticias a tiempo.',
|
||||
'value3-title': 'Recaudación internacional',
|
||||
'value3-body': 'Sitios multilingües, tableros de adquisición y proyectos coordinan campañas globales sin rehacer playbooks ni procesos.',
|
||||
'blog-tagline': 'Ideas para líderes de ONG',
|
||||
'blog-title': 'Blog y centro de recursos',
|
||||
'blog-subtitle': 'Recibe impulsos con nuestros playbooks entretenidos.',
|
||||
'blog-link': 'Ver todos los artículos →',
|
||||
'blog-all-open': 'Mostrar menos artículos',
|
||||
'blog-read-more': 'Leer más',
|
||||
'blog-show-less': 'Mostrar menos',
|
||||
'blog-error': 'No pudimos cargar los artículos en este momento.',
|
||||
'trial-tagline': 'Activa tu prueba',
|
||||
'trial-heading': 'Lanza tu sandbox ERP para ONG en menos de 5 minutos',
|
||||
'trial-body': 'Explora plantillas localizadas, CRM de donantes y recetas de automatización. Sin tarjeta; solo elige tu prioridad e invita al equipo.',
|
||||
'trial-bullet1': 'Plan contable para ONG y seguimiento de subvenciones precargado',
|
||||
'trial-bullet2': 'Recibos automáticos más tableros de impacto',
|
||||
'trial-bullet3': 'Checklists guiados para salir a producción en 30 días',
|
||||
'trial-label-email': 'Correo laboral',
|
||||
'trial-placeholder-email': 'impacto@tuong.org',
|
||||
'trial-label-priority': 'Prioridad principal',
|
||||
'priority-1': 'Reportes de subvenciones',
|
||||
'priority-2': 'Gestión de voluntarios',
|
||||
'priority-3': 'CRM y recaudación',
|
||||
'priority-4': 'Finanzas y compras',
|
||||
'trial-label-region': 'País / región',
|
||||
'trial-placeholder-region': 'ej. Paraguay, LATAM',
|
||||
'trial-microcopy': 'Sin tarjeta. Hosting en la UE y cumplimiento GDPR.',
|
||||
'trial-help': '¿Dudas? Usa el botón “Agendar una reunión” en el encabezado para reservar una llamada guiada.',
|
||||
'meeting-tagline': 'Agenda una reunión',
|
||||
'meeting-heading': 'Descubre cómo optimizar operaciones, ahorrar tiempo y reducir errores',
|
||||
'meeting-body': 'Sesión de 30 minutos adaptada a tu misión, con localización, integraciones y gobernanza. Sal con un plan de implementación.',
|
||||
'meeting-bullet1': 'Diagnóstico de automatización',
|
||||
'meeting-bullet2': 'Plan de migración y alineación tecnológica',
|
||||
'meeting-bullet3': 'Plantillas presupuestarias y previsión de costes',
|
||||
'meeting-note-title': 'Cómo reservar',
|
||||
'meeting-note-body': 'Te reunirás con un consultor ONG de ODOO4projects.',
|
||||
'meeting-note-hint': 'Usa el botón “Agendar una reunión” del encabezado y cuéntanos durante la reserva qué pregunta debemos preparar.',
|
||||
'meeting-note-cta': 'Abrir calendario de reservas',
|
||||
'footer-note': 'ODOO4projects — Hosting para la generación IA',
|
||||
'footer-support': 'Soporte',
|
||||
'footer-legal': 'Legal',
|
||||
'footer-contact': 'Contacto'
|
||||
},
|
||||
de: {
|
||||
'nav-resources': 'Ressourcen',
|
||||
'nav-trial': 'Kostenlose Testphase',
|
||||
'hero-badge': 'ERP FÜR NGOs',
|
||||
'hero-pill': 'Vereintes NGO-ERP',
|
||||
'hero-headline': 'Vereinfache jeden Einsatz mit einem ERP für NGOs',
|
||||
'hero-subheadline': 'Bündele Programme, automatisiere Spender- und Förderberichte und gib allen Standorten dieselbe Datenbasis. Starte in wenigen Wochen mit maßgeschneiderten Templates.',
|
||||
'cta-trial': 'Kostenlose Testphase starten',
|
||||
'cta-meeting': 'Meeting planen',
|
||||
'hero-stat1': 'Schnellere Förder- & Spenderberichte',
|
||||
'hero-stat2': 'Doppelt so schnelle Ehrenamtlichen-Onboardings',
|
||||
'hero-card-title': 'Live-KPI-Überblick',
|
||||
'hero-card-headline': 'Impact-Dashboard für Programme',
|
||||
'hero-card-body': 'Budgets in Echtzeit • Ehrenamtsstunden • Donor Health',
|
||||
'value1-title': 'Transparenz für Spender',
|
||||
'value1-body': 'Buchhaltungsbereite Ledger verbinden Belege mit Geschichten, damit Spender jeden Euro ohne Zusatz-Excel sofort klar sehen.',
|
||||
'value2-title': 'Spenderverwaltung & Kommunikation',
|
||||
'value2-body': 'Automations-Buddys planen Dankesnachrichten, Newsletter und SMS, damit jede Beziehung pünktlich gepflegt und dokumentiert bleibt.',
|
||||
'value3-title': 'Internationale Fundraising',
|
||||
'value3-body': 'Mehrsprachige Homepages, Akquise-Kanban und Projekttracker halten Kampagnen weltweit synchron ohne Playbooks ständig umzuschreiben.',
|
||||
'blog-tagline': 'Insights für NGO-Führungskräfte',
|
||||
'blog-title': 'Blog & Wissenshub',
|
||||
'blog-subtitle': 'Hol dir Impulse mit unseren unterhaltsamen Playbooks.',
|
||||
'blog-link': 'Alle Artikel ansehen →',
|
||||
'blog-all-open': 'Weniger Artikel anzeigen',
|
||||
'blog-read-more': 'Mehr lesen',
|
||||
'blog-show-less': 'Weniger anzeigen',
|
||||
'blog-error': 'Artikel konnten gerade nicht geladen werden.',
|
||||
'trial-tagline': 'Kostenlos testen',
|
||||
'trial-heading': 'Starte dein NGO-ERP-Sandbox in unter 5 Minuten',
|
||||
'trial-body': 'Teste lokalisierte Templates, Donor-CRM und Automatisierungen. Keine Kreditkarte – wähle den Fokus und lade dein Team ein.',
|
||||
'trial-bullet1': 'Vorkonfigurierter Kontenplan & Fördertracking',
|
||||
'trial-bullet2': 'Automatische Spendenbelege & Impact-Dashboards',
|
||||
'trial-bullet3': 'Geführte Checklisten für Go-Live in 30 Tagen',
|
||||
'trial-label-email': 'Arbeits-E-Mail',
|
||||
'trial-placeholder-email': 'impact@deinengo.org',
|
||||
'trial-label-priority': 'Höchste Priorität',
|
||||
'priority-1': 'Förder-Reporting',
|
||||
'priority-2': 'Ehrenamt-Management',
|
||||
'priority-3': 'Spender-CRM & Fundraising',
|
||||
'priority-4': 'Finanzen & Beschaffung',
|
||||
'trial-label-region': 'Land / Region',
|
||||
'trial-placeholder-region': 'z. B. Paraguay, LATAM',
|
||||
'trial-microcopy': 'Keine Kreditkarte. EU-Hosting & DSGVO-konform.',
|
||||
'trial-help': 'Brauchen Sie Hilfe? Nutzen Sie den Button „Meeting planen“ im Header für einen geführten Call.',
|
||||
'meeting-tagline': 'Meeting vereinbaren',
|
||||
'meeting-heading': 'Erleben Sie, wie Ihre NGO Zeit spart und Fehler reduziert',
|
||||
'meeting-body': 'Ein 30-minütiger Walkthrough zu Lokalisierung, Integrationen und Governance – inklusive Rollout-Fahrplan.',
|
||||
'meeting-bullet1': 'Automation-Score als Ausgangspunkt',
|
||||
'meeting-bullet2': 'Technologie- & Migrationsplan',
|
||||
'meeting-bullet3': 'Budgetvorlagen & Kostenprognose',
|
||||
'meeting-note-title': 'So buchen Sie',
|
||||
'meeting-note-body': 'Sie sprechen mit einem NGO-Berater von ODOO4projects.',
|
||||
'meeting-note-hint': 'Verwenden Sie den Button „Meeting planen“ im Header und nennen Sie bei der Buchung Ihre Frage, damit wir uns vorbereiten können.',
|
||||
'meeting-note-cta': 'Buchungskalender öffnen',
|
||||
'footer-note': 'ODOO4projects — Hosting für die KI-Generation',
|
||||
'footer-support': 'Support',
|
||||
'footer-legal': 'Rechtliches',
|
||||
'footer-contact': 'Kontakt'
|
||||
}
|
||||
};
|
||||
|
||||
const BLOG_LIMIT = 3;
|
||||
const blogGrid = document.getElementById('blog-grid');
|
||||
const blogToggle = document.getElementById('blog-toggle');
|
||||
const blogError = document.getElementById('blog-error');
|
||||
let blogPosts = [];
|
||||
let blogExpanded = false;
|
||||
|
||||
if (blogGrid) {
|
||||
fetch('blog.json')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
blogPosts = Array.isArray(data) ? data : [];
|
||||
renderBlogCards();
|
||||
})
|
||||
.catch(error => {
|
||||
if (blogError) {
|
||||
blogError.classList.remove('hidden');
|
||||
blogError.textContent = getTranslation(document.documentElement.lang, 'blog-error', 'Unable to load articles right now.');
|
||||
}
|
||||
console.error('blog.json load failed', error);
|
||||
});
|
||||
}
|
||||
|
||||
if (blogToggle) {
|
||||
blogToggle.addEventListener('click', () => {
|
||||
if (blogPosts.length <= BLOG_LIMIT) return;
|
||||
blogExpanded = !blogExpanded;
|
||||
renderBlogCards();
|
||||
});
|
||||
}
|
||||
|
||||
function getTranslation(locale, key, fallback) {
|
||||
return (translations[locale] && translations[locale][key]) ?? translations.en[key] ?? fallback;
|
||||
}
|
||||
|
||||
function renderBlogCards() {
|
||||
if (!blogGrid) {
|
||||
return;
|
||||
}
|
||||
if (!blogPosts.length) {
|
||||
blogGrid.innerHTML = '';
|
||||
updateBlogToggleLabel();
|
||||
return;
|
||||
}
|
||||
const limit = blogExpanded ? blogPosts.length : Math.min(BLOG_LIMIT, blogPosts.length);
|
||||
blogGrid.innerHTML = '';
|
||||
blogPosts.slice(0, limit).forEach(post => {
|
||||
blogGrid.appendChild(createBlogCard(post));
|
||||
});
|
||||
updateBlogToggleLabel();
|
||||
}
|
||||
|
||||
function createBlogCard(post) {
|
||||
const card = document.createElement('article');
|
||||
card.className = 'border border-brand-smoke rounded-3xl p-6 h-full flex flex-col';
|
||||
|
||||
const meta = document.createElement('div');
|
||||
meta.className = 'flex items-center justify-between mb-3';
|
||||
const area = document.createElement('p');
|
||||
area.className = 'text-xs uppercase tracking-widest text-brand-primary';
|
||||
area.textContent = post.area || '';
|
||||
const dateEl = document.createElement('time');
|
||||
dateEl.className = 'text-xs text-brand-ink/60';
|
||||
if (post.date) {
|
||||
dateEl.dateTime = post.date;
|
||||
}
|
||||
dateEl.textContent = formatBlogDate(post.date);
|
||||
meta.append(area, dateEl);
|
||||
card.appendChild(meta);
|
||||
|
||||
const title = document.createElement('h3');
|
||||
title.className = 'text-xl font-semibold mb-3';
|
||||
title.textContent = post.title || '';
|
||||
card.appendChild(title);
|
||||
|
||||
const teaser = document.createElement('div');
|
||||
teaser.className = 'text-sm text-brand-ink/80 space-y-3 mb-4';
|
||||
teaser.innerHTML = post.teaser || '';
|
||||
card.appendChild(teaser);
|
||||
|
||||
let contentBlock = null;
|
||||
const hasMore = post.content && post.content.trim() !== (post.teaser || '').trim();
|
||||
if (post.content) {
|
||||
contentBlock = document.createElement('div');
|
||||
contentBlock.className = 'text-sm text-brand-ink/80 space-y-3 mb-4 hidden';
|
||||
contentBlock.innerHTML = post.content;
|
||||
card.appendChild(contentBlock);
|
||||
}
|
||||
|
||||
if (hasMore && contentBlock) {
|
||||
const btn = document.createElement('button');
|
||||
btn.type = 'button';
|
||||
btn.className = 'text-sm font-semibold text-brand-accent underline-offset-4 hover:underline self-start';
|
||||
btn.textContent = getTranslation(document.documentElement.lang, 'blog-read-more', 'Read more');
|
||||
btn.addEventListener('click', () => {
|
||||
const isHidden = contentBlock.classList.contains('hidden');
|
||||
if (isHidden) {
|
||||
contentBlock.classList.remove('hidden');
|
||||
btn.textContent = getTranslation(document.documentElement.lang, 'blog-show-less', 'Show less');
|
||||
} else {
|
||||
contentBlock.classList.add('hidden');
|
||||
btn.textContent = getTranslation(document.documentElement.lang, 'blog-read-more', 'Read more');
|
||||
}
|
||||
});
|
||||
card.appendChild(btn);
|
||||
}
|
||||
|
||||
return card;
|
||||
}
|
||||
|
||||
function formatBlogDate(dateString) {
|
||||
if (!dateString) return '';
|
||||
try {
|
||||
const locale = document.documentElement.lang || 'en';
|
||||
return new Intl.DateTimeFormat(locale, { year: 'numeric', month: 'short', day: 'numeric' }).format(new Date(dateString));
|
||||
} catch (error) {
|
||||
return dateString;
|
||||
}
|
||||
}
|
||||
|
||||
function updateBlogToggleLabel() {
|
||||
if (!blogToggle) return;
|
||||
if (blogPosts.length <= BLOG_LIMIT) {
|
||||
blogToggle.classList.add('hidden');
|
||||
blogExpanded = false;
|
||||
return;
|
||||
}
|
||||
blogToggle.classList.remove('hidden');
|
||||
blogToggle.disabled = false;
|
||||
const locale = document.documentElement.lang || 'en';
|
||||
blogToggle.textContent = blogExpanded
|
||||
? getTranslation(locale, 'blog-all-open', 'Show fewer articles')
|
||||
: getTranslation(locale, 'blog-link', 'Browse all articles →');
|
||||
}
|
||||
|
||||
function setLanguage(lang) {
|
||||
const locale = translations[lang] ? lang : 'en';
|
||||
document.documentElement.lang = locale;
|
||||
document.querySelectorAll('[data-i18n]').forEach(el => {
|
||||
const key = el.dataset.i18n;
|
||||
const value = translations[locale][key] ?? translations.en[key] ?? '';
|
||||
if (value !== undefined) el.innerHTML = value;
|
||||
});
|
||||
document.querySelectorAll('[data-i18n-placeholder]').forEach(el => {
|
||||
const key = el.dataset.i18nPlaceholder;
|
||||
const value = translations[locale][key] ?? translations.en[key] ?? '';
|
||||
if (value !== undefined) el.setAttribute('placeholder', value);
|
||||
});
|
||||
document.querySelectorAll('[data-i18n-option]').forEach(el => {
|
||||
const key = el.dataset.i18nOption;
|
||||
const value = translations[locale][key] ?? translations.en[key] ?? '';
|
||||
if (value !== undefined) el.textContent = value;
|
||||
});
|
||||
document.querySelectorAll('[data-i18n-aria]').forEach(el => {
|
||||
const key = el.dataset.i18nAria;
|
||||
const value = translations[locale][key] ?? translations.en[key] ?? '';
|
||||
if (value !== undefined) el.setAttribute('aria-label', value);
|
||||
});
|
||||
renderBlogCards();
|
||||
updateBlogToggleLabel();
|
||||
}
|
||||
|
||||
document.getElementById('lang-selector').addEventListener('change', (event) => {
|
||||
setLanguage(event.target.value);
|
||||
});
|
||||
|
||||
setLanguage('en');
|
||||
document.getElementById('year').textContent = new Date().getFullYear();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,550 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" class="scroll-smooth">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>NGO ERP Landingpage | ODOO4projects</title>
|
||||
<meta name="description" content="Purpose-built ERP platform for NGOs. Centralize programs, automate donor and grant reporting, and launch in weeks with ODOO4projects." />
|
||||
<meta name="keywords" content="NGO ERP system, nonprofit management software, ERP for NGOs, NGO operations platform, ODOO for nonprofits" />
|
||||
<link rel="icon" href="https://odoo4projects.com/web/image/website/1/favicon?unique=725c3af" />
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||
<link rel="preload" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" as="style" onload="this.onload=null;this.rel='stylesheet'" />
|
||||
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"></noscript>
|
||||
<link rel="preload" href="assets/site.css" as="style" onload="this.onload=null;this.rel='stylesheet'" />
|
||||
<noscript><link rel="stylesheet" href="assets/site.css"></noscript>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "WebPage",
|
||||
"name": "NGO ERP Landing",
|
||||
"about": "ERP for NGOs",
|
||||
"publisher": {
|
||||
"@type": "Organization",
|
||||
"name": "ODOO4projects",
|
||||
"logo": "https://odoo4projects.com/web/image/website/1/logo?unique=1be96c3"
|
||||
},
|
||||
"mainEntity": {
|
||||
"@type": "SoftwareApplication",
|
||||
"name": "ODOO4projects NGO ERP",
|
||||
"applicationCategory": "BusinessApplication",
|
||||
"operatingSystem": "Cloud",
|
||||
"offers": {
|
||||
"@type": "Offer",
|
||||
"price": "0",
|
||||
"priceCurrency": "USD",
|
||||
"description": "4-week free trial of NGO ERP workspace"
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<script defer data-domain="ngo.odoo4projects.com" src="https://plausible.odoo4projects.com/js/script.tagged-events.js"></script>
|
||||
<script>window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) }</script>
|
||||
</head>
|
||||
<body class="bg-brand-snow text-brand-ink">
|
||||
<header class="bg-hero-gradient text-white">
|
||||
<div class="max-w-6xl mx-auto px-6 py-6 flex flex-wrap items-center justify-between gap-4">
|
||||
<div class="flex items-center gap-3">
|
||||
<img src="https://odoo4projects.com/web/image/website/1/logo?unique=1be96c3" alt="ODOO4projects logo" class="h-10 w-auto" />
|
||||
<span class="uppercase tracking-[0.3em] text-xs text-brand-smoke" data-i18n="hero-badge"></span>
|
||||
</div>
|
||||
<nav class="flex flex-wrap items-center gap-6 text-sm">
|
||||
<a href="#blog" class="hover:text-brand-sunrise transition" data-i18n="nav-resources"></a>
|
||||
<a href="#trial" class="hover:text-brand-sunrise transition" data-i18n="nav-trial"></a>
|
||||
</nav>
|
||||
<div class="flex items-center gap-3">
|
||||
<label for="lang-selector" class="sr-only">Language</label>
|
||||
<select id="lang-selector" class="bg-white/10 border border-white/30 text-sm rounded-full px-3 py-1.5 focus:outline-none focus:ring-2 focus:ring-brand-sunrise/70">
|
||||
<option value="en">English</option>
|
||||
<option value="es">Español</option>
|
||||
<option value="de">Deutsch</option>
|
||||
</select>
|
||||
<a href="https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ3DDbaiHFlhNhWySszAQoPXE_H73QLqYT3w7H9IYWC76RA_TgNIhLESjb4N7ep_D2D_OyW9q4-c" target="_blank" rel="noopener" class="px-5 py-2 bg-brand-sunrise text-brand-ink font-semibold rounded-full text-sm shadow-brand hover:translate-y-0.5 transition plausible-event-name=meeting" data-i18n="cta-meeting"></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="max-w-6xl mx-auto px-6 py-16 grid md:grid-cols-2 gap-12 items-center">
|
||||
<div>
|
||||
<p class="text-brand-sunrise font-semibold mb-4" data-i18n="hero-pill"></p>
|
||||
<h1 class="text-4xl md:text-5xl font-semibold leading-tight mb-6" data-i18n="hero-headline"></h1>
|
||||
<p class="text-lg text-white/80 mb-8" data-i18n="hero-subheadline"></p>
|
||||
<div class="flex flex-wrap gap-4">
|
||||
<a href="#trial" class="px-6 py-3 bg-brand-accent hover:bg-brand-sunrise text-brand-ink font-semibold rounded-full transition" data-i18n="cta-trial" data-event="cta:hero-trial"></a>
|
||||
</div>
|
||||
<div class="mt-10 grid grid-cols-2 gap-6 text-sm text-white/80">
|
||||
<div>
|
||||
<p class="text-3xl font-semibold text-white">38%</p>
|
||||
<p data-i18n="hero-stat1"></p>
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-3xl font-semibold text-white">2x</p>
|
||||
<p data-i18n="hero-stat2"></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bg-white/10 backdrop-blur-lg rounded-3xl p-8 shadow-brand">
|
||||
<div class="relative">
|
||||
<img src="https://images.unsplash.com/photo-1521737604893-d14cc237f11d?auto=format&fit=crop&w=900&q=80" alt="NGO team collaborating" class="rounded-2xl" />
|
||||
<div class="absolute -bottom-8 left-8 bg-white/90 text-brand-ink px-4 py-3 rounded-2xl shadow-lg">
|
||||
<p class="text-xs uppercase tracking-widest text-brand-primary mb-1" data-i18n="hero-card-title"></p>
|
||||
<p class="text-lg font-semibold" data-i18n="hero-card-headline"></p>
|
||||
<p class="text-sm text-brand-primary" data-i18n="hero-card-body"></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<section class="max-w-6xl mx-auto px-6 py-16 grid md:grid-cols-3 gap-8">
|
||||
<article class="bg-white rounded-2xl p-6 shadow-brand border border-brand-smoke">
|
||||
<h2 class="text-xl font-semibold mb-2" data-i18n="value1-title"></h2>
|
||||
<p class="text-sm text-brand-ink/80" data-i18n="value1-body"></p>
|
||||
</article>
|
||||
<article class="bg-white rounded-2xl p-6 shadow-brand border border-brand-smoke">
|
||||
<h2 class="text-xl font-semibold mb-2" data-i18n="value2-title"></h2>
|
||||
<p class="text-sm text-brand-ink/80" data-i18n="value2-body"></p>
|
||||
</article>
|
||||
<article class="bg-white rounded-2xl p-6 shadow-brand border border-brand-smoke">
|
||||
<h2 class="text-xl font-semibold mb-2" data-i18n="value3-title"></h2>
|
||||
<p class="text-sm text-brand-ink/80" data-i18n="value3-body"></p>
|
||||
</article>
|
||||
</section>
|
||||
|
||||
<section id="blog" class="bg-white py-20">
|
||||
<div class="max-w-6xl mx-auto px-6">
|
||||
<div class="flex flex-col md:flex-row md:items-end md:justify-between gap-6 mb-12">
|
||||
<div>
|
||||
<p class="text-sm uppercase tracking-[0.3em] text-brand-primary mb-3" data-i18n="blog-tagline"></p>
|
||||
<h2 class="text-3xl font-semibold" data-i18n="blog-title"></h2>
|
||||
<p class="text-brand-ink/80" data-i18n="blog-subtitle"></p>
|
||||
</div>
|
||||
<button id="blog-toggle" type="button" class="text-brand-accent font-semibold hover:underline underline-offset-4">Browse all articles →</button>
|
||||
</div>
|
||||
<div id="blog-grid" class="grid gap-6 md:grid-cols-3"></div>
|
||||
<p id="blog-error" class="text-sm text-brand-ink/70 mt-6 hidden"></p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="trial" class="bg-brand-ink text-white py-20">
|
||||
<div class="max-w-5xl mx-auto px-6 grid md:grid-cols-2 gap-12">
|
||||
<div>
|
||||
<p class="text-brand-sunrise text-sm uppercase tracking-[0.3em] mb-4" data-i18n="trial-tagline"></p>
|
||||
<h2 class="text-3xl font-semibold mb-4" data-i18n="trial-heading"></h2>
|
||||
<p class="text-white/80 mb-6" data-i18n="trial-body"></p>
|
||||
<ul class="space-y-4 text-sm text-white/80">
|
||||
<li class="flex gap-3"><span class="text-brand-emerald">✔</span><span data-i18n="trial-bullet1"></span></li>
|
||||
<li class="flex gap-3"><span class="text-brand-emerald">✔</span><span data-i18n="trial-bullet2"></span></li>
|
||||
<li class="flex gap-3"><span class="text-brand-emerald">✔</span><span data-i18n="trial-bullet3"></span></li>
|
||||
</ul>
|
||||
</div>
|
||||
<form class="bg-white text-brand-ink rounded-3xl p-8 shadow-brand space-y-5" data-event="form:trial">
|
||||
<label class="block text-sm font-medium">
|
||||
<span data-i18n="trial-label-email"></span>
|
||||
<input type="email" required class="mt-2 w-full rounded-2xl border border-brand-smoke px-4 py-3 focus:outline-none focus:ring-2 focus:ring-brand-accent" data-i18n-placeholder="trial-placeholder-email" />
|
||||
</label>
|
||||
<label class="block text-sm font-medium">
|
||||
<span data-i18n="trial-label-priority"></span>
|
||||
<select class="mt-2 w-full rounded-2xl border border-brand-smoke px-4 py-3 focus:outline-none focus:ring-2 focus:ring-brand-accent">
|
||||
<option data-i18n-option="priority-1"></option>
|
||||
<option data-i18n-option="priority-2"></option>
|
||||
<option data-i18n-option="priority-3"></option>
|
||||
<option data-i18n-option="priority-4"></option>
|
||||
</select>
|
||||
</label>
|
||||
<label class="block text-sm font-medium">
|
||||
<span data-i18n="trial-label-region"></span>
|
||||
<input type="text" class="mt-2 w-full rounded-2xl border border-brand-smoke px-4 py-3 focus:outline-none focus:ring-2 focus:ring-brand-accent" data-i18n-placeholder="trial-placeholder-region" />
|
||||
</label>
|
||||
<p class="text-xs text-brand-ink/70" data-i18n="trial-microcopy"></p>
|
||||
<button type="submit" class="w-full py-3 rounded-2xl bg-brand-accent text-brand-ink font-semibold" data-i18n="cta-trial"></button>
|
||||
<p class="text-xs text-brand-ink/60 text-center" data-i18n="trial-help"></p>
|
||||
</form>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="meeting" class="py-20 bg-white">
|
||||
<div class="max-w-5xl mx-auto px-6 grid md:grid-cols-2 gap-12 items-center">
|
||||
<div>
|
||||
<p class="uppercase text-xs tracking-[0.3em] text-brand-primary mb-3" data-i18n="meeting-tagline"></p>
|
||||
<h2 class="text-3xl font-semibold mb-4" data-i18n="meeting-heading"></h2>
|
||||
<p class="text-brand-ink/80 mb-6" data-i18n="meeting-body"></p>
|
||||
<ul class="space-y-4 text-sm text-brand-ink/80">
|
||||
<li class="flex gap-3"><span class="text-brand-primary">◎</span><span data-i18n="meeting-bullet1"></span></li>
|
||||
<li class="flex gap-3"><span class="text-brand-primary">◎</span><span data-i18n="meeting-bullet2"></span></li>
|
||||
<li class="flex gap-3"><span class="text-brand-primary">◎</span><span data-i18n="meeting-bullet3"></span></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="bg-brand-snow border border-brand-smoke rounded-3xl p-8 shadow-brand">
|
||||
<p class="text-sm text-brand-primary font-semibold mb-2" data-i18n="meeting-note-title"></p>
|
||||
<p class="text-brand-ink font-semibold text-xl mb-4" data-i18n="meeting-note-body"></p>
|
||||
<p class="text-sm text-brand-ink/70" data-i18n="meeting-note-hint"></p>
|
||||
<a href="https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ3DDbaiHFlhNhWySszAQoPXE_H73QLqYT3w7H9IYWC76RA_TgNIhLESjb4N7ep_D2D_OyW9q4-c" target="_blank" rel="noopener" class="inline-flex items-center gap-2 mt-4 text-sm font-semibold text-brand-primary hover:text-brand-accent plausible-event-name=meeting" data-i18n="meeting-note-cta"></a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<footer class="bg-brand-ink text-white py-10">
|
||||
<div class="max-w-6xl mx-auto px-6 flex flex-col md:flex-row gap-6 items-center justify-between text-sm">
|
||||
<p>© <span id="year"></span> <span data-i18n="footer-note"></span></p>
|
||||
<div class="flex gap-4">
|
||||
<a href="https://odoo4projects.com/support" class="hover:text-brand-sunrise" data-i18n="footer-support"></a>
|
||||
<a href="https://odoo4projects.com/legal" class="hover:text-brand-sunrise" data-i18n="footer-legal"></a>
|
||||
<a href="https://odoo4projects.com/contactus" class="hover:text-brand-sunrise" data-i18n="footer-contact"></a>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
const translations = {
|
||||
en: {
|
||||
'nav-resources': 'Resources',
|
||||
'nav-trial': 'Free Trial',
|
||||
'hero-badge': 'ERP FOR NGOs',
|
||||
'hero-pill': 'Unified NGO ERP Platform',
|
||||
'hero-headline': 'Simplify every mission workflow with an ERP built for NGOs',
|
||||
'hero-subheadline': 'Consolidate programs, automate donor and grant reporting, and give every field office the same source of truth. Launch in weeks with templates tailored to humanitarian and community-impact teams.',
|
||||
'cta-trial': 'Sign Up for Free Trial',
|
||||
'cta-meeting': 'Schedule a Meeting',
|
||||
'hero-stat1': 'Faster donor & grant reporting cycles',
|
||||
'hero-stat2': 'Increase in volunteer onboarding speed',
|
||||
'hero-card-title': 'Live KPI snapshot',
|
||||
'hero-card-headline': 'Program Impact Dashboard',
|
||||
'hero-card-body': 'Realtime budgets • Volunteer hours • Donor health',
|
||||
'value1-title': 'Transparency for Donors',
|
||||
'value1-body': 'Accounting-ready ledgers pair receipts with stories so donors see every peso without extra spreadsheets or calls.',
|
||||
'value2-title': 'Donor Management & Communications',
|
||||
'value2-body': 'Automation buddies queue thank-yous, newsletters, and SMS nudges so every supporter hears from you right on time.',
|
||||
'value3-title': 'International Fund Raising',
|
||||
'value3-body': 'Multilingual homepages, acquisition kanbans, and project trackers keep campaigns aligned across countries without rebuilding playbooks.',
|
||||
'blog-tagline': 'Insights for NGO leaders',
|
||||
'blog-title': 'Blog & resource hub',
|
||||
'blog-subtitle': 'Get your impulses with our entertaining playbooks.',
|
||||
'blog-link': 'Browse all articles →',
|
||||
'blog-all-open': 'Show fewer articles',
|
||||
'blog-read-more': 'Read more',
|
||||
'blog-show-less': 'Show less',
|
||||
'blog-error': 'Unable to load articles right now.',
|
||||
'trial-tagline': 'Sign up free trial',
|
||||
'trial-heading': 'Launch your NGO ERP sandbox in under 5 minutes',
|
||||
'trial-body': 'Experience localized NGO templates, donor CRM, and automation recipes. No credit card required—just choose your focus area and invite teammates.',
|
||||
'trial-bullet1': 'Pre-loaded NGO chart of accounts & grant tracking',
|
||||
'trial-bullet2': 'Automated donor receipts + impact dashboards',
|
||||
'trial-bullet3': 'Guided checklists for go-live within 30 days',
|
||||
'trial-label-email': 'Work email',
|
||||
'trial-placeholder-email': 'impact@yourngo.org',
|
||||
'trial-label-priority': 'Primary priority',
|
||||
'priority-1': 'Grant compliance reporting',
|
||||
'priority-2': 'Volunteer management',
|
||||
'priority-3': 'Donor CRM & fundraising',
|
||||
'priority-4': 'Finance & procurement',
|
||||
'trial-label-region': 'Country / region',
|
||||
'trial-placeholder-region': 'e.g., Paraguay, LATAM',
|
||||
'trial-microcopy': 'No credit card required. EU hosting & GDPR-ready.',
|
||||
'trial-help': 'Need help? Use the Schedule a Meeting button in the header to book a guided call.',
|
||||
'meeting-tagline': 'Have a meeting',
|
||||
'meeting-heading': 'See how your NGO can streamline operations, save time, and reduce errors',
|
||||
'meeting-body': 'A 30-minute live walkthrough tailored to your mission, covering localization, integrations, and governance. Walk away with a rollout roadmap.',
|
||||
'meeting-bullet1': 'Baseline automation scoring',
|
||||
'meeting-bullet2': 'Tech stack alignment & data migration plan',
|
||||
'meeting-bullet3': 'Budget templates & total cost forecast',
|
||||
'meeting-note-title': 'How scheduling works',
|
||||
'meeting-note-body': 'You will meet with an NGO consultant from ODOO4projects.',
|
||||
'meeting-note-hint': 'Use the Schedule a Meeting button in the header and tell us during booking which question we should prepare for.',
|
||||
'meeting-note-cta': 'Open booking calendar',
|
||||
'footer-note': 'ODOO4projects — Hosting for the AI generation',
|
||||
'footer-support': 'Support',
|
||||
'footer-legal': 'Legal',
|
||||
'footer-contact': 'Contact'
|
||||
},
|
||||
es: {
|
||||
'nav-resources': 'Recursos',
|
||||
'nav-trial': 'Prueba gratuita',
|
||||
'hero-badge': 'ERP PARA ONGs',
|
||||
'hero-pill': 'Plataforma ERP unificada para ONGs',
|
||||
'hero-headline': 'Simplifica cada misión con un ERP diseñado para ONGs',
|
||||
'hero-subheadline': 'Centraliza programas, automatiza reportes de donantes y subvenciones y ofrece a cada sede la misma fuente de verdad. Implementa en semanas con plantillas creadas para equipos humanitarios.',
|
||||
'cta-trial': 'Crear prueba gratuita',
|
||||
'cta-meeting': 'Agendar una reunión',
|
||||
'hero-stat1': 'Ciclos más rápidos de reportes a donantes y subvenciones',
|
||||
'hero-stat2': 'Mayor velocidad en la incorporación de voluntarios',
|
||||
'hero-card-title': 'Panel de KPIs en vivo',
|
||||
'hero-card-headline': 'Tablero de impacto programático',
|
||||
'hero-card-body': 'Presupuestos en tiempo real • Horas voluntarias • Salud de donantes',
|
||||
'value1-title': 'Transparencia para donantes',
|
||||
'value1-body': 'Libros contables listos unen recibos y relatos para que cada donante vea su aporte sin hojas extra.',
|
||||
'value2-title': 'Gestión y comunicación con donantes',
|
||||
'value2-body': 'Bots de automatización programan agradecimientos, boletines y SMS para que cada aliado reciba noticias a tiempo.',
|
||||
'value3-title': 'Recaudación internacional',
|
||||
'value3-body': 'Sitios multilingües, tableros de adquisición y proyectos coordinan campañas globales sin rehacer playbooks ni procesos.',
|
||||
'blog-tagline': 'Ideas para líderes de ONG',
|
||||
'blog-title': 'Blog y centro de recursos',
|
||||
'blog-subtitle': 'Recibe impulsos con nuestros playbooks entretenidos.',
|
||||
'blog-link': 'Ver todos los artículos →',
|
||||
'blog-all-open': 'Mostrar menos artículos',
|
||||
'blog-read-more': 'Leer más',
|
||||
'blog-show-less': 'Mostrar menos',
|
||||
'blog-error': 'No pudimos cargar los artículos en este momento.',
|
||||
'trial-tagline': 'Activa tu prueba',
|
||||
'trial-heading': 'Lanza tu sandbox ERP para ONG en menos de 5 minutos',
|
||||
'trial-body': 'Explora plantillas localizadas, CRM de donantes y recetas de automatización. Sin tarjeta; solo elige tu prioridad e invita al equipo.',
|
||||
'trial-bullet1': 'Plan contable para ONG y seguimiento de subvenciones precargado',
|
||||
'trial-bullet2': 'Recibos automáticos más tableros de impacto',
|
||||
'trial-bullet3': 'Checklists guiados para salir a producción en 30 días',
|
||||
'trial-label-email': 'Correo laboral',
|
||||
'trial-placeholder-email': 'impacto@tuong.org',
|
||||
'trial-label-priority': 'Prioridad principal',
|
||||
'priority-1': 'Reportes de subvenciones',
|
||||
'priority-2': 'Gestión de voluntarios',
|
||||
'priority-3': 'CRM y recaudación',
|
||||
'priority-4': 'Finanzas y compras',
|
||||
'trial-label-region': 'País / región',
|
||||
'trial-placeholder-region': 'ej. Paraguay, LATAM',
|
||||
'trial-microcopy': 'Sin tarjeta. Hosting en la UE y cumplimiento GDPR.',
|
||||
'trial-help': '¿Dudas? Usa el botón “Agendar una reunión” en el encabezado para reservar una llamada guiada.',
|
||||
'meeting-tagline': 'Agenda una reunión',
|
||||
'meeting-heading': 'Descubre cómo optimizar operaciones, ahorrar tiempo y reducir errores',
|
||||
'meeting-body': 'Sesión de 30 minutos adaptada a tu misión, con localización, integraciones y gobernanza. Sal con un plan de implementación.',
|
||||
'meeting-bullet1': 'Diagnóstico de automatización',
|
||||
'meeting-bullet2': 'Plan de migración y alineación tecnológica',
|
||||
'meeting-bullet3': 'Plantillas presupuestarias y previsión de costes',
|
||||
'meeting-note-title': 'Cómo reservar',
|
||||
'meeting-note-body': 'Te reunirás con un consultor ONG de ODOO4projects.',
|
||||
'meeting-note-hint': 'Usa el botón “Agendar una reunión” del encabezado y cuéntanos durante la reserva qué pregunta debemos preparar.',
|
||||
'meeting-note-cta': 'Abrir calendario de reservas',
|
||||
'footer-note': 'ODOO4projects — Hosting para la generación IA',
|
||||
'footer-support': 'Soporte',
|
||||
'footer-legal': 'Legal',
|
||||
'footer-contact': 'Contacto'
|
||||
},
|
||||
de: {
|
||||
'nav-resources': 'Ressourcen',
|
||||
'nav-trial': 'Kostenlose Testphase',
|
||||
'hero-badge': 'ERP FÜR NGOs',
|
||||
'hero-pill': 'Vereintes NGO-ERP',
|
||||
'hero-headline': 'Vereinfache jeden Einsatz mit einem ERP für NGOs',
|
||||
'hero-subheadline': 'Bündele Programme, automatisiere Spender- und Förderberichte und gib allen Standorten dieselbe Datenbasis. Starte in wenigen Wochen mit maßgeschneiderten Templates.',
|
||||
'cta-trial': 'Kostenlose Testphase starten',
|
||||
'cta-meeting': 'Meeting planen',
|
||||
'hero-stat1': 'Schnellere Förder- & Spenderberichte',
|
||||
'hero-stat2': 'Doppelt so schnelle Ehrenamtlichen-Onboardings',
|
||||
'hero-card-title': 'Live-KPI-Überblick',
|
||||
'hero-card-headline': 'Impact-Dashboard für Programme',
|
||||
'hero-card-body': 'Budgets in Echtzeit • Ehrenamtsstunden • Donor Health',
|
||||
'value1-title': 'Transparenz für Spender',
|
||||
'value1-body': 'Buchhaltungsbereite Ledger verbinden Belege mit Geschichten, damit Spender jeden Euro ohne Zusatz-Excel sofort klar sehen.',
|
||||
'value2-title': 'Spenderverwaltung & Kommunikation',
|
||||
'value2-body': 'Automations-Buddys planen Dankesnachrichten, Newsletter und SMS, damit jede Beziehung pünktlich gepflegt und dokumentiert bleibt.',
|
||||
'value3-title': 'Internationale Fundraising',
|
||||
'value3-body': 'Mehrsprachige Homepages, Akquise-Kanban und Projekttracker halten Kampagnen weltweit synchron ohne Playbooks ständig umzuschreiben.',
|
||||
'blog-tagline': 'Insights für NGO-Führungskräfte',
|
||||
'blog-title': 'Blog & Wissenshub',
|
||||
'blog-subtitle': 'Hol dir Impulse mit unseren unterhaltsamen Playbooks.',
|
||||
'blog-link': 'Alle Artikel ansehen →',
|
||||
'blog-all-open': 'Weniger Artikel anzeigen',
|
||||
'blog-read-more': 'Mehr lesen',
|
||||
'blog-show-less': 'Weniger anzeigen',
|
||||
'blog-error': 'Artikel konnten gerade nicht geladen werden.',
|
||||
'trial-tagline': 'Kostenlos testen',
|
||||
'trial-heading': 'Starte dein NGO-ERP-Sandbox in unter 5 Minuten',
|
||||
'trial-body': 'Teste lokalisierte Templates, Donor-CRM und Automatisierungen. Keine Kreditkarte – wähle den Fokus und lade dein Team ein.',
|
||||
'trial-bullet1': 'Vorkonfigurierter Kontenplan & Fördertracking',
|
||||
'trial-bullet2': 'Automatische Spendenbelege & Impact-Dashboards',
|
||||
'trial-bullet3': 'Geführte Checklisten für Go-Live in 30 Tagen',
|
||||
'trial-label-email': 'Arbeits-E-Mail',
|
||||
'trial-placeholder-email': 'impact@deinengo.org',
|
||||
'trial-label-priority': 'Höchste Priorität',
|
||||
'priority-1': 'Förder-Reporting',
|
||||
'priority-2': 'Ehrenamt-Management',
|
||||
'priority-3': 'Spender-CRM & Fundraising',
|
||||
'priority-4': 'Finanzen & Beschaffung',
|
||||
'trial-label-region': 'Land / Region',
|
||||
'trial-placeholder-region': 'z. B. Paraguay, LATAM',
|
||||
'trial-microcopy': 'Keine Kreditkarte. EU-Hosting & DSGVO-konform.',
|
||||
'trial-help': 'Brauchen Sie Hilfe? Nutzen Sie den Button „Meeting planen“ im Header für einen geführten Call.',
|
||||
'meeting-tagline': 'Meeting vereinbaren',
|
||||
'meeting-heading': 'Erleben Sie, wie Ihre NGO Zeit spart und Fehler reduziert',
|
||||
'meeting-body': 'Ein 30-minütiger Walkthrough zu Lokalisierung, Integrationen und Governance – inklusive Rollout-Fahrplan.',
|
||||
'meeting-bullet1': 'Automation-Score als Ausgangspunkt',
|
||||
'meeting-bullet2': 'Technologie- & Migrationsplan',
|
||||
'meeting-bullet3': 'Budgetvorlagen & Kostenprognose',
|
||||
'meeting-note-title': 'So buchen Sie',
|
||||
'meeting-note-body': 'Sie sprechen mit einem NGO-Berater von ODOO4projects.',
|
||||
'meeting-note-hint': 'Verwenden Sie den Button „Meeting planen“ im Header und nennen Sie bei der Buchung Ihre Frage, damit wir uns vorbereiten können.',
|
||||
'meeting-note-cta': 'Buchungskalender öffnen',
|
||||
'footer-note': 'ODOO4projects — Hosting für die KI-Generation',
|
||||
'footer-support': 'Support',
|
||||
'footer-legal': 'Rechtliches',
|
||||
'footer-contact': 'Kontakt'
|
||||
}
|
||||
};
|
||||
|
||||
const BLOG_LIMIT = 3;
|
||||
const blogGrid = document.getElementById('blog-grid');
|
||||
const blogToggle = document.getElementById('blog-toggle');
|
||||
const blogError = document.getElementById('blog-error');
|
||||
let blogPosts = [];
|
||||
let blogExpanded = false;
|
||||
|
||||
if (blogGrid) {
|
||||
fetch('blog.json')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
blogPosts = Array.isArray(data) ? data : [];
|
||||
renderBlogCards();
|
||||
})
|
||||
.catch(error => {
|
||||
if (blogError) {
|
||||
blogError.classList.remove('hidden');
|
||||
blogError.textContent = getTranslation(document.documentElement.lang, 'blog-error', 'Unable to load articles right now.');
|
||||
}
|
||||
console.error('blog.json load failed', error);
|
||||
});
|
||||
}
|
||||
|
||||
if (blogToggle) {
|
||||
blogToggle.addEventListener('click', () => {
|
||||
if (blogPosts.length <= BLOG_LIMIT) return;
|
||||
blogExpanded = !blogExpanded;
|
||||
renderBlogCards();
|
||||
});
|
||||
}
|
||||
|
||||
function getTranslation(locale, key, fallback) {
|
||||
return (translations[locale] && translations[locale][key]) ?? translations.en[key] ?? fallback;
|
||||
}
|
||||
|
||||
function renderBlogCards() {
|
||||
if (!blogGrid) {
|
||||
return;
|
||||
}
|
||||
if (!blogPosts.length) {
|
||||
blogGrid.innerHTML = '';
|
||||
updateBlogToggleLabel();
|
||||
return;
|
||||
}
|
||||
const limit = blogExpanded ? blogPosts.length : Math.min(BLOG_LIMIT, blogPosts.length);
|
||||
blogGrid.innerHTML = '';
|
||||
blogPosts.slice(0, limit).forEach(post => {
|
||||
blogGrid.appendChild(createBlogCard(post));
|
||||
});
|
||||
updateBlogToggleLabel();
|
||||
}
|
||||
|
||||
function createBlogCard(post) {
|
||||
const card = document.createElement('article');
|
||||
card.className = 'border border-brand-smoke rounded-3xl p-6 h-full flex flex-col';
|
||||
|
||||
const meta = document.createElement('div');
|
||||
meta.className = 'flex items-center justify-between mb-3';
|
||||
const area = document.createElement('p');
|
||||
area.className = 'text-xs uppercase tracking-widest text-brand-primary';
|
||||
area.textContent = post.area || '';
|
||||
const dateEl = document.createElement('time');
|
||||
dateEl.className = 'text-xs text-brand-ink/60';
|
||||
if (post.date) {
|
||||
dateEl.dateTime = post.date;
|
||||
}
|
||||
dateEl.textContent = formatBlogDate(post.date);
|
||||
meta.append(area, dateEl);
|
||||
card.appendChild(meta);
|
||||
|
||||
const title = document.createElement('h3');
|
||||
title.className = 'text-xl font-semibold mb-3';
|
||||
title.textContent = post.title || '';
|
||||
card.appendChild(title);
|
||||
|
||||
const teaser = document.createElement('div');
|
||||
teaser.className = 'text-sm text-brand-ink/80 space-y-3 mb-4';
|
||||
teaser.innerHTML = post.teaser || '';
|
||||
card.appendChild(teaser);
|
||||
|
||||
let contentBlock = null;
|
||||
const hasMore = post.content && post.content.trim() !== (post.teaser || '').trim();
|
||||
if (post.content) {
|
||||
contentBlock = document.createElement('div');
|
||||
contentBlock.className = 'text-sm text-brand-ink/80 space-y-3 mb-4 hidden';
|
||||
contentBlock.innerHTML = post.content;
|
||||
card.appendChild(contentBlock);
|
||||
}
|
||||
|
||||
if (hasMore && contentBlock) {
|
||||
const btn = document.createElement('button');
|
||||
btn.type = 'button';
|
||||
btn.className = 'text-sm font-semibold text-brand-accent underline-offset-4 hover:underline self-start';
|
||||
btn.textContent = getTranslation(document.documentElement.lang, 'blog-read-more', 'Read more');
|
||||
btn.addEventListener('click', () => {
|
||||
const isHidden = contentBlock.classList.contains('hidden');
|
||||
if (isHidden) {
|
||||
contentBlock.classList.remove('hidden');
|
||||
btn.textContent = getTranslation(document.documentElement.lang, 'blog-show-less', 'Show less');
|
||||
} else {
|
||||
contentBlock.classList.add('hidden');
|
||||
btn.textContent = getTranslation(document.documentElement.lang, 'blog-read-more', 'Read more');
|
||||
}
|
||||
});
|
||||
card.appendChild(btn);
|
||||
}
|
||||
|
||||
return card;
|
||||
}
|
||||
|
||||
function formatBlogDate(dateString) {
|
||||
if (!dateString) return '';
|
||||
try {
|
||||
const locale = document.documentElement.lang || 'en';
|
||||
return new Intl.DateTimeFormat(locale, { year: 'numeric', month: 'short', day: 'numeric' }).format(new Date(dateString));
|
||||
} catch (error) {
|
||||
return dateString;
|
||||
}
|
||||
}
|
||||
|
||||
function updateBlogToggleLabel() {
|
||||
if (!blogToggle) return;
|
||||
if (blogPosts.length <= BLOG_LIMIT) {
|
||||
blogToggle.classList.add('hidden');
|
||||
blogExpanded = false;
|
||||
return;
|
||||
}
|
||||
blogToggle.classList.remove('hidden');
|
||||
blogToggle.disabled = false;
|
||||
const locale = document.documentElement.lang || 'en';
|
||||
blogToggle.textContent = blogExpanded
|
||||
? getTranslation(locale, 'blog-all-open', 'Show fewer articles')
|
||||
: getTranslation(locale, 'blog-link', 'Browse all articles →');
|
||||
}
|
||||
|
||||
function setLanguage(lang) {
|
||||
const locale = translations[lang] ? lang : 'en';
|
||||
document.documentElement.lang = locale;
|
||||
document.querySelectorAll('[data-i18n]').forEach(el => {
|
||||
const key = el.dataset.i18n;
|
||||
const value = translations[locale][key] ?? translations.en[key] ?? '';
|
||||
if (value !== undefined) el.innerHTML = value;
|
||||
});
|
||||
document.querySelectorAll('[data-i18n-placeholder]').forEach(el => {
|
||||
const key = el.dataset.i18nPlaceholder;
|
||||
const value = translations[locale][key] ?? translations.en[key] ?? '';
|
||||
if (value !== undefined) el.setAttribute('placeholder', value);
|
||||
});
|
||||
document.querySelectorAll('[data-i18n-option]').forEach(el => {
|
||||
const key = el.dataset.i18nOption;
|
||||
const value = translations[locale][key] ?? translations.en[key] ?? '';
|
||||
if (value !== undefined) el.textContent = value;
|
||||
});
|
||||
document.querySelectorAll('[data-i18n-aria]').forEach(el => {
|
||||
const key = el.dataset.i18nAria;
|
||||
const value = translations[locale][key] ?? translations.en[key] ?? '';
|
||||
if (value !== undefined) el.setAttribute('aria-label', value);
|
||||
});
|
||||
renderBlogCards();
|
||||
updateBlogToggleLabel();
|
||||
}
|
||||
|
||||
document.getElementById('lang-selector').addEventListener('change', (event) => {
|
||||
setLanguage(event.target.value);
|
||||
});
|
||||
|
||||
setLanguage('en');
|
||||
document.getElementById('year').textContent = new Date().getFullYear();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user