Deleted Backups and changed readme
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
|
## Repository Rules
|
||||||
- Blog posts are saved in blog.json (do not create separate backup files).
|
|
||||||
- Do not create backups in the repo.
|
|
||||||
|
|
||||||
CI:
|
- Blog posts live in `blog.json` — do not create separate backup files.
|
||||||
- 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.)
|
- 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:
|
## Page Structure
|
||||||
- Default: English
|
|
||||||
- Additional: Spanish (es), French (fr) — prepare for translation-ready content
|
|
||||||
|
|
||||||
Technology Stack:
|
| # | Block | Purpose |
|
||||||
- Tailwind CSS. Static-first, optimized HTML, semantic markup.
|
|---|-------|---------|
|
||||||
|
| 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):
|
## CI Checks (required on every push)
|
||||||
- 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
|
|
||||||
|
|
||||||
Suggested CTAs (text variations):
|
- **HTML lint** — valid markup, no broken anchors
|
||||||
- Primary: Support
|
- **JS lint** — no errors, no `console.error` left in production paths
|
||||||
now / Donate
|
- **Tailwind build** — `npx tailwindcss -i ./src/input.css -o ./assets/site.css --minify` must exit 0
|
||||||
- Secondary: See
|
- **Corporate design compliance:**
|
||||||
donor
|
- No CSS gradients — `gradient`, `bg-*-gradient`, `linear-gradient`, `radial-gradient` are forbidden
|
||||||
management / Schedule
|
- No CSS animations or keyframes — `animate-*`, `@keyframes`, transform-based `hover:translate-*` are forbidden
|
||||||
a
|
- No blur or glassmorphism effects — `backdrop-blur`, `backdrop-filter` are forbidden
|
||||||
demo
|
- Colors must use the approved brand palette only: `brand-ink · brand-primary · brand-accent · brand-sunrise · brand-emerald · brand-snow · brand-smoke`
|
||||||
- Micro CTA: Download
|
- Images must be served from `odoo4projects.com`, `images.unsplash.com`, or local `assets/`
|
||||||
impact
|
- **Accessibility** — heading hierarchy (one `<h1>` per page), `alt` on all images, sufficient contrast (WCAG AA)
|
||||||
report
|
- **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):
|
## Languages
|
||||||
- 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
|
|
||||||
}
|
|
||||||
|
|
||||||
Social media snippets (short, use for cards):
|
| Code | Language |
|
||||||
- Tweet/LinkedIn (short): Reduce
|
|------|----------|
|
||||||
admin,
|
| `en` | English (default) |
|
||||||
increase
|
| `es` | Español |
|
||||||
trust.
|
| `de` | Deutsch |
|
||||||
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
|
|
||||||
|
|
||||||
Notes for the designer (content only):
|
All UI strings are managed via the inline `translations` object in `index.html`.
|
||||||
- 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.
|
|
||||||
|
|
||||||
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