{
  "formatVersion": "1.2",
  "currency": "EUR",
  "timezone": "Europe/Paris",
  "id": "family-week-normandy",
  "name": "A family week in Normandy",
  "subtitle": "Beaches, Mont-Saint-Michel and a surprise for the kids",
  "start": "2027-04-10",
  "end": "2027-04-13",
  "members": [
    { "id": "m1", "name": "Camille", "role": "owner", "kind": "adult", "phone": "+33 6 00 00 00 00" },
    { "id": "m2", "name": "Jules", "role": "editor", "kind": "adult", "dietary": ["gluten_free"] },
    { "id": "m3", "name": "Noa", "role": "viewer", "kind": "teen", "age": 14 },
    { "id": "m4", "name": "Lila", "role": "viewer", "kind": "child", "age": 7, "surpriseMode": "day" }
  ],
  "days": [
    {
      "id": "d1", "index": 1, "date": "2027-04-10", "title": "Arrival in Bayeux",
      "coords": { "lat": 49.2764, "lon": -0.7024, "label": "Bayeux" },
      "stayBookingId": "b-gite",
      "route": { "km": 270, "drive": "3 h from Paris" },
      "items": [
        { "id": "i1", "time": "09:00", "endTime": "12:00", "title": "Drive Paris → Bayeux", "type": "drive", "status": "planned" },
        { "id": "i2", "time": "12:30", "title": "Picnic lunch", "type": "meal", "status": "planned", "outfit": ["casual"],
          "alternatives": [ { "id": "a1", "trigger": "rain", "title": "Crêperie in the old town" } ] },
        { "id": "i3", "time": "14:30", "endTime": "16:00", "title": "Bayeux Tapestry", "type": "heritage", "status": "planned", "stars": 2,
          "place": "13 bis Rue de Nesmond, Bayeux", "bookingId": "b-tapestry" },
        { "id": "i4", "time": "17:00", "title": "Check-in at the gîte", "type": "checkin", "status": "planned", "bookingId": "b-gite" }
      ]
    },
    {
      "id": "d2", "index": 2, "date": "2027-04-11", "title": "D-Day beaches",
      "coords": { "lat": 49.3398, "lon": -0.8551, "label": "Arromanches" },
      "stayBookingId": "b-gite",
      "items": [
        { "id": "i5", "time": "10:00", "endTime": "12:00", "title": "Arromanches 360 and the artificial harbour", "type": "heritage", "status": "planned", "stars": 2,
          "place": "Arromanches-les-Bains", "outfit": ["windproof"], "outfitNote": "It is always windy on the cliff — hats for the kids." },
        { "id": "i6", "time": "12:30", "title": "Lunch", "type": "meal", "status": "planned",
          "options": [
            { "id": "o1", "title": "Le Bistrot d'Arromanches", "desc": "Gluten-free options on request" },
            { "id": "o2", "title": "Fish & chips on the seafront" }
          ] },
        { "id": "i7", "time": "15:00", "endTime": "17:00", "title": "Beach time at Omaha", "type": "nature", "status": "planned", "outfit": ["beach", "warm"],
          "alternatives": [ { "id": "a2", "trigger": "rain", "title": "Overlord Museum", "desc": "Colleville-sur-Mer, 10 minutes away" } ] }
      ],
      "planB": "Bad weather all day: Caen Memorial (indoor, half a day)."
    },
    {
      "id": "d3", "index": 3, "date": "2027-04-12", "title": "Mont-Saint-Michel",
      "coords": { "lat": 48.6361, "lon": -1.5115, "label": "Mont-Saint-Michel" },
      "stayBookingId": "b-gite",
      "route": { "km": 260, "drive": "1 h 30 each way" },
      "items": [
        { "id": "i8", "time": "08:30", "endTime": "10:00", "title": "Drive to the Mont", "type": "drive", "status": "planned" },
        { "id": "i9", "time": "10:15", "endTime": "12:30", "title": "Abbey visit", "type": "heritage", "status": "planned", "stars": 3,
          "place": "Mont-Saint-Michel", "bookingId": "b-abbey", "critical": "Timed entry 10:30 — the walk up from the shuttle takes 25 minutes." },
        { "id": "i10", "time": "13:00", "title": "Lunch on the Mont", "type": "meal", "status": "planned", "price": 70, "priceEstimated": true },
        { "id": "i11", "time": "15:00", "endTime": "16:00", "title": "Guided bay walk", "type": "hike", "status": "planned", "bookingId": "b-bay", "outfit": ["sport"],
          "outfitNote": "Barefoot in the sand — bring a towel and a change of clothes.",
          "alternatives": [ { "id": "a3", "trigger": "wind", "windThreshold": 50, "title": "Skip the bay walk — ramparts instead" } ] }
      ]
    },
    {
      "id": "d4", "index": 4, "date": "2027-04-13", "title": "Surprise day — home in the evening",
      "coords": { "lat": 49.1829, "lon": -0.3707, "label": "Caen" },
      "items": [
        { "id": "i12", "time": "10:00", "title": "Check-out", "type": "checkout", "status": "planned", "bookingId": "b-gite" },
        { "id": "i13", "time": "11:00", "endTime": "15:00", "title": "Festyland amusement park", "type": "activity", "status": "planned", "stars": 3,
          "place": "Route de Caumont, Bretteville-sur-Odon", "bookingId": "b-park", "memberIds": ["m1", "m2", "m3", "m4"] },
        { "id": "i14", "time": "15:30", "endTime": "18:30", "title": "Drive home", "type": "drive", "status": "planned" }
      ]
    }
  ],
  "bookings": [
    { "id": "b-gite", "type": "stay", "status": "confirmed", "title": "Gîte du Bessin", "dates": "3 nights, Apr 10–13", "checkin": "17:00", "checkout": "10:00",
      "breakfastIncluded": false, "rooms": [ { "label": "Parents", "memberIds": ["m1", "m2"] }, { "label": "Kids", "memberIds": ["m3", "m4"] } ],
      "address": "Route d'Arromanches, Bayeux", "instructions": "Key box next to the blue door — code sent by SMS the day before.",
      "price": 420, "payment": { "status": "deposit", "deposit": 120, "note": "Balance in cash on arrival" },
      "refs": [ { "label": "Booking", "value": "GITE-EXAMPLE-42", "sensitive": true } ] },
    { "id": "b-tapestry", "type": "activity", "status": "confirmed", "title": "Bayeux Tapestry — family ticket", "price": 32,
      "tickets": [
        { "id": "t1", "label": "Family ticket", "code": "TAP-0001", "payload": "TAP-0001-EXAMPLE", "format": "qr", "date": "2027-04-10", "time": "14:30" }
      ] },
    { "id": "b-abbey", "type": "activity", "status": "confirmed", "title": "Abbey of Mont-Saint-Michel — timed entry", "price": 26,
      "tickets": [
        { "id": "t2", "label": "Adult", "code": "ABB-1001", "memberId": "m1", "payload": "ABB1001EXAMPLE", "format": "code128", "date": "2027-04-12", "time": "10:30" },
        { "id": "t3", "label": "Adult", "code": "ABB-1002", "memberId": "m2", "payload": "ABB1002EXAMPLE", "format": "code128", "date": "2027-04-12", "time": "10:30" }
      ] },
    { "id": "b-bay", "type": "activity", "status": "to_book", "title": "Guided crossing of the bay", "website": "https://example.org/bay-walk",
      "reminder": { "date": "2027-04-01", "action": "Book the 15:00 family walk (tide-dependent)" } },
    { "id": "b-park", "type": "activity", "status": "to_book", "title": "Festyland — 4 tickets", "price": 92, "priceEstimated": true }
  ],
  "checklists": [
    { "id": "c1", "title": "Packing", "emoji": "🎒", "items": [
      { "id": "c1-1", "label": "Rain jackets for everyone", "done": false },
      { "id": "c1-2", "label": "Beach towels", "done": false },
      { "id": "c1-3", "label": "Gluten-free snacks for Jules", "done": false },
      { "id": "c1-4", "label": "Car seat booster for Lila", "done": true }
    ] }
  ],
  "contacts": [
    { "id": "k1", "name": "Emergency (EU)", "phone": "112" },
    { "id": "k2", "name": "Gîte owner", "phone": "+33 2 00 00 00 00", "note": "Call if arriving after 20:00" }
  ]
}
