rebours/main.js
2026-02-24 11:14:33 +01:00

143 lines
5.3 KiB
JavaScript

/**
* REBOUR — Main Script
*/
document.addEventListener('DOMContentLoaded', () => {
// ---- CUSTOM CURSOR ----
const cursorDot = document.querySelector('.cursor-dot');
const cursorOutline = document.querySelector('.cursor-outline');
window.addEventListener('mousemove', (e) => {
cursorDot.style.left = `${e.clientX}px`;
cursorDot.style.top = `${e.clientY}px`;
cursorOutline.animate(
{ left: `${e.clientX}px`, top: `${e.clientY}px` },
{ duration: 100, fill: 'forwards' }
);
});
const interactives = document.querySelectorAll('a, button, input, .product-card, summary, .panel-close');
interactives.forEach(el => {
el.addEventListener('mouseenter', () => {
cursorOutline.style.width = '38px';
cursorOutline.style.height = '38px';
cursorDot.style.transform = 'translate(-50%, -50%) scale(0)';
});
el.addEventListener('mouseleave', () => {
cursorOutline.style.width = '26px';
cursorOutline.style.height = '26px';
cursorDot.style.transform = 'translate(-50%, -50%) scale(1)';
});
});
// ---- INTERACTIVE GRID ----
const gridContainer = document.getElementById('interactive-grid');
const CELL = 60;
const COLORS = [
'rgba(160,160,155,0.3)',
'rgba(140,140,135,0.22)',
'rgba(120,120,115,0.18)',
];
function buildGrid() {
if (!gridContainer) return;
gridContainer.innerHTML = '';
const cols = Math.ceil(window.innerWidth / CELL);
const rows = Math.ceil(window.innerHeight / CELL);
gridContainer.style.display = 'grid';
gridContainer.style.gridTemplateColumns = `repeat(${cols}, ${CELL}px)`;
gridContainer.style.gridTemplateRows = `repeat(${rows}, ${CELL}px)`;
for (let i = 0; i < cols * rows; i++) {
const cell = document.createElement('div');
cell.className = 'grid-cell';
cell.addEventListener('mouseenter', () => {
cell.style.transition = 'none';
cell.style.backgroundColor = COLORS[Math.floor(Math.random() * COLORS.length)];
});
cell.addEventListener('mouseleave', () => {
cell.style.transition = 'background-color 1.4s ease-out';
cell.style.backgroundColor = 'transparent';
});
gridContainer.appendChild(cell);
}
}
buildGrid();
let rt;
window.addEventListener('resize', () => { clearTimeout(rt); rt = setTimeout(buildGrid, 150); });
// ---- PRODUCT PANEL ----
const panel = document.getElementById('product-panel');
const panelClose = document.getElementById('panel-close');
const cards = document.querySelectorAll('.product-card');
// Champs du panel
const fields = {
img: document.getElementById('panel-img'),
index: document.getElementById('panel-index'),
name: document.getElementById('panel-name'),
type: document.getElementById('panel-type'),
mat: document.getElementById('panel-mat'),
year: document.getElementById('panel-year'),
status: document.getElementById('panel-status'),
desc: document.getElementById('panel-desc'),
specs: document.getElementById('panel-specs'),
notes: document.getElementById('panel-notes'),
};
function openPanel(card) {
fields.img.src = card.dataset.img;
fields.img.alt = card.dataset.name;
fields.index.textContent = card.dataset.index;
fields.name.textContent = card.dataset.name;
fields.type.textContent = card.dataset.type;
fields.mat.textContent = card.dataset.mat;
fields.year.textContent = card.dataset.year;
fields.status.textContent = card.dataset.status;
fields.desc.textContent = card.dataset.desc;
fields.specs.textContent = card.dataset.specs;
fields.notes.textContent = card.dataset.notes;
// Ferme les accordéons
panel.querySelectorAll('details').forEach(d => d.removeAttribute('open'));
panel.classList.add('is-open');
panel.setAttribute('aria-hidden', 'false');
document.body.style.overflow = 'hidden';
// Refresh cursor sur les nouveaux éléments
panel.querySelectorAll('summary, .panel-close').forEach(el => {
el.addEventListener('mouseenter', () => {
cursorOutline.style.width = '38px';
cursorOutline.style.height = '38px';
cursorDot.style.transform = 'translate(-50%, -50%) scale(0)';
});
el.addEventListener('mouseleave', () => {
cursorOutline.style.width = '26px';
cursorOutline.style.height = '26px';
cursorDot.style.transform = 'translate(-50%, -50%) scale(1)';
});
});
}
function closePanel() {
panel.classList.remove('is-open');
panel.setAttribute('aria-hidden', 'true');
document.body.style.overflow = '';
}
cards.forEach(card => {
card.addEventListener('click', () => openPanel(card));
});
panelClose.addEventListener('click', closePanel);
// Echap pour fermer
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape') closePanel();
});
});