feat: dodaj stronę polityki prywatności (PL+EN) z routingiem
- nginx.conf: SPA fallback (try_files → index.html), bez niego /privacy zwracało 404 - Dockerfile: kopiuje nginx.conf do kontenera - i18n/pl.ts + en.ts: nowa sekcja `privacy` z 6 podsekcjami (admin, formularz, Umami analytics, cookies, prawa, zmiany) - PrivacyPolicyPage.tsx: strona polityki używająca useT(), sekcje z kotwicami (controller/contact/analytics/cookies/rights/changes) - App.tsx: prosty routing po window.location.pathname — /privacy → PrivacyPolicyPage - Footer.tsx: /privacy i /privacy#cookies zamiast martwych href="#" Co do sekcji Umami: napisana na podstawie kodu (self-hosted stats.gethumanai.pl, cookie-free). Zweryfikuj treść przed publikacją. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
144dff7f85
commit
e0557a7d76
|
|
@ -7,4 +7,5 @@ RUN npm run build
|
|||
|
||||
FROM nginx:alpine
|
||||
COPY --from=build /app/dist /usr/share/nginx/html
|
||||
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
||||
EXPOSE 80
|
||||
|
|
|
|||
9
nginx.conf
Normal file
9
nginx.conf
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
server {
|
||||
listen 80;
|
||||
root /usr/share/nginx/html;
|
||||
index index.html;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
}
|
||||
|
|
@ -8,8 +8,15 @@ import Process from './components/Process';
|
|||
import Audience from './components/Audience';
|
||||
import CTASection from './components/CTASection';
|
||||
import Footer from './components/Footer';
|
||||
import PrivacyPolicyPage from './components/PrivacyPolicyPage';
|
||||
|
||||
function App() {
|
||||
const path = window.location.pathname.replace(/\/$/, '') || '/';
|
||||
|
||||
if (path === '/privacy') {
|
||||
return <PrivacyPolicyPage />;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="min-h-screen bg-background selection:bg-primary selection:text-background">
|
||||
<Header />
|
||||
|
|
|
|||
|
|
@ -36,8 +36,8 @@ const Footer = () => {
|
|||
<div>
|
||||
<h4 className="font-bold mb-6 text-sm uppercase tracking-wider">Prywatność</h4>
|
||||
<ul className="space-y-4">
|
||||
<li><a href="#" className="text-muted hover:text-foreground transition-colors">Polityka prywatności</a></li>
|
||||
<li><a href="#" className="text-muted hover:text-foreground transition-colors">Cookies</a></li>
|
||||
<li><a href="/privacy" className="text-muted hover:text-foreground transition-colors">Polityka prywatności</a></li>
|
||||
<li><a href="/privacy#cookies" className="text-muted hover:text-foreground transition-colors">Cookies</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
45
src/components/PrivacyPolicyPage.tsx
Normal file
45
src/components/PrivacyPolicyPage.tsx
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
import React from 'react';
|
||||
import { useT } from '../i18n';
|
||||
import Footer from './Footer';
|
||||
|
||||
const PrivacyPolicyPage = () => {
|
||||
const t = useT();
|
||||
|
||||
return (
|
||||
<div className="min-h-screen bg-background selection:bg-primary selection:text-background">
|
||||
<header className="bg-background/80 backdrop-blur-lg border-b border-white/5">
|
||||
<div className="container mx-auto px-6 py-4 flex items-center justify-between">
|
||||
<a href="/" className="text-2xl font-bold tracking-tight hover:opacity-80 transition-opacity">
|
||||
human<span className="text-primary">AI</span>
|
||||
</a>
|
||||
<a href="/" className="text-sm text-muted hover:text-foreground transition-colors">
|
||||
{t.privacy.backToHome}
|
||||
</a>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main className="container mx-auto px-6 py-16 max-w-3xl">
|
||||
<h1 className="text-4xl font-bold mb-2">{t.privacy.title}</h1>
|
||||
<p className="text-muted text-sm mb-8">{t.privacy.lastUpdated}</p>
|
||||
<p className="text-foreground/80 mb-12 leading-relaxed">{t.privacy.intro}</p>
|
||||
|
||||
<div className="space-y-10">
|
||||
{t.privacy.sections.map((section, i) => (
|
||||
<section key={section.title} id={['controller', 'contact', 'analytics', 'cookies', 'rights', 'changes'][i]}>
|
||||
<h2 className="text-xl font-bold mb-4">{section.title}</h2>
|
||||
{section.body.split('\n\n').map((paragraph, i) => (
|
||||
<p key={i} className="text-foreground/80 leading-relaxed mb-3">
|
||||
{paragraph}
|
||||
</p>
|
||||
))}
|
||||
</section>
|
||||
))}
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<Footer />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default PrivacyPolicyPage;
|
||||
|
|
@ -21,4 +21,36 @@ export const en = {
|
|||
generic: 'Please try again or email us directly at hello@gethumanai.pl.',
|
||||
},
|
||||
},
|
||||
privacy: {
|
||||
title: 'Privacy Policy',
|
||||
lastUpdated: 'Last updated: June 2026',
|
||||
intro: 'This privacy policy describes how humanAI (gethumanai.pl) processes personal data and protects the privacy of its users.',
|
||||
backToHome: '← Back to homepage',
|
||||
sections: [
|
||||
{
|
||||
title: '1. Data Controller',
|
||||
body: 'The data controller is humanAI, reachable at hello@gethumanai.pl. For any privacy-related questions, please contact us at that address.',
|
||||
},
|
||||
{
|
||||
title: '2. Contact Form',
|
||||
body: 'When you fill out the contact form on our website, we collect your name, email address, and the content of your message. This data is used solely to respond to your enquiry and is not shared with any third parties.',
|
||||
},
|
||||
{
|
||||
title: '3. Analytics and Website Statistics',
|
||||
body: 'We use Umami Analytics — an open-source tool hosted on our own servers (stats.gethumanai.pl). Umami collects anonymous visit statistics: page views, traffic source, approximate country, device type, operating system, and browser.\n\nUmami does not use cookies and does not track users across sessions. The data collected is fully anonymised and cannot be used to identify any individual. All data remains on our servers and is not shared with third parties.\n\nYou can prevent statistics from being collected by disabling JavaScript in your browser or using a script-blocking extension.',
|
||||
},
|
||||
{
|
||||
title: '4. Cookies',
|
||||
body: 'Our website does not use cookies for tracking or advertising purposes. We do not set any analytics or marketing cookies. Umami Analytics, which we use, is intentionally designed as a cookie-free tool — all data is collected anonymously at the session level and is not stored in your browser.',
|
||||
},
|
||||
{
|
||||
title: '5. Your Rights',
|
||||
body: 'You have the right to access, correct, delete, and object to the processing of your personal data. To exercise these rights, please write to hello@gethumanai.pl.',
|
||||
},
|
||||
{
|
||||
title: '6. Changes to This Policy',
|
||||
body: 'We reserve the right to update this privacy policy. Any significant changes will be announced on this page.',
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -21,4 +21,36 @@ export const pl = {
|
|||
generic: 'Spróbuj ponownie lub napisz bezpośrednio na hello@gethumanai.pl.',
|
||||
},
|
||||
},
|
||||
privacy: {
|
||||
title: 'Polityka prywatności',
|
||||
lastUpdated: 'Ostatnia aktualizacja: czerwiec 2026',
|
||||
intro: 'Niniejsza polityka prywatności opisuje, w jaki sposób humanAI (gethumanai.pl) przetwarza dane osobowe i dba o prywatność użytkowników.',
|
||||
backToHome: '← Wróć na stronę główną',
|
||||
sections: [
|
||||
{
|
||||
title: '1. Administrator danych',
|
||||
body: 'Administratorem danych osobowych jest humanAI, dostępny pod adresem hello@gethumanai.pl. W sprawach dotyczących prywatności możesz skontaktować się z nami, pisząc na ten adres.',
|
||||
},
|
||||
{
|
||||
title: '2. Formularz kontaktowy',
|
||||
body: 'Gdy wypełniasz formularz kontaktowy na naszej stronie, zbieramy Twoje imię, adres e-mail oraz treść wiadomości. Dane te są wykorzystywane wyłącznie w celu odpowiedzi na Twoje zapytanie i nie są udostępniane podmiotom trzecim.',
|
||||
},
|
||||
{
|
||||
title: '3. Analityka i statystyki odwiedzin',
|
||||
body: 'Używamy narzędzia Umami Analytics — oprogramowania open-source zainstalowanego na naszych własnych serwerach (stats.gethumanai.pl). Umami zbiera anonimowe statystyki odwiedzin: liczba odsłon, źródło ruchu, przybliżony kraj, typ urządzenia, system operacyjny i przeglądarka.\n\nUmami nie używa plików cookies ani nie śledzi użytkowników między sesjami. Zbierane dane są w pełni anonimowe i nie pozwalają na identyfikację konkretnej osoby. Dane pozostają na naszych serwerach i nie są przekazywane podmiotom trzecim.\n\nMożesz zablokować zbieranie statystyk, wyłączając JavaScript w przeglądarce lub korzystając z rozszerzenia blokującego skrypty.',
|
||||
},
|
||||
{
|
||||
title: '4. Pliki cookies',
|
||||
body: 'Nasza strona internetowa nie używa plików cookies do śledzenia użytkowników ani celów reklamowych. Nie instalujemy żadnych analitycznych ani marketingowych plików cookies. Umami Analytics, z którego korzystamy, celowo zaprojektowano jako narzędzie wolne od cookies — wszystkie dane zbierane są anonimowo na poziomie sesji i nie są zapisywane w Twojej przeglądarce.',
|
||||
},
|
||||
{
|
||||
title: '5. Twoje prawa',
|
||||
body: 'Masz prawo do dostępu do swoich danych, ich sprostowania, usunięcia oraz wniesienia sprzeciwu wobec ich przetwarzania. Aby skorzystać z tych praw, napisz na hello@gethumanai.pl.',
|
||||
},
|
||||
{
|
||||
title: '6. Zmiany polityki prywatności',
|
||||
body: 'Zastrzegamy sobie prawo do zmiany niniejszej polityki prywatności. O wszelkich istotnych zmianach będziemy informować na tej stronie.',
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in a new issue