Detailed chronological log of changes made to the calendar during the development session on 9 July 2026.
Goal: Make undated activities more discoverable without cluttering the main view.
Changes:
Technical details:
collapsed class to section by defaultmax-height transition for smooth expand/collapse animationFLOATING.length in buildFloating()aria-expanded for accessibilityprefers-reduced-motion supportGoal: Remove redundancy between hero tally pills and filter buttons.
Changes:
<div class="tally"> from hero sectionflex: 1Technical details:
buildTally() to populate counter elements instead of creating pillsid="count-{status}" patternfont-size: 10.5px, padding: 1px 7px, border-radius: 999pxGoal: Simplify legend to show only essential information (clash indicators).
Changes:
Technical details:
opacity: 0 by default, opacity: 1 on hover/focus::before and ::after pseudo-elements (border triangles)top: calc(100% + 6px) and left: 50% with transformprefers-reduced-motion disables transitionGoal: Visually distinguish weekends from weekdays.
Changes:
Technical details:
.weekend class to day cells where dt.getUTCDay() === 0 || dt.getUTCDay() === 6.weekend .dnum { color: #B22222 }.we class for weekends, updated color to matchGoal: Events within each day should appear in time order.
Changes:
noSlot: true (polls) appear before timed eventsTechnical details:
len then start, so data order is preservedGoal: Mark first-week activities as confirmed based on group decisions.
Events changed to status: "confirmed":
walk — Free walking tour (Mon 6 Jul)viana — Viana do Castelo day tour (Wed 8 Jul)majestic — Majestic Café (Wed 8 Jul)aveiro-em — Aveiro tour (Thu 9 Jul)douro — Douro Valley boat tour (Sat 11 Jul) — changed from “pending”fadoA — Fado — Carminho Valença (Sat 11 Jul)nightout — Night out bar crawl (Sat 11 Jul)brunch — Sunday brunch (Sun 12 Jul)kayak — Douro Valley kayak (Sun 12 Jul)beach — Beach day Espinho (Sun 12 Jul)Kept as-is:
match-* events (football matches) — remain “interest”ss-sales — B2B sales skill share — later changed to confirmedlivraria — Livraria Lello — already confirmedss-autism — Autism skill share — remains “interest” (poll)Goal: Clarify that all 4 days are confirmed (3-night option won).
Changes:
villa span from endDate: "2026-07-26" to "2026-07-27"villa-opt event from EVENTS arrayGoal: Confirm Harry’s skill share session.
Changes:
ss-sales status from “interest” to “confirmed”Goal: Update movie screening based on binding post.
Changes:
date: "2026-07-16" to "2026-07-17"start: "13:00" (1:00 PM)link with Google Maps URLoptions array and noSlot: trueGoal: Pin food tour to specific date.
Changes:
date: "2026-07-13" to "2026-07-15" (Wednesday)options array (was a poll)Goal: Add Dan’s francesinha lunch suggestion.
New event:
{
id: "lado-b",
title: "🍽️ Lado B Café — francesinha lunch",
tag: "FOOD",
org: "Dan Perez",
status: "interest",
date: "2026-07-10",
len: "part",
start: "12:00",
loc: "Lado B Café (Coliseu), R. de Passos Manuel 190, Porto",
link: { label: "Google Maps", url: "https://maps.app.goo.gl/p3bRLrNhuHn9bkJn8" },
note: "Recommended by the tour guide for francesinha. Near Livraria Lello for those doing the bookstore visit. Opens at 12:00."
}
Goal: Add all remaining World Cup matches from the schedule.
New events (all with ⚽ emoji, status: “interest”):
match-qf1 — France vs Morocco (Thu 9 Jul, 21:00)match-qf2 — Spain vs Belgium (Fri 10 Jul, 20:00)match-qf3 — Norway vs England (Sat 11 Jul, 22:00)match-qf4 — Argentina vs Switzerland (Sun 12 Jul, 02:00)match-sf1 — France/Morocco vs Spain/Belgium (Tue 14 Jul, 20:00)match-sf2 — Norway/England vs Argentina/Switzerland (Wed 15 Jul, 20:00)match-3rd — Third-place match (Sat 18 Jul, 21:00)match-final — Final (Sun 19 Jul, 20:00)All matches have loc: "Sky Sports" or "Livescore+" and note: “World Cup [round]. Watch party TBD.”
Goal: Add visual category indicators to all event titles.
Emoji assignments:
| Emoji | Category | Events |
|---|---|---|
| ⚽ | Sports / Match | All World Cup matches |
| 🏄 | Sports / Water | Kayak |
| 🏖️ | Sports / Leisure | Beach day |
| 🧗 | Sports / Climbing | Via Ferrata (floating) |
| 🏛️ | City / Tour | Majestic Café, Livraria Lello, Food tour |
| 🚶 | City / Walk | Walking tour |
| 🚌 | Full-day trip | Viana, Aveiro, Douro Valley, Chefs on Fire |
| 🍽️ | Food / Meal | Brunch, Lado B Café |
| 🍸 | Food / Drinks | Night out, Speakeasy |
| 🎵 | Entertainment / Music | Fado A (Valença), Fado B (Coimbra) |
| 🎭 | Entertainment / Theatre | Stand-up comedy |
| 🎬 | Entertainment / Cinema | Odyssey IMAX |
| 💼 | Professional / Skill share | B2B sales, Autism, SEO (floating) |
| 🧳 | Travel / Logistics | Checkout |
| 🏡 | Accommodation | Villa weekend |
| 🎨 | Workshop | Tile-painting (floating) |
Design principle: Emojis represent the kind of activity (duration and context), not the specific content. For example:
Goal: Remove distinction between “hard clashes” and “competing options.”
Rationale: Since all events are group activities where the group simply needs to choose, there’s no meaningful difference between a “hard clash” (confirmed vs confirmed) and a “soft overlap” (interest vs interest). The group just needs to pick one.
Changes:
computeClashes() function to always set level: "choose" instead of checking statusBefore:
const level = (a.status === "confirmed" || a.status === "pending" ||
b.status === "confirmed" || b.status === "pending")
? "clash" : "choose";
After:
const level = "choose";
Events by status (after changes):
Events by date range:
Floating ideas: 3 items (tile-painting, via ferrata, SEO skill share)
porto-chapter-calendar.html — Main calendar file (all changes)README.md — Updated documentation to reflect new featuresNotes and ideas _jul26.md — Added decisions log and troubleshooting notesdevelopment_runbook_jul26.md — This file (created)START date and week count.End of runbook.