Garage sales and flea markets in Loire-Atlantique (44)

Découvrez les vide-greniers et brocantes en Loire-Atlantique (44) pour chiner des objets uniques et profiter d'une ambiance conviviale près de chez vous.

In short

Sommaire

44 Quick Tips for Thrifting

  • In Nantes, the urban flea market blends with traditional antique markets: ideal for small finds and items to be appraised.

  • Around Saint-Nazaire and Donges, early morning gatherings often offer the best prices on furniture, tools, and tableware.

  • Head to the coast: Pornic and Villeneuve-en-Retz prioritize a family atmosphere and vintage vacation items.

  • Themed fairs (books, vinyl records) in Nantes attract collectors, record dealers, and professional booksellers.

  • To sell: advance registration, sorting by category, price display, and a mini “appraisal” area inspired by antique dealers’ practices.

In Loire-Atlantique, thrifting has that Sunday outing feel that often ends in a real discovery. Between Nantes and the port towns, the stalls tell stories: wedding tableware, 80s toys, old carpenter’s tools, concert posters, and sometimes that family heirloom salvaged from an estate clearance. Regulars know: a successful flea market is as much about having a good eye as it is about knowing how to do things. People come for the bargain, stay for the atmosphere, and sometimes leave with a lead for a more serious appraisal, just like a traveling antique dealer from Normandy. What’s striking in Loire-Atlantique (department 44) is the diversity of formats. A neighborhood garage sale in Nantes doesn’t have the same dynamic as a seaside flea market in Pornic, nor as a specialized fair where collectors bring out magnifying glasses, lists, and protective sleeves. And if you’re preparing for a clearance or an inheritance sale, these events also give you a concrete idea of ​​the values, trends, and items that sell quickly. The common thread: learning to hunt smart, without rushing, and with the pleasure of conversation. Meta description: Calendar and tips for garage sales

and flea markets in Loire-Atlantique (44): Nantes , Saint-Nazaire , Donges,

Pornic Vinyl record fairs, booksellers, seasonal markets, and tips for buying and selling. Garage Sale Calendar for Loire-Atlantique (44): Upcoming Must-See Dates To help you find your way around, a few dates stand out: in Nantes , the large Sundays in spring (April-May) bring together a dense flea marketin the city center, while summer favors the quays and parks. In September, the start of the academic year is ideal for students furnishing their apartments: a bistro chair or an Art Deco lamp can find a buyer in an hour. Along the estuary,Donges often organizes agarage sale organized by a non-profit organization at the end of May, and a second one at the beginning of autumn, when attics are being emptied before winter. Clisson, with its focus on “charming objects,” is perfect for finding decorative items, andNantes

remains the price barometer: it’s where you can see what’s going up… and what’s going down.

Top Flea Markets in Nantes: Major Flea Markets and Antique FairsNantes shines with its “mainstream” events where casual bargain hunters and seasoned buyers mingle. A neighborhood flea market near the boulevards often allows you to haggle over a set of dishes, while a more central flea market attracts professionals and better-sourced items. Local tip: arrive with a specific idea (mirror, chest of drawers, tools) and leave room for the unexpected. In Nantes, stalls change quickly, and the first hour often makes all the difference when it comes to furniture. The next logical step is to explore the specializations, particularly books and music. Professional Booksellers in Nantes: Where and When to Find Them In Nantes, some professional booksellers work like true “treasure hunters”: they buy up libraries from estates, sort through them, restore them, and then put them back into circulation. You can find them at themed days in the city centre, but also at indoor events when the weather turns bad.

A telling example: a collection of regional and maritime books, spotted in Nantes on an unassuming table, might be worth more than it first appears. In the world of printed material, condition, edition, and rarity matter as much as the title. Vinyl and record fairs: specialized events in Nantes Vinyl fairs in Nantes attract record dealers, collectors, and the simply curious. People look for French pressings, rock from the 60s and 70s, or electro maxi-singles that are making a strong comeback. Here, the negotiation is more technical: master, sleeve, and sound quality. These events in Nantes perfectly complement a classic flea market: you go there to find specific items, not just to browse. Next step: venture outside the city and compare the atmospheres. Flea markets and garage sales in the towns of Loire-Atlantique: Donges, Pornic, Clisson, Saint-Nazaire Outside of Nantes, these towns offer a more “local” and often more direct approach to bargain hunting. In Donges, you’ll find tools, workshop equipment, and nautical items related to the estuary; the atmosphere is lively, and prices remain affordable. In Pornic, the flea market has a more leisurely, stroll-like feel, with seaside items, baskets, posters, and vacation furniture. Clisson frequently offers a more decorative selection, while Saint-Nazaire is a perfect place for sturdy furniture and garage equipment. Varying the towns increases your chances: each place has its own unique character. Early morning flea markets in Saint-Nazaire: great deals and must-see spots In Saint-Nazaire, the early morning markets reward early risers: arriving as early as 7:30 a.m., flashlights in winter, and coffee in hand. During these times, you can often find entire lots (dishes, toys, hardware), perfect for furnishing a house after a clearance. The best tip: look for “house clearance” stalls, which indicate the end of an estate sale. A flea market It’s not just a market; it’s sometimes a passing of the torch between generations.

Découvrez le calendrier 2026 des brocantes en Normandie ainsi que nos bons plans pour chiner les meilleures trouvailles tout au long de l'année.

Flea markets in Normandy : calendar and good deals 2026

Antique-hunting enthusiasts and antiques professionals, this overview gathers the 2026 calendar of flea markets and garage sales in Normandy, designed for treasure-hunters, secondhand dealers and…

Christmas markets and seasonal events in Loire-Atlantique: what are their specific characteristics?

At the end of the year, Nantes and the surrounding towns organize Christmas markets where the flea market

takes on a handcrafted and vintage feel. You’ll find antique decorations, glass ornaments, nativity figurines, and sometimes mechanical toys to restore. These seasonal events also encourage responsible gift-giving: giving something old is giving a story. For sellers, it’s a more demanding format: careful presentation, clean items, and staging. The season naturally leads to indoor venues, which brings us to the next topic.Formats of flea markets in Loire-Atlantique: outdoors, indoor venues, and more

Outdoors remain the classic choice, especially in

Nantes where strolling is part of the fun. But indoor fairs are gaining ground: more comfortable, more conducive to interaction, and often better organized for the quick appraisal of antiques.Hybrid formats are also emerging: a

flea market in a supermarket parking lot, or a garage sale

in a multi-purpose hall, convenient for families. The important thing is to choose the format best suited to your goal: furnishing, collecting, or clearing out an attic.

Specialized fairs: niche items and rare collections in Loire-Atlantique Specialized fairs appeal to those who appreciate detail: coins, postcards, militaria, antique toys. In Nantes

, these gatherings allow you to compare items, avoid mistakes, and request a consistent appraisal before buying, just as you would during an appraisal in Normandy. A general flea market offers the element of surprise; a fair provides precision. The two are complementary. Typical locations for garage sales in Loire-Atlantique: public squares, parking lots, and multi-purpose halls

Vide grenier 76

Flea market 76 : tips for hunting the best finds in 2026

Overseeing the flea market scene in Normandy, this practical guide focuses on tips to succeed in your treasure hunt during a garage sale in Seine-Maritime.…

In the Loire-Atlantique department (44), the locations are recurring: town squares, stadium parking lots, the areas around covered markets, and community halls. In Nantes, some neighborhoods favor tree-lined squares; in Donges, easily accessible areas are appreciated, convenient for loading furniture. Keep in mind that location influences the contents: near a food market, small items turn over quickly; near a gym, you’ll often find baby equipment and clothing. A flea market is also a geographical phenomenon.

Practical tips for a successful visit to a flea market in Loire-Atlantique (44): The winning trio: arrive early, travel light, and have some cash on hand. In Nantes, an extra hour can make all the difference when it comes to finding a chest of drawers or an original poster. Bring a tape measure: impulse buying can quickly become a headache on the stairs. Observe: look for the “attic find” stalls, often the most interesting ones. Ask questions: about origin, condition, repairs, especially regarding electrical items and furniture.Negotiate: politely, in bulk, and showing respect for the item. And if you’re preparing a clearance after an inheritance, note the prices you see: it’s a concrete benchmark for sorting and valuing items.Why participating in flea markets in Loire-Atlantique is an intergenerational pleasure At a flea market, you often see three generations around the same stall. Children rummage through toys, parents look for practical items, and grandparents explain how an object was used. In Nantes, this transmission is palpable: an old coffee grinder becomes a pretext for memories.This shared pleasure creates a rare conviviality and makes the outing worthwhile. The next step is understanding how it all works thanks to the organizers. The importance of local organization: finding schedules and contacts for flea markets in Loire-Atlantique (department 44) A flea market

Success relies on solid logistics: registration, placement, security, and crowd management. Local posters, town halls, festival committees, and associations generally publish schedules and contact information. In Nantes, neighborhood pages are invaluable for avoiding unnecessary trips. Pro tip: check the exhibitors’ setup times and the actual closing time. The best deals are found early… and sometimes right at the end. Discover the wealth of secondhand items at Loire-Atlantique flea markets. Loire-Atlantique blends maritime and urban influences. In Nantes, you’ll find design, vintage, and industrial decor. In Pornic, you’ll come across nautical items, baskets, and tourist posters. Each flea market becomes a small, living museum. And with practice, you’ll start to spot the events that really matter. Major Annual Flea Market Events in Loire-Atlantique (department 44)

Several major annual events structure the season: large flea markets in Nantes in the spring and fall, large community gatherings around the estuary, and indoor fairs as winter approaches. These events attract regular vendors with better-prepared stalls.

For a buyer, it’s the ideal place to compare prices within the same category. For a seller clearing out an estate, it’s an effective showcase. A Closer Look at Themed Flea Markets in Loire-Atlantique: Antiques, Books, and Vinyl RecordsThemed events are gaining popularity: regional antiques, rare books, and vinyl records in Nantes. An antique flea market emphasizes authenticity, restoration, and provenance. Books require careful handling; vinyl records, a visual inspection, and sometimes listening on-site. This targeting avoids dispersion and reassures: we buy better when we understand what we are buying.

How to enjoy family flea markets in Loire-Atlantique For a smooth outing, choose a simple itinerary: an event in Nantes

vide grenier

Everything you need to know about vide grenier.org in 2026 : complete guide to enjoying the best finds

Overseeing the 2026 season of flea markets and garage sales, this text describes step by step the strategies to turn each outing into a fruitful…

in the morning, a break, then a smaller location in the afternoon. Children love the hunt for little treasures; adults appreciate the stalls selling tableware and decorative items.

A good tip: give the younger ones a “mission” (find a book, a game, a poster), while keeping an eye on the budget. The flea market becomes a game of observation. The best tips for selling effectively at a flea market in Loire-Atlantique (44) A

successful flea market

for the seller starts at home: sorting by category, a quick clean-up, and clearly displayed prices. In

Nantes , buyers compare prices quickly; clear pricing avoids endless discussions. Present your items like a little “corner of home”: this encourages purchases. And if you are clearing out a property after an inheritance, remember to keep separate the items to be appraised by a professional.

How to Spot the Best Deals at Flea Markets in Loire-Atlantique The best deals are often hidden in bundles: a kitchen box, a haberdashery drawer, a hardware crate. In Nantes, look for vendors who are constantly restocking: they’re more likely to give a price later in the morning. For example, a set of mismatched chairs might seem ordinary, but a designer bistro chair or an antique straw seat deserves an appraisal. Your eye will develop with experience. The Ecological and Economic Benefits of Flea Markets in Loire-Atlantique Flea markets offer immediate reuse: less waste, fewer new purchases, and a second life for the object. In Nantes, this approach is part of an urban culture of reuse and repair.

Economically, it’s a win-win: you can equip yourself at a lower cost, and the money circulates locally through associations. Thrift shopping is a different way to consume, without sacrificing the enjoyment.

Discover the flea markets and garage sales in Loire-Atlantique (44) to find unique items and enjoy a friendly atmosphere close to home.

Interview with flea market organizers in Loire-Atlantique: behind the scenes and preparation Behind the scenes, organizers often talk about the same challenges: managing registrations, avoiding duplicate spaces, and maintaining a family-friendly atmosphere. In Nantes, coordination with local residents is essential: traffic, cleanliness, and opening hours.

Their secret: a clear map, easily identifiable volunteers, and an information point. The result: a more pleasant flea market, where people take the time to chat and shop at their leisure. The essential monthly flea markets in Loire-Atlantique (department 44)

Monthly flea markets are perfect for honing your skills: you spot the regulars, keep an eye on prices, and learn how to negotiate. In Nantes, some neighborhoods have a regularity that allows you to return with a specific item in mind (mirror, dishes, lighting). On the outskirts, a trip to Couëron or quieter towns offers a different experience: fewer crowds, more conversation, and sometimes unexpected finds. Collections fairs in Loire-Atlantique: how to participate and what to findParticipating in a flea market requires a serious approach: registration, a reserved table, and pre-sorted items. You’ll find well-curated collections, sometimes from a family attic. In Nantes, these fairs provide access to sellers who know their stuff, which helps you buy the right items. For visitors, it’s a learning experience: you compare items in different conditions, understand the criteria, and refine your eye. A Specialized Flea Marketspeeds up the experience.

Interactive infographicFlea markets & garage sales in Loire-Atlantique (44)

Filter events, estimate your budget, and get a ready-to-copy checklist.

Weather (free) Refresh☁︎

  • Loading…

  • — Tip: Choose mornings if there’s a risk of rain. (Open-Meteo data) Find a flea market (examples)

  • The list below is an editable example. You can replace the data with your own. Reset

Copy my selection

Town/City

Type Maximum distance (km)20 Estimate based on a starting point (editable) and a simple formula.Search (name / details)

— Matching event(s)

Sort

Date (ascending) Distance (ascending) Name (A → Z) Note: This infographic does not replace official announcements. Always check the organizer (schedule, cancellation policy, weather, permits).Quick budget estimate

Adjust your settings to get a realistic range (fuel + purchases + contingencies).

Mode: Visitor

You are VisitorExhibitor Estimated distance (km)Fuel consumption (L/100km)

Fuel price (€/L) Purchases budget (€) Contingency margin

10%

Estimated total Indicative range Minimum

Comfort

FuelPurchases

Exhibitor fees

Simplified calculation: fuel = km × (consumption/100) × price. Exhibitor fees are estimated. Quick checklist Check, then copy a clean list to paste into your notes.

Copy Check all Uncheck all

Weather tips

Quick tips Copied. The Role of Local Associations in Organizing Flea Markets in Loire-Atlantique In the Loire-Atlantique department (44), many events fund schools, sports clubs, and charitable initiatives. In Nantes, this community involvement strengthens trust: people know where the money from stall rentals goes. For sellers clearing out a house, it’s also an opportunity to give everyday items a second life. We also see partnerships between neighborhoods, particularly around Saint-Sébastien-sur-Loire and Saint-Herblain.which pool communication resources. The local organization ensures a high-quality experience, quite simply.

Contact and registration: how to participate in a flea market in Loire-Atlantique (44)

The best approach: register early, especially in Nantes, where spaces fill up quickly. Prepare your ID, license plate number, and possibly proof of address, depending on the regulations. A well-organized flea market minimizes unforeseen problems. If you are selling items from a house clearance or inheritance, keep a list and some photos: this helps to set reasonable prices and identify items that need appraisal.Social media and websites to stay up-to-date on flea markets in Loire-Atlantique

To keep track of dates, local groups remain very effective: neighborhood pages in Nantes, association calendars, and announcements from town halls. You can also find practical information (parking, access) and sometimes location maps. On the ground, a simple chat with an exhibitor often leads to the next great opportunity, in

Donges

or elsewhere. Thrifting thrives on word-of-mouth. Smart Thrifting: Tips for finding unique and affordable items in Loire-AtlantiqueSmart Thrifting means alternating between Nantesand smaller towns: an urban Sunday, then a quieter event in

Donges

, a detour to

Saint-Lumine-de-Coutais

, or a stop in Villeneuve-en-Retz. This rotation avoids direct competition and opens up new styles of objects.

Two simple guidelines: check the condition (wood, drawers, smells) and imagine how it would be used. Between Gorges and

Nantes

, you can often find sturdy furniture to revamp; that’s where the flea marketbecomes a real home improvement project.

City Event Type

Specific Focus

Nantes Flea Markets / Antiques MarketsFurniture, vintage decor, quick appraisals

Donges Garage Sale organized by associations

/* — Design (sans images) — */ #infographie-vide-greniers-44 .bg-grid { background-image: radial-gradient(transparent 1px, rgba(255,255,255,0.0) 1px), linear-gradient(90deg, rgba(255,255,255,0.06) 1px, transparent 1px), linear-gradient(rgba(255,255,255,0.06) 1px, transparent 1px); background-size: 10px 10px, 26px 26px, 26px 26px; background-position: 0 0, 0 0, 0 0; } #infographie-vide-greniers-44 .glass { background: linear-gradient(180deg, rgba(255,255,255,0.10), rgba(255,255,255,0.06)); border: 1px solid rgba(255,255,255,0.12); box-shadow: 0 10px 30px rgba(0,0,0,0.25); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); } #infographie-vide-greniers-44 .chip { border: 1px solid rgba(255,255,255,0.14); background: rgba(255,255,255,0.06); } #infographie-vide-greniers-44 .focus-ring:focus { outline: 3px solid rgba(59,130,246,0.75); outline-offset: 2px; } #infographie-vide-greniers-44 .slider { accent-color: #60a5fa; } #infographie-vide-greniers-44 .bar { height: 10px; border-radius: 999px; background: rgba(255,255,255,0.10); overflow: hidden; border: 1px solid rgba(255,255,255,0.10); } #infographie-vide-greniers-44 .bar > i { display: block; height: 100%; width: 0%; border-radius: 999px; background: linear-gradient(90deg, rgba(96,165,250,0.95), rgba(52,211,153,0.95)); transition: width 300ms ease; } /* Hauteur max (outil complet) */ #infographie-vide-greniers-44 .cap-height { max-height: 2000px; }
Tools, household goods, workshop items

Pornic

Coastal Flea Market

Seaside items, posters, family atmosphere
Tip
Early morning

Rare items

Take a quick look around, then come back to negotiate

Late morning

What documents are needed to run a stall at a flea market in Loire-Atlantique? Generally: an identity document and, depending on the organizer, proof of address and vehicle registration. In Nantes, as elsewhere, registration is often done in advance through an association or town hall, with internal regulations to be followed.
How do you know if an item deserves an appraisal rather than an immediate sale? At a flea market, certain clues matter: signature, brand, antique material (solid wood, brass), original condition, and overall coherence (complete set, series). In the case of an inheritance or house clearance, set these pieces aside and have them appraised by a professional to avoid underselling. What are the best times to find bargains in Nantes?
In Nantes, the early hours are for snagging the items you’re looking for (furniture, posters, vinyl records). Late morning is ideal for negotiating, especially when buying in bulk. The two strategies are complementary depending on your goal. Can you browse effectively with children?
/* === API externe 100% gratuite (sans clé) === Service : Open-Meteo (prévisions) URL (exemple Nantes) : https://api.open-meteo.com/v1/forecast?latitude=47.2184&longitude=-1.5536&current=temperature_2m,precipitation,rain,wind_speed_10m&timezone=Europe%2FParis Exemple de réponse JSON (extrait) : { “latitude”:47.22, “longitude”:-1.55, “current”:{ “time”:”2025-12-15T10:00″, “temperature_2m”:8.2, “precipitation”:0.0, “rain”:0.0, “wind_speed_10m”:12.3 } } */ (function () { // ============ Textes (FR) facilement éditables ============ const STR = { badge: “Infographie interactive”, title: “Vide-greniers & brocantes en Loire-Atlantique (44)”, subtitle: “Filtrez les événements, estimez votre budget et récupérez une checklist prête à copier.”, filterTitle: “Trouver un vide-greniers (exemples)”, filterDesc: “La liste ci-dessous est un exemple éditable. Vous pouvez remplacer les données par les vôtres.”, disclaimer: “Remarque : cette infographie ne remplace pas les annonces officielles. Vérifiez toujours l’organisateur (horaires, annulation, météo, autorisations).”, townLabel: “Commune”, typeLabel: “Type”, distanceLabel: “Distance maximale (km)”, distanceHint: “Estimation basée sur un point de départ (modifiable) et une formule simple.”, searchLabel: “Recherche (nom / détails)”, resultsSuffix: “événement(s) correspondant(s)”, sortLabel: “Tri”, reset: “Réinitialiser”, copySelection: “Copier ma sélection”, weatherLabel: “Météo (gratuite)”, weatherLoading1: “Chargement…”, weatherLoading2: “—”, weatherHint: “Astuce : privilégiez les matinées si risque de pluie. (Données Open-Meteo)”, weatherLine: (city, t, rain, wind) => `${city} : ${t}°C • Pluie ${rain} mm • Vent ${wind} km/h`, budgetTitle: “Estimation rapide du budget”, budgetDesc: “Ajustez vos paramètres pour obtenir une fourchette réaliste (carburant + achats + imprévus).”, modeVisitor: “Mode : visiteur”, modeExhibitor: “Mode : exposant”, youAre: “Vous êtes”, tripKm: “Trajet estimé (km)”, conso: “Conso (L/100km)”, fuelPrice: “Prix carburant (€/L)”, buyBudget: “Budget achats (€)”, buffer: “Marge imprévus”, totalEstimated: “Total estimé”, indicativeRange: “Fourchette indicative”, min: “Minimum”, comfort: “Confort”, breakdownFuel: “Carburant”, breakdownBuy: “Achats”, breakdownFees: “Frais (exposant)”, budgetNote: “Calcul simplifié : carburant = km × (conso/100) × prix. Les frais exposant sont estimés.”, checklistTitle: “Checklist express”, checklistDesc: “Cochez, puis copiez une liste propre à coller dans vos notes.”, copy: “Copier”, checkAll: “Tout cocher”, uncheckAll: “Tout décocher”, smartTips: “Conseils selon météo”, tipsTitle: “Conseils rapides”, toastCopied: “Copié dans le presse-papiers.”, toastFallback: “Copie impossible automatiquement. Sélectionnez et copiez manuellement.” }; // ============ Données locales (exemples) ============ // IMPORTANT : vous pouvez remplacer ce tableau par “la data pour l’outils” si vous la collez ici. // Champs : id, nom, commune, type, dateISO, debut, fin, lat, lon, details const EVENTS = [ { id: “vg-nantes-01”, nom: “Vide-greniers du quartier (exemple)”, commune: “Nantes”, type: “Vide-greniers”, dateISO: “2026-04-12”, debut: “08:00”, fin: “18:00”, lat: 47.2184, lon: -1.5536, details: “Accès transports • Restauration • Toilettes” }, { id: “brc-reze-01”, nom: “Brocante de printemps (exemple)”, commune: “Rezé”, type: “Brocante”, dateISO: “2026-05-03”, debut: “09:00”, fin: “17:30”, lat: 47.1907, lon: -1.5686, details: “Professionnels & particuliers • Parking à proximité” }, { id: “vg-stherblain-01”, nom: “Vide-greniers associatif (exemple)”, commune: “Saint-Herblain”, type: “Vide-greniers”, dateISO: “2026-06-07”, debut: “07:30”, fin: “18:30”, lat: 47.2175, lon: -1.6493, details: “Entrée gratuite • Emplacements exposants sur réservation” }, { id: “brc-guerande-01”, nom: “Brocante & antiquités (exemple)”, commune: “Guérande”, type: “Brocante”, dateISO: “2026-07-19”, debut: “08:30”, fin: “19:00”, lat: 47.3282, lon: -2.4296, details: “Centre historique • Idéal pour chiner tôt” }, { id: “vg-saintnazaire-01”, nom: “Grand vide-greniers (exemple)”, commune: “Saint-Nazaire”, type: “Vide-greniers”, dateISO: “2026-08-23”, debut: “08:00”, fin: “18:00”, lat: 47.2733, lon: -2.2137, details: “Grande capacité • Zone ombragée partielle” } ]; // Point de départ (modifiable) : Nantes centre const START = { label: “Point de départ : Nantes”, lat: 47.2184, lon: -1.5536 }; // ============ Checklist (FR) ============ const CHECKLIST_ITEMS = [ “Espèces (petites coupures) + monnaie”, “Sac cabas / chariot / sacs solides”, “Mètre ruban (meubles, cadres, vélos)”, “Batterie externe + câble”, “Lingettes / gel hydroalcoolique”, “Bouteille d’eau + encas”, “Vêtements adaptés (couche imperméable)”, “Liste de ce que je cherche + budget max”, “De quoi protéger les trouvailles (papier bulle, couverture)”, “Pour exposants : table, bâche, ficelle, scotch, marqueur” ]; // ============ Helpers ============ const $ = (sel) => document.querySelector(sel); const root = $(“#infographie-vide-greniers-44”); function formatDateFR(dateISO) { const d = new Date(dateISO + “T00:00:00”); return d.toLocaleDateString(“fr-FR”, { weekday: “short”, year: “numeric”, month: “long”, day: “numeric” }); } // Haversine (distance km) function distanceKm(lat1, lon1, lat2, lon2) { const R = 6371; const toRad = (x) => x * Math.PI / 180; const dLat = toRad(lat2 – lat1); const dLon = toRad(lon2 – lon1); const a = Math.sin(dLat / 2) ** 2 + Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLon / 2) ** 2; const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 – a)); return R * c; } function clamp(n, min, max) { return Math.max(min, Math.min(max, n)); } function euro(n) { const v = Number.isFinite(n) ? n : 0; return v.toLocaleString(“fr-FR”, { style: “currency”, currency: “EUR” }); } async function copyToClipboard(text) { try { await navigator.clipboard.writeText(text); showToast(STR.toastCopied); return true; } catch (e) { showToast(STR.toastFallback); return false; } } let toastTimer = null; function showToast(msg) { const toast = $(“#toast”); $(“#toastText”).textContent = msg; toast.classList.remove(“hidden”); if (toastTimer) clearTimeout(toastTimer); toastTimer = setTimeout(() => toast.classList.add(“hidden”), 2200); } // ============ UI init textes ============ function setStaticText() { $(“#txtBadge”).textContent = STR.badge; $(“#txtTitle”).textContent = STR.title; $(“#txtSubtitle”).textContent = STR.subtitle; $(“#txtFilterTitle”).textContent = STR.filterTitle; $(“#txtFilterDesc”).textContent = STR.filterDesc; $(“#txtTownLabel”).textContent = STR.townLabel; $(“#txtTypeLabel”).textContent = STR.typeLabel; $(“#txtDistanceLabel”).textContent = STR.distanceLabel; $(“#txtDistanceHint”).textContent = STR.distanceHint; $(“#txtSearchLabel”).textContent = STR.searchLabel; $(“#txtResultsSuffix”).textContent = STR.resultsSuffix; $(“#txtSortLabel”).textContent = STR.sortLabel; $(“#btnReset”).textContent = STR.reset; $(“#btnCopySelection”).textContent = STR.copySelection; $(“#txtNowLabel”).textContent = STR.weatherLabel; $(“#meteoLine1”).textContent = STR.weatherLoading1; $(“#meteoLine2”).textContent = STR.weatherLoading2; $(“#meteoHint”).textContent = STR.weatherHint; $(“#txtDisclaimer”).textContent = STR.disclaimer; $(“#txtBudgetTitle”).textContent = STR.budgetTitle; $(“#txtBudgetDesc”).textContent = STR.budgetDesc; $(“#txtRoleLabel”).textContent = STR.youAre; $(“#txtKmLabel”).textContent = STR.tripKm; $(“#txtConsoLabel”).textContent = STR.conso; $(“#txtFuelLabel”).textContent = STR.fuelPrice; $(“#txtBuyLabel”).textContent = STR.buyBudget; $(“#txtBufferLabel”).textContent = STR.buffer; $(“#txtBudgetResultTitle”).textContent = STR.totalEstimated; $(“#txtBudgetResultHint”).textContent = STR.indicativeRange; $(“#txtBudgetMin”).textContent = STR.min; $(“#txtBudgetMax”).textContent = STR.comfort; $(“#txtBreakdownFuel”).textContent = STR.breakdownFuel; $(“#txtBreakdownBuy”).textContent = STR.breakdownBuy; $(“#txtBreakdownFees”).textContent = STR.breakdownFees; $(“#txtBudgetNote”).textContent = STR.budgetNote; $(“#txtChecklistTitle”).textContent = STR.checklistTitle; $(“#txtChecklistDesc”).textContent = STR.checklistDesc; $(“#btnCopyChecklist”).textContent = STR.copy; $(“#btnCheckAll”).textContent = STR.checkAll; $(“#btnUncheckAll”).textContent = STR.uncheckAll; $(“#btnSmartTips”).textContent = STR.smartTips; $(“#txtTipsTitle”).textContent = STR.tipsTitle; } // ============ Filtres : options ============ function uniqueSorted(arr) { return […new Set(arr)].sort((a, b) => a.localeCompare(b, “fr”)); } function buildSelectOptions() { const towns = uniqueSorted(EVENTS.map(e => e.commune)); const types = uniqueSorted(EVENTS.map(e => e.type)); const selTown = $(“#selTown”); const selType = $(“#selType”); selTown.innerHTML = “”; selType.innerHTML = “”; const optAllTown = document.createElement(“option”); optAllTown.value = “TOUTES”; optAllTown.textContent = “Toutes les communes”; selTown.appendChild(optAllTown); towns.forEach(t => { const o = document.createElement(“option”); o.value = t; o.textContent = t; selTown.appendChild(o); }); const optAllType = document.createElement(“option”); optAllType.value = “TOUS”; optAllType.textContent = “Tous les types”; selType.appendChild(optAllType); types.forEach(t => { const o = document.createElement(“option”); o.value = t; o.textContent = t; selType.appendChild(o); }); } // ============ Rendu liste ============ function getFilteredSorted() { const town = $(“#selTown”).value; const type = $(“#selType”).value; const q = ($(“#inpSearch”).value || “”).trim().toLowerCase(); const maxDist = Number($(“#rangeDistance”).value); const sort = $(“#selSort”).value; const enriched = EVENTS.map(ev => { const d = distanceKm(START.lat, START.lon, ev.lat, ev.lon); return { …ev, distance: d }; }); let res = enriched.filter(ev => { const okTown = (town === “TOUTES”) || (ev.commune === town); const okType = (type === “TOUS”) || (ev.type === type); const okDist = ev.distance (a.dateISO).localeCompare(b.dateISO)); } else if (sort === “distanceAsc”) { res.sort((a, b) => a.distance – b.distance); } else if (sort === “nameAsc”) { res.sort((a, b) => a.nom.localeCompare(b.nom, “fr”)); } return res; } function renderList() { $(“#distanceValue”).textContent = String($(“#rangeDistance”).value); const list = $(“#list”); const items = getFilteredSorted(); $(“#resultsCount”).textContent = String(items.length); list.innerHTML = “”; if (items.length === 0) { const empty = document.createElement(“div”); empty.className = “rounded-xl border border-white/10 bg-white/5 p-4 text-sm text-slate-200”; empty.textContent = “Aucun événement ne correspond. Essayez d’augmenter la distance ou d’enlever un filtre.”; list.appendChild(empty); return; } items.forEach(ev => { const card = document.createElement(“article”); card.className = “rounded-2xl border border-white/10 bg-white/5 p-4 hover:bg-white/7 transition”; const top = document.createElement(“div”); top.className = “flex items-start justify-between gap-3”; const left = document.createElement(“div”); left.className = “min-w-0”; const h = document.createElement(“h4”); h.className = “text-base font-semibold text-slate-50 truncate”; h.textContent = ev.nom; const meta = document.createElement(“div”); meta.className = “mt-1 flex flex-wrap items-center gap-2 text-xs text-slate-300”; const chip1 = document.createElement(“span”); chip1.className = “chip rounded-full px-2 py-1”; chip1.textContent = ev.commune; const chip2 = document.createElement(“span”); chip2.className = “chip rounded-full px-2 py-1”; chip2.textContent = ev.type; const chip3 = document.createElement(“span”); chip3.className = “chip rounded-full px-2 py-1 tabular-nums”; chip3.textContent = `${ev.distance.toFixed(1)} km (depuis ${START.label.replace(“Point de départ : “, “”)})`; meta.appendChild(chip1); meta.appendChild(chip2); meta.appendChild(chip3); const when = document.createElement(“div”); when.className = “mt-2 text-sm text-slate-200”; when.textContent = `${formatDateFR(ev.dateISO)} • ${ev.debut} – ${ev.fin}`; const details = document.createElement(“p”); details.className = “mt-2 text-sm text-slate-300 leading-relaxed”; details.textContent = ev.details; left.appendChild(h); left.appendChild(meta); left.appendChild(when); left.appendChild(details); const right = document.createElement(“div”); right.className = “shrink-0 flex flex-col gap-2 items-end”; const btn = document.createElement(“button”); btn.className = “focus-ring rounded-lg px-3 py-2 text-sm bg-white/10 hover:bg-white/15 transition”; btn.textContent = “Copier”; btn.setAttribute(“aria-label”, “Copier les détails de cet événement”); btn.addEventListener(“click”, () => { const txt = `${ev.nom}n` + `${ev.type} • ${ev.commune} (44)n` + `${formatDateFR(ev.dateISO)} • ${ev.debut} – ${ev.fin}n` + `Distance estimée : ${ev.distance.toFixed(1)} km (depuis ${START.label})n` + `Détails : ${ev.details}`; copyToClipboard(txt); }); const small = document.createElement(“div”); small.className = “text-[11px] text-slate-400 text-right”; small.textContent = “À vérifier auprès de l’organisateur”; right.appendChild(btn); right.appendChild(small); top.appendChild(left); top.appendChild(right); card.appendChild(top); list.appendChild(card); }); } // ============ Budget ============ function computeBudget() { const role = $(“#selRole”).value; const km = Math.max(0, Number($(“#inpKm”).value || 0)); const conso = Math.max(0, Number($(“#inpConso”).value || 0)); const fuel = Math.max(0, Number($(“#inpFuel”).value || 0)); const buy = Math.max(0, Number($(“#inpBuy”).value || 0)); const bufferPct = Number($(“#rangeBuffer”).value || 0); $(“#bufferValue”).textContent = `${bufferPct}%`; // Carburant : km * (L/100km) * €/L const fuelCost = km * (conso / 100) * fuel; // Frais exposant : estimation simple // (souvent 2-6€ le mètre linéaire ; ici un forfait indicatif) const fees = (role === “exposant”) ? 12 : 0; // Base const base = fuelCost + buy + fees; const buffer = base * (bufferPct / 100); // Fourchette : minimum = base, confort = base + buffer + 10% “souplesse” const min = base; const max = base + buffer + (base * 0.10); $(“#budgetMin”).textContent = euro(min); $(“#budgetMax”).textContent = euro(max); $(“#budgetBadge”).textContent = (role === “exposant”) ? STR.modeExhibitor : STR.modeVisitor; $(“#breakFuel”).textContent = euro(fuelCost); $(“#breakBuy”).textContent = euro(buy); $(“#breakFees”).textContent = euro(fees); // Bars (ratio relatif à max) const totalForBars = Math.max(max, 1); const wFuel = clamp((fuelCost / totalForBars) * 100, 0, 100); const wBuy = clamp((buy / totalForBars) * 100, 0, 100); const wFees = clamp((fees / totalForBars) * 100, 0, 100); $(“#barFuel”).style.width = wFuel.toFixed(1) + “%”; $(“#barBuy”).style.width = wBuy.toFixed(1) + “%”; $(“#barFees”).style.width = wFees.toFixed(1) + “%”; } // ============ Checklist ============ function renderChecklist() { const wrap = $(“#checklist”); wrap.innerHTML = “”; CHECKLIST_ITEMS.forEach((label, idx) => { const id = `chk_${idx}`; const row = document.createElement(“label”); row.className = “flex items-start gap-3 rounded-xl border border-white/10 bg-white/5 p-3 hover:bg-white/7 transition cursor-pointer”; const input = document.createElement(“input”); input.type = “checkbox”; input.id = id; input.className = “mt-1 h-4 w-4 accent-emerald-400”; input.setAttribute(“aria-label”, label); const text = document.createElement(“div”); text.className = “text-sm text-slate-200 leading-snug”; text.textContent = label; row.appendChild(input); row.appendChild(text); wrap.appendChild(row); }); } function checklistText() { const inputs = Array.from($(“#checklist”).querySelectorAll(“input[type=’checkbox’]”)); const lines = inputs.map((inp, i) => { const label = CHECKLIST_ITEMS[i]; const mark = inp.checked ? “[x]” : “[ ]”; return `${mark} ${label}`; }); return `Checklist vide-greniers / brocantes (44)n` + lines.join(“n”); } // ============ Météo (Open-Meteo) ============ const METEO = { city: “Nantes”, lat: 47.2184, lon: -1.5536, timezone: “Europe/Paris” }; function interpretWeather(current) { const t = Math.round(current.temperature_2m); const rain = Number(current.rain ?? current.precipitation ?? 0); const wind = Math.round(current.wind_speed_10m); return { t, rain, wind }; } async function fetchWeather() { const url = `https://api.open-meteo.com/v1/forecast` + `?latitude=${encodeURIComponent(METEO.lat)}` + `&longitude=${encodeURIComponent(METEO.lon)}` + `&current=temperature_2m,precipitation,rain,wind_speed_10m` + `&timezone=${encodeURIComponent(METEO.timezone)}`; $(“#meteoLine1”).textContent = STR.weatherLoading1; $(“#meteoLine2”).textContent = “Connexion à Open-Meteo…”; try { const res = await fetch(url, { cache: “no-store” }); if (!res.ok) throw new Error(“Réponse météo invalide”); const json = await res.json(); const cur = json.current || {}; const { t, rain, wind } = interpretWeather(cur); $(“#meteoLine1”).textContent = STR.weatherLine(METEO.city, t, rain.toFixed(1), wind); $(“#meteoLine2”).textContent = `Dernière mise à jour : ${String(cur.time || “”).replace(“T”, ” “) || “—”}`; // Stocker pour les conseils root.__meteo = { t, rain, wind, time: cur.time || null }; } catch (e) { $(“#meteoLine1”).textContent = “Météo indisponible pour le moment.”; $(“#meteoLine2”).textContent = “Vous pouvez continuer sans la météo.”; root.__meteo = null; } } function buildTipsFromWeather() { const m = root.__meteo; const tips = []; if (!m) { tips.push(“Prévoyez une couche légère + une option imperméable, par précaution.”); tips.push(“Arrivez tôt : le meilleur choix part souvent en première heure.”); tips.push(“Fixez un budget max avant de chiner, puis gardez 10–15% de marge.”); return tips; } if (m.rain >= 1.0) { tips.push(“Risque de pluie : prenez une veste imperméable et des sacs étanches pour vos trouvailles.”); tips.push(“Privilégiez les stands abrités et protégez les objets fragiles (papier bulle / couverture).”); } else { tips.push(“Peu de pluie : c’est un bon jour pour chiner tôt et comparer les prix.”); } if (m.wind >= 25) { tips.push(“Vent soutenu : pour exposants, prévoyez pinces, ficelle et lest pour la bâche.”); } if (m.t = 22) { tips.push(“Température douce/chaude : eau + casquette, et faites une pause avant midi.”); } tips.push(“Négociation : proposez un prix global si vous prenez plusieurs objets.”); return tips; } function showTips() { const list = $(“#tipsList”); list.innerHTML = “”; buildTipsFromWeather().forEach(t => { const li = document.createElement(“li”); li.textContent = t; list.appendChild(li); }); $(“#tipsBox”).classList.remove(“hidden”); $(“#tipsBox”).scrollIntoView({ block: “nearest”, behavior: “smooth” }); } // ============ Copier sélection ============ function selectionText() { const items = getFilteredSorted(); const header = `Sélection d’événements (Loire-Atlantique 44)n` + `Filtres : commune=${$(“#selTown”).value}, type=${$(“#selType”).value}, distance { return ( `${i + 1}. ${ev.nom}n` + ` ${ev.type} • ${ev.commune} (44)n` + ` ${formatDateFR(ev.dateISO)} • ${ev.debut} – ${ev.fin}n` + ` Distance : ${ev.distance.toFixed(1)} kmn` + ` Détails : ${ev.details}n` ); }); return header + (lines.length ? lines.join(“n”) : “Aucun événement correspondant.”); } // ============ Events ============ function bindEvents() { $(“#selTown”).addEventListener(“change”, renderList); $(“#selType”).addEventListener(“change”, renderList); $(“#rangeDistance”).addEventListener(“input”, renderList); $(“#inpSearch”).addEventListener(“input”, () => { // Petit debounce simple if (root.__searchTimer) clearTimeout(root.__searchTimer); root.__searchTimer = setTimeout(renderList, 120); }); $(“#selSort”).addEventListener(“change”, renderList); $(“#btnReset”).addEventListener(“click”, () => { $(“#selTown”).value = “TOUTES”; $(“#selType”).value = “TOUS”; $(“#rangeDistance”).value = “20”; $(“#inpSearch”).value = “”; $(“#selSort”).value = “dateAsc”; renderList(); }); $(“#btnCopySelection”).addEventListener(“click”, () => { copyToClipboard(selectionText()); }); // Budget [“selRole”, “inpKm”, “inpConso”, “inpFuel”, “inpBuy”, “rangeBuffer”].forEach(id => { $(“#” + id).addEventListener(“input”, computeBudget); $(“#” + id).addEventListener(“change”, computeBudget); }); // Checklist $(“#btnCopyChecklist”).addEventListener(“click”, () => copyToClipboard(checklistText())); $(“#btnCheckAll”).addEventListener(“click”, () => { $(“#checklist”).querySelectorAll(“input[type=’checkbox’]”).forEach(i => i.checked = true); }); $(“#btnUncheckAll”).addEventListener(“click”, () => { $(“#checklist”).querySelectorAll(“input[type=’checkbox’]”).forEach(i => i.checked = false); }); // Tips $(“#btnSmartTips”).addEventListener(“click”, showTips); // Météo $(“#btnMeteoRefresh”).addEventListener(“click”, fetchWeather); } // ============ Init ============ function init() { setStaticText(); buildSelectOptions(); renderList(); renderChecklist(); computeBudget(); fetchWeather(); } // Assurer que le composant s’initialise même si collé en bas de page if (document.readyState === “loading”) { document.addEventListener(“DOMContentLoaded”, init, { once: true }); } else { init(); } })();

{“@context”:”https://schema.org”,”@type”:”FAQPage”,”mainEntity”:[{“@type”:”Question”,”name”:”Quels documents faut-il pour tenir un stand en vide grenier en Loire-Atlantique ?”,”acceptedAnswer”:{“@type”:”Answer”,”text”:”Gu00e9nu00e9ralement : une piu00e8ce du2019identitu00e9 et, selon lu2019organisateur, un justificatif de domicile et lu2019immatriculation du vu00e9hicule. u00c0 Nantes comme ailleurs, lu2019inscription se fait souvent u00e0 lu2019avance via association ou mairie, avec ru00e8glement intu00e9rieur u00e0 respecter.”}},{“@type”:”Question”,”name”:”Comment savoir si un objet mu00e9rite une estimation plutu00f4t quu2019une vente immu00e9diate ?”,”acceptedAnswer”:{“@type”:”Answer”,”text”:”Sur une Brocante, certains indices comptent : signature, marque, matu00e9riau ancien (bois massif, laiton), u00e9tat du2019origine, cohu00e9rence du2019ensemble (service complet, su00e9rie). En cas de succession ou du00e9barras, mettez ces piu00e8ces u00e0 part et faites-les u00e9valuer par un professionnel pour u00e9viter de sous-vendre.”}},{“@type”:”Question”,”name”:”Quels sont les meilleurs horaires pour faire de bonnes affaires u00e0 Nantes ?”,”acceptedAnswer”:{“@type”:”Answer”,”text”:”u00c0 Nantes, les premiu00e8res heures servent u00e0 capter les piu00e8ces recherchu00e9es (meubles, affiches, vinyles). La fin de matinu00e9e est idu00e9ale pour nu00e9gocier, surtout en achetant en lot. Les deux stratu00e9gies sont complu00e9mentaires selon votre objectif.”}},{“@type”:”Question”,”name”:”Peut-on chiner efficacement avec des enfants ?”,”acceptedAnswer”:{“@type”:”Answer”,”text”:”Oui, en fixant une u201cmissionu201d simple (un livre, un jouet, une affiche) et un budget. Privilu00e9giez des allu00e9es au00e9ru00e9es et pru00e9voyez une pause : la Brocante devient une sortie ludique et u00e9ducative, surtout quand on discute avec les vendeurs.”}}]}

Leave a Reply

Your email address will not be published. Required fields are marked *

Antiquité Normandie Brocante
Privacy Overview

This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.