Triathlon Transition Area Checklist

Triathlon Transition Area Checklist

TriCheck - Transition Optimizer

Triathlon Transition Area Checklist
Race Metadata
Essential Gear Checklist

Mark items required for your transition bag setup.

Transition Sequence Planner

Define the step-by-step actions for each phase.

Phase 0: Pre-Race Setup (Morning)
Phase I: T1 - Swim to Bike
Phase II: T2 - Bike to Run

Date: ${data.meta.date}

Target T1 Time: ${totalT1} | Target T2 Time: ${totalT2}

`; // 2. Gear List html += `

Essential Gear Checklist

${data.gear.map(g => `${g}`).join('')}
`; // 3. Action Sequence const renderActionPhase = (phaseKey, title, actions) => { let phaseHtml = `

${title}

    `; if (actions.length === 0) { phaseHtml += `
  1. No actions defined.
  2. `; } else { actions.forEach((a, i) => { phaseHtml += `
  3. ${a.desc} (${a.time})
  4. `; }); } phaseHtml += `
`; return phaseHtml; }; html += renderActionPhase('setup', 'Phase 0: Pre-Race Setup (Morning)', data.actions.setup); html += renderActionPhase('t1', 'Phase I: T1 - Swim to Bike', data.actions.t1); html += renderActionPhase('t2', 'Phase II: T2 - Bike to Run', data.actions.t2); container.innerHTML = html; } function ttacLoadExample() { if(!confirm("Overwrite current data and load standard Sprint distance transition steps?")) return; document.getElementById('inp-race').value = "Sprint Distance Triathlon"; document.getElementById('inp-athlete').value = "C. Champion / Aug 2026"; // Clear and fill actions document.getElementById('ttac-setup-rows').innerHTML = ''; document.getElementById('ttac-t1-rows').innerHTML = ''; document.getElementById('ttac-t2-rows').innerHTML = ''; ttacAddActionRow('setup', "Attach race number to belt", "0:05"); ttacAddActionRow('setup', "Apply anti-chafing balm", "0:15"); ttacAddActionRow('setup', "Lay out running shoes and helmet/glasses", "0:20"); ttacAddActionRow('t1', "STOP Watch & Remove Wetsuit (top)", "0:15"); ttacAddActionRow('t1', "Run to bike rack & Wetsuit off completely", "0:25"); ttacAddActionRow('t1', "Helmet & Sunglasses on", "0:10"); ttacAddActionRow('t1', "Take bike off rack", "0:05"); ttacAddActionRow('t2', "Dismount bike at line", "0:05"); ttacAddActionRow('t2', "Rack bike & Helmet off", "0:10"); ttacAddActionRow('t2', "Running Shoes and Race Belt on", "0:15"); ttacAddActionRow('t2', "Grab Gels / Nutrition", "0:05"); // Check some gear items document.querySelectorAll('#ttac-gear-list input[type="checkbox"]').forEach(cb => { if (['Wetsuit', 'Helmet', 'Running Shoes', 'Race Belt', 'Sunglasses'].includes(cb.value)) { cb.checked = true; } else { cb.checked = false; } }); ttacRenderReport(); ttacSwitchTab('report'); } /* --- PDF Generation --- */ async function ttacGeneratePDF() { ttacRenderReport(); // Ensure report is updated const data = ttacGetLogData(); const { jsPDF } = window.jspdf; const doc = new jsPDF('p', 'mm', 'a4'); // Styling const blue = [0, 119, 182]; // Deep Blue let y = 20; // Header doc.setFillColor(...blue); doc.rect(0, 0, 210, 20, 'F'); doc.setTextColor(255, 255, 255); doc.setFontSize(16); doc.text(`Transition Strategy Plan: ${data.meta.race}`, 14, 13); // Meta Data doc.setTextColor(0, 0, 0); doc.setFontSize(10); doc.setFont(undefined, 'normal'); doc.text(`Athlete: ${data.meta.athlete}`, 14, y + 10); doc.text(`Date: ${data.meta.date}`, 100, y + 10); y += 25; // Gear Checklist doc.setFontSize(12); doc.setFont(undefined, 'bold'); doc.text("Essential Gear Checklist", 14, y); y += 5; doc.setFontSize(10); doc.setFont(undefined, 'normal'); const gearListText = data.gear.join(', '); const splitGear = doc.splitTextToSize(gearListText, 180); doc.text(splitGear, 14, y + 5); y += (splitGear.length * 5) + 10; // Action Table Helper const generateActionTable = (phaseTitle, actions, startY) => { if (startY > 250) { doc.addPage(); startY = 20; } doc.setFontSize(12); doc.setFont(undefined, 'bold'); doc.text(phaseTitle, 14, startY); startY += 5; const tableBody = actions.map((a, i) => [`${i + 1}.`, a.desc, a.time]); doc.autoTable({ startY: startY, head: [['#', 'Action Step', 'Time Target']], body: tableBody, theme: 'grid', headStyles: { fillColor: blue, fontSize: 10 }, styles: { fontSize: 9 }, columnStyles: { 0: { cellWidth: 10, fontStyle: 'bold', halign: 'center' }, 2: { cellWidth: 25, halign: 'center', textColor: [192, 57, 43] } } }); return doc.lastAutoTable.finalY + 10; }; y = generateActionTable('Phase 0: Pre-Race Setup (Morning)', data.actions.setup, y); y = generateActionTable('Phase I: T1 - Swim to Bike', data.actions.t1, y); y = generateActionTable('Phase II: T2 - Bike to Run', data.actions.t2, y); doc.save(`Triathlon_Plan_${data.meta.race.replace(/\s+/g, '_')}.pdf`); }
Scroll to Top