<section id="team-council-tiles">
<style>
#team-council-tiles {
padding-block: var(--et-spacing-vertical);
padding-inline: var(--et-spacing-horizontal);
background-color: var(--et-colors-background);
position: relative;
overflow: hidden;
}
@media (min-width: 1024px) {
#team-council-tiles {
padding-block: var(--et-spacing-vertical-lg);
padding-inline: var(--et-spacing-horizontal-lg);
}
}
/* Background decorative blobs */
#team-council-tiles .bg-blob {
position: absolute;
border-radius: 50%;
filter: blur(80px);
pointer-events: none;
z-index: 0;
}
#team-council-tiles .bg-blob-1 {
width: 520px;
height: 520px;
background: color-mix(in srgb, var(--et-colors-brand) 18%, transparent);
top: -120px;
left: -160px;
}
#team-council-tiles .bg-blob-2 {
width: 400px;
height: 400px;
background: color-mix(in srgb, var(--et-colors-brand) 12%, transparent);
bottom: -100px;
right: -100px;
}
#team-council-tiles .bg-blob-3 {
width: 260px;
height: 260px;
background: color-mix(in srgb, var(--et-colors-brand) 10%, transparent);
top: 40%;
left: 50%;
transform: translateX(-50%);
}
/* Dot grid pattern overlay */
#team-council-tiles .dot-grid {
position: absolute;
inset: 0;
z-index: 0;
pointer-events: none;
background-image: radial-gradient(circle, color-mix(in srgb, var(--et-colors-text) 10%, transparent) 1px, transparent 1px);
background-size: 28px 28px;
opacity: 0.35;
}
/* Sparkles canvas */
#team-council-tiles .sparkles-canvas {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
pointer-events: none;
z-index: 0;
}
#team-council-tiles .container {
margin-inline: auto;
max-width: 42rem;
position: relative;
z-index: 1;
}
@media (min-width: 1024px) {
#team-council-tiles .container {
max-width: 80rem;
}
}
/* Header */
#team-council-tiles .section-header {
text-align: center;
margin-bottom: 48px;
}
#team-council-tiles .tag {
color: var(--et-colors-brand);
font-weight: 600;
line-height: 1.2;
letter-spacing: -0.02em;
text-wrap: balance;
font-size: 16px;
margin-bottom: 8px;
}
#team-council-tiles .heading {
color: var(--et-colors-text);
font-weight: 600;
line-height: 1.2;
letter-spacing: -0.02em;
text-wrap: balance;
max-width: 42rem;
margin-bottom: 16px;
font-size: 36px;
margin-inline: auto;
}
@media (min-width: 640px) {
#team-council-tiles .heading {
font-size: 48px;
}
}
#team-council-tiles .paragraph {
color: var(--et-colors-text);
font-size: 18px;
opacity: 0.7;
text-wrap: balance;
max-width: 42rem;
margin-bottom: 20px;
margin-inline: auto;
}
/* Tiles grid — centered, smaller tiles */
#team-council-tiles .tiles-grid {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 20px;
}
/* Individual tile card */
#team-council-tiles .tile {
position: relative;
border-radius: 8px;
overflow: hidden;
border: 1px solid var(--et-colors-border, #e5e7eb);
background-color: var(--et-colors-card-background, #fff);
display: flex;
flex-direction: column;
transition: box-shadow 0.3s ease, transform 0.3s ease, border-color 0.3s ease;
text-decoration: none;
color: inherit;
width: 100%;
max-width: 320px;
}
@media (min-width: 768px) {
#team-council-tiles .tile {
width: calc(50% - 10px);
max-width: 320px;
}
}
#team-council-tiles .tile:not(.tile-disabled):hover {
box-shadow: 0 0 0 2px var(--et-colors-brand);
transform: translateY(-4px);
border-color: var(--et-colors-brand);
}
#team-council-tiles .tile:focus-visible {
outline: 2px solid var(--et-colors-brand);
outline-offset: 3px;
}
/* NIEAKTYWNY KAFELEK - ZASZARZONY BEZ HOVERU */
#team-council-tiles .tile-disabled {
cursor: not-allowed;
opacity: 0.65; /* Przyciemnienie całego klocka */
filter: grayscale(0.5); /* Lekkie odbarwienie koloru */
border-color: var(--et-colors-border) !important;
}
#team-council-tiles .tile-disabled:hover {
transform: none !important;
box-shadow: none !important;
}
/* Brand accent bar */
#team-council-tiles .tile-accent-bar {
height: 4px;
background: linear-gradient(90deg, var(--et-colors-brand), color-mix(in srgb, var(--et-colors-brand) 50%, transparent));
width: 100%;
display: block;
transition: opacity 0.3s ease;
opacity: 0.6;
}
#team-council-tiles .tile:not(.tile-disabled):hover .tile-accent-bar {
opacity: 1;
}
/* Tile inner content */
#team-council-tiles .tile-body {
padding: 1.25rem;
display: flex;
flex-direction: column;
flex: 1;
}
#team-council-tiles .tile-tag {
display: inline-block;
background-color: color-mix(in srgb, var(--et-colors-brand) 15%, transparent);
color: var(--et-colors-brand);
font-weight: 700;
font-size: 11px;
letter-spacing: 0.08em;
text-transform: uppercase;
border-radius: 999px;
padding: 3px 10px;
margin-bottom: 12px;
width: fit-content;
}
#team-council-tiles .tile-disabled .tile-tag {
background-color: rgba(120, 120, 120, 0.15) !important;
color: #9ca3af !important;
}
#team-council-tiles .tile-title {
color: var(--et-colors-text);
font-weight: 700;
font-size: 18px;
line-height: 1.25;
letter-spacing: -0.02em;
text-wrap: balance;
margin-bottom: 10px;
}
#team-council-tiles .tile-desc {
color: var(--et-colors-text);
font-size: 14px;
opacity: 0.65;
line-height: 1.6;
margin-bottom: 16px;
flex: 1;
}
/* Tile CTA row */
#team-council-tiles .tile-cta {
display: flex;
align-items: center;
margin-top: auto;
}
#team-council-tiles .btn {
border-radius: var(--et-radius-button, 8px);
padding: 9px 16px;
font-size: 13px;
font-weight: 600;
display: inline-flex;
align-items: center;
text-decoration: none;
transition: background-color 0.2s ease, box-shadow 0.2s ease;
gap: 6px;
}
#team-council-tiles .btn-primary {
background-color: var(--et-colors-brand);
color: #101828 !important;
}
#team-council-tiles .btn-primary:hover {
background-color: color-mix(in srgb, var(--et-colors-brand) 85%, transparent);
box-shadow: 0 4px 12px color-mix(in srgb, var(--et-colors-brand) 40%, transparent);
}
/* Zamiana przycisku nieaktywnego na szary/zablokowany */
#team-council-tiles .btn-disabled {
background-color: #e5e7eb !important;
color: #6b7280 !important;
cursor: not-allowed;
border: 1px solid #d1d5db !important;
box-shadow: none !important;
}
#team-council-tiles .btn-disabled .arrow {
transform: none !important;
}
#team-council-tiles .btn .arrow {
transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1);
display: inline-block;
font-size: 14px;
line-height: 1;
}
#team-council-tiles .btn:not(.btn-disabled):hover .arrow {
transform: translateX(5px);
}
#team-council-tiles .btn-primary:focus-visible {
outline: 2px solid var(--et-colors-brand);
outline-offset: 2px;
}
/* Shimmer animation on hover */
#team-council-tiles .tile-shimmer {
position: absolute;
top: 0;
left: -100%;
width: 60%;
height: 100%;
background: linear-gradient(
105deg,
transparent 40%,
color-mix(in srgb, var(--et-colors-brand) 12%, transparent) 50%,
transparent 60%
);
pointer-events: none;
transition: left 0.6s ease;
z-index: 2;
}
#team-council-tiles .tile:not(.tile-disabled):hover .tile-shimmer {
left: 160%;
}
/* Last utility */
#team-council-tiles .last {
margin-bottom: 0 !important;
}
</style>
<!-- Background decorations -->
<div class="bg-blob bg-blob-1" aria-hidden="true"></div>
<div class="bg-blob bg-blob-2" aria-hidden="true"></div>
<div class="bg-blob bg-blob-3" aria-hidden="true"></div>
<div class="dot-grid" aria-hidden="true"></div>
<!-- Sparkles canvas -->
<canvas class="sparkles-canvas" aria-hidden="true" id="team-council-sparkles-canvas"></canvas>
<div class="container">
<!-- Section header -->
<header class="section-header">
<h3 class="tag">Vividi Champions</h3>
<h2 class="heading">Ludzie za Fundacją</h2>
</header>
<!-- Tiles grid -->
<div class="tiles-grid" role="list">
<!-- Tile 1: Nasz Zespół - Aktywny -->
<article class="tile" role="listitem">
<div class="tile-shimmer" aria-hidden="true"></div>
<span class="tile-accent-bar" aria-hidden="true"></span>
<div class="tile-body">
<span class="tile-tag">Zespół</span>
<h2 class="tile-title">Poznaj Nasz Zespół</h2>
<p class="tile-desc">
Za projektem stoi grupa pasjonatów i specjalistów łączących wiedzę naukową z doświadczeniem praktycznym. Poznaj ludzi, którzy każdego dnia pracują nad rozwojem naszej misji.
</p>
<div class="tile-cta">
<a class="btn btn-primary last" href="vivid-emotio/nasz-zespol">Poznaj nas <span class="arrow">→</span></a>
</div>
</div>
</article>
<!-- Tile 2: Rada Naukowa - CZASOWO NIEAKTYWNY I ZASZARZONY -->
<article class="tile tile-disabled" role="listitem">
<span class="tile-accent-bar" aria-hidden="true"></span>
<div class="tile-body">
<span class="tile-tag">Wkrótce</span>
<h2 class="tile-title" style="opacity: 0.7;">Poznaj Naszą Radę Naukową</h2>
<p class="tile-desc">
Rada Naukowa to grono wybitnych naukowców, badaczy i praktyków, którzy czuwają nad merytoryczną jakością naszych działań. Ich wiedza i doświadczenie wyznaczą kierunek naszego rozwoju.
</p>
<div class="tile-cta">
<button class="btn btn-disabled last" disabled>Już wkrótce <span class="arrow">→</span></button>
</div>
</div>
</article>
</div>
<!-- end tiles grid -->
</div>
<script>
(function () {
const canvas = document.getElementById('team-council-sparkles-canvas');
if (!canvas) return;
const ctx = canvas.getContext('2d');
function getBrandColor() {
const raw = getComputedStyle(document.documentElement)
.getPropertyValue('--et-colors-brand')
.trim();
return raw || '#f1df8a';
}
function hexToRgb(hex) {
const clean = hex.replace('#', '');
if (clean.length === 3) {
return {
r: parseInt(clean[0] + clean[0], 16),
g: parseInt(clean[1] + clean[1], 16),
b: parseInt(clean[2] + clean[2], 16),
};
}
return {
r: parseInt(clean.slice(0, 2), 16),
g: parseInt(clean.slice(2, 4), 16),
b: parseInt(clean.slice(4, 6), 16),
};
}
const SPARKLE_COUNT = 55;
let sparkles = [];
let animFrame;
let brand = { r: 241, g: 223, b: 138 };
function resizeCanvas() {
const section = canvas.parentElement;
canvas.width = section.offsetWidth;
canvas.height = section.offsetHeight;
}
function randomBetween(a, b) {
return a + Math.random() * (b - a);
}
function createSparkle(i) {
return {
x: randomBetween(0, canvas.width),
y: randomBetween(0, canvas.height),
size: randomBetween(1, 3.2),
opacity: randomBetween(0.1, 0.85),
opacityDir: Math.random() > 0.5 ? 1 : -1,
opacitySpeed: randomBetween(0.004, 0.018),
speedX: randomBetween(-0.12, 0.12),
speedY: randomBetween(-0.22, -0.06),
shape: Math.random() > 0.45 ? 'star' : 'circle',
twinklePhase: randomBetween(0, Math.PI * 2),
};
}
function initSparkles() {
const raw = getBrandColor();
if (raw.startsWith('#')) {
brand = hexToRgb(raw);
}
sparkles = [];
for (let i = 0; i < SPARKLE_COUNT; i++) {
sparkles.push(createSparkle(i));
}
}
function drawStar(ctx, cx, cy, r, opacity) {
const spikes = 15;
const inner = r * 0.50;
ctx.save();
ctx.translate(cx, cy);
ctx.rotate(Math.PI / 4);
ctx.beginPath();
for (let i = 0; i < spikes * 2; i++) {
const angle = (i * Math.PI) / spikes;
const radius = i % 2 === 0 ? r : inner;
if (i === 0) {
ctx.moveTo(Math.cos(angle) * radius, Math.sin(angle) * radius);
} else {
ctx.lineTo(Math.cos(angle) * radius, Math.sin(angle) * radius);
}
}
ctx.closePath();
ctx.fillStyle = `rgba(${brand.r},${brand.g},${brand.b},${opacity})`;
ctx.shadowColor = `rgba(${brand.r},${brand.g},${brand.b},${opacity * 0.7})`;
ctx.shadowBlur = r * 3;
ctx.fill();
ctx.restore();
}
function drawCircle(ctx, cx, cy, r, opacity) {
ctx.save();
ctx.beginPath();
ctx.arc(cx, cy, r, 0, Math.PI * 2);
ctx.fillStyle = `rgba(${brand.r},${brand.g},${brand.b},${opacity})`;
ctx.shadowColor = `rgba(${brand.r},${brand.g},${brand.b},${opacity * 0.6})`;
ctx.shadowBlur = r * 4;
ctx.fill();
ctx.restore();
}
function tick(time) {
ctx.clearRect(0, 0, canvas.width, canvas.height);
for (let s of sparkles) {
s.twinklePhase += s.opacitySpeed;
s.opacity = 0.15 + 0.7 * (0.5 + 0.5 * Math.sin(s.twinklePhase));
s.x += s.speedX;
s.y += s.speedY;
if (s.y < -10) s.y = canvas.height + 10;
if (s.x < -10) s.x = canvas.width + 10;
if (s.x > canvas.width + 10) s.x = -10;
if (s.shape === 'star') {
drawStar(ctx, s.x, s.y, s.size, s.opacity);
} else {
drawCircle(ctx, s.x, s.y, s.size * 0.7, s.opacity);
}
}
animFrame = requestAnimationFrame(tick);
}
// Start animations
start();
})();
</script>
</section>