Compare commits
89 Commits
60cbae30af
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
| d4c8760007 | |||
| b8fc96ea0a | |||
| 966441e6aa | |||
| 43d66fd295 | |||
| 5afda4e953 | |||
| c6d3e2516e | |||
| 3ac4e9bb4a | |||
| eb2f6802fd | |||
| 8bb70a9af0 | |||
| 8755db3305 | |||
| 2fa1a5eb3a | |||
| 75fc2ccc3b | |||
| e44d99c7e7 | |||
| dedec93e23 | |||
| 9a120ab0d6 | |||
| 6079039f21 | |||
| 2cf4dcbdae | |||
| e9dc4a6a0d | |||
| f488a103c8 | |||
| df5eeeb00c | |||
| b581601064 | |||
| 77bc63de24 | |||
| a86684f6d1 | |||
| b82c04ce51 | |||
| df20b2fb51 | |||
| 77aaa9989e | |||
| c5a862f7ba | |||
| 3bf0060439 | |||
| a5b3b9d36f | |||
| 440cc084d3 | |||
| f9a263dd8c | |||
| fdc1a1a215 | |||
| 10ac10a92a | |||
| a9ea122ac5 | |||
| f865d549d1 | |||
| 3215694f5c | |||
| 8594393664 | |||
| b0dde481cf | |||
| 5172bfe62c | |||
| d518ad2ae4 | |||
| 62c4aee24c | |||
| d92c72a6cd | |||
| 3005e53d6e | |||
| afb5a2ac20 | |||
| 3afcf77a16 | |||
| e542bbd44a | |||
| a626defcfd | |||
| b2cb2a1a8e | |||
| 3549e8757e | |||
| 2b2baf6851 | |||
| e649373118 | |||
| f3cb8ca848 | |||
| acec840d91 | |||
| 0d5205ac94 | |||
| 1a4a9542f5 | |||
| bd319d05a5 | |||
| 2a0af148c8 | |||
| ad7a531ea0 | |||
| fd91306cb0 | |||
| 4ea7586a7f | |||
| 671ddb2b75 | |||
| 7d447bee93 | |||
| 5cc4486ab7 | |||
| 6e4b1c891c | |||
| f1f67b29dd | |||
| d568a365df | |||
| 4781e84ebc | |||
| be09564a25 | |||
| 0fc5b59d5f | |||
| 5526873a41 | |||
| d111b55de0 | |||
| 5bd3c7b398 | |||
| 3627c2c73d | |||
| 4d2f57c20c | |||
| 05719aae4e | |||
| b2a41d1a7b | |||
| 4bdef11b3c | |||
| aafb99460c | |||
| a74de43248 | |||
| 819665225f | |||
| 3dd49559ac | |||
| c81565749a | |||
| ecf4219897 | |||
| 84090fd562 | |||
| 76a47cc730 | |||
| 6127867d51 | |||
| 5189b232bc | |||
| 482847e89e | |||
| a7521ebdec |
+21
@@ -0,0 +1,21 @@
|
||||
# Dependencies
|
||||
node_modules/
|
||||
|
||||
# Tailwind build temp
|
||||
tmp.json
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# OS
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Editor
|
||||
.vscode/
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
@@ -0,0 +1,233 @@
|
||||
# AGENTS.md — NGO Landing Page
|
||||
|
||||
Read this file fully before taking any action.
|
||||
|
||||
---
|
||||
|
||||
## Project Context
|
||||
|
||||
Single-page static landing page for an NGO ERP product.
|
||||
|
||||
| Item | Detail |
|
||||
|---|---|
|
||||
| Pages | `index.html` — the only HTML file |
|
||||
| Styling | Tailwind CSS v3 · source `src/input.css` → compiled `assets/site.css` |
|
||||
| Data | `blog.json` — flat array of blog posts, loaded at runtime by inline JS |
|
||||
| i18n | Inline `translations` object inside `index.html` (EN / ES / DE) |
|
||||
| Blog renderer | Inline `<script>` in `index.html` — no external JS files |
|
||||
| Dev server | `./start` (runs `live-server`) |
|
||||
| Git remote | `git@git.odoo4projects.com:Oliver/NGO.git` |
|
||||
|
||||
### File map
|
||||
|
||||
```
|
||||
index.html ← only HTML file — layout + all inline JS + i18n
|
||||
src/input.css ← Tailwind source (edit here, then rebuild)
|
||||
assets/site.css ← compiled output — DO NOT edit by hand
|
||||
blog.json ← English blog posts (canonical + fallback)
|
||||
blog.es.json ← Spanish blog posts
|
||||
blog.de.json ← German blog posts
|
||||
tailwind.config.js ← design tokens (colors, fonts, shadows)
|
||||
```
|
||||
|
||||
### Design tokens (from `tailwind.config.js`)
|
||||
|
||||
| Token | Hex | Usage |
|
||||
|---|---|---|
|
||||
| `brand-ink` | `#201824` | default text / dark backgrounds |
|
||||
| `brand-primary` | `#603F57` | section labels, bullet accents |
|
||||
| `brand-accent` | `#F762B4` | CTA buttons, links |
|
||||
| `brand-sunrise` | `#F8B84A` | hero highlights, hover states |
|
||||
| `brand-emerald` | `#39B982` | positive indicators |
|
||||
| `brand-snow` | `#F5F2F7` | page background |
|
||||
| `brand-smoke` | `#E5DCE8` | borders, subtle dividers |
|
||||
|
||||
NEVER use raw hex values in HTML — always use the token class names above.
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Goal
|
||||
|
||||
- Deliver an **SEO-optimised, fast-loading, responsive** single-page site.
|
||||
- Keep all edits **minimal and targeted** — preserve design, structure, and functionality.
|
||||
- NEVER introduce new frameworks, libraries, or external dependencies.
|
||||
|
||||
### Quality bar for every change
|
||||
|
||||
| Concern | Rule |
|
||||
|---|---|
|
||||
| SEO | Keep all existing meta tags, `ld+json`, `alt` attributes, and heading hierarchy |
|
||||
| Performance | No comments in production HTML, no unused CSS classes, no render-blocking additions |
|
||||
| Responsive | Every element must work on mobile (375 px), tablet (768 px), and desktop (1280 px+) |
|
||||
| Consistency | Use only brand token classes; match existing spacing and rounding patterns |
|
||||
|
||||
---
|
||||
|
||||
## Commands
|
||||
|
||||
```bash
|
||||
# Build CSS after editing src/input.css or tailwind.config.js
|
||||
npm run build:css
|
||||
|
||||
# Watch CSS during active development
|
||||
npm run watch:css
|
||||
|
||||
# Validate blog.json
|
||||
jq empty blog.json && echo "JSON valid"
|
||||
|
||||
# Start dev server
|
||||
./start
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Git Rules
|
||||
|
||||
- ALWAYS work on **`main`** branch.
|
||||
- Pull before every session:
|
||||
```bash
|
||||
git pull origin main
|
||||
```
|
||||
- Commit messages must follow the pattern:
|
||||
- `blog: add post – <title>`
|
||||
- `fix: <short description>`
|
||||
- `content: <short description>`
|
||||
- Push immediately after committing — never leave unpushed commits.
|
||||
- Branch creation is permitted ONLY under the **Branch Handling Exception** (see bottom).
|
||||
|
||||
---
|
||||
|
||||
## File Safety Rules
|
||||
|
||||
- ONLY modify files required for the task.
|
||||
- NEVER delete or restructure content unrelated to the task.
|
||||
- NEVER remove existing blog posts from `blog.json`.
|
||||
- NEVER edit `assets/site.css` directly — always rebuild from `src/input.css`.
|
||||
|
||||
---
|
||||
|
||||
## Blog Post Schema
|
||||
|
||||
### Language-to-file mapping
|
||||
|
||||
| Language | File loaded | Fallback |
|
||||
|---|---|---|
|
||||
| English (`en`) | `blog.json` | — |
|
||||
| Spanish (`es`) | `blog.es.json` | `blog.json` |
|
||||
| German (`de`) | `blog.de.json` | `blog.json` |
|
||||
|
||||
The loader in `index.html` fetches the language-specific file automatically when the visitor switches language. If a language file is missing or returns an error, it falls back to `blog.json` silently.
|
||||
|
||||
`blog.json` is always the **English source and fallback**. Keep all three files structurally identical — same number of posts, same order, translated content only.
|
||||
|
||||
---
|
||||
|
||||
`blog.json` (and every language variant) is a root-level JSON array. Every post object contains **exactly these five fields**:
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"area": "Automation",
|
||||
"date": "2026-03-25",
|
||||
"title": "Article title as plain text",
|
||||
"teaser": "<p>One or two sentences visible before 'Read more'.</p>",
|
||||
"content": "<h3>Section</h3><p>Full article as HTML.</p>"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
| Field | Type | Constraint |
|
||||
|---|---|---|
|
||||
| `area` | plain string | Category label rendered above the title |
|
||||
| `date` | ISO 8601 (`YYYY-MM-DD`) | Used by `Intl.DateTimeFormat` |
|
||||
| `title` | plain string | Rendered as `<h3>` — no HTML |
|
||||
| `teaser` | HTML string | Always visible — wrap in `<p>` tags |
|
||||
| `content` | HTML string | Revealed by "Read more" toggle — use `<h3>`, `<p>`, `<ul>`, `<li>` |
|
||||
|
||||
NEVER add extra fields (`slug`, `author`, `tags`, `excerpt`, `hero_image`, etc.) — they are ignored by the renderer and pollute the file.
|
||||
|
||||
### Adding a new blog post (jq method)
|
||||
|
||||
> Add to **all three files** in the same session. A post that exists in English but not in Spanish/German will silently fall back to the English version for those visitors — which is acceptable temporarily but should be resolved promptly.
|
||||
|
||||
```bash
|
||||
# 1. Pull latest
|
||||
git pull origin main
|
||||
|
||||
# 2. Backup all blog files once per session
|
||||
mkdir -p /backup
|
||||
for f in blog.json blog.es.json blog.de.json; do
|
||||
cp $f /backup/$f.$(date +%Y%m%d%H%M%S)
|
||||
done
|
||||
|
||||
# 3. Prepend new post to each language file
|
||||
# $NEW_EN, $NEW_ES, $NEW_DE must each be a valid single post object
|
||||
jq --argjson new "$NEW_EN" '. = [$new] + .' blog.json > tmp.json && mv tmp.json blog.json
|
||||
jq --argjson new "$NEW_ES" '. = [$new] + .' blog.es.json > tmp.json && mv tmp.json blog.es.json
|
||||
jq --argjson new "$NEW_DE" '. = [$new] + .' blog.de.json > tmp.json && mv tmp.json blog.de.json
|
||||
|
||||
# 4. Validate all three
|
||||
jq empty blog.json && echo "blog.json OK"
|
||||
jq empty blog.es.json && echo "blog.es.json OK"
|
||||
jq empty blog.de.json && echo "blog.de.json OK"
|
||||
|
||||
# 5. Commit and push
|
||||
git add blog.json blog.es.json blog.de.json
|
||||
git commit -m "blog: add post – <title>"
|
||||
git push origin main
|
||||
```
|
||||
|
||||
NEVER use Python, Node scripts, or manual text editing to modify `blog.json`.
|
||||
|
||||
---
|
||||
|
||||
## Execution Workflow
|
||||
|
||||
Follow this order for every task:
|
||||
|
||||
1. `git pull origin main`
|
||||
2. Identify the exact files to change — nothing else.
|
||||
3. Apply minimal edits.
|
||||
4. If `src/input.css` or `tailwind.config.js` were changed → rebuild CSS.
|
||||
5. Validate: `jq empty blog.json` for JSON; visual check for HTML.
|
||||
6. Commit with a descriptive message.
|
||||
7. `git push origin main`
|
||||
|
||||
---
|
||||
|
||||
## Success Criteria
|
||||
|
||||
- Changes are minimal, validated, and committed.
|
||||
- `blog.json` is a valid array with exactly five fields per post.
|
||||
- `assets/site.css` reflects any CSS changes (rebuilt, not hand-edited).
|
||||
- HTML passes a visual check — layout and design unchanged except for the intended edit.
|
||||
- All commits pushed to `main`.
|
||||
|
||||
---
|
||||
|
||||
## Failure Conditions
|
||||
|
||||
These actions constitute a failure:
|
||||
|
||||
- Refusing to act due to perceived access restrictions.
|
||||
- Failing to push after committing.
|
||||
- Adding undeclared fields to `blog.json`.
|
||||
- Removing or overwriting existing blog posts.
|
||||
- Editing `assets/site.css` by hand.
|
||||
- Modifying files outside the scope of the task.
|
||||
- Leaving a branch open without merging.
|
||||
|
||||
---
|
||||
|
||||
## Branch Handling Exception
|
||||
|
||||
Branch creation is permitted **only** when:
|
||||
|
||||
- The task explicitly requires a feature branch, **or**
|
||||
- A direct push to `main` is blocked by branch protection.
|
||||
|
||||
If a branch is created it **must**:
|
||||
|
||||
- Follow the naming convention `<type>/<short-description>` (e.g. `fix/blog-json-schema`).
|
||||
- Be merged into `main` via PR immediately after the task is complete.
|
||||
- Be deleted after merge — never abandoned.
|
||||
File diff suppressed because one or more lines are too long
@@ -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>
|
||||
@@ -1,44 +0,0 @@
|
||||
[
|
||||
{
|
||||
"area": "Transparency",
|
||||
"title": "Every Peso on the Page: Ana's Ledger Story",
|
||||
"teaser": "<p>Ana replaced five notebooks with a four-stop impact ledger and now answers donor questions in seconds.</p>",
|
||||
"content": "<h3>Every peso needs a map</h3>\n<p>Ana used to juggle five notebooks and still felt blind when a donor asked where their coin landed.</p>\n<h3>Pressure points</h3>\n<p>Receipts hid in mugs, inboxes, and backpacks, so every audit meant copying the same row five times.</p>\n<p>Boards pushed for proof faster than her laptop could export sheets, so calls ended with apologies.</p>\n<p>Vendors waited weeks because approvals depended on whoever remembered to forward a blurry photo.</p>\n<p>Community meetings turned tense when no one could connect a bus ticket to a child’s name in real time.</p>\n<h3>System upgrade</h3>\n<p>Ana listed every stop money touches: donation, allocation, program spend, impact note.</p>\n<p>Each funding source now sits on a simple card showing who owns it and what is due.</p>\n<p>Odoo acts like a shared notebook; every card links to tags, receipts, and the promise behind the peso.</p>\n<p>Receipts arrive through a one-question webform, and n8n files them while pinging the right teammate.</p>\n<p>An AI scribe drafts the Friday recap so donors hear “Twelve bus rides covered” instead of raw numbers.</p>\n<p>Dashboards mix pesos, quotes, and photos so anyone can understand the path without spreadsheets.</p>\n<h3>Controls and rituals</h3>\n<p>Program leads drop 20-second voice notes beside transactions, turning expenses into mini field reports.</p>\n<p>Monthly reviews start with one shared view, so no one emails attachments named “final_v7.xlsx.”</p>\n<p>Vendors sign reimbursements inside the same screen, keeping cash flow visible for everyone.</p>\n<p>Audit packets assemble in three clicks because every receipt already lives on its card.</p>\n<p>Community assemblies now show a single screen that pairs pesos with tickets and class photos.</p>\n<ul>\n <li>Ledger lane: donation → tag → receipt → quote.</li>\n <li>Reminder loop: webform → n8n alert → approval in Odoo.</li>\n <li>Donor pack: one graph, two sentences, one photo.</li>\n</ul>\n<h3>Governance wins</h3>\n<p>Restricted funds carry color labels so staff know which pesos can move and which must stay put.</p>\n<p>Variance alerts fire when a promise slips, giving Ana 48 hours to fix it before donors notice.</p>\n<p>Impact notes sync to donor cards, so every thank-you includes the latest field quote.</p>\n<p>Training new volunteers takes twenty minutes because the process lives inside the cards, not in Ana's head.</p>\n<ul>\n <li>Color coding: blue for scholarship, green for bus fuel, gold for emergency repairs.</li>\n <li>Two-minute onboarding video embedded on every card.</li>\n <li>Alert ladder: email at 24 hours, WhatsApp ping at 48, phone call at 72.</li>\n </ul>\n<h3>Results that stick</h3>\n<p>Reimbursements clear within 48 hours, so vendors keep extending gentle credit.</p>\n<p>Audit fees dropped by 15% because firms spend less time chasing evidence.</p><p>Board calls shifted from “Where is the proof?” to “Can we share this ledger publicly?”</p>\n<p>Staff now clock out at 7 p.m. because reconciliation no longer eats the night.</p>\n<p>Students narrate the dashboard column by column, which builds trust faster than static PDFs.</p><p>Grant partners log in as viewers and pull their own numbers instead of emailing last-minute lists.</p>\n<p>The finance committee now focuses on scenario planning rather than detective work.</p>\n<p><strong>Micro-CTA:</strong> Want Ana’s four-stop ledger map? Reply “ledger” and I’ll send the template.</p>\n<h3>Story beats returned</h3>\n<p>The organization still hustles, but the hustle now has lanes, and Ana rides the 7:15 bus home holding a calm heart instead of a stack of IOUs.</p>\n<h3>Your invitation</h3>\n<p>Book a 30-minute impact-ledger clinic. We’ll map two of your funding streams, load them into an Odoo sandbox, and show how a reminder bot can keep receipts in line without late nights.</p>\n",
|
||||
"date": "2026-03-22"
|
||||
},
|
||||
{
|
||||
"area": "Fundraising",
|
||||
"title": "From One-Time Gifts to Farm Friends: Tomas' Relationship Journal",
|
||||
"teaser": "<p>Tomas' relationship journal keeps every donor promise on time and turns farm visitors into recurring supporters.</p>",
|
||||
"content": "<h3>From one-time gifts to farm friends</h3>\n<p>Tomas dreaded the silence after every big appeal because each unanswered thank-you felt like losing a future harvest.</p>\n<h3>Where the leaks lived</h3>\n<p>Welcome emails left days late since volunteers worked from separate inboxes.</p>\n<p>Birthdays hid in a paper planner that once soaked up a rainstorm.</p>\n<p>Corporate sponsors received the same PDF regardless of what crops they cared about.</p>\n<p>Board reviews turned into guessing games about which families might donate again.</p>\n<h3>The rebuild</h3>\n<p>Tomas moved everything into a lightweight Odoo workspace he calls the relationship journal.</p>\n<p>Each supporter card shows origin story, favorite program, and next touchpoint in one glance.</p>\n<p>He mapped three paths: new friend, seasonal donor, recurring guardian.</p>\n<p>Tasks now show one line: owner, due date, and purpose.</p>\n<p>n8n schedules nudges the moment a gift arrives, so someone always follows up within 48 hours.</p>\n<p>An AI drafting buddy writes first-pass thank-you notes using the details already on each card.</p>\n<h3>Data made friendly</h3>\n<p>Supporters are tagged by crop, channel, and volunteer interest in plain words like “loves cassava fairs.”</p>\n<p>Segment dashboards show which stories pull one-time donors into the recurring lane.</p>\n<p>Monthly reviews ask one question: Which color column needs attention?</p>\n<ul>\n <li>Blue tiles = families who gave at events.</li>\n <li>Orange tiles = businesses who sponsor seedlings.</li>\n <li>Purple tiles = diaspora donors following WhatsApp updates.</li>\n </ul>\n<h3>Human touches</h3>\n<p>Field photos upload straight from phones, and Odoo resizes them so they look great on any device.</p><p>Tomas records 60-second voice notes from the fields and attaches them to donor cards.</p>\n<p>Volunteers pull scripts straight from Odoo, so language stays warm even when teams rotate.</p>\n<p>Dashboard tiles show who has not heard from the collective in 30, 60, and 90 days.</p>\n<ul>\n <li>Green cards = steady supporters with next visit scheduled.</li>\n <li>Yellow cards = need a story update this week.</li>\n <li>Red cards = missed promise; assign a call immediately.</li>\n</ul>\n<h3>Metrics that matter</h3>\n<p>Open tasks dropped by half because every promise now has one owner and timestamp.</p><p>Recurring donors grew 38% once the journal kept promises on time.</p>\n<p>Average thank-you response time dropped to nine hours.</p>\n<p>Volunteers onboard in fifteen minutes because every step sits inside the card.</p>\n<p>Corporate partners now sponsor recurring kits because they see their updates logged in real time.</p><p>Board decks now show journey health instead of raw totals, so planning conversations stay calm.</p>\n<p><strong>Micro-CTA:</strong> Want the three-path relationship map Tomas uses? Reply “journey” and I’ll send the canvas.</p>\n<h3>Implementation sprint</h3>\n<ul>\n <li>Export your top 50 donors and tag them by story interest.</li>\n <li>Draft three touchpoint paths with one welcome, one update, one invite.</li>\n <li>Connect n8n so each donation triggers the right checklist.</li>\n <li>Record one voice memo per week and attach it to the cards that need warmth.</li>\n</ul>\n<p>Teams that follow this sprint usually see dormant donors reply within two weeks.</p>\n<p>Volunteers love the clarity because they can grab the next action during a lunch break.</p><p>Quarterly reviews compare each path, so Tomas can tweak scripts without rebuilding the system.</p>\n\n<h3>Story beats returned</h3>\n<p>The farm still hustles, but now Tomas walks home at sunset knowing every donor hears a fresh story before the soil cools.</p>\n<h3>Your invitation</h3>\n<p>Spin up a free Odoo sandbox and let’s load ten supporter cards together. In one 30-minute clinic we’ll copy Tomas’ paths, hook up n8n reminders, and leave you with scripts volunteers can read tomorrow.</p>\n",
|
||||
"date": "2026-03-18"
|
||||
},
|
||||
{
|
||||
"area": "Digital presence",
|
||||
"title": "Turn Your NGO Website into a Field Walk",
|
||||
"teaser": "<p>Elena's five-block layout makes every site visit feel like a river cleanup, even on a phone.</p>",
|
||||
"content": "<h3>Turn your site into a field walk</h3>\n<p>Elena cringed every time someone opened their website at a street fair because the spinning loader felt like an apology.</p>\n<h3>Issues to fix</h3>\n<p>Pages mixed board minutes with volunteer invites, so nobody knew where to click.</p>\n<p>The donate form had eight required fields and crashed on older phones.</p>\n<p>Images lived on personal devices, so updates stalled whenever volunteers traveled.</p>\n<p>Analytics showed people bounced in under ten seconds.</p>\n<h3>Build blocks, not code</h3>\n<p>Elena moved the site into Odoo’s drag-and-drop builder so every block felt like a card.</p>\n<p>Each section fits on a phone screen: mission, today’s project, proof, ways to help, calendar.</p>\n<p>Real photos upload straight from WhatsApp and resize automatically.</p>\n<p>Testimonials now sit beside the action they describe.</p>\n<p>Donate buttons follow the reader down the page with a single tap checkout.</p>\n<h3>Governance & workflow</h3>\n<p>Editorial calendar lives inside Odoo with color labels for campaigns, reports, and evergreen stories.</p>\n<p>Reviewers get one-click preview links, so approvals happen on WhatsApp instead of email chains.</p>\n<p>Accessibility checks run before publish, flagging low-contrast text in plain language.</p>\n<p>Translations sit beside each block, letting bilingual volunteers ship updates fast.</p>\n<h3>Automation assist</h3>\n<p>n8n resizes images, tags blogs by theme, and cross-posts stories to WhatsApp and email.</p>\n<p>Elena writes once and the reminder bot republishes everywhere.</p>\n<p>An AI headline buddy suggests two simple options per story, so copy stays human.</p><p>Heatmaps highlight which block loses attention so Elena can adjust the layout weekly.</p>\n<p>Error logs show if someone’s phone fails mid-form, helping the team fix issues before a campaign.</p>\n<p>Weekly summary emails pull site stats plus top-performing sections for the board.</p>\n<h3>Content structure</h3>\n<p>Downloadable kits live behind simple buttons, so teachers grab lesson plans without emails.</p><p>Each article follows a three-block rhythm: hook, proof, invite.</p>\n<p>Videos autoplay muted with captions so people understand the scene on crowded buses.</p>\n<p>Callout cards explain tools in plain phrases: “Map every cleanup in one shared calendar.”</p>\n<ul>\n <li>Hero row: bold photo + 12-word promise.</li>\n <li>Impact grid: three stats with icons.</li>\n <li>Action tray: volunteer form, donate, share.</li>\n</ul>\n<h3>Results</h3>\n<p>Average time on page tripled and bounce rate dropped below 30%.</p>\n<p>Volunteer signups happen on mobile because the form now has three fields.</p>\n<p>SEO basics improved because every block now has alt text and descriptive slugs.</p><p>Board members review live dashboards instead of PDFs.</p>\n<p>Funders cite the site during calls because proof is easy to show.</p>\n<p><strong>Micro-CTA:</strong> Need Elena’s five-section layout? Reply “walk” and I’ll send the wireframe.</p>\n<h3>Quick launch plan</h3>\n<ul>\n <li>Sketch five sections on paper and test with two volunteers.</li>\n <li>Upload one real photo per section; skip stock imagery.</li>\n <li>Wire n8n to resize and tag assets automatically.</li>\n <li>Schedule a weekly 30-minute content sweep to keep blocks fresh.</li>\n</ul>\n<p>Most teams ship a refreshed homepage in under two days using this plan.</p>\n<p>Keep a punch list of “next swap” items so volunteers can help during downtime.</p><p>Use simple analytics goals like “Time on page > 90 seconds” to measure if the story lands.</p>\n\n<h3>Story beats returned</h3>\n<p>The site finally feels like the river trail Elena loves, and neighbors stay long enough to smell the wet soil through their screens.</p>\n<h3>Your invitation</h3>\n<p>Book a website tune-up clinic. We’ll sketch your content blocks, load them into an Odoo sandbox, hook n8n to your photo sources, and leave you with headlines any volunteer can publish.</p>\n",
|
||||
"date": "2026-03-12"
|
||||
},
|
||||
{
|
||||
"area": "Operations",
|
||||
"title": "Calm Ops for Five-Person Teams: Paula's Playbook",
|
||||
"teaser": "<p>Paula's shared board, three kits, and reminder bots give her tiny team calm lanes again.</p>",
|
||||
"content": "<h3>Small team, calmer ops</h3>\n<p>Paula’s five-person crew once survived on coffee and miracles, and every missed grant email felt like letting the clinic down.</p>\n<h3>Where chaos hid</h3>\n<p>Tasks lived in WhatsApp, paper folders, and sticky notes taped to doors.</p>\n<p>Expense approvals stalled because the volunteer bookkeeper checked email at midnight.</p>\n<p>Volunteers requested time off via voice notes, so schedules overlapped without warning.</p>\n<p>Board calls devolved into status therapy instead of strategic planning.</p>\n<h3>Operating spine</h3>\n<p>Paula mapped every recurring task and moved it into Odoo boards labeled This Week, Blocked, Done.</p>\n<p>Each card lists owner, due date, and checklist in two lines.</p>\n<p>Expense records attach directly to tasks, so reimbursements sit next to receipts.</p>\n<p>Standard kits—clinic, workshop, grant—bundle supplies, links, and photos of “done.”</p><p>Each kit also lists backup owners so vacations stop being crises.</p>\n<ul>\n <li>Clinic kit: tents, coolers, intake forms, walkie-charge reminder.</li>\n <li>Workshop kit: markers, snacks, attendance sheet, follow-up template.</li>\n <li>Grant kit: metrics link, testimonial prompt, submission portal.</li>\n</ul>\n<h3>Visibility upgrades</h3>\n<p>Risk cards surface at the top whenever deadlines approach, so leadership sees trouble before it burns staff.</p>\n<p>Meeting notes live inside the task they reference, making handoffs painless.</p>\n<p>Quarterly calendars hang beside the board and mirror the same color codes.</p>\n<h3>Automation assist</h3>\n<p>n8n routes webforms, pings owners when tasks age, and batches approvals before lunch.</p><p>Escalations ladder from email to WhatsApp to phone call if a blocker lingers more than 48 hours.</p>\n<p>Volunteer hours log automatically when someone submits the attendance form.</p>\n<p>An AI summary buddy sends Paula a nightly paragraph with wins, risks, and supply levels.</p>\n<p>Color labels show which funder cares about each task, avoiding compliance missteps.</p><p>Grant attachments stay versioned inside the card, so no one emails “final_final.pdf” ever again.</p>\n<h3>Working rhythm</h3>\n<p>Monday stand-ups start with the shared board projected on the wall.</p>\n<p>Quiet Wednesdays block meetings so staff can finish deep work.</p>\n<p>Weekly “clear bins” hour means everyone empties inboxes while the board stays open.</p><p>Friday reflections capture lessons learned directly on the board so next week starts sharper.</p>\n<p>Energy check stickers track morale on a wall chart.</p><p>Red stickers trigger a five-minute retro so the team fixes friction before it festers.</p>\n<h3>Metrics</h3>\n<p>Grant packets now ship three days early.</p>\n<p>Average reimbursement time fell to 36 hours.</p><p>Procurement cycle time shrank by 40% because approvals travel with the task.</p>\n<p>Volunteer onboarding lasts 20 minutes because the process lives inside the cards.</p>\n<p>Funder check-ins shortened because dashboards answer status questions at a glance.</p><p>Burnout signals—sick days, tense meetings—dropped sharply once lanes were visible.</p>\n<p><strong>Micro-CTA:</strong> Want Paula’s three-kit template? Reply “ops” and I’ll send the board layout.</p>\n<h3>Four-step rollout</h3>\n<ul>\n <li>List every recurring task and tag who truly owns it.</li>\n <li>Clone Paula's three kits and rename them for your programs.</li>\n <li>Hook n8n to your intake forms so work lands in the right lane.</li>\n <li>Set two check windows per week to clear blockers in under 15 minutes.</li>\n</ul>\n<p>Teams usually reclaim 6–8 staff hours per week once this cadence sticks.</p>\n<p>Use those hours for prevention work: training, donor care, or rest.</p>\n\n<h3>Story beats returned</h3>\n<p>The organization still hustles, but the hustle now has lanes, and Paula walks home before sunset while the reminder bot keeps promises steady.</p>\n<h3>Your invitation</h3>\n<p>Book a free ops audit call. We’ll clone Paula’s board in your sandbox, wire n8n to your forms, and leave you with a checklist that keeps five-person teams sane.</p>\n",
|
||||
"date": "2026-03-05"
|
||||
},
|
||||
{
|
||||
"area": "Donor data",
|
||||
"title": "Build a Relationship Atlas Like Idris",
|
||||
"teaser": "<p>Idris' relationship atlas turns scattershot spreadsheets into humane tags, reminders, and quick compliance wins.</p>",
|
||||
"content": "<h3>Build a relationship atlas</h3>\n<p>Idris hated guessing which donors cared most because every wrong thank-you felt like letting someone down.</p>\n<h3>Pains</h3>\n<p>Six spreadsheets, three CRMs, and a shoebox of pledge cards all told different stories.</p>\n<p>Privacy requests took weeks because data sat in personal inboxes.</p>\n<p>Board members asked for regional insights he could only estimate.</p>\n<p>Volunteers kept their own contact lists, so follow-ups collided.</p>\n<h3>Single source of truth</h3>\n<p>Idris imported everything into Odoo and nicknamed it the relationship atlas.</p>\n<p>Each supporter card shows giving history, volunteer hours, favorite program, and preferred channel in one view.</p>\n<p>Tags read like stories: “cares about maternal health,” “joins WhatsApp lives,” “hosts clinics in the Chaco.”</p>\n<p>Consent fields sit at the top so compliance is a two-click job.</p><p>Notes include pronunciation tips and personal preferences so every interaction feels human.</p>\n<h3>Automation loop</h3>\n<p>n8n watches forms, webinars, and replies, then updates the right card automatically.</p>\n<p>Reminder bots create tasks when someone goes 45 days without a touch.</p>\n<p>An AI scribe scans meeting notes and suggests segments Idris might have missed.</p><p>Suggested segments come with sample language, so outreach stays consistent even when staff rotate.</p>\n<p>Alerts escalate from email to WhatsApp when a promise is about to slip.</p>\n<h3>Dashboards that talk like humans</h3>\n<p>Heat maps show supporters by region with real photos.</p>\n<p>Rhythm boards display who heard from the team this week, month, and quarter.</p>\n<p>Promise trackers highlight pending callbacks with color codes.</p><p>Leaders can filter by “next visit” to plan travel without extra spreadsheets.</p>\n<ul>\n <li>Blue = steady supporters ready for deeper invite.</li>\n <li>Yellow = needs story update within seven days.</li>\n <li>Red = missed commitment; assign personally.</li>\n</ul>\n<h3>Implementation steps</h3>\n<ul>\n <li>Export contacts from every source and label them with plain-language tags.</li>\n <li>Deduplicate inside Odoo using email + phone as anchors.</li>\n <li>Embed a simple preference form so supporters update their own data.</li>\n <li>Schedule weekly “atlas sweeps” to review alerts and close loops.</li>\n</ul>\n<p>These sweeps take 20 minutes when everyone owns their slice.</p>\n<p>Volunteers see the same view, so handoffs finally feel respectful.</p><p>Partner organizations can receive read-only links, keeping coalitions aligned without extra exports.</p>\n<h3>Operational wins</h3>\n<p>Event RSVPs sync automatically, so Idris knows who to greet by name.</p><p>Segmented campaigns now send health advocates clinic updates while corporate donors get quarterly kits.</p>\n<p>Lapsed supporters receive friendly voice memos instead of generic emails.</p><p>Data health score appears on the dashboard so the team knows when to clean duplicates.</p>\n<p>Deletion requests finish in under an hour with audit logs attached.</p><p>Data exports for funders now take minutes because filters remember the last settings.</p>\n<p>Retention jumped 12% because people hear from the team before they feel forgotten.</p><p>Board decks now include one slide per segment with photos and next steps.</p>\n<p><strong>Micro-CTA:</strong> Need the atlas tagging sheet? Reply “atlas” and I’ll send the workbook.</p>\n<h3>Signals worth monitoring</h3>\n<p>Weekly: touchpoint gaps by segment.</p><p>Daily: check for bounced emails or unsubscribes so you can switch channels fast.</p>\n<p>Monthly: conversion from one-time to recurring gifts.</p>\n<p>Quarterly: data health score and consent updates.</p>\n<p>Flag anything red for 48 hours and assign a specific owner.</p>\n<h3>Story beats returned</h3>\n<p>The atlas means Idris walks into meetings knowing who needs care, and donors feel remembered instead of managed.</p>\n<h3>Your invitation</h3>\n<p>Start a free Odoo sandbox and bring three messy lists to a 30-minute map-making session. We’ll clean them live, wire n8n updates, and leave you with segments you can act on tomorrow.</p>\n",
|
||||
"date": "2026-02-26"
|
||||
},
|
||||
{
|
||||
"area": "Sustainability",
|
||||
"title": "How Lila Turned Cash Flow into a Calm Heartbeat",
|
||||
"teaser": "<p>Lila's money-weather calendar shows every cliff before it hits and keeps reserves growing.</p>",
|
||||
"content": "<h3>Cash flow needs a heartbeat</h3>\n<p>Lila was tired of praying every March because each late rent payment felt like telling families their shelter might vanish.</p>\n<h3>Cliffs to smooth</h3>\n<p>Income arrived in unpredictable bursts while expenses stayed steady.</p>\n<p>Sticky-note calendars overlapped, so no one saw when grants and payroll collided.</p>\n<p>Vendors heard “soon” more than “paid,” which strained trust.</p>\n<p>Staff carried stress home because every storm meant emergency appeals.</p>\n<h3>Calendar overhaul</h3>\n<p>Lila sketched a wall-sized calendar and marked every income stream in one color.</p>\n<p>Expenses earned their own colors so cliffs jumped off the page.</p>\n<p>She moved the plan into Odoo so updates happen once and appear everywhere.</p>\n<p>Each funding source now has a simple card showing owner, due date, and health.</p>\n<p>Reserve tracker nudges her to move money into savings whenever cash exceeds a safe line.</p><p>Each nudge includes a suggested amount so she builds reserves in bite-sized transfers.</p>\n<h3>Data on one screen</h3>\n<p>Cards show amount expected, confidence level, and last touch in plain words.</p>\n<p>Color labels: green for confirmed, yellow for pending, red for risk.</p>\n<p>Scenario slider lets Lila test “what if grant X delays 30 days” without new sheets.</p>\n<h3>Automation guardrails</h3>\n<p>n8n watches deadlines, renewals, and grant reports, then pings owners before crunch time.</p>\n<p>Dashboards display twelve months of runway plus a “money weather” icon the team understands at a glance.</p>\n<p>Alerts escalate if reserves dip below target, giving leadership days to respond.</p><p>Expense approvals show impact notes so finance knows why the spend matters.</p>\n<p>Vendors submit invoices through a webform so approvals travel with documentation.</p><p>Vendors now see status labels on their invoices, so they know when funds will land.</p>\n<h3>Communication rhythm</h3>\n<p>Staff receive a monthly money weather note using sunny/cloudy/rainy icons.</p>\n<p>Quarterly “friends of Puentes” emails explain where funds went and what’s next.</p>\n<p>Community budget circles vote on flexible funds and suggest low-lift fundraisers.</p><p>Notes from each circle feed back into Odoo so ideas become tasks instantly.</p>\n<p>Dashboards stream to a TV in the workspace, making cash position visible all day.</p><p>Board members log in remotely and leave comments on specific cards instead of firing off emails.</p>\n<ul>\n <li>Monday: review runway line and upcoming cliffs.</li>\n <li>Wednesday: confirm reserve transfers.</li>\n <li>Thursday: check subsidy renewals against alerts.</li>\n <li>Friday: send weather note before people log off.</li>\n</ul>\n<h3>Metrics</h3>\n<p>Reserve now covers two months of core costs.</p>\n<p>Vendors are paid within five days, improving terms.</p>\n<p>Emergency appeals dropped because runway forecasts flag issues early.</p><p>Scenario drills now happen quarterly so nothing feels like a surprise fire drill.</p>\n<p>Board meetings focus on partnerships instead of patching leaks.</p><p>Staff stress surveys show a 30% drop in “money worries” mentions.</p>\n<h3>Rollout plan</h3>\n<ul>\n <li>List every income stream with amount, timing, and confidence.</li>\n <li>Plot expenses in the same calendar, highlighting spikes.</li>\n <li>Move both into Odoo cards and tag owners.</li>\n <li>Set n8n alerts for renewals, reserve dips, and vendor payments.</li>\n</ul>\n<p>This takes one afternoon and replaces months of scrambling.</p>\n<p><strong>Micro-CTA:</strong> Want the money weather template? Reply “weather” and I’ll send the kit.</p>\n\n<h3>Story beats returned</h3>\n<p>The organization still hustles, but the hustle now has lanes, and Lila rings a tiny bell every time the reserve line inches upward.</p>\n<h3>Your invitation</h3>\n<p>Subscribe to the NGO ops newsletter or book a funding calendar clinic. We’ll map your cliffs, load them into an Odoo sandbox, wire n8n alerts, and leave you with a calm heartbeat you can explain in five minutes.</p>\n",
|
||||
"date": "2026-02-19"
|
||||
}
|
||||
]
|
||||
BIN
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
@@ -0,0 +1 @@
|
||||
google-site-verification: google261cafffa78d8c3d.html
|
||||
+114
@@ -0,0 +1,114 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg fill="#000000" width="800px" height="800px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(1,0,0,1,-1152,-256)">
|
||||
<rect id="Icons" x="0" y="0" width="1280" height="800" style="fill:none;"/>
|
||||
<g id="Icons1" serif:id="Icons">
|
||||
<g id="Strike">
|
||||
</g>
|
||||
<g id="H1">
|
||||
</g>
|
||||
<g id="H2">
|
||||
</g>
|
||||
<g id="H3">
|
||||
</g>
|
||||
<g id="list-ul">
|
||||
</g>
|
||||
<g id="hamburger-1">
|
||||
</g>
|
||||
<g id="hamburger-2">
|
||||
</g>
|
||||
<g id="list-ol">
|
||||
</g>
|
||||
<g id="list-task">
|
||||
</g>
|
||||
<g id="trash">
|
||||
</g>
|
||||
<g id="vertical-menu">
|
||||
</g>
|
||||
<g id="horizontal-menu">
|
||||
</g>
|
||||
<g id="sidebar-2">
|
||||
</g>
|
||||
<g id="Pen">
|
||||
</g>
|
||||
<g id="Pen1" serif:id="Pen">
|
||||
</g>
|
||||
<g id="clock">
|
||||
</g>
|
||||
<g id="external-link">
|
||||
</g>
|
||||
<g id="hr">
|
||||
</g>
|
||||
<g id="info">
|
||||
</g>
|
||||
<g id="warning">
|
||||
</g>
|
||||
<g id="plus-circle">
|
||||
</g>
|
||||
<g id="minus-circle">
|
||||
</g>
|
||||
<g id="vue">
|
||||
</g>
|
||||
<g id="cog">
|
||||
</g>
|
||||
<g id="logo">
|
||||
</g>
|
||||
<g id="radio-check">
|
||||
</g>
|
||||
<g id="eye-slash">
|
||||
</g>
|
||||
<g id="eye">
|
||||
</g>
|
||||
<g id="toggle-off">
|
||||
</g>
|
||||
<g id="shredder">
|
||||
</g>
|
||||
<g id="spinner--loading--dots-" serif:id="spinner [loading, dots]">
|
||||
</g>
|
||||
<g id="react">
|
||||
</g>
|
||||
<g id="check-selected">
|
||||
</g>
|
||||
<g id="turn-off">
|
||||
</g>
|
||||
<g id="code-block">
|
||||
</g>
|
||||
<g id="user">
|
||||
</g>
|
||||
<g id="coffee-bean">
|
||||
</g>
|
||||
<g transform="matrix(0.638317,0.368532,-0.368532,0.638317,785.021,-208.975)">
|
||||
<g id="coffee-beans">
|
||||
<g id="coffee-bean1" serif:id="coffee-bean">
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="coffee-bean-filled" transform="matrix(0.866025,0.5,-0.5,0.866025,717.879,-387.292)">
|
||||
<g transform="matrix(1,0,0,1,0,-0.699553)">
|
||||
<path d="M737.673,328.231C738.494,328.056 739.334,328.427 739.757,329.152C739.955,329.463 740.106,329.722 740.106,329.722C740.106,329.722 745.206,338.581 739.429,352.782C737.079,358.559 736.492,366.083 738.435,371.679C738.697,372.426 738.482,373.258 737.89,373.784C737.298,374.31 736.447,374.426 735.735,374.077C730.192,371.375 722.028,365.058 722.021,352C722.015,340.226 728.812,330.279 737.673,328.231Z"/>
|
||||
</g>
|
||||
<g transform="matrix(-1,0,0,-1,1483.03,703.293)">
|
||||
<path d="M737.609,328.246C738.465,328.06 739.344,328.446 739.785,329.203C739.97,329.49 740.106,329.722 740.106,329.722C740.106,329.722 745.206,338.581 739.429,352.782C737.1,358.507 736.503,365.948 738.383,371.527C738.646,372.304 738.415,373.164 737.796,373.703C737.177,374.243 736.294,374.356 735.56,373.989C730.02,371.241 722.028,364.92 722.021,352C722.016,340.255 728.779,330.328 737.609,328.246Z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(0.638317,0.368532,-0.368532,0.638317,913.062,-208.975)">
|
||||
<g id="coffee-beans-filled">
|
||||
<g id="coffee-bean2" serif:id="coffee-bean">
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="clipboard">
|
||||
</g>
|
||||
<g transform="matrix(1,0,0,1,128.011,1.35415)">
|
||||
<g id="clipboard-paste">
|
||||
</g>
|
||||
</g>
|
||||
<g id="clipboard-copy">
|
||||
</g>
|
||||
<g id="Layer1">
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.5 KiB |
@@ -0,0 +1,224 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
|
||||
<svg
|
||||
fill="#000000"
|
||||
width="800px"
|
||||
height="800px"
|
||||
viewBox="0 0 64 64"
|
||||
version="1.1"
|
||||
xml:space="preserve"
|
||||
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"
|
||||
id="svg6"
|
||||
sodipodi:docname="bean_dark_Roast.svg"
|
||||
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:serif="http://www.serif.com/"><defs
|
||||
id="defs6" /><sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:zoom="1.075"
|
||||
inkscape:cx="400"
|
||||
inkscape:cy="400"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1129"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg6" />
|
||||
<g
|
||||
transform="matrix(1,0,0,1,-1152,-256)"
|
||||
id="g6">
|
||||
<rect
|
||||
id="Icons"
|
||||
x="0"
|
||||
y="0"
|
||||
width="1280"
|
||||
height="800"
|
||||
style="fill:none;" />
|
||||
<g
|
||||
id="Icons1"
|
||||
serif:id="Icons">
|
||||
<g
|
||||
id="Strike">
|
||||
</g>
|
||||
<g
|
||||
id="H1">
|
||||
</g>
|
||||
<g
|
||||
id="H2">
|
||||
</g>
|
||||
<g
|
||||
id="H3">
|
||||
</g>
|
||||
<g
|
||||
id="list-ul">
|
||||
</g>
|
||||
<g
|
||||
id="hamburger-1">
|
||||
</g>
|
||||
<g
|
||||
id="hamburger-2">
|
||||
</g>
|
||||
<g
|
||||
id="list-ol">
|
||||
</g>
|
||||
<g
|
||||
id="list-task">
|
||||
</g>
|
||||
<g
|
||||
id="trash">
|
||||
</g>
|
||||
<g
|
||||
id="vertical-menu">
|
||||
</g>
|
||||
<g
|
||||
id="horizontal-menu">
|
||||
</g>
|
||||
<g
|
||||
id="sidebar-2">
|
||||
</g>
|
||||
<g
|
||||
id="Pen">
|
||||
</g>
|
||||
<g
|
||||
id="Pen1"
|
||||
serif:id="Pen">
|
||||
</g>
|
||||
<g
|
||||
id="clock">
|
||||
</g>
|
||||
<g
|
||||
id="external-link">
|
||||
</g>
|
||||
<g
|
||||
id="hr">
|
||||
</g>
|
||||
<g
|
||||
id="info">
|
||||
</g>
|
||||
<g
|
||||
id="warning">
|
||||
</g>
|
||||
<g
|
||||
id="plus-circle">
|
||||
</g>
|
||||
<g
|
||||
id="minus-circle">
|
||||
</g>
|
||||
<g
|
||||
id="vue">
|
||||
</g>
|
||||
<g
|
||||
id="cog">
|
||||
</g>
|
||||
<g
|
||||
id="logo">
|
||||
</g>
|
||||
<g
|
||||
id="radio-check">
|
||||
</g>
|
||||
<g
|
||||
id="eye-slash">
|
||||
</g>
|
||||
<g
|
||||
id="eye">
|
||||
</g>
|
||||
<g
|
||||
id="toggle-off">
|
||||
</g>
|
||||
<g
|
||||
id="shredder">
|
||||
</g>
|
||||
<g
|
||||
id="spinner--loading--dots-"
|
||||
serif:id="spinner [loading, dots]">
|
||||
</g>
|
||||
<g
|
||||
id="react">
|
||||
</g>
|
||||
<g
|
||||
id="check-selected">
|
||||
</g>
|
||||
<g
|
||||
id="turn-off">
|
||||
</g>
|
||||
<g
|
||||
id="code-block">
|
||||
</g>
|
||||
<g
|
||||
id="user">
|
||||
</g>
|
||||
<g
|
||||
id="coffee-bean">
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(0.638317,0.368532,-0.368532,0.638317,785.021,-208.975)"
|
||||
id="g1">
|
||||
<g
|
||||
id="coffee-beans">
|
||||
<g
|
||||
id="coffee-bean1"
|
||||
serif:id="coffee-bean">
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="coffee-bean-filled"
|
||||
transform="matrix(0.866025,0.5,-0.5,0.866025,717.879,-387.292)">
|
||||
<g
|
||||
transform="matrix(1,0,0,1,0,-0.699553)"
|
||||
id="g2">
|
||||
<path
|
||||
d="M737.673,328.231C738.494,328.056 739.334,328.427 739.757,329.152C739.955,329.463 740.106,329.722 740.106,329.722C740.106,329.722 745.206,338.581 739.429,352.782C737.079,358.559 736.492,366.083 738.435,371.679C738.697,372.426 738.482,373.258 737.89,373.784C737.298,374.31 736.447,374.426 735.735,374.077C730.192,371.375 722.028,365.058 722.021,352C722.015,340.226 728.812,330.279 737.673,328.231Z"
|
||||
id="path1"
|
||||
style="fill:#3e2723;fill-opacity:1" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(-1,0,0,-1,1483.03,703.293)"
|
||||
id="g3">
|
||||
<path
|
||||
d="M737.609,328.246C738.465,328.06 739.344,328.446 739.785,329.203C739.97,329.49 740.106,329.722 740.106,329.722C740.106,329.722 745.206,338.581 739.429,352.782C737.1,358.507 736.503,365.948 738.383,371.527C738.646,372.304 738.415,373.164 737.796,373.703C737.177,374.243 736.294,374.356 735.56,373.989C730.02,371.241 722.028,364.92 722.021,352C722.016,340.255 728.779,330.328 737.609,328.246Z"
|
||||
id="path2"
|
||||
style="stroke:#3e2723;stroke-opacity:1;fill:#3e2723;fill-opacity:1" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(0.638317,0.368532,-0.368532,0.638317,913.062,-208.975)"
|
||||
id="g4">
|
||||
<g
|
||||
id="coffee-beans-filled">
|
||||
<g
|
||||
id="coffee-bean2"
|
||||
serif:id="coffee-bean">
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="clipboard">
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(1,0,0,1,128.011,1.35415)"
|
||||
id="g5">
|
||||
<g
|
||||
id="clipboard-paste">
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="clipboard-copy">
|
||||
</g>
|
||||
<g
|
||||
id="Layer1">
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.4 KiB |
@@ -0,0 +1,224 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
|
||||
<svg
|
||||
fill="#000000"
|
||||
width="800px"
|
||||
height="800px"
|
||||
viewBox="0 0 64 64"
|
||||
version="1.1"
|
||||
xml:space="preserve"
|
||||
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"
|
||||
id="svg6"
|
||||
sodipodi:docname="bean_light_brown.svg"
|
||||
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:serif="http://www.serif.com/"><defs
|
||||
id="defs6" /><sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:zoom="1.075"
|
||||
inkscape:cx="400"
|
||||
inkscape:cy="400"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1129"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg6" />
|
||||
<g
|
||||
transform="matrix(1,0,0,1,-1152,-256)"
|
||||
id="g6">
|
||||
<rect
|
||||
id="Icons"
|
||||
x="0"
|
||||
y="0"
|
||||
width="1280"
|
||||
height="800"
|
||||
style="fill:none;" />
|
||||
<g
|
||||
id="Icons1"
|
||||
serif:id="Icons">
|
||||
<g
|
||||
id="Strike">
|
||||
</g>
|
||||
<g
|
||||
id="H1">
|
||||
</g>
|
||||
<g
|
||||
id="H2">
|
||||
</g>
|
||||
<g
|
||||
id="H3">
|
||||
</g>
|
||||
<g
|
||||
id="list-ul">
|
||||
</g>
|
||||
<g
|
||||
id="hamburger-1">
|
||||
</g>
|
||||
<g
|
||||
id="hamburger-2">
|
||||
</g>
|
||||
<g
|
||||
id="list-ol">
|
||||
</g>
|
||||
<g
|
||||
id="list-task">
|
||||
</g>
|
||||
<g
|
||||
id="trash">
|
||||
</g>
|
||||
<g
|
||||
id="vertical-menu">
|
||||
</g>
|
||||
<g
|
||||
id="horizontal-menu">
|
||||
</g>
|
||||
<g
|
||||
id="sidebar-2">
|
||||
</g>
|
||||
<g
|
||||
id="Pen">
|
||||
</g>
|
||||
<g
|
||||
id="Pen1"
|
||||
serif:id="Pen">
|
||||
</g>
|
||||
<g
|
||||
id="clock">
|
||||
</g>
|
||||
<g
|
||||
id="external-link">
|
||||
</g>
|
||||
<g
|
||||
id="hr">
|
||||
</g>
|
||||
<g
|
||||
id="info">
|
||||
</g>
|
||||
<g
|
||||
id="warning">
|
||||
</g>
|
||||
<g
|
||||
id="plus-circle">
|
||||
</g>
|
||||
<g
|
||||
id="minus-circle">
|
||||
</g>
|
||||
<g
|
||||
id="vue">
|
||||
</g>
|
||||
<g
|
||||
id="cog">
|
||||
</g>
|
||||
<g
|
||||
id="logo">
|
||||
</g>
|
||||
<g
|
||||
id="radio-check">
|
||||
</g>
|
||||
<g
|
||||
id="eye-slash">
|
||||
</g>
|
||||
<g
|
||||
id="eye">
|
||||
</g>
|
||||
<g
|
||||
id="toggle-off">
|
||||
</g>
|
||||
<g
|
||||
id="shredder">
|
||||
</g>
|
||||
<g
|
||||
id="spinner--loading--dots-"
|
||||
serif:id="spinner [loading, dots]">
|
||||
</g>
|
||||
<g
|
||||
id="react">
|
||||
</g>
|
||||
<g
|
||||
id="check-selected">
|
||||
</g>
|
||||
<g
|
||||
id="turn-off">
|
||||
</g>
|
||||
<g
|
||||
id="code-block">
|
||||
</g>
|
||||
<g
|
||||
id="user">
|
||||
</g>
|
||||
<g
|
||||
id="coffee-bean">
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(0.638317,0.368532,-0.368532,0.638317,785.021,-208.975)"
|
||||
id="g1">
|
||||
<g
|
||||
id="coffee-beans">
|
||||
<g
|
||||
id="coffee-bean1"
|
||||
serif:id="coffee-bean">
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="coffee-bean-filled"
|
||||
transform="matrix(0.866025,0.5,-0.5,0.866025,717.879,-387.292)">
|
||||
<g
|
||||
transform="matrix(1,0,0,1,0,-0.699553)"
|
||||
id="g2">
|
||||
<path
|
||||
d="M737.673,328.231C738.494,328.056 739.334,328.427 739.757,329.152C739.955,329.463 740.106,329.722 740.106,329.722C740.106,329.722 745.206,338.581 739.429,352.782C737.079,358.559 736.492,366.083 738.435,371.679C738.697,372.426 738.482,373.258 737.89,373.784C737.298,374.31 736.447,374.426 735.735,374.077C730.192,371.375 722.028,365.058 722.021,352C722.015,340.226 728.812,330.279 737.673,328.231Z"
|
||||
id="path1"
|
||||
style="fill:#5d4037;fill-opacity:1" />
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(-1,0,0,-1,1483.03,703.293)"
|
||||
id="g3">
|
||||
<path
|
||||
d="M737.609,328.246C738.465,328.06 739.344,328.446 739.785,329.203C739.97,329.49 740.106,329.722 740.106,329.722C740.106,329.722 745.206,338.581 739.429,352.782C737.1,358.507 736.503,365.948 738.383,371.527C738.646,372.304 738.415,373.164 737.796,373.703C737.177,374.243 736.294,374.356 735.56,373.989C730.02,371.241 722.028,364.92 722.021,352C722.016,340.255 728.779,330.328 737.609,328.246Z"
|
||||
id="path2"
|
||||
style="stroke:#5d4037;stroke-opacity:1;fill:#5d4037;fill-opacity:1" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(0.638317,0.368532,-0.368532,0.638317,913.062,-208.975)"
|
||||
id="g4">
|
||||
<g
|
||||
id="coffee-beans-filled">
|
||||
<g
|
||||
id="coffee-bean2"
|
||||
serif:id="coffee-bean">
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="clipboard">
|
||||
</g>
|
||||
<g
|
||||
transform="matrix(1,0,0,1,128.011,1.35415)"
|
||||
id="g5">
|
||||
<g
|
||||
id="clipboard-paste">
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="clipboard-copy">
|
||||
</g>
|
||||
<g
|
||||
id="Layer1">
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.4 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 115 KiB |
+116
@@ -0,0 +1,116 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="124.8711mm"
|
||||
height="31.440542mm"
|
||||
viewBox="0 0 124.8711 31.440542"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
|
||||
sodipodi:docname="logo.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:zoom="0.70021044"
|
||||
inkscape:cx="329.90082"
|
||||
inkscape:cy="345.61039"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1046"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" />
|
||||
<defs
|
||||
id="defs1" />
|
||||
<g
|
||||
inkscape:label="Ebene 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-17.727083,-56.885417)">
|
||||
<g
|
||||
id="g5"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-67.310852,25.675979)">
|
||||
<text
|
||||
id="text5"
|
||||
xml:space="preserve"
|
||||
transform="matrix(1.3333333,0,0,1.3333333,316.00667,186.29426)"><tspan
|
||||
id="tspan5"
|
||||
style="font-variant:normal;font-weight:700;font-size:65.991px;font-family:'Noto Sans';writing-mode:lr-tb;fill:#3e2723;fill-opacity:1;fill-rule:nonzero;stroke:#3e2723;stroke-width:2.19965;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="0"
|
||||
y="0">my</tspan></text>
|
||||
<text
|
||||
id="text6"
|
||||
xml:space="preserve"
|
||||
transform="matrix(1.3333333,0,0,1.3333333,452.48533,186.29426)"><tspan
|
||||
id="tspan6"
|
||||
style="font-variant:normal;font-weight:700;font-size:65.991px;font-family:'Noto Sans';writing-mode:lr-tb;fill:#e65100;fill-opacity:1;fill-rule:nonzero;stroke:#e65100;stroke-width:2.19965;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="0"
|
||||
y="0">-</tspan></text>
|
||||
<text
|
||||
id="text7"
|
||||
xml:space="preserve"
|
||||
transform="matrix(1.3333333,0,0,1.3333333,480.79333,186.29426)"><tspan
|
||||
id="tspan7"
|
||||
style="font-variant:normal;font-weight:700;font-size:65.991px;font-family:'Noto Sans';writing-mode:lr-tb;fill:#3e2723;fill-opacity:1;fill-rule:nonzero;stroke:#3e2723;stroke-width:2.19965;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="0"
|
||||
y="0">biz</tspan></text>
|
||||
<text
|
||||
id="text8"
|
||||
xml:space="preserve"
|
||||
transform="matrix(1.3333333,0,0,1.3333333,606.236,186.29426)"><tspan
|
||||
id="tspan8"
|
||||
style="font-variant:normal;font-weight:700;font-size:65.991px;font-family:'Noto Sans';writing-mode:lr-tb;fill:#e65100;fill-opacity:1;fill-rule:nonzero;stroke:#e65100;stroke-width:2.19965;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="0"
|
||||
y="0">.app</tspan></text>
|
||||
</g>
|
||||
<g
|
||||
id="g8"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-67.310852,25.675979)">
|
||||
<path
|
||||
id="path8"
|
||||
d="M 249.449,279.212 H 391.181"
|
||||
style="fill:none;stroke:#e65100;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
|
||||
transform="matrix(1.3333333,0,0,-1.3333333,0,595.27559)" />
|
||||
</g>
|
||||
<g
|
||||
id="g9"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-67.310852,25.675979)">
|
||||
<path
|
||||
id="path9"
|
||||
d="M 442.205,279.212 H 583.937"
|
||||
style="fill:none;stroke:#e65100;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
|
||||
transform="matrix(1.3333333,0,0,-1.3333333,0,595.27559)" />
|
||||
</g>
|
||||
<g
|
||||
id="g10"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-67.310852,25.675979)">
|
||||
<path
|
||||
id="path10"
|
||||
d="m 420.661,289.332 c 0.369,-0.114 0.596,-0.454 0.596,-0.822 0.028,-0.171 0.028,-0.284 0.028,-0.284 0,0 -0.028,-4.535 -5.386,-8.702 -2.182,-1.701 -4.053,-4.451 -4.564,-7.03 -0.056,-0.34 -0.311,-0.624 -0.652,-0.681 -0.368,-0.085 -0.708,0.057 -0.907,0.369 -1.53,2.268 -3.259,6.491 -0.368,11.48 2.608,4.536 7.427,6.832 11.253,5.67 z"
|
||||
style="fill:#3e2723;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
transform="matrix(1.3333333,0,0,-1.3333333,0,595.27559)" />
|
||||
<path
|
||||
id="path11"
|
||||
d="m 413.121,269.376 c -0.368,0.141 -0.623,0.482 -0.623,0.85 0,0.17 0,0.284 0,0.284 0,0 0,4.535 5.357,8.702 2.154,1.672 4.054,4.394 4.564,6.945 0.057,0.368 0.34,0.623 0.709,0.708 0.34,0.057 0.708,-0.085 0.907,-0.396 1.53,-2.268 3.174,-6.463 0.34,-11.424 -2.608,-4.507 -7.399,-6.803 -11.254,-5.669 z"
|
||||
style="fill:#3e2723;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
transform="matrix(1.3333333,0,0,-1.3333333,0,595.27559)" />
|
||||
<path
|
||||
id="path12"
|
||||
d="m 413.121,269.376 c -0.368,0.141 -0.623,0.482 -0.623,0.85 0,0.17 0,0.284 0,0.284 0,0 0,4.535 5.357,8.702 2.154,1.672 4.054,4.394 4.564,6.945 0.057,0.368 0.34,0.623 0.709,0.708 0.34,0.057 0.708,-0.085 0.907,-0.396 1.53,-2.268 3.174,-6.463 0.34,-11.424 -2.608,-4.507 -7.399,-6.803 -11.254,-5.669 z"
|
||||
style="fill:none;stroke:#3e2723;stroke-width:0.4428;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
|
||||
transform="matrix(1.3333333,0,0,-1.3333333,0,595.27559)" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.8 KiB |
+4573
-526
File diff suppressed because it is too large
Load Diff
Generated
-1027
File diff suppressed because it is too large
Load Diff
@@ -1,20 +0,0 @@
|
||||
{
|
||||
"name": "ngo",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git@git.odoo4projects.com:Oliver/NGO.git"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"type": "commonjs",
|
||||
"devDependencies": {
|
||||
"tailwindcss": "^3.4.17"
|
||||
}
|
||||
}
|
||||
+47
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"area": "CRM", "Vertical": "NGO", "date": "2026-05-04", "title": "Impact Reporting in Minutes", "teaser": "Small NGOs waste countless hours turning donor data into reports—instead of serving those they’re meant to help.", "content": "<article>\n<h2>Impact Reporting in Minutes</h2>\n<p style=\"margin: 0; color: #374151;\">— \"Maria stared at her screen at 11 p.m., three days before the grant deadline. Her donor database had 872 entries. Excel had 14 tabs. She hadnt slept in 36 hours. Every email from a donor—How was the clean water project?—demanded a new report. She couldnt tell them. Not without weeks of work. <strong>Spreadsheets</strong> were drowning her. <strong>Manual reporting</strong> was stealing her purpose. And worst of all—she knew donors were slipping away, not because her work wasn’t impactful, but because she couldn’t prove it.\" —</p>\n\n<p style=\"margin: 0; color: #374151;\">Modern digital tools can transform how NGOs capture and communicate impact. Automated systems can pull data from donations, program logs, and field reports into unified dashboards. Reports once built by hand can now be generated with a single click, reducing errors, saving weeks of labor, and preserving the emotional integrity of the stories behind the numbers.</p>\n\n<h3>Stop drowning in spreadsheets. Start telling stories.</h3>\n<p style=\"margin: 0; color: #374151;\">When your team spends 20 hours a week just compiling donor data, you’re not serving beneficiaries—you’re serving Excel. Automated reporting tools reset that balance. They sync with your existing donation platforms, track program outcomes across locations, and turn fragmented inputs into cohesive, real-time narratives that donors actually read.</p>\n\n<h3>Trust isn’t built with PDFs. It’s built with clarity.</h3>\n<p style=\"margin: 0; color: #374151;\">Donors don’t want line items. They want to know lives changed. A clean, automated dashboard shows a child’s progress in school, not just the $50 spent on textbooks. When you can show, not tell, donors see their values reflected in real results. That’s how <strong>retention grows</strong>—not through emails begging for more, but through transparency that feels genuine.</p>\n\n<h3>Proof that matters. Without the panic.</h3>\n<p style=\"margin: 0; color: #374151;\">Grant applications and board reviews require compliance—not creativity. When audit season rolls around, having pre-built, audit-ready templates means your finance lead isn’t working through the night. No more frantic last-minute data fixes. Just a few clicks, and your compliance is done. That peace of mind? It’s priceless.</p>\n\n<div class=\"video-container\" style=\"display: flex; margin: 2rem 0; gap: 2rem;\">\n <div class=\"video-text\" style=\"flex: 1;\">\n <p style=\"margin: 0; color: #374151;\">This is how you generate an impact report for your donors—no more spreadsheets, no more stress. Just one click, and your story goes live.</p>\n </div>\n <div class=\"video-player\" style=\"flex: 1; min-width: 300px; height: 300px;\">\n <iframe width=\"100%\" height=\"100%\"\n src=\"https://www.youtube.com/embed/huVrXvkCAqg\"\n title=\"YouTube video player\"\n frameborder=\"0\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowfullscreen\n style=\"width: 100%; height: 100%; border-radius: 8px;\">\n </iframe>\n </div>\n</div>\n\n<p style=\"margin: 0; color: #374151;\"><em>Remember: Every hour you spend wrestling with data is an hour taken from the field, the classroom, the clinic.</em></p>\n\n<a class=\"cta\" href=\"https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ3DDbaiHFlhNhWySszAQoPXE_H73QLqYT3w7H9IYWC76RA_TgNIhLESjb4N7ep_D2D_OyW9q4-c\">When you want to explore how this could work for your organization, you can book a meeting here:</a>\n</article>", "image": "ngo_office3"}
|
||||
@@ -1,17 +0,0 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
body {
|
||||
font-family: 'Inter', 'Segoe UI', system-ui, sans-serif;
|
||||
}
|
||||
|
||||
#lang-selector {
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
#lang-selector:focus,
|
||||
#lang-selector:focus-visible {
|
||||
color: #201824;
|
||||
background-color: #ffffff;
|
||||
}
|
||||
+1630
File diff suppressed because it is too large
Load Diff
@@ -1,27 +0,0 @@
|
||||
/** @type {import('tailwindcss').Config} */
|
||||
module.exports = {
|
||||
content: ['./index.html'],
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
'brand-ink': '#201824',
|
||||
'brand-primary': '#603F57',
|
||||
'brand-accent': '#F762B4',
|
||||
'brand-sunrise': '#F8B84A',
|
||||
'brand-emerald': '#39B982',
|
||||
'brand-snow': '#F5F2F7',
|
||||
'brand-smoke': '#E5DCE8'
|
||||
},
|
||||
fontFamily: {
|
||||
brand: ['Inter', 'Segoe UI', 'system-ui', 'sans-serif']
|
||||
},
|
||||
boxShadow: {
|
||||
brand: '0 20px 60px rgba(32, 24, 36, 0.15)'
|
||||
},
|
||||
backgroundImage: {
|
||||
'hero-gradient': 'radial-gradient(circle at top left, rgba(247,98,180,0.35), rgba(32,24,36,0.95))'
|
||||
}
|
||||
}
|
||||
},
|
||||
plugins: []
|
||||
};
|
||||
Reference in New Issue
Block a user