nordabiz/templates/pej/index.html
Maciej Pienczyn ea2a5e0939
Some checks are pending
NordaBiz Tests / Unit & Integration Tests (push) Waiting to run
NordaBiz Tests / E2E Tests (Playwright) (push) Blocked by required conditions
NordaBiz Tests / Smoke Tests (Production) (push) Blocked by required conditions
NordaBiz Tests / Send Failure Notification (push) Blocked by required conditions
fix(pej): use YouTube thumbnails and local infographics
YouTube iframes blocked by CSP, pej.pl blocks hotlinking.
Videos now show as clickable thumbnail cards with play button.
Infographics downloaded to static/images/pej/.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 21:19:55 +01:00

423 lines
21 KiB
HTML

{% extends "base.html" %}
{% block title %}PEJ — Elektrownia Jądrowa - Norda Biznes Partner{% endblock %}
{% block extra_css %}
<style>
.pej-hero {
background: #7c3aed;
color: #fff;
padding: var(--spacing-2xl) 0;
margin: calc(-1 * var(--spacing-lg)) calc(-1 * var(--spacing-lg)) var(--spacing-xl);
text-align: center;
}
.pej-hero h1 { font-size: 2rem; margin-bottom: var(--spacing-sm); }
.pej-hero p { opacity: 0.9; max-width: 600px; margin: 0 auto; font-size: var(--font-size-md); }
.pej-stats {
display: flex; justify-content: center; gap: var(--spacing-xl);
padding: var(--spacing-md) 0;
margin-bottom: var(--spacing-xl);
}
.pej-stat { text-align: center; }
.pej-stat-value { font-size: 2rem; font-weight: 700; color: #7c3aed; }
.pej-stat-label { font-size: var(--font-size-sm); color: var(--text-secondary); }
.pej-section { margin-bottom: var(--spacing-xl); }
.pej-section-title {
font-size: var(--font-size-lg); font-weight: 600;
margin-bottom: var(--spacing-md);
display: flex; align-items: center; gap: var(--spacing-sm);
}
.pej-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--spacing-lg); }
@media (max-width: 768px) { .pej-grid { grid-template-columns: 1fr; } }
.pej-announcement {
background: #f5f3ff; border: 1px solid #e9d5ff; border-radius: var(--radius);
padding: var(--spacing-md); margin-bottom: var(--spacing-sm);
}
.pej-announcement-title { font-weight: 600; margin-bottom: var(--spacing-xs); }
.pej-announcement-date { font-size: var(--font-size-sm); color: var(--text-secondary); }
.pej-news-card {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius); padding: var(--spacing-md);
margin-bottom: var(--spacing-sm); transition: var(--transition);
}
.pej-news-card:hover { border-color: #7c3aed; }
.pej-news-card h3 { font-size: var(--font-size-md); margin-bottom: var(--spacing-xs); }
.pej-news-card h3 a { color: var(--text-primary); text-decoration: none; }
.pej-news-card h3 a:hover { color: #7c3aed; }
.pej-news-card .meta { font-size: var(--font-size-sm); color: var(--text-secondary); }
.pej-milestone {
display: flex; gap: var(--spacing-md); padding: var(--spacing-sm) 0;
border-bottom: 1px solid var(--border);
}
.pej-milestone:last-child { border-bottom: none; }
.pej-milestone-date {
min-width: 80px; font-size: var(--font-size-sm); color: #7c3aed; font-weight: 600;
}
.pej-milestone-title { font-size: var(--font-size-sm); }
.pej-milestone-status {
font-size: 0.7rem; padding: 2px 6px; border-radius: 10px;
display: inline-block; margin-left: var(--spacing-xs);
}
.pej-milestone-status.planned { background: #e0e7ff; color: #3730a3; }
.pej-milestone-status.in_progress { background: #fef3c7; color: #92400e; }
.pej-milestone-status.completed { background: #d1fae5; color: #065f46; }
.pej-milestone-status.delayed { background: #fee2e2; color: #991b1b; }
.pej-company-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--spacing-md); }
@media (max-width: 768px) { .pej-company-grid { grid-template-columns: 1fr; } }
@media (min-width: 769px) and (max-width: 1024px) { .pej-company-grid { grid-template-columns: repeat(2, 1fr); } }
.pej-company-card {
background: var(--surface); border: 1px solid var(--border);
border-radius: var(--radius); padding: var(--spacing-md);
transition: var(--transition);
}
.pej-company-card:hover { border-color: #7c3aed; box-shadow: 0 2px 8px rgba(124,58,237,0.1); }
.pej-company-name { font-weight: 600; margin-bottom: var(--spacing-xs); }
.pej-company-name a { color: var(--text-primary); text-decoration: none; }
.pej-company-name a:hover { color: #7c3aed; }
.pej-company-meta { font-size: var(--font-size-sm); color: var(--text-secondary); }
.pej-company-score {
display: inline-block; background: #f5f3ff; color: #7c3aed;
padding: 2px 8px; border-radius: 10px; font-size: var(--font-size-sm); font-weight: 600;
}
.pej-company-type {
display: inline-block; background: #e0e7ff; color: #3730a3;
padding: 2px 8px; border-radius: 10px; font-size: 0.75rem;
}
.pej-company-desc {
font-size: var(--font-size-sm); color: var(--text-secondary);
margin-top: var(--spacing-xs);
}
.pej-cta {
text-align: center; margin-top: var(--spacing-lg);
display: flex; gap: var(--spacing-md); justify-content: center; flex-wrap: wrap;
}
.pej-btn {
display: inline-block; padding: var(--spacing-sm) var(--spacing-lg);
border-radius: var(--radius); text-decoration: none; font-weight: 500;
transition: var(--transition);
}
.pej-btn-primary { background: #7c3aed; color: #fff; }
.pej-btn-primary:hover { background: #6d28d9; }
.pej-btn-outline { border: 1px solid #7c3aed; color: #7c3aed; }
.pej-btn-outline:hover { background: #f5f3ff; }
.pej-media-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--spacing-lg); }
@media (max-width: 768px) { .pej-media-grid { grid-template-columns: 1fr; } }
.pej-video-card {
display: block; text-decoration: none; border-radius: var(--radius);
border: 1px solid var(--border); overflow: hidden; transition: var(--transition);
}
.pej-video-card:hover { border-color: #7c3aed; box-shadow: 0 2px 8px rgba(124,58,237,0.1); }
.pej-video-thumb {
position: relative; padding-bottom: 56.25%; background: #000;
}
.pej-video-thumb img {
position: absolute; top: 0; left: 0; width: 100%; height: 100%; object-fit: cover;
}
.pej-video-play {
position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);
width: 60px; height: 60px; background: rgba(124,58,237,0.9); border-radius: 50%;
display: flex; align-items: center; justify-content: center;
}
.pej-video-play::after {
content: ''; width: 0; height: 0;
border-left: 20px solid #fff; border-top: 12px solid transparent; border-bottom: 12px solid transparent;
margin-left: 4px;
}
.pej-video-title {
padding: var(--spacing-sm) var(--spacing-md);
font-size: var(--font-size-sm); font-weight: 500; color: var(--text-primary);
}
.pej-infographic {
border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden;
background: #fff;
}
.pej-infographic img { width: 100%; height: auto; display: block; }
.pej-infographic-caption {
padding: var(--spacing-sm) var(--spacing-md);
font-size: var(--font-size-sm); color: var(--text-secondary);
border-top: 1px solid var(--border);
}
.pej-empty { text-align: center; padding: var(--spacing-xl); color: var(--text-secondary); }
.pej-sources { display: grid; grid-template-columns: 1fr 1fr; gap: var(--spacing-lg); }
@media (max-width: 768px) { .pej-sources { grid-template-columns: 1fr; } }
.pej-source-group { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: var(--spacing-md); }
.pej-source-group h3 { font-size: var(--font-size-md); font-weight: 600; margin-bottom: var(--spacing-sm); color: #7c3aed; }
.pej-source-item { display: flex; align-items: flex-start; gap: var(--spacing-sm); padding: var(--spacing-xs) 0; }
.pej-source-item a { color: var(--text-primary); text-decoration: none; font-size: var(--font-size-sm); }
.pej-source-item a:hover { color: #7c3aed; }
.pej-source-item .pej-src-label { font-size: 0.75rem; color: var(--text-secondary); }
.pej-source-icon { min-width: 20px; color: #7c3aed; font-size: var(--font-size-sm); }
.pej-contact-card { background: #f5f3ff; border-radius: var(--radius); padding: var(--spacing-md); margin-bottom: var(--spacing-sm); }
.pej-contact-name { font-weight: 600; }
.pej-contact-role { font-size: var(--font-size-sm); color: var(--text-secondary); }
</style>
{% endblock %}
{% block content %}
<div class="pej-hero">
<h1>Elektrownia Jądrowa — Szanse dla Naszych Firm</h1>
<p>Izba Norda Biznes aktywnie uczestniczy w projekcie PEJ. Tu znajdziesz aktualności, listę firm gotowych do współpracy i informacje o możliwościach dla członków.</p>
</div>
<div class="pej-stats">
<div class="pej-stat">
<div class="pej-stat-value">{{ companies_count }}</div>
<div class="pej-stat-label">firm gotowych</div>
</div>
<div class="pej-stat">
<div class="pej-stat-value">{{ news_count }}</div>
<div class="pej-stat-label">aktualności</div>
</div>
<div class="pej-stat">
<div class="pej-stat-value">{{ milestones_count }}</div>
<div class="pej-stat-label">kamieni milowych</div>
</div>
</div>
{% if announcements %}
<div class="pej-section">
<div class="pej-section-title">Komunikaty Izby</div>
{% for ann in announcements %}
<div class="pej-announcement">
<div class="pej-announcement-title">{{ ann.title }}</div>
<div class="pej-announcement-date">{{ ann.created_at.strftime('%d.%m.%Y') }}</div>
<p>{{ ann.content[:300] }}{% if ann.content|length > 300 %}...{% endif %}</p>
</div>
{% endfor %}
</div>
{% endif %}
<div class="pej-grid">
<div class="pej-section">
<div class="pej-section-title">Najnowsze aktualności</div>
{% if news %}
{% for item in news %}
<div class="pej-news-card">
<h3><a href="{{ item.url }}" target="_blank" rel="noopener">{{ item.title }}</a></h3>
<div class="meta">
{{ item.source_name or item.source_domain or '' }}
{% if item.published_at %} &middot; {{ item.published_at.strftime('%d.%m.%Y') }}{% endif %}
</div>
</div>
{% endfor %}
<a href="{{ url_for('pej_news') }}" class="pej-btn pej-btn-outline" style="margin-top: var(--spacing-sm); display: inline-block;">Zobacz wszystkie &rarr;</a>
{% else %}
<div class="pej-empty">Brak aktualności nuklearnych.</div>
{% endif %}
</div>
<div class="pej-section">
<div class="pej-section-title">Kamienie milowe</div>
{% if milestones %}
{% for m in milestones %}
<div class="pej-milestone">
<div class="pej-milestone-date">
{% if m.target_date %}{{ m.target_date.strftime('%m/%Y') }}{% else %}&mdash;{% endif %}
</div>
<div>
<span class="pej-milestone-title">{{ m.title }}</span>
<span class="pej-milestone-status {{ m.status }}">{{ m.status }}</span>
</div>
</div>
{% endfor %}
{% else %}
<div class="pej-empty">Brak kamieni milowych.</div>
{% endif %}
</div>
</div>
<div class="pej-section">
<div class="pej-section-title">Multimedia</div>
<div class="pej-media-grid">
<div>
<a href="https://www.youtube.com/watch?v=Ne7Nwo3sGSg" target="_blank" rel="noopener" class="pej-video-card">
<div class="pej-video-thumb">
<img src="https://img.youtube.com/vi/Ne7Nwo3sGSg/hqdefault.jpg" alt="Wirtualny spacer po elektrowni jądrowej" loading="lazy">
<div class="pej-video-play"></div>
</div>
<div class="pej-video-title">Wirtualny spacer po elektrowni jądrowej z perspektywy dozoru</div>
</a>
</div>
<div>
<a href="https://www.youtube.com/watch?v=VnNmsntBHsg" target="_blank" rel="noopener" class="pej-video-card">
<div class="pej-video-thumb">
<img src="https://img.youtube.com/vi/VnNmsntBHsg/hqdefault.jpg" alt="Elektrownia jądrowa Lubiatowo-Kopalino" loading="lazy">
<div class="pej-video-play"></div>
</div>
<div class="pej-video-title">Elektrownia jądrowa Lubiatowo-Kopalino</div>
</a>
</div>
<div>
<div class="pej-infographic">
<a href="{{ url_for('static', filename='images/pej/elementy-bloku-ej.png') }}" target="_blank" rel="noopener">
<img src="{{ url_for('static', filename='images/pej/elementy-bloku-ej.png') }}" alt="Elementy bloku elektrowni jądrowej" loading="lazy">
</a>
<div class="pej-infographic-caption">Elementy bloku elektrowni jądrowej AP1000</div>
</div>
</div>
<div>
<div class="pej-infographic">
<a href="{{ url_for('static', filename='images/pej/harmonogram-budowy.png') }}" target="_blank" rel="noopener">
<img src="{{ url_for('static', filename='images/pej/harmonogram-budowy.png') }}" alt="Harmonogram budowy elektrowni jądrowej" loading="lazy">
</a>
<div class="pej-infographic-caption">Harmonogram budowy elektrowni jądrowej (luty 2026)</div>
</div>
</div>
</div>
</div>
<div class="pej-section">
<div class="pej-section-title">Źródła i kontakty PEJ</div>
<div class="pej-sources">
<div class="pej-source-group">
<h3>Jak zostać dostawcą PEJ</h3>
<div class="pej-source-item">
<span class="pej-source-icon">&#9993;</span>
<div>
<a href="mailto:dostawcy@pej.pl"><strong>dostawcy@pej.pl</strong></a>
<div class="pej-src-label">Rejestracja dostawców — wyślij: nazwę firmy, NIP, branżę, osobę kontaktową</div>
</div>
</div>
<div class="pej-source-item">
<span class="pej-source-icon">&#128722;</span>
<div>
<a href="https://pz.pej.pl/" target="_blank" rel="noopener"><strong>pz.pej.pl</strong> — Platforma zakupowa PEJ</a>
<div class="pej-src-label">Przetargi i aukcje otwarte (43 planowane do końca 2026)</div>
</div>
</div>
<div class="pej-source-item">
<span class="pej-source-icon">&#127891;</span>
<div>
<a href="https://polskaplatformajadrowa.pl/" target="_blank" rel="noopener"><strong>Polska Platforma Jądrowa</strong></a>
<div class="pej-src-label">Newsletter, grupy tematyczne dla polskich dostawców</div>
</div>
</div>
<div class="pej-source-item">
<span class="pej-source-icon">&#128196;</span>
<div>
<a href="https://pej.pl/en/for-suppliers/notice-board/" target="_blank" rel="noopener"><strong>Notice Board</strong> — ogłoszenia Bechtel i Westinghouse</a>
<div class="pej-src-label">Aktualne zapotrzebowanie technologiczne i usługowe</div>
</div>
</div>
</div>
<div class="pej-source-group">
<h3>Osoby kontaktowe w PEJ</h3>
<div class="pej-contact-card">
<div class="pej-contact-name">Grzegorz Maj</div>
<div class="pej-contact-role">Pełnomocnik Zarządu ds. Wsparcia Rozwoju Rynku (Local Content)</div>
</div>
<div class="pej-contact-card">
<div class="pej-contact-name">Marek Woszczyk</div>
<div class="pej-contact-role">Prezes Zarządu PEJ</div>
</div>
<div class="pej-contact-card">
<div class="pej-contact-name">Leszek Hołda</div>
<div class="pej-contact-role">Prezes Bechtel Polska</div>
</div>
</div>
<div class="pej-source-group">
<h3>Oficjalne strony projektu</h3>
<div class="pej-source-item">
<span class="pej-source-icon">&#127970;</span>
<div><a href="https://pej.pl/" target="_blank" rel="noopener"><strong>pej.pl</strong> — Polskie Elektrownie Jądrowe</a></div>
</div>
<div class="pej-source-item">
<span class="pej-source-icon">&#9762;</span>
<div>
<a href="https://www.gov.pl/web/paa" target="_blank" rel="noopener"><strong>PAA</strong> — Państwowa Agencja Atomistyki</a>
<div class="pej-src-label">Regulator — proces licencyjny, pozwolenie na budowę</div>
</div>
</div>
<div class="pej-source-item">
<span class="pej-source-icon">&#127463;</span>
<div><a href="https://www.gov.pl/web/polski-atom" target="_blank" rel="noopener"><strong>Polski Atom</strong> — portal rządowy</a></div>
</div>
<div class="pej-source-item">
<span class="pej-source-icon">&#127468;</span>
<div><a href="https://www.westinghousenuclear.com" target="_blank" rel="noopener"><strong>Westinghouse</strong> — technologia AP1000</a></div>
</div>
<div class="pej-source-item">
<span class="pej-source-icon">&#127959;</span>
<div><a href="https://www.bechtel.com/markets/nuclear-power/" target="_blank" rel="noopener"><strong>Bechtel</strong> — generalny wykonawca</a></div>
</div>
</div>
<div class="pej-source-group">
<h3>Śledź PEJ w mediach</h3>
<div class="pej-source-item">
<span class="pej-source-icon">in</span>
<div><a href="https://www.linkedin.com/company/polskieelektrowniejadrowe/" target="_blank" rel="noopener"><strong>PEJ na LinkedIn</strong> (~16 tys. obserwujących)</a></div>
</div>
<div class="pej-source-item">
<span class="pej-source-icon">&#120143;</span>
<div><a href="https://x.com/pej_pl" target="_blank" rel="noopener"><strong>@PEJ_PL</strong> na X</a></div>
</div>
<div class="pej-source-item">
<span class="pej-source-icon">&#120143;</span>
<div><a href="https://x.com/WECNuclearPL" target="_blank" rel="noopener"><strong>@WECNuclearPL</strong> — Westinghouse Polska na X</a></div>
</div>
<div class="pej-source-item">
<span class="pej-source-icon">f</span>
<div><a href="https://www.facebook.com/polskiatom.govpl/" target="_blank" rel="noopener"><strong>Polski Atom</strong> na Facebooku</a></div>
</div>
<div class="pej-source-item">
<span class="pej-source-icon">&#128240;</span>
<div>
<a href="https://nuclear.pl/" target="_blank" rel="noopener"><strong>nuclear.pl</strong></a> &middot;
<a href="https://biznesalert.pl/" target="_blank" rel="noopener"><strong>BiznesAlert</strong></a> &middot;
<a href="https://energetyka24.com/" target="_blank" rel="noopener"><strong>Energetyka24</strong></a>
<div class="pej-src-label">Portale informacyjne z sekcjami nuklearnymi</div>
</div>
</div>
</div>
</div>
</div>
<div class="pej-section">
<div class="pej-section-title">Local Content — Firmy z Izby gotowe do współpracy</div>
{% if top_companies %}
<div class="pej-company-grid">
{% for link, company in top_companies %}
<div class="pej-company-card">
<div class="pej-company-name">
<a href="{{ url_for('company_detail_by_slug', slug=company.slug) }}">{{ company.name }}</a>
</div>
<div class="pej-company-meta">
{% if company.category %}<span>{{ company.category.name }}</span>{% endif %}
<span class="pej-company-score">{{ link.relevance_score }}/100</span>
{% if link.link_type %}
<span class="pej-company-type">{{ link_type_labels.get(link.link_type, link.link_type) }}</span>
{% endif %}
</div>
{% if link.collaboration_description %}
<div class="pej-company-desc">{{ link.collaboration_description[:150] }}{% if link.collaboration_description|length > 150 %}...{% endif %}</div>
{% endif %}
</div>
{% endfor %}
</div>
<div class="pej-cta">
<a href="{{ url_for('pej_local_content') }}" class="pej-btn pej-btn-primary">Zobacz pełną listę &rarr;</a>
{% if current_user.can_access_admin_panel() %}
<a href="{{ url_for('admin.pej_export_csv') }}" class="pej-btn pej-btn-outline">Eksportuj CSV</a>
{% endif %}
</div>
{% else %}
<div class="pej-empty">Brak dopasowanych firm.</div>
{% endif %}
</div>
{% endblock %}