feat(platforma): restructure into Ilenar + Curetes platforms

This commit is contained in:
oskar 2026-08-03 13:08:42 +02:00
parent 348921df1a
commit 07ffe89688
3 changed files with 427 additions and 327 deletions

View file

@ -6,9 +6,14 @@ import { localizePath, useLang, useT } from '../i18n';
import type { Bullet } from '../i18n/types';
import LangSwitcher from './LangSwitcher';
// Standalone product page at /platforma (and /en/platforma). All copy lives in
// i18n under `platform`; paragraphs that carry inline emphasis are stored as
// runs and rendered through <RichText> (see i18n/types.ts).
// Standalone page at /platforma (and /en/platforma) presenting both platforms:
// Ilenar (what the system does) and Curetes (the supervision over it). All copy
// lives in i18n under `platform`; paragraphs that carry inline emphasis are
// stored as runs and rendered through <RichText> (see i18n/types.ts).
//
// Heading levels: the page has a single <h1> ("Nasze platformy"). Platform names
// are <h2> despite reading as titles, and the sections inside a platform are
// <h3> — the sizing classes keep them looking exactly as before.
const PlatformPage = () => {
const t = useT();
const lang = useLang();
@ -40,42 +45,22 @@ const PlatformPage = () => {
</header>
<main className="container mx-auto px-6 py-16 max-w-3xl">
<h1 className="text-4xl md:text-5xl font-bold mb-3">{t.platform.title}</h1>
<p className="text-muted text-sm italic mb-16">{t.platform.workingName}</p>
<div className="space-y-16">
{/* ── Kto pilnuje agentów ───────────────────────────────────────── */}
<section>
<h2 className="text-2xl md:text-3xl font-bold mb-6">{t.platform.watchers.title}</h2>
{t.platform.watchers.paragraphs.map((paragraph, i) => (
<p key={i} className="text-foreground/80 leading-relaxed mb-4 last:mb-0">
<RichText content={paragraph} />
</p>
))}
</section>
{/* ── Problem, który znika ──────────────────────────────────────── */}
<section>
<h2 className="text-2xl md:text-3xl font-bold mb-6">{t.platform.problem.title}</h2>
<ul className="space-y-4">
{t.platform.problem.bullets.map((bullet, i) => renderBullet(bullet, i, ChevronRight))}
</ul>
</section>
{/* ── Jak to działa ─────────────────────────────────────────────── */}
<section>
<h2 className="text-2xl md:text-3xl font-bold mb-6">{t.platform.howItWorks.title}</h2>
<p className="text-foreground/80 leading-relaxed mb-4">
<RichText content={t.platform.howItWorks.core} />
<h1 className="text-4xl md:text-5xl font-bold mb-4">{t.platform.title}</h1>
<p className="text-foreground/80 text-lg leading-relaxed mb-20">
<RichText content={t.platform.lead} />
</p>
{/* ══ Platforma 1 — Ilenar ════════════════════════════════════════ */}
<section aria-labelledby="ilenar" className="mb-20">
<p className="text-primary text-sm font-semibold tracking-wide uppercase mb-3">
{t.platform.ilenar.eyebrow}
</p>
<h2 id="ilenar" className="text-4xl md:text-5xl font-bold mb-3">
{t.platform.ilenar.name}
</h2>
<p className="text-foreground text-xl font-semibold mb-6">{t.platform.ilenar.subtitle}</p>
<p className="text-foreground/80 leading-relaxed mb-10">
<RichText content={t.platform.howItWorks.humanAsk} />
</p>
<p className="text-foreground/80 leading-relaxed mb-8">
<RichText content={t.platform.howItWorks.tailored} />
<RichText content={t.platform.ilenar.body} />
</p>
{/* Dwie ścieżki, jeden rdzeń — karty obok siebie */}
@ -84,9 +69,9 @@ const PlatformPage = () => {
<div className="w-12 h-12 rounded-xl bg-primary/10 flex items-center justify-center text-primary mb-6">
<Home size={24} />
</div>
<h3 className="text-xl font-bold mb-4">{t.platform.howItWorks.home.title}</h3>
<h3 className="text-xl font-bold mb-4">{t.platform.ilenar.home.title}</h3>
<p className="text-foreground/80 leading-relaxed">
<RichText content={t.platform.howItWorks.home.body} />
<RichText content={t.platform.ilenar.home.body} />
</p>
</div>
@ -94,46 +79,121 @@ const PlatformPage = () => {
<div className="w-12 h-12 rounded-xl bg-secondary/10 flex items-center justify-center text-secondary mb-6">
<Building2 size={24} />
</div>
<h3 className="text-xl font-bold mb-4">{t.platform.howItWorks.business.title}</h3>
<h3 className="text-xl font-bold mb-4">{t.platform.ilenar.business.title}</h3>
<p className="text-foreground/80 leading-relaxed">
<RichText content={t.platform.howItWorks.business.body} />
<RichText content={t.platform.ilenar.business.body} />
</p>
</div>
</div>
<p className="text-foreground/80 leading-relaxed mt-8">
<RichText content={t.platform.howItWorks.shared} />
<RichText content={t.platform.ilenar.shared} />
</p>
</section>
{/* ── Pod maską ─────────────────────────────────────────────────── */}
<section>
<h2 className="text-2xl md:text-3xl font-bold mb-6">{t.platform.underTheHood.title}</h2>
<ul className="space-y-4">
{t.platform.underTheHood.bullets.map((bullet, i) => renderBullet(bullet, i, ChevronRight))}
</ul>
</section>
{/* ── Separator: obie platformy pod wspólnym nadzorem ───────────── */}
<div className="flex items-center gap-4 mb-20" aria-hidden="false">
<span className="h-px flex-1 bg-white/10" />
<span className="text-muted text-sm text-center">{t.platform.divider}</span>
<span className="h-px flex-1 bg-white/10" />
</div>
{/* ── Dlaczego to ───────────────────────────────────────────────── */}
<section>
<h2 className="text-2xl md:text-3xl font-bold mb-6">{t.platform.why.title}</h2>
<ul className="space-y-4">
{t.platform.why.bullets.map((bullet, i) => renderBullet(bullet, i, CheckCircle2))}
</ul>
</section>
{/* ══ Platforma 2 — Curetes ═══════════════════════════════════════ */}
<section aria-labelledby="curetes">
<p className="text-primary text-sm font-semibold tracking-wide uppercase mb-3">
{t.platform.curetes.eyebrow}
</p>
<h2 id="curetes" className="text-4xl md:text-5xl font-bold mb-3">
{t.platform.curetes.name}
</h2>
<p className="text-foreground text-xl font-semibold mb-16">
{t.platform.curetes.subtitle}
</p>
{/* ── Gdzie jesteśmy ────────────────────────────────────────────── */}
<div className="space-y-16">
{/* ── Kto pilnuje agentów ─────────────────────────────────── */}
<section>
<h2 className="text-2xl md:text-3xl font-bold mb-6">{t.platform.status.title}</h2>
{t.platform.status.paragraphs.map((paragraph, i) => (
<h3 className="text-2xl md:text-3xl font-bold mb-6">
{t.platform.curetes.watchers.title}
</h3>
{t.platform.curetes.watchers.paragraphs.map((paragraph, i) => (
<p key={i} className="text-foreground/80 leading-relaxed mb-4 last:mb-0">
<RichText content={paragraph} />
</p>
))}
</section>
{/* ── CTA ───────────────────────────────────────────────────────── */}
<section className="glass-card p-10 text-center">
{/* ── Problem, który znika ─────────────────────────────────── */}
<section>
<h3 className="text-2xl md:text-3xl font-bold mb-6">
{t.platform.curetes.problem.title}
</h3>
<ul className="space-y-4">
{t.platform.curetes.problem.bullets.map((bullet, i) =>
renderBullet(bullet, i, ChevronRight),
)}
</ul>
</section>
{/* ── Jak to działa ────────────────────────────────────────── */}
<section>
<h3 className="text-2xl md:text-3xl font-bold mb-6">
{t.platform.curetes.howItWorks.title}
</h3>
<p className="text-foreground/80 leading-relaxed mb-4">
<RichText content={t.platform.curetes.howItWorks.core} />
</p>
<p className="text-foreground/80 leading-relaxed mb-10">
<RichText content={t.platform.curetes.howItWorks.humanAsk} />
</p>
<p className="text-foreground/80 leading-relaxed">
<RichText content={t.platform.curetes.howItWorks.tailored} />
</p>
</section>
{/* ── Pod maską ────────────────────────────────────────────── */}
<section>
<h3 className="text-2xl md:text-3xl font-bold mb-6">
{t.platform.curetes.underTheHood.title}
</h3>
<ul className="space-y-4">
{t.platform.curetes.underTheHood.bullets.map((bullet, i) =>
renderBullet(bullet, i, ChevronRight),
)}
</ul>
</section>
{/* ── Dlaczego to ──────────────────────────────────────────── */}
<section>
<h3 className="text-2xl md:text-3xl font-bold mb-6">
{t.platform.curetes.why.title}
</h3>
<ul className="space-y-4">
{t.platform.curetes.why.bullets.map((bullet, i) =>
renderBullet(bullet, i, CheckCircle2),
)}
</ul>
</section>
{/* ── Gdzie jesteśmy ───────────────────────────────────────── */}
<section>
<h3 className="text-2xl md:text-3xl font-bold mb-6">
{t.platform.curetes.status.title}
</h3>
{t.platform.curetes.status.paragraphs.map((paragraph, i) => (
<p key={i} className="text-foreground/80 leading-relaxed mb-4 last:mb-0">
<RichText content={paragraph} />
</p>
))}
</section>
</div>
</section>
{/* ── CTA — jedno, wspólne dla obu platform ───────────────────────── */}
<section className="glass-card p-10 text-center mt-20">
<h2 className="text-2xl md:text-3xl font-bold mb-6">{t.platform.cta.title}</h2>
<p className="text-foreground/80 leading-relaxed mb-8">
<RichText content={t.platform.cta.body} />
@ -143,7 +203,6 @@ const PlatformPage = () => {
<ArrowRight className="ml-2" size={20} />
</a>
</section>
</div>
</main>
<Footer />

View file

@ -167,8 +167,45 @@ export const en: typeof pl = {
],
},
platform: {
title: 'Overseeing agentic systems',
workingName: '(working name — to be confirmed before publication)',
title: 'Our Platforms',
lead: 'Two platforms, one foundation: code as the source of truth, and a human in the decision loop.' as Rich,
// ── Platform 1 — Ilenar ────────────────────────────────────────────────
// "For your home"/"For your business" are the same cards as before, moved
// here from howItWorks: they describe what Ilenar does, not how the
// supervision works.
ilenar: {
eyebrow: 'Platform 1 — Knowledge and Action',
name: 'Ilenar',
subtitle: 'The platform that knows and acts.',
body: 'It understands your documents, your home, your business — and acts on it. We build it dedicated to your specific need.' as Rich,
home: {
title: 'For your home',
body: [
{
t: 'You already have an automated home — lights, blinds, gates, climate control — but that\'s automation, not intelligence: it does exactly what you tell it, and nothing more. We add a layer that ',
},
{ t: 'understands context', em: 'strong' },
{
t: ': it recognises your car by its license plate and opens the gate before you get there. It sees on your cameras that no one\'s home and dims the lights for the night on its own. It notices you\'ve left and something was left open — and asks before it does anything.',
},
] as Rich,
},
business: {
title: 'For your business',
body: 'You\'ve got a mess of documents, a paper trail nobody\'s happy with, and data scattered across someone else\'s cloud that you don\'t fully control. We build you a paperless system on your own servers — with your own domain and authentication, with no dependency on external cloud providers. We index documents, photos, and correspondence so they can be searched by meaning, not just keywords. The interface — a web dashboard always, and a chatbot too if it genuinely fits your business — is matched to what you actually need, not to whatever\'s trendy.' as Rich,
},
shared:
'Both paths share the same foundation: everything that\'s supposed to run is defined as code in a repository — every change has a history and can be rolled back — and both run under the same supervision that makes sure nothing fails silently.' as Rich,
},
divider: 'Both platforms run under shared supervision ↓',
// ── Platform 2 — Curetes ───────────────────────────────────────────────
curetes: {
eyebrow: 'Platform 2 — Supervision',
name: 'Curetes',
subtitle: 'Overseeing agentic systems',
watchers: {
title: 'Who watches the agents that watch everything else?',
paragraphs: [
@ -231,24 +268,6 @@ export const en: typeof pl = {
{ t: 'The working system — built around you.', em: 'strong' },
{ t: ' What this supervision watches over is tailored to what you actually need.' },
] as Rich,
home: {
title: 'For your home',
body: [
{
t: 'You already have an automated home — lights, blinds, gates, climate control — but that\'s automation, not intelligence: it does exactly what you tell it, and nothing more. We add a layer that ',
},
{ t: 'understands context', em: 'strong' },
{
t: ': it recognises your car by its license plate and opens the gate before you get there. It sees on your cameras that no one\'s home and dims the lights for the night on its own. It notices you\'ve left and something was left open — and asks before it does anything.',
},
] as Rich,
},
business: {
title: 'For your business',
body: 'You\'ve got a mess of documents, a paper trail nobody\'s happy with, and data scattered across someone else\'s cloud that you don\'t fully control. We build you a paperless system on your own servers — with your own domain and authentication, with no dependency on external cloud providers. We index documents, photos, and correspondence so they can be searched by meaning, not just keywords. The interface — a web dashboard always, and a chatbot too if it genuinely fits your business — is matched to what you actually need, not to whatever\'s trendy.' as Rich,
},
shared:
'Both paths share the same foundation: everything that\'s supposed to run is defined as code in a repository — every change has a history and can be rolled back — and both run under the same supervision that makes sure nothing fails silently.' as Rich,
},
underTheHood: {
title: 'Under the hood — for the curious',
@ -308,6 +327,8 @@ export const en: typeof pl = {
'Dedicated deployments — for a specific home or business — we build as needed, on top of the same proven core. We\'d rather say plainly what we\'re still working on than promise more than what actually works.',
] as Rich[],
},
},
cta: {
title: 'Let\'s talk',
body: 'Tell us what you want to automate or organise — we\'ll figure out how to build it, and put it under the same supervision we run on ourselves.' as Rich,

View file

@ -166,8 +166,44 @@ export const pl = {
],
},
platform: {
title: 'Nadzór nad systemami agentowymi',
workingName: '(nazwa robocza — do potwierdzenia przed publikacją)',
title: 'Nasze platformy',
lead: 'Dwie platformy, jeden fundament: kod jako źródło prawdy i człowiek w pętli decyzji.' as Rich,
// ── Platforma 1 — Ilenar ───────────────────────────────────────────────
// "Dla domu"/"Dla firm" to te same karty co wcześniej, przeniesione tu
// z howItWorks: opisują, co Ilenar robi, nie jak działa nadzór.
ilenar: {
eyebrow: 'Platforma 1 — wiedza i działanie',
name: 'Ilenar',
subtitle: 'Platforma, która wie i działa.',
body: 'Rozumie Twoje dokumenty, Twój dom, Twoją firmę — i wykonuje. Budujemy ją dedykowanie pod Twoją konkretną potrzebę.' as Rich,
home: {
title: 'Dla domu',
body: [
{
t: 'Masz już zautomatyzowany dom — światła, rolety, bramy, klimatyzację — ale to automatyka, nie inteligencja: robi dokładnie to, co jej każesz, i nic więcej. Dokładamy warstwę, która ',
},
{ t: 'rozumie kontekst', em: 'strong' },
{
t: ': rozpoznaje Twój samochód po tablicy rejestracyjnej i otwiera bramę, zanim dojedziesz do niej. Widzi na kamerach, że nikogo nie ma w domu, i sama wygasza światła na noc. Zauważa, że wyjechałeś, a coś zostało otwarte — i pyta, zanim cokolwiek zrobi.',
},
] as Rich,
},
business: {
title: 'Dla firm',
body: 'Masz bałagan w dokumentach, obieg papierowy, który nikogo nie satysfakcjonuje, i dane rozsiane po cudzych chmurach, nad którymi nie masz pełnej kontroli. Budujemy Ci paperless na Twoich własnych serwerach — z własną domeną i autoryzacją, bez uzależnienia od zewnętrznych dostawców chmury. Indeksujemy dokumenty, zdjęcia i korespondencję tak, żeby dało się to przeszukać po sensie, nie po słowach kluczowych. Interfejs — webowy panel, a jeśli to naprawdę pasuje do Twojej firmy, także chatbot — dobieramy do tego, czego faktycznie potrzebujesz, a nie do tego, co akurat modne.' as Rich,
},
shared:
'Obie ścieżki łączy to samo: cała konfiguracja tego, co ma działać, jest zapisana jako kod w repozytorium — każda zmiana ma historię i da się ją cofnąć — i obie działają pod tym samym nadzorem, który pilnuje, żeby nic nie zawiodło po cichu.' as Rich,
},
divider: 'Obie platformy działają pod wspólnym nadzorem ↓',
// ── Platforma 2 — Curetes ──────────────────────────────────────────────
curetes: {
eyebrow: 'Platforma 2 — nadzór',
name: 'Curetes',
subtitle: 'Nadzór nad systemami agentowymi',
watchers: {
title: 'Kto pilnuje agentów, którzy pilnują wszystkiego innego?',
paragraphs: [
@ -227,24 +263,6 @@ export const pl = {
{ t: 'System roboczy — budowany pod Ciebie.', em: 'strong' },
{ t: ' To, co ten nadzór pilnuje, dopasowujemy do konkretnej potrzeby.' },
] as Rich,
home: {
title: 'Dla domu',
body: [
{
t: 'Masz już zautomatyzowany dom — światła, rolety, bramy, klimatyzację — ale to automatyka, nie inteligencja: robi dokładnie to, co jej każesz, i nic więcej. Dokładamy warstwę, która ',
},
{ t: 'rozumie kontekst', em: 'strong' },
{
t: ': rozpoznaje Twój samochód po tablicy rejestracyjnej i otwiera bramę, zanim dojedziesz do niej. Widzi na kamerach, że nikogo nie ma w domu, i sama wygasza światła na noc. Zauważa, że wyjechałeś, a coś zostało otwarte — i pyta, zanim cokolwiek zrobi.',
},
] as Rich,
},
business: {
title: 'Dla firm',
body: 'Masz bałagan w dokumentach, obieg papierowy, który nikogo nie satysfakcjonuje, i dane rozsiane po cudzych chmurach, nad którymi nie masz pełnej kontroli. Budujemy Ci paperless na Twoich własnych serwerach — z własną domeną i autoryzacją, bez uzależnienia od zewnętrznych dostawców chmury. Indeksujemy dokumenty, zdjęcia i korespondencję tak, żeby dało się to przeszukać po sensie, nie po słowach kluczowych. Interfejs — webowy panel, a jeśli to naprawdę pasuje do Twojej firmy, także chatbot — dobieramy do tego, czego faktycznie potrzebujesz, a nie do tego, co akurat modne.' as Rich,
},
shared:
'Obie ścieżki łączy to samo: cała konfiguracja tego, co ma działać, jest zapisana jako kod w repozytorium — każda zmiana ma historię i da się ją cofnąć — i obie działają pod tym samym nadzorem, który pilnuje, żeby nic nie zawiodło po cichu.' as Rich,
},
underTheHood: {
title: 'Pod maską — dla ciekawych',
@ -304,6 +322,8 @@ export const pl = {
'Dedykowane wdrożenia — pod konkretny dom czy firmę — budujemy w miarę potrzeb, opierając się na tym samym, sprawdzonym rdzeniu. Wolimy powiedzieć wprost, co jeszcze dopracowujemy, niż obiecywać więcej niż działa.',
] as Rich[],
},
},
cta: {
title: 'Umów rozmowę',
body: 'Powiedz, co chcesz zautomatyzować albo uporządkować — zobaczymy, jak to zbudować i objąć nadzorem, który sami na sobie testujemy.' as Rich,