Карацей кажучы, багаты і разнастайны рэгіянальны каляндар:
блошыныя рынкі, гаражныя распродажы, спецыялізаваныя рынкі і калядныя кірмашы. Знакавыя месцы: узбярэжжа, сельская мясцовасць, гістарычныя цэнтры, такія як Кан,
і турыстычныя славутасці. Адрасы, якія абавязкова трэба наведаць, і экспертныя крамы мэблі, посуду, вінілавых пласцінак і вінтажнага адзення. Гэтым летам і падчас сезона палявання за скарбамі Мары, заўзятая калекцыянерка, падарожнічае па рэгіёне, каб знайсці рэчы, прасякнутыя гісторыяй.
Блышыныя рынкі ў
Нармандыі спалучаюць у сабе сямейныя кірмашы, спецыялізаваныя рынкі і невялікія крамы, якімі кіруюць дасведчаныя ўладальнікі. На вясковай плошчы можна знайсці столькі ж маленькіх скарбаў, колькі і пад ангарамі вялікага кірмашу: дубовая мэбля, французскі фаянс, рэдкія вінілавыя пласцінкі або вытанчаны фарфор. Мясцовае багацце таксама адлюстроўваецца ў прыязнасці арганізатараў і ў практычных паслугах — ацэнцы, вывазе дамоў, камісійным продажы — якія спрыяюць куплі і ацэнцы прадметаў. Каб спланаваць свае паездкі, звярніцеся да абноўленых календароў, такіх як рэгіянальная падборка Brocmania ці каляндар MyBrocante
і адкрыйце для сябе дэкаратыўныя адрасы ў блогу адрасоў Каляндар блышыных рынкаў і антыкварных кірмашоў у Нармандыі на 2025 год Разнастайнасць мерапрыемстваў: гаражныя распродажы, вулічныя кірмашы і калядныя кірмашы У рэгіёне кожныя выхадныя праходзяць розныя мерапрыемствы: грамадскія гаражныя распродажы, буйныя вулічныя кірмашы і калядныя кірмашы ў халодныя месяцы. Кожнае з іх прыцягвае розную аўдыторыю, ад калекцыянераў да сем’яў.
Фарматы: гаражныя распродажы, блышыныя рынкі, антыкварныя рынкі, абмен адзеннем.
Паслугі: ацэнка на месцы, мясцовая ежа.
Спецыялізаваныя кірмашы ў Нармандыі: цацкі, адзенне і антыкварныя кнігі
Тэматычныя кірмашы прапануюць старанна падабраны выбар: антыкварныя цацкі, вінілавыя пласцінкі, рэдкія кнігі. Спецыялісты дзеляцца сваім вопытам і парадамі па доглядзе, асабліва за сталовым срэбрам і фарфорам.
Практычныя рэсурсы:
Даведнік па фарфору
ці да каталога
Каляндар блошыных рынкаў Парада: плануйце раннюю раніцу для пошуку зніжак; лепшыя рэчы хутка разыходзяцца. Адкрыйце для сябе знакавыя гарады і вёскі для пошуку зніжак у Нармандыі
Кан
прапануе гарадскія рынкі, дзе можна знайсці мэблю і дэкаратыўныя прадметы. Атмасферу часта ажыўляюць кіёскі мясцовых антыквараў.
Моцныя бакі: разнастайнасць, даступнасць, майстэрства прадаўцоў. Шарм блошыных рынкаў вакол Мон-Сен-Мішэль
Парада: спалучайце агляд славутасцяў з пошукам зніжак у канцы дня, каб пазбегнуць натоўпу.
Невялікія вёскі часта дэманструюць унікальныя сямейныя калекцыі, якія перадаюцца з пакалення ў пакаленне. Вы можаце знайсці рэчы з відавочным паходжаннем, што з’яўляецца сапраўдным плюсам за іх кошт.
Бонус: цёплы прыём і непасрэднае ўзаемадзеянне з прадаўцамі.
Уздоўж узбярэжжа вы знойдзеце марскія прадметы, пабеленую мэблю і багемныя ўпрыгажэнні. Пастаянна зменлівая атмасфера запрашае вас на шпацыр і даследаванне.
У цэнтры ўвагі: вінтажныя рэчы, звязаныя з морам і прамысловым перапрафіляваннем.
Антыкварная мэбля і посуд: адрасы, якія абавязкова трэба наведаць
Мясцовыя блошыныя рынкі і крамы прапануюць мэблю з масіва дрэва і якасны посуд. Поўныя спісы і даты глядзіце ў раздзеле
Petit Futé ці ў календары гаражных распродажаў . Назва Месцазнаходжанне Спецыяльнасць
Антыкварыят Порта
Гранвіль
Вінтажная мэбля, фарфор
Стайня антыквара
Онфлёр
Анфлёр
Антыкварны посуд, дэкор
Блышыны рынак
Руан
Дэкаратыўныя прадметы, кнігі
Дэкаратыўныя прадметы і антыкварыят: выключныя месцы
У некаторых месцах прадстаўлены прызнаныя эксперты і рэдкі выбар. Таксама азнаёмцеся з
даведнікамі па вінтажнай мэблі,
каб лепш вызначыць свой пошук. Адкрыйце для сябе 20 лепшых блышыных рынкаў у Нармандыі, якія нельга прапусціць у 2025 годзе, унікальныя мерапрыемствы для пошуку скарбаў і атрымання аўтэнтычных уражанняў. Рэтра-адзенне, кнігі і вінілавыя пласцінкі: курыраваны выбар крам
Даследуйце, фільтруйце і адкрывайце для сябе асноўныя блышыныя рынкі ў Нармандыі ў 2025 годзе. Выкарыстоўвайце фільтры, каб наладзіць адлюстраванне.
/* Styles complémentaires (design, accessibilité, taille max) */
#infographie-brocantes { font-family: Inter, ui-sans-serif, system-ui, -apple-system, « Segoe UI », Roboto, « Helvetica Neue », Arial; max-width:1100px; margin:0 auto; border-radius:12px; box-shadow:0 8px 30px rgba(2,6,23,0.12); overflow:hidden; background:linear-gradient(180deg,#ffffff, #fbfdff); max-height:1200px; }
#infographie-brocantes * { box-sizing:border-box; }
.ib-top { display:flex; gap:16px; padding:20px; align-items:center; border-bottom:1px solid #eef2f7; }
.ib-title { flex:1; }
.ib-title h2 { margin:0; font-weight:700; font-size:20px; color:#0f172a; }
.ib-desc { margin-top:6px; font-size:13px; color:#475569; }
.ib-controls { display:flex; gap:8px; align-items:center; }
.ib-input, .ib-select, .ib-btn { padding:8px 10px; border-radius:8px; border:1px solid #e2e8f0; background:#fff; font-size:13px; color:#0f172a; }
.ib-btn { cursor:pointer; background:linear-gradient(180deg,#0ea5a4,#0b948c); color:white; border:none; box-shadow:0 6px 18px rgba(14,165,164,0.16); }
.ib-main { display:grid; grid-template-columns: 380px 1fr; gap:16px; padding:18px; }
.ib-side { background:#fff; border:1px solid #eef2f7; border-radius:10px; padding:12px; height:820px; overflow:auto; }
.ib-canvas { background:linear-gradient(180deg,#f8fafc,#ffffff); border:1px solid #eef2f7; border-radius:10px; padding:12px; height:820px; overflow:auto; }
.item { padding:10px; border-radius:8px; margin-bottom:10px; background:linear-gradient(180deg,#ffffff,#fbfeff); border:1px solid #eef2f7; display:flex; gap:10px; align-items:flex-start; }
.badge { font-size:12px; padding:6px 8px; border-radius:999px; background:#f1f5f9; color:#0f172a; border:1px solid #e2e8f0; }
.item h3 { margin:0; font-size:15px; color:#0f172a; }
.item p { margin:4px 0 0 0; font-size:13px; color:#475569; }
.meta { font-size:12px; color:#94a3b8; margin-top:6px; display:flex; gap:8px; align-items:center; flex-wrap:wrap; }
.mini-stats { display:flex; gap:8px; margin-bottom:12px; }
.stat { padding:8px 10px; border-radius:8px; background:#fff; border:1px solid #eef2f7; text-align:center; flex:1; }
.stat strong { display:block; font-size:18px; color:#0f172a; }
.depart-grid { display:grid; grid-template-columns:repeat(5,1fr); gap:8px; margin-top:10px; }
.depart-col { padding:8px; border-radius:8px; background:linear-gradient(180deg,#ffffff,#fbfeff); border:1px solid #eef2f7; min-height:120px; }
.dot { width:10px; height:10px; border-radius:50%; display:inline-block; margin-right:6px; vertical-align:middle; }
.dot.upcoming { background:linear-gradient(180deg,#10b981,#059669); box-shadow:0 4px 12px rgba(16,185,129,0.16); }
.dot.regular { background:#60a5fa; }
.dot.vg { background:#f59e0b; }
.controls-row { display:flex; gap:8px; margin-top:10px; }
.timeline { width:100%; height:120px; background:linear-gradient(90deg,#f8fafc,#fff); border-radius:8px; padding:8px; border:1px solid #eef2f7; }
.sr-only { position:absolute; left:-10000px; top:auto; width:1px; height:1px; overflow:hidden; }
.detail-panel { padding:10px; border-radius:8px; background:#fff; border:1px dashed #e6eef8; margin-top:8px; font-size:13px; color:#0f172a; }
.small { font-size:12px; color:#64748b; }
/* responsive */
@media (max-width:980px) {
.ib-main { grid-template-columns: 1fr; }
.ib-side, .ib-canvas { height:650px; }
}
Усе тыпы
Прафесійны блышыны рынак
Гаражны распродаж
Блышыны рынак
Скінуць фільтры
Скінуць
0
Набліжаныя 0
Аддзелы 0
Сартаваць Дата (самая ранняя)
Дата (апошняя)
Папулярнасць
Экспартаваць спіс у CSV
Экспартаваць CSV
Выберыце блышыны рынак, каб убачыць падрабязнасці тут.
Распаўсюджванне па аддзелах
Гаражны распродаж
Прафесійны блышыны рынак
Набліжаная падзея
Штомесячная частата (2025)
Кампактная карта (слупкі = аддзелы)
Задавальненне ад пошуку зніжак у Нармандыі: паміж гісторыяй і святочнай атмасферай
/*
Infographie interactive (JavaScript)
– Toutes les chaînes sont en français
– Pas d’appels externes à des APIs (données internes)
– Code commenté en français et conçu pour être lisible / accessible
– Si vous souhaitez intégrer une API publique (ex: Nominatim), prévoir un commentaire d’exemple ici.
*/
/* Données internes : liste simplifiée des 20 brocantes/top événements en Normandie (2025)
– Chaque entrée contient : id, nom, departement, ville, date(ISO), type, heure, popularite (0-100), description
– Facilement éditable / extensible
*/
const BROCANTES = [
{ id:1, nom: »Grande Brocante de Caen », departement: »Calvados », ville: »Caen », date: »2025-05-03″, type: »brocante », heure: »09:00″, popularite:90, description: »Brocante annuelle au coeur de la ville, stands pros et particuliers. » },
{ id:2, nom: »Vide-Grenier d’Honfleur », departement: »Calvados », ville: »Honfleur », date: »2025-06-15″, type: »vide-grenier », heure: »08:00″, popularite:78, description: »Ambiance portuaire, nombreux exposants locaux. » },
{ id:3, nom: »Marché aux Puces de Rouen », departement: »Seine-Maritime », ville: »Rouen », date: »2025-07-12″, type: »marche », heure: »07:30″, popularite:85, description: »Grand marché aux puces avec antiquaires et brocanteurs. » },
{ id:4, nom: »Brocante de Deauville », departement: »Calvados », ville: »Deauville », date: »2025-08-02″, type: »brocante », heure: »10:00″, popularite:88, description: »Événement chic en bord de mer, pièces déco et vintage. » },
{ id:5, nom: »Vide-Grenier de Cherbourg », departement: »Manche », ville: »Cherbourg », date: »2025-05-25″, type: »vide-grenier », heure: »09:00″, popularite:65, description: »Grande foire aux affaires pour les chineurs. » },
{ id:6, nom: »Brocante d’Alençon », departement: »Orne », ville: »Alençon », date: »2025-09-07″, type: »brocante », heure: »08:00″, popularite:60, description: »Brocante locale au centre-ville. » },
{ id:7, nom: »Marché aux Puces du Havre », departement: »Seine-Maritime », ville: »Le Havre », date: »2025-06-22″, type: »marche », heure: »07:00″, popularite:70, description: »Stands variés, restauration sur place. » },
{ id:8, nom: »Foire aux Brocantes d’Évreux », departement: »Eure », ville: »Évreux », date: »2025-07-19″, type: »brocante », heure: »09:30″, popularite:55, description: »Grande foire annuelle, objets divers. » },
{ id:9, nom: »Vide-Grenier de Lisieux », departement: »Calvados », ville: »Lisieux », date: »2025-05-11″, type: »vide-grenier », heure: »08:30″, popularite:50, description: »Idéal pour chiner à prix doux. » },
{ id:10, nom: »Brocante de Saint-Lô », departement: »Manche », ville: »Saint-Lô », date: »2025-08-16″, type: »brocante », heure: »09:00″, popularite:52, description: »Stands de brocanteurs professionnels. » },
{ id:11, nom: »Marché aux Puces de Fécamp », departement: »Seine-Maritime », ville: »Fécamp », date: »2025-05-18″, type: »marche », heure: »08:00″, popularite:48, description: »Marché convivial, spécialités locales. » },
{ id:12, nom: »Brocante de Vire », departement: »Calvados », ville: »Vire », date: »2025-07-26″, type: »brocante », heure: »09:00″, popularite:46, description: »Brocante de quartier, bon plan pour petits budgets. » },
{ id:13, nom: »Vide-Grenier de Dieppe », departement: »Seine-Maritime », ville: »Dieppe », date: »2025-08-30″, type: »vide-grenier », heure: »08:00″, popularite:67, description: »Bords de mer, ambiance familiale. » },
{ id:14, nom: »Brocante d’Avranches », departement: »Manche », ville: »Avranches », date: »2025-06-08″, type: »brocante », heure: »09:00″, popularite:44, description: »Brocante locale en centre-ville. » },
{ id:15, nom: »Marché aux Puces de Bayeux », departement: »Calvados », ville: »Bayeux », date: »2025-06-29″, type: »marche », heure: »08:30″, popularite:59, description: »Antiquités et découvertes historiques. » },
{ id:16, nom: »Vide-Grenier de Pont-Audemer », departement: »Eure », ville: »Pont-Audemer », date: »2025-09-13″, type: »vide-grenier », heure: »08:30″, popularite:40, description: »Charmante ville, chine tranquille. » },
{ id:17, nom: »Brocante de Mortain », departement: »Manche », ville: »Mortain », date: »2025-05-31″, type: »brocante », heure: »09:00″, popularite:35, description: »Petite brocante locale. » },
{ id:18, nom: »Marché aux Puces de Lisors », departement: »Eure », ville: »Les Andelys », date: »2025-07-05″, type: »marche », heure: »08:00″, popularite:38, description: »Marché de village très apprécié. » },
{ id:19, nom: »Brocante de Granville », departement: »Manche », ville: »Granville », date: »2025-08-09″, type: »brocante », heure: »10:00″, popularite:57, description: »Brocante côtière animée. » },
{ id:20, nom: »Vide-Grenier de Saint-Pierre », departement: »Calvados », ville: »Saint-Pierre-en-Auge », date: »2025-09-20″, type: »vide-grenier », heure: »09:00″, popularite:33, description: »Petit vide-grenier villageois. » }
];
/* TRANSLATIONS / CHAINES (facilement modifiables) */
const T = {
prochain: « À venir »,
total: « Total »,
departements: « Départements »,
reset: « Réinitialiser »,
exporter: « Exporter CSV »,
selection_info: « Sélectionnez une brocante pour voir les détails ici. »
};
/* Initialisation : récupération des éléments DOM */
const el = {
root: document.getElementById(‘infographie-brocantes’),
list: document.getElementById(‘list’),
statTotal: document.getElementById(‘stat-total’),
statUpcoming: document.getElementById(‘stat-upcoming’),
statDept: document.getElementById(‘stat-dept’),
departGrid: document.getElementById(‘depart-grid’),
miniMap: document.getElementById(‘mini-map’),
spark: document.getElementById(‘spark’),
search: document.getElementById(‘search’),
filterDept: document.getElementById(‘filter-dept’),
filterType: document.getElementById(‘filter-type’),
sort: document.getElementById(‘sort’),
resetBtn: document.getElementById(‘reset-btn’),
exportCsv: document.getElementById(‘export-csv’),
detail: document.getElementById(‘detail’)
};
/* UTILITAIRES */
function formatDateISO(iso) {
// Format simple : 12 juin 2025
const d = new Date(iso + ‘T00:00:00’);
return d.toLocaleDateString(‘fr-FR’, { day:’2-digit’, month:’long’, year:’numeric’ });
}
function daysUntil(iso) {
const today = new Date();
const d = new Date(iso + ‘T00:00:00’);
const diff = Math.ceil((d – today) / (1000*60*60*24));
return diff;
}
/* Préparer liste de départements uniques */
const DEPARTS = Array.from(new Set(BROCANTES.map(b => b.departement))).sort();
/* Remplir filtre département */
function populateDeptFilter() {
DEPARTS.forEach(d => {
const opt = document.createElement(‘option’);
opt.value = d;
opt.textContent = d;
el.filterDept.appendChild(opt);
});
}
populateDeptFilter();
/* STATE */
let state = {
items: BROCANTES.slice(),
query: »,
dept: ‘all’,
type: ‘all’,
sort: ‘date-asc’
};
/* RENDER : liste d’items */
function renderList(items) {
el.list.innerHTML = »;
if (items.length === 0) {
const no = document.createElement(‘div’);
no.className = ‘small’;
no.textContent = ‘Aucun résultat’;
el.list.appendChild(no);
return;
}
items.forEach(item => {
const div = document.createElement(‘div’);
div.className = ‘item’;
div.tabIndex = 0;
div.setAttribute(‘role’,’listitem’);
div.setAttribute(‘aria-label’, `${item.nom}, ${item.ville}, ${formatDateISO(item.date)}`);
// couleur selon type
const colorClass = (item.type === ‘vide-grenier’) ? ‘vg’ : (item.type === ‘marche’ ? ‘regular’ : ‘regular’);
const dot = document.createElement(‘span’);
dot.className = ‘dot ‘ + ((daysUntil(item.date) >= 0 && daysUntil(item.date) <= 30) ? 'upcoming' : (item.type === 'vide-grenier' ? 'vg' : 'regular'));
dot.setAttribute('aria-hidden','true');
const content = document.createElement('div');
content.style.flex = '1';
const h = document.createElement('h3');
h.textContent = item.nom + ' — ' + item.ville;
content.appendChild(h);
const p = document.createElement('p');
p.textContent = formatDateISO(item.date) + ' · ' + item.heure;
content.appendChild(p);
const meta = document.createElement('div');
meta.className = 'meta';
meta.innerHTML = `${item.departement} ${item.type} Popularité : ${item.popularite} `;
content.appendChild(meta);
div.appendChild(dot);
div.appendChild(content);
// interaction : clic / clavier pour détails
div.addEventListener(‘click’, () => showDetail(item));
div.addEventListener(‘keydown’, (e) => {
if (e.key === ‘Enter’ || e.key === ‘ ‘) { showDetail(item); e.preventDefault(); }
});
el.list.appendChild(div);
});
}
/* Affiche panneau détail */
function showDetail(item) {
el.detail.innerHTML = `
${item.nom}
${item.ville} · ${item.departement}
${formatDateISO(item.date)} à ${item.heure}
${item.description}
Popularité : ${item.popularite}
`;
el.detail.scrollIntoView({ behavior:’smooth’, block:’nearest’ });
}
/* Statistiques simples */
function computeStats(items) {
el.statTotal.textContent = items.length;
const upcoming = items.filter(i => daysUntil(i.date) >= 0).length;
el.statUpcoming.textContent = upcoming;
el.statDept.textContent = new Set(items.map(i=>i.departement)).size;
}
/* Répartition par département : grille */
function renderDepartGrid(items) {
// compter par département
const counts = {};
DEPARTS.forEach(d => counts[d] = 0);
items.forEach(i => {
counts[i.departement] = (counts[i.departement] || 0) + 1;
});
el.departGrid.innerHTML = »;
DEPARTS.forEach(d => {
const col = document.createElement(‘div’);
col.className = ‘depart-col’;
col.setAttribute(‘role’,’group’);
col.setAttribute(‘aria-label’, `${d} : ${counts[d]} événements`);
const title = document.createElement(‘div’);
title.style.fontWeight = 600;
title.style.marginBottom = ‘6px’;
title.textContent = d;
col.appendChild(title);
const list = document.createElement(‘div’);
list.style.display = ‘flex’;
list.style.flexDirection = ‘column’;
list.style.gap = ‘6px’;
// montrer jusqu’à 5 éléments mini
const listItems = items.filter(i => i.departement === d).slice(0,5);
listItems.forEach(i => {
const row = document.createElement(‘div’);
row.style.display = ‘flex’;
row.style.alignItems = ‘center’;
row.style.justifyContent = ‘space-between’;
const left = document.createElement(‘div’);
left.style.display=’flex’; left.style.alignItems=’center’;
const dot = document.createElement(‘span’);
dot.className = ‘dot ‘ + ((daysUntil(i.date) >= 0 && daysUntil(i.date) 5) {
const more = document.createElement(‘div’);
more.className = ‘small’;
more.style.marginTop=’6px’;
more.textContent = `+ ${counts[d] – 5} autres`;
list.appendChild(more);
}
col.appendChild(list);
el.departGrid.appendChild(col);
});
}
/* Mini carte compacte : colonnes par département */
function renderMiniMap(items) {
// chaque colonne = departement; on affiche petits points par événement
el.miniMap.innerHTML = »;
DEPARTS.forEach(d => {
const col = document.createElement(‘div’);
col.style.flex=’1′;
col.style.minHeight=’56px’;
col.style.background=’#fff’;
col.style.border=’1px solid #eef2f7′;
col.style.borderRadius=’6px’;
col.style.padding=’6px’;
const title = document.createElement(‘div’);
title.style.fontSize=’12px’;
title.style.color=’#0f172a’;
title.style.fontWeight=’600′;
title.style.marginBottom=’6px’;
title.textContent = d.split(‘ ‘)[0];
col.appendChild(title);
const points = document.createElement(‘div’);
points.style.display=’flex’;
points.style.flexWrap=’wrap’;
points.style.gap=’4px’;
const itemsD = items.filter(i => i.departement === d);
itemsD.forEach(i => {
const p = document.createElement(‘div’);
p.setAttribute(‘title’, `${i.nom} — ${i.ville} (${formatDateISO(i.date)})`);
const cls = (daysUntil(i.date) >= 0 && daysUntil(i.date) showDetail(i));
p.addEventListener(‘keydown’, (e) => { if (e.key===’Enter’) showDetail(i); });
points.appendChild(p);
});
col.appendChild(points);
el.miniMap.appendChild(col);
});
}
/* Sparkline / histogramme mensuel (SVG simple) */
function renderSpark(items) {
// compter par mois 2025 (index 1..12)
const months = Array(12).fill(0);
items.forEach(i => {
const d = new Date(i.date + ‘T00:00:00’);
if (d.getFullYear() === 2025) months[d.getMonth()]++;
});
const w = el.spark.clientWidth || el.spark.parentElement.clientWidth;
const h = el.spark.clientHeight || 120;
el.spark.innerHTML = »;
const max = Math.max(…months,1);
const padding = 8;
const barW = (w – padding*2) / 12;
months.forEach((v, idx) => {
const x = padding + idx * barW;
const barH = (v / max) * (h – 30);
const y = h – padding – barH;
const rect = document.createElementNS(‘http://www.w3.org/2000/svg’,’rect’);
rect.setAttribute(‘x’, x.toFixed(2));
rect.setAttribute(‘y’, y.toFixed(2));
rect.setAttribute(‘width’, Math.max(6, barW – 6).toFixed(2));
rect.setAttribute(‘height’, barH.toFixed(2));
rect.setAttribute(‘fill’, ‘#0ea5a4’);
rect.setAttribute(‘opacity’, ‘0.95’);
rect.setAttribute(‘aria-hidden’,’true’);
el.spark.appendChild(rect);
// label mois (abrégé)
const txt = document.createElementNS(‘http://www.w3.org/2000/svg’,’text’);
txt.setAttribute(‘x’, (x + barW/2).toFixed(2));
txt.setAttribute(‘y’, (h – 4).toFixed(2));
txt.setAttribute(‘fill’,’#475569′);
txt.setAttribute(‘font-size’,’10’);
txt.setAttribute(‘text-anchor’,’middle’);
const monthNames = [‘jan’,’fév’,’mars’,’avr’,’mai’,’juin’,’juil’,’août’,’sept’,’oct’,’nov’,’déc’];
txt.textContent = monthNames[idx];
el.spark.appendChild(txt);
});
}
/* Filtrage / tri */
function applyFilters() {
// récupérer état UI
state.query = el.search.value.trim().toLowerCase();
state.dept = el.filterDept.value;
state.type = el.filterType.value;
state.sort = el.sort.value;
let items = BROCANTES.slice();
// recherche texte
if (state.query) {
items = items.filter(i =>
(i.nom + ‘ ‘ + i.ville + ‘ ‘ + i.departement + ‘ ‘ + i.description).toLowerCase().includes(state.query)
);
}
// département
if (state.dept !== ‘all’) {
items = items.filter(i => i.departement === state.dept);
}
// type
if (state.type !== ‘all’) {
items = items.filter(i => i.type === state.type);
}
// tri
if (state.sort === ‘date-asc’) {
items.sort((a,b) => new Date(a.date) – new Date(b.date));
} else if (state.sort === ‘date-desc’) {
items.sort((a,b) => new Date(b.date) – new Date(a.date));
} else if (state.sort === ‘popularity’) {
items.sort((a,b) => b.popularite – a.popularite);
}
// rendre
renderList(items);
computeStats(items);
renderDepartGrid(items);
renderMiniMap(items);
renderSpark(items);
}
/* Export CSV simple */
function exportCSV(items) {
if (!items || items.length === 0) {
alert(‘Aucun élément à exporter.’);
return;
}
const headers = [‘id’,’nom’,’departement’,’ville’,’date’,’heure’,’type’,’popularite’,’description’];
const rows = items.map(i => headers.map(h => JSON.stringify(i[h]|| »)).join(‘,’));
const csv = [headers.join(‘,’), …rows].join(‘n’);
const blob = new Blob([csv], { type:’text/csv;charset=utf-8;’ });
const url = URL.createObjectURL(blob);
const a = document.createElement(‘a’);
a.href = url;
a.download = ‘brocantes_normandie_2025.csv’;
document.body.appendChild(a);
a.click();
a.remove();
URL.revokeObjectURL(url);
}
/* Événements UI */
el.search.addEventListener(‘input’, debounce(() => applyFilters(), 250));
el.filterDept.addEventListener(‘change’, applyFilters);
el.filterType.addEventListener(‘change’, applyFilters);
el.sort.addEventListener(‘change’, applyFilters);
el.resetBtn.addEventListener(‘click’, () => {
el.search.value = »;
el.filterDept.value = ‘all’;
el.filterType.value = ‘all’;
el.sort.value = ‘date-asc’;
applyFilters();
});
el.exportCsv.addEventListener(‘click’, () => {
// exporter les éléments actuellement visibles
const visibleItems = Array.from(el.list.querySelectorAll(‘.item’)).map(node => {
// trouver l’item via label (recherche communautaire)
const label = node.querySelector(‘h3’)?.textContent || »;
return BROCANTES.find(b => label.includes(b.nom));
}).filter(Boolean);
exportCSV(visibleItems);
});
/* Débounce utilitaire */
function debounce(fn, wait) {
let t;
return function(…args) {
clearTimeout(t);
t = setTimeout(() => fn.apply(this, args), wait);
};
}
/* Initial render */
applyFilters();
/* ACCESSIBILITÉ : raccourci clavier global pour focus recherche (Alt+F) */
document.addEventListener(‘keydown’, (e) => {
if ((e.altKey || e.metaKey) && e.key.toLowerCase() === ‘f’) {
e.preventDefault();
el.search.focus();
}
});
/*
NOTE sur les APIs externes :
– Aucune API externe n’est utilisée pour garder cet outil 100% gratuit et offline.
– Si vous souhaitez enrichir avec géocodage (coordonnées) : utiliser par ex.
Nominatim (OpenStreetMap) : https://nominatim.openstreetmap.org/search?q=Caen&format=json
Réponse JSON exemple :
[
{
« place_id »: »123456″,
« licence »: »Data © OpenStreetMap contributors »,
« osm_type »: »relation »,
« osm_id »: »… « ,
« boundingbox »:[« 49.18″, »49.19″, »-0.37″, »-0.36″],
« lat »: »49.1829″,
« lon »: »-0.3700″,
« display_name »: »Caen, Calvados, Normandie, France »,
« class »: »place »,
« type »: »city »,
« importance »:0.8
}
]
– Respectez les règles d’usage et les quotas de ces services si vous les activez.
*/
/* Fin du script */
Адкрыйце для сябе ўнікальныя прадметы для аўтэнтычнага дэкору
Каштоўнасць прадмета заключаецца ў яго гісторыі: камода адраджаецца ў гасцінай, антыкварны абедзенны сервіз знаходзіць сваё месца на сучасным стале. Гэтыя знаходкі распавядаюць гісторыі.
Ідэя: спалучыць антыкварны прадмет з сучаснай мэбляй для стварэння яркага інтэр’еру.
Многія арганізатары з’яўляюцца некамерцыйнымі арганізацыямі: продажы фінансуюць мясцовыя праекты. Гэта ўмацоўвае сацыяльныя сувязі і перадачу ведаў.
Спецыяльныя мерапрыемствы і паслугі: узбагачэнне вашага досведу на блышыным рынку
Карысная паслуга: бясплатная ацэнка і хуткі вываз для прыборкі дамоў.
Парады, як максімальна выкарыстоўваць блышыныя рынкі Нармандыі ў 2025 годзе
Адаптуйце свой візіт да фарматаў і даступнасці
Навучыцеся распазнаваць пароды дрэва і брэнды, каб ацаніць іх кошт. Практычныя дапаможнікі па ідэнтыфікацыі парод дрэва вельмі карысныя. Парада: вядзіце перамовы з павагай і правярайце наяўнасць рэстаўрацый.
Даследуйце бліжэйшыя блышыныя рынкі, каб падоўжыць сваё вінтажнае прыгода. Падоўжыце свой дзень, наведаўшы некалькі суседніх вёсак: геаграфічная разнастайнасць павялічвае вашы шанцы знайсці скарбы. Улічвайце лагістыку перавозкі грувасткіх прадметаў. Напамін: звярніцеся да рэгіянальных даведнікаў, каб спланаваць свае прыпынкі.
Ці варта выбіраць барахолкі ці спецыялізаваныя крамы?
Барахлышы прапануюць цэны і сюрпрызы, а крамы даюць гарантыю і экспертызу. Спалучайце абодва падыходы.
Як перавезці далікатную мэблю пасля пакупкі? Вазьміце з сабой рамяні, коўдру для пераезду і, пры неабходнасці, запытайце прафесійную службу перавозкі.
{« @context »: »https://schema.org », »@type »: »FAQPage », »mainEntity »:[{« @type »: »Question », »name »: »Comment repu00e9rer une vraie piu00e8ce ancienne? », »acceptedAnswer »:{« @type »: »Answer », »text »: »Vu00e9rifiez lu2019usure naturelle, les fixations anciennes, les essences de bois et demandez lu2019histoire du meuble au vendeur. »}},{« @type »: »Question », »name »: »Faut-il pru00e9fu00e9rer les brocantes ou les boutiques spu00e9cialisu00e9es? », »acceptedAnswer »:{« @type »: »Answer », »text »: »Les brocantes offrent des prix et des surprises, les boutiques du00e9livrent assurance et expertise. Combinez les deux approches. »}},{« @type »: »Question », »name »: »Comment transporter un meuble fragile apru00e8s achat? », »acceptedAnswer »:{« @type »: »Answer », »text »: »Pru00e9voir sangles, couverture de du00e9mu00e9nagement et, si besoin, demander un service du2019enlu00e8vement professionnel. »}}]}