Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions .git-blame-ignore-revs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Bulk reformats. `git config blame.ignoreRevsFile .git-blame-ignore-revs`
255c58d0436bf36964f8e58ceeebdb062c5e10cf # prettier, 399 files
4 changes: 2 additions & 2 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
version: 2
updates:
- package-ecosystem: npm
directory: "/"
directory: '/'
schedule:
interval: weekly
open-pull-requests-limit: 5
Expand All @@ -20,7 +20,7 @@ updates:
update-types: [minor, patch]

- package-ecosystem: github-actions
directory: "/"
directory: '/'
schedule:
interval: weekly
open-pull-requests-limit: 3
21 changes: 21 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Build output and vendored trees — formatting these is noise.
node_modules
.next
dist
build
out
coverage
.turbo
.vercel
*.min.js
*.min.css

# Lockfiles are generated; prettier would rewrite them wholesale.
package-lock.json
pnpm-lock.yaml
yarn.lock

# Markdown is deliberately out of scope for now. Prettier rewraps prose, which
# is where it is most opinionated and least useful, and it would bury the real
# diff. Remove this line when you want docs formatted too.
*.md
9 changes: 9 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"semi": true,
"singleQuote": true,
"printWidth": 100,
"tabWidth": 2,
"trailingComma": "all",
"arrowParens": "always",
"endOfLine": "lf"
}
37 changes: 20 additions & 17 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -1,43 +1,46 @@
import { defineConfig, globalIgnores } from "eslint/config";
import nextVitals from "eslint-config-next/core-web-vitals";
import nextTs from "eslint-config-next/typescript";
import { defineConfig, globalIgnores } from 'eslint/config';
import nextVitals from 'eslint-config-next/core-web-vitals';
import nextTs from 'eslint-config-next/typescript';

const eslintConfig = defineConfig([
...nextVitals,
...nextTs,
{
rules: {
"@typescript-eslint/no-unused-vars": ["warn", {
argsIgnorePattern: "^_",
varsIgnorePattern: "^_",
destructuredArrayIgnorePattern: "^_",
}],
'@typescript-eslint/no-unused-vars': [
'warn',
{
argsIgnorePattern: '^_',
varsIgnorePattern: '^_',
destructuredArrayIgnorePattern: '^_',
},
],
},
},
// Pipeline/migration scripts — relax any-type rule.
// These one-off scripts manipulate JSONB blobs where exact types aren't needed.
{
files: ["scripts/**/*.ts", "src/scripts/**/*.ts"],
files: ['scripts/**/*.ts', 'src/scripts/**/*.ts'],
rules: {
"@typescript-eslint/no-explicit-any": "off",
'@typescript-eslint/no-explicit-any': 'off',
},
},
// Legacy JS scripts using CommonJS require() — exclude from ESM import rule.
{
files: ["src/scripts/**/*.js"],
files: ['src/scripts/**/*.js'],
rules: {
"@typescript-eslint/no-require-imports": "off",
'@typescript-eslint/no-require-imports': 'off',
},
},
// Override default ignores of eslint-config-next.
globalIgnores([
// Default ignores of eslint-config-next:
".next/**",
"out/**",
"build/**",
"next-env.d.ts",
'.next/**',
'out/**',
'build/**',
'next-env.d.ts',
// Auto-generated file — never lint
"src/lib/config/foundations/stiftungen-generated.ts",
'src/lib/config/foundations/stiftungen-generated.ts',
]),
]);

Expand Down
70 changes: 56 additions & 14 deletions messages/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,30 +14,72 @@
},
"nav": {
"ueberUns": { "label": "Über uns" },
"strategie": { "label": "Mission & Strategie", "desc": "Warum wir existieren & was wir erreichen wollen" },
"strategie": {
"label": "Mission & Strategie",
"desc": "Warum wir existieren & was wir erreichen wollen"
},
"team": { "label": "Team", "desc": "Wer wir sind & wie wir arbeiten" },
"wieWirArbeiten": { "label": "Wie wir arbeiten", "desc": "Die Wertschöpfungskaskade — maximale Wertschöpfung pro Gerät" },
"finanzen": { "label": "Finanzen {range}", "desc": "Transparente Einnahmen & Ausgaben ({label})" },
"wirkung": { "label": "Wirkung & Impact", "desc": "CO₂ eingespart, Geräte refurbiert, Menschen erreicht" },
"preismodell": { "label": "Preismodell", "desc": "Solidarische Preise (4 Stufen nach Einkommen)" },
"wieWirArbeiten": {
"label": "Wie wir arbeiten",
"desc": "Die Wertschöpfungskaskade — maximale Wertschöpfung pro Gerät"
},
"finanzen": {
"label": "Finanzen {range}",
"desc": "Transparente Einnahmen & Ausgaben ({label})"
},
"wirkung": {
"label": "Wirkung & Impact",
"desc": "CO₂ eingespart, Geräte refurbiert, Menschen erreicht"
},
"preismodell": {
"label": "Preismodell",
"desc": "Solidarische Preise (4 Stufen nach Einkommen)"
},
"methodik": { "label": "Methodik", "desc": "Wie wir messen & berechnen (Transparenzreport)" },
"zukunft": { "label": "Zukunft 2030" },
"vision": { "label": "Vision" },
"revamp2030": { "label": "Revamp 2030 — Die Vision", "desc": "Wo wir 2030 stehen wollen: Hub, Bildung, Impact" },
"revamp2030": {
"label": "Revamp 2030 — Die Vision",
"desc": "Wo wir 2030 stehen wollen: Hub, Bildung, Impact"
},
"projekte": { "label": "Konkrete Projekte (2026–2028)" },
"hub": { "label": "Hub {space}", "desc": "🏢 Werkstatt + AI Lab + Hackerspace + Kulturraum" },
"bildung": { "label": "Bildungsprogramm", "desc": "🎓 2× Programmleiter für Train-the-Trainer & Workshops" },
"bildung": {
"label": "Bildungsprogramm",
"desc": "🎓 2× Programmleiter für Train-the-Trainer & Workshops"
},
"fundraising": { "label": "Fundraising" },
"budgetStatus": { "label": "Budget & Status" },
"plan": { "label": "Fundraising-Plan", "desc": "📊 Budget-Übersicht, Finanzierungsbedarf, Timeline" },
"dashboard": { "label": "Pipeline-Dashboard", "desc": "📈 KPI-Übersicht: Eingereicht, Zugesagt, Erfolgsquote" },
"plan": {
"label": "Fundraising-Plan",
"desc": "📊 Budget-Übersicht, Finanzierungsbedarf, Timeline"
},
"dashboard": {
"label": "Pipeline-Dashboard",
"desc": "📈 KPI-Übersicht: Eingereicht, Zugesagt, Erfolgsquote"
},
"stiftungenSection": { "label": "Stiftungen" },
"stiftungen": { "label": "{count} Stiftungen", "desc": "🔍 Mit Fit-Score, Themen, Deadlines, Beträgen" },
"vorlagen": { "label": "Gesuch-Vorlagen", "desc": "📝 {count} Referenz-Vorlagen nach Typ (A/B/C/D)" },
"stiftungen": {
"label": "{count} Stiftungen",
"desc": "🔍 Mit Fit-Score, Themen, Deadlines, Beträgen"
},
"vorlagen": {
"label": "Gesuch-Vorlagen",
"desc": "📝 {count} Referenz-Vorlagen nach Typ (A/B/C/D)"
},
"gesuche": { "label": "Meine Gesuche", "desc": "📝 Bearbeitete Gesuch-Entwürfe im Überblick" },
"pipeline": { "label": "Gesuch-Pipeline", "desc": "📋 Stiftungsgesuche verwalten und nachverfolgen" },
"scoring": { "label": "Scoring-Methodik", "desc": "⚙️ Wie Fit, Bereitschaft und Priorität berechnet werden" },
"pipelineMethodik": { "label": "Pipeline-Methodik", "desc": "🔬 Wie wir aus {universe} Stiftungen die richtigen finden" },
"pipeline": {
"label": "Gesuch-Pipeline",
"desc": "📋 Stiftungsgesuche verwalten und nachverfolgen"
},
"scoring": {
"label": "Scoring-Methodik",
"desc": "⚙️ Wie Fit, Bereitschaft und Priorität berechnet werden"
},
"pipelineMethodik": {
"label": "Pipeline-Methodik",
"desc": "🔬 Wie wir aus {universe} Stiftungen die richtigen finden"
},
"dokumente": { "label": "Dokumente" },
"plattform": { "label": "Plattform" }
}
Expand Down
60 changes: 48 additions & 12 deletions messages/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,30 +14,66 @@
},
"nav": {
"ueberUns": { "label": "About us" },
"strategie": { "label": "Mission & strategy", "desc": "Why we exist & what we want to achieve" },
"strategie": {
"label": "Mission & strategy",
"desc": "Why we exist & what we want to achieve"
},
"team": { "label": "Team", "desc": "Who we are & how we work" },
"wieWirArbeiten": { "label": "How we work", "desc": "The value cascade — maximum value per device" },
"wieWirArbeiten": {
"label": "How we work",
"desc": "The value cascade — maximum value per device"
},
"finanzen": { "label": "Finances {range}", "desc": "Transparent income & expenses ({label})" },
"wirkung": { "label": "Impact", "desc": "CO₂ saved, devices refurbished, people reached" },
"preismodell": { "label": "Pricing model", "desc": "Solidarity pricing (4 tiers by income)" },
"methodik": { "label": "Methodology", "desc": "How we measure & calculate (transparency report)" },
"methodik": {
"label": "Methodology",
"desc": "How we measure & calculate (transparency report)"
},
"zukunft": { "label": "Future 2030" },
"vision": { "label": "Vision" },
"revamp2030": { "label": "Revamp 2030 — the vision", "desc": "Where we want to be in 2030: hub, education, impact" },
"revamp2030": {
"label": "Revamp 2030 — the vision",
"desc": "Where we want to be in 2030: hub, education, impact"
},
"projekte": { "label": "Concrete projects (2026–2028)" },
"hub": { "label": "Hub {space}", "desc": "🏢 Workshop + AI lab + hackerspace + cultural space" },
"bildung": { "label": "Education program", "desc": "🎓 2× program leads for train-the-trainer & workshops" },
"hub": {
"label": "Hub {space}",
"desc": "🏢 Workshop + AI lab + hackerspace + cultural space"
},
"bildung": {
"label": "Education program",
"desc": "🎓 2× program leads for train-the-trainer & workshops"
},
"fundraising": { "label": "Fundraising" },
"budgetStatus": { "label": "Budget & status" },
"plan": { "label": "Fundraising plan", "desc": "📊 Budget overview, funding needs, timeline" },
"dashboard": { "label": "Pipeline dashboard", "desc": "📈 KPI overview: submitted, awarded, success rate" },
"dashboard": {
"label": "Pipeline dashboard",
"desc": "📈 KPI overview: submitted, awarded, success rate"
},
"stiftungenSection": { "label": "Foundations" },
"stiftungen": { "label": "{count} foundations", "desc": "🔍 With fit scores, themes, deadlines, amounts" },
"vorlagen": { "label": "Application templates", "desc": "📝 {count} reference templates by type (A/B/C/D)" },
"stiftungen": {
"label": "{count} foundations",
"desc": "🔍 With fit scores, themes, deadlines, amounts"
},
"vorlagen": {
"label": "Application templates",
"desc": "📝 {count} reference templates by type (A/B/C/D)"
},
"gesuche": { "label": "My applications", "desc": "📝 Edited application drafts at a glance" },
"pipeline": { "label": "Application pipeline", "desc": "📋 Manage and track foundation applications" },
"scoring": { "label": "Scoring methodology", "desc": "⚙️ How fit, readiness, and priority are computed" },
"pipelineMethodik": { "label": "Pipeline methodology", "desc": "🔬 How we find the right ones among {universe} foundations" },
"pipeline": {
"label": "Application pipeline",
"desc": "📋 Manage and track foundation applications"
},
"scoring": {
"label": "Scoring methodology",
"desc": "⚙️ How fit, readiness, and priority are computed"
},
"pipelineMethodik": {
"label": "Pipeline methodology",
"desc": "🔬 How we find the right ones among {universe} foundations"
},
"dokumente": { "label": "Documents" },
"plattform": { "label": "Platform" }
}
Expand Down
80 changes: 64 additions & 16 deletions messages/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,30 +14,78 @@
},
"nav": {
"ueberUns": { "label": "À propos" },
"strategie": { "label": "Mission & stratégie", "desc": "Pourquoi nous existons & ce que nous voulons accomplir" },
"strategie": {
"label": "Mission & stratégie",
"desc": "Pourquoi nous existons & ce que nous voulons accomplir"
},
"team": { "label": "Équipe", "desc": "Qui nous sommes & comment nous travaillons" },
"wieWirArbeiten": { "label": "Notre façon de travailler", "desc": "La cascade de valeur — valorisation maximale par appareil" },
"finanzen": { "label": "Finances {range}", "desc": "Recettes & dépenses transparentes ({label})" },
"wirkung": { "label": "Impact", "desc": "CO₂ économisé, appareils reconditionnés, personnes touchées" },
"preismodell": { "label": "Modèle de prix", "desc": "Prix solidaires (4 niveaux selon le revenu)" },
"methodik": { "label": "Méthodologie", "desc": "Comment nous mesurons & calculons (rapport de transparence)" },
"wieWirArbeiten": {
"label": "Notre façon de travailler",
"desc": "La cascade de valeur — valorisation maximale par appareil"
},
"finanzen": {
"label": "Finances {range}",
"desc": "Recettes & dépenses transparentes ({label})"
},
"wirkung": {
"label": "Impact",
"desc": "CO₂ économisé, appareils reconditionnés, personnes touchées"
},
"preismodell": {
"label": "Modèle de prix",
"desc": "Prix solidaires (4 niveaux selon le revenu)"
},
"methodik": {
"label": "Méthodologie",
"desc": "Comment nous mesurons & calculons (rapport de transparence)"
},
"zukunft": { "label": "Avenir 2030" },
"vision": { "label": "Vision" },
"revamp2030": { "label": "Revamp 2030 — la vision", "desc": "Où nous voulons être en 2030 : hub, formation, impact" },
"revamp2030": {
"label": "Revamp 2030 — la vision",
"desc": "Où nous voulons être en 2030 : hub, formation, impact"
},
"projekte": { "label": "Projets concrets (2026–2028)" },
"hub": { "label": "Hub {space}", "desc": "🏢 Atelier + AI lab + hackerspace + espace culturel" },
"bildung": { "label": "Programme de formation", "desc": "🎓 2× responsables pour train-the-trainer & ateliers" },
"hub": {
"label": "Hub {space}",
"desc": "🏢 Atelier + AI lab + hackerspace + espace culturel"
},
"bildung": {
"label": "Programme de formation",
"desc": "🎓 2× responsables pour train-the-trainer & ateliers"
},
"fundraising": { "label": "Levée de fonds" },
"budgetStatus": { "label": "Budget & statut" },
"plan": { "label": "Plan de levée de fonds", "desc": "📊 Vue d'ensemble du budget, besoins, calendrier" },
"dashboard": { "label": "Tableau de bord", "desc": "📈 Vue KPI : soumis, accordés, taux de succès" },
"plan": {
"label": "Plan de levée de fonds",
"desc": "📊 Vue d'ensemble du budget, besoins, calendrier"
},
"dashboard": {
"label": "Tableau de bord",
"desc": "📈 Vue KPI : soumis, accordés, taux de succès"
},
"stiftungenSection": { "label": "Fondations" },
"stiftungen": { "label": "{count} fondations", "desc": "🔍 Avec scores de fit, thèmes, délais, montants" },
"vorlagen": { "label": "Modèles de demande", "desc": "📝 {count} modèles de référence par type (A/B/C/D)" },
"stiftungen": {
"label": "{count} fondations",
"desc": "🔍 Avec scores de fit, thèmes, délais, montants"
},
"vorlagen": {
"label": "Modèles de demande",
"desc": "📝 {count} modèles de référence par type (A/B/C/D)"
},
"gesuche": { "label": "Mes demandes", "desc": "📝 Brouillons de demandes en un coup d'œil" },
"pipeline": { "label": "Pipeline des demandes", "desc": "📋 Gérer et suivre les demandes aux fondations" },
"scoring": { "label": "Méthodologie de scoring", "desc": "⚙️ Comment fit, préparation et priorité sont calculés" },
"pipelineMethodik": { "label": "Méthodologie du pipeline", "desc": "🔬 Comment trouver les bonnes parmi {universe} fondations" },
"pipeline": {
"label": "Pipeline des demandes",
"desc": "📋 Gérer et suivre les demandes aux fondations"
},
"scoring": {
"label": "Méthodologie de scoring",
"desc": "⚙️ Comment fit, préparation et priorité sont calculés"
},
"pipelineMethodik": {
"label": "Méthodologie du pipeline",
"desc": "🔬 Comment trouver les bonnes parmi {universe} fondations"
},
"dokumente": { "label": "Documents" },
"plattform": { "label": "Plateforme" }
}
Expand Down
4 changes: 2 additions & 2 deletions next-env.d.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/// <reference types="next" />
/// <reference types="next/image-types/global" />
import "./.next/types/routes.d.ts";
import "./.next/types/root-params.d.ts";
import './.next/types/routes.d.ts';
import './.next/types/root-params.d.ts';

// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
Loading