[[💠integ(process-product)]] using https://claude.ai/chat/252da16a-4f99-42a4-baf4-9e5602bf942c with artifact in https://claude.site/artifacts/84896cea-45fc-4870-b376-026d7bf1a2d6 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>3-Hour Task Progress Tracker</title> <style> body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; margin: 0; padding: 20px; background-color: #f5f5f7; color: #333; } .container { max-width: 800px; margin: 0 auto; background-color: white; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); padding: 20px; } h1 { text-align: center; color: #333; margin-top: 0; padding-bottom: 10px; border-bottom: 1px solid #eee; } h2 { margin-top: 20px; color: #444; display: flex; align-items: center; justify-content: space-between; } .task-group { margin-bottom: 20px; padding: 15px; border-radius: 8px; background-color: #f9f9f9; } .task { display: flex; flex-direction: column; margin: 10px 0; padding: 10px; background-color: white; border-radius: 5px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); } .task:hover { background-color: #f0f7ff; } .task-main { display: flex; align-items: center; width: 100%; } .task-links { display: flex; margin-top: 8px; padding-top: 8px; border-top: 1px dashed #eee; width: 100%; } .link-input { flex-grow: 1; padding: 6px; margin-right: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 0.9em; } .link-label { min-width: 75px; font-size: 0.9em; color: #666; display: flex; align-items: center; } .task-checkbox { margin-right: 10px; transform: scale(1.2); } .task-description { flex-grow: 1; } .task-time { color: #666; font-size: 0.9em; margin-left: 10px; min-width: 60px; text-align: right; } .progress-container { height: 15px; background-color: #e0e0e0; border-radius: 7px; margin: 5px 0 15px 0; } .progress-bar { height: 100%; border-radius: 7px; background-color: #4CAF50; width: 0%; transition: width 0.3s ease; } .summary { display: flex; justify-content: space-between; margin-top: 20px; padding: 15px; background-color: #f0f7ff; border-radius: 8px; } .summary-item { text-align: center; } .summary-value { font-size: 1.5em; font-weight: bold; color: #4CAF50; } .time-display { font-size: 2em; text-align: center; margin: 20px 0; font-weight: bold; } </style> </head> <body> <div class="container"> <h1>3-Hour Task Progress Tracker</h1> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;"> <button id="copyDataBtn" class="btn" style="padding: 8px 16px; background-color: #4CAF50; color: white; border: none; border-radius: 4px; cursor: pointer;">Copy Progress Data</button> <div class="time-display" id="timeDisplay">03:00:00</div> <textarea id="importData" style="display: none;"></textarea> <button id="pasteDataBtn" class="btn" style="padding: 8px 16px; background-color: #2196F3; color: white; border: none; border-radius: 4px; cursor: pointer;">Paste Progress Data</button> </div> <div class="progress-container"> <div class="progress-bar" id="overallProgress"></div> </div> <div class="task-group"> <h2>Hour 1: Paper Introduction Writing <span id="hour1-progress">0%</span></h2> <div class="progress-container"> <div class="progress-bar" id="hour1-bar"></div> </div> <div class="task"> <div class="task-main"> <input type="checkbox" class="task-checkbox" data-group="hour1" data-time="40" id="task1"> <label for="task1" class="task-description">Draft introduction with clear distinction between two audience versions</label> <span class="task-time">40 min</span> </div> <div class="task-links"> <span class="link-label">GitHub:</span> <input type="text" class="link-input" placeholder="Paste GitHub link here" id="github-task1"> <span class="link-label">Claude:</span> <input type="text" class="link-input" placeholder="Paste Claude conversation link here" id="claude-task1"> </div> </div> <div class="task"> <div class="task-main"> <input type="checkbox" class="task-checkbox" data-group="hour1" data-time="20" id="task2"> <label for="task2" class="task-description">Outline key theoretical arguments about go-to-market vs. φ learning</label> <span class="task-time">20 min</span> </div> <div class="task-links"> <span class="link-label">GitHub:</span> <input type="text" class="link-input" placeholder="Paste GitHub link here" id="github-task2"> <span class="link-label">Claude:</span> <input type="text" class="link-input" placeholder="Paste Claude conversation link here" id="claude-task2"> </div> </div> </div> <div class="task-group"> <h2>Hour 2: Bayesian Reading Group Preparation <span id="hour2-progress">0%</span></h2> <div class="progress-container"> <div class="progress-bar" id="hour2-bar"></div> </div> <div class="task"> <div class="task-main"> <input type="checkbox" class="task-checkbox" data-group="hour2" data-time="30" id="task3"> <label for="task3" class="task-description">Create document structure with key terms and concepts</label> <span class="task-time">30 min</span> </div> <div class="task-links"> <span class="link-label">GitHub:</span> <input type="text" class="link-input" placeholder="Paste GitHub link here" id="github-task3"> <span class="link-label">Claude:</span> <input type="text" class="link-input" placeholder="Paste Claude conversation link here" id="claude-task3"> </div> </div> <div class="task"> <div class="task-main"> <input type="checkbox" class="task-checkbox" data-group="hour2" data-time="20" id="task4"> <label for="task4" class="task-description">Add citations and resource rationality concepts</label> <span class="task-time">20 min</span> </div> <div class="task-links"> <span class="link-label">GitHub:</span> <input type="text" class="link-input" placeholder="Paste GitHub link here" id="github-task4"> <span class="link-label">Claude:</span> <input type="text" class="link-input" placeholder="Paste Claude conversation link here" id="claude-task4"> </div> </div> <div class="task"> <div class="task-main"> <input type="checkbox" class="task-checkbox" data-group="hour2" data-time="10" id="task5"> <label for="task5" class="task-description">Review and refine</label> <span class="task-time">10 min</span> </div> <div class="task-links"> <span class="link-label">GitHub:</span> <input type="text" class="link-input" placeholder="Paste GitHub link here" id="github-task5"> <span class="link-label">Claude:</span> <input type="text" class="link-input" placeholder="Paste Claude conversation link here" id="claude-task5"> </div> </div> </div> <div class="task-group"> <h2>Hour 3: Platformization Theory Completion <span id="hour3-progress">0%</span></h2> <div class="progress-container"> <div class="progress-bar" id="hour3-bar"></div> </div> <div class="task"> <div class="task-main"> <input type="checkbox" class="task-checkbox" data-group="hour3" data-time="25" id="task6"> <label for="task6" class="task-description">Develop predictive phenomena from customer/technology sides</label> <span class="task-time">25 min</span> </div> <div class="task-links"> <span class="link-label">GitHub:</span> <input type="text" class="link-input" placeholder="Paste GitHub link here" id="github-task6"> <span class="link-label">Claude:</span> <input type="text" class="link-input" placeholder="Paste Claude conversation link here" id="claude-task6"> </div> </div> <div class="task"> <div class="task-main"> <input type="checkbox" class="task-checkbox" data-group="hour3" data-time="25" id="task7"> <label for="task7" class="task-description">Articulate specialization scaling and domain-specific language benefits</label> <span class="task-time">25 min</span> </div> <div class="task-links"> <span class="link-label">GitHub:</span> <input type="text" class="link-input" placeholder="Paste GitHub link here" id="github-task7"> <span class="link-label">Claude:</span> <input type="text" class="link-input" placeholder="Paste Claude conversation link here" id="claude-task7"> </div> </div> <div class="task"> <div class="task-main"> <input type="checkbox" class="task-checkbox" data-group="hour3" data-time="10" id="task8"> <label for="task8" class="task-description">Connect to reinforcement loop and network effects</label> <span class="task-time">10 min</span> </div> <div class="task-links"> <span class="link-label">GitHub:</span> <input type="text" class="link-input" placeholder="Paste GitHub link here" id="github-task8"> <span class="link-label">Claude:</span> <input type="text" class="link-input" placeholder="Paste Claude conversation link here" id="claude-task8"> </div> </div> </div> <div class="summary"> <div class="summary-item"> <div>Completed Tasks</div> <div class="summary-value" id="completedTasks">0/8</div> </div> <div class="summary-item"> <div>Time Allocated</div> <div class="summary-value">180 min</div> </div> <div class="summary-item"> <div>Overall Progress</div> <div class="summary-value" id="overallProgressText">0%</div> </div> </div> <div style="margin-top: 20px; padding: 15px; background-color: #f9f9f9; border-radius: 8px;" id="notesContainer"> <h3 style="margin-top: 0; color: #444;">Task Notes</h3> <textarea id="notesTextarea" style="width: 100%; height: 100px; padding: 10px; border: 1px solid #ddd; border-radius: 4px; margin-bottom: 10px;" placeholder="Add your notes, reflections, or planning for tomorrow here..."></textarea> <button id="saveNotesBtn" style="padding: 8px 16px; background-color: #4CAF50; color: white; border: none; border-radius: 4px; cursor: pointer;">Save Notes</button> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Initialize const checkboxes = document.querySelectorAll('.task-checkbox'); const timerDisplay = document.getElementById('timeDisplay'); const copyDataBtn = document.getElementById('copyDataBtn'); const pasteDataBtn = document.getElementById('pasteDataBtn'); const importData = document.getElementById('importData'); let timer; let timeLeft = 3 * 60 * 60; // 3 hours in seconds const sessionDate = new Date().toISOString().slice(0, 10); // Today's date for session tracking // Task tracking const groups = { 'hour1': { total: 60, completed: 0 }, 'hour2': { total: 60, completed: 0 }, 'hour3': { total: 60, completed: 0 } }; // Copy progress data to clipboard function copyProgressData() { const taskData = []; // Collect data from all tasks checkboxes.forEach(checkbox => { const taskId = checkbox.id; const gitHubLink = document.getElementById(`github-${taskId}`)?.value || ''; const claudeLink = document.getElementById(`claude-${taskId}`)?.value || ''; const description = document.querySelector(`label[for="${taskId}"]`)?.textContent || ''; taskData.push({ id: taskId, description: description, completed: checkbox.checked, gitHubLink: gitHubLink, claudeLink: claudeLink, group: checkbox.dataset.group, time: checkbox.dataset.time }); }); // Create a session object with timestamp const session = { date: sessionDate, timeLeft: timeLeft, tasks: taskData, notes: document.getElementById('notesTextarea')?.value || '' }; // Convert to JSON string const dataStr = JSON.stringify(session, null, 2); // Create a temporary textarea element const tempTextArea = document.createElement('textarea'); tempTextArea.value = dataStr; document.body.appendChild(tempTextArea); tempTextArea.select(); // Copy the text try { document.execCommand('copy'); alert('Progress data copied to clipboard! Save this in a text file for later use.'); } catch (err) { alert('Failed to copy data. ' + err); } // Clean up document.body.removeChild(tempTextArea); } // Show textarea for pasting data function showImportTextarea() { // Create modal for pasting data const modal = document.createElement('div'); modal.style.position = 'fixed'; modal.style.top = '0'; modal.style.left = '0'; modal.style.width = '100%'; modal.style.height = '100%'; modal.style.backgroundColor = 'rgba(0,0,0,0.5)'; modal.style.display = 'flex'; modal.style.justifyContent = 'center'; modal.style.alignItems = 'center'; modal.style.zIndex = '1000'; const modalContent = document.createElement('div'); modalContent.style.backgroundColor = 'white'; modalContent.style.padding = '20px'; modalContent.style.borderRadius = '8px'; modalContent.style.width = '80%'; modalContent.style.maxWidth = '600px'; const heading = document.createElement('h3'); heading.textContent = 'Paste Progress Data'; heading.style.marginTop = '0'; const textarea = document.createElement('textarea'); textarea.style.width = '100%'; textarea.style.height = '200px'; textarea.style.padding = '10px'; textarea.style.marginBottom = '10px'; textarea.placeholder = 'Paste your previously copied JSON data here...'; const buttonContainer = document.createElement('div'); buttonContainer.style.display = 'flex'; buttonContainer.style.justifyContent = 'space-between'; const importButton = document.createElement('button'); importButton.textContent = 'Import Data'; importButton.style.padding = '8px 16px'; importButton.style.backgroundColor = '#4CAF50'; importButton.style.color = 'white'; importButton.style.border = 'none'; importButton.style.borderRadius = '4px'; importButton.style.cursor = 'pointer'; const cancelButton = document.createElement('button'); cancelButton.textContent = 'Cancel'; cancelButton.style.padding = '8px 16px'; cancelButton.style.backgroundColor = '#f44336'; cancelButton.style.color = 'white'; cancelButton.style.border = 'none'; cancelButton.style.borderRadius = '4px'; cancelButton.style.cursor = 'pointer'; buttonContainer.appendChild(cancelButton); buttonContainer.appendChild(importButton); modalContent.appendChild(heading); modalContent.appendChild(textarea); modalContent.appendChild(buttonContainer); modal.appendChild(modalContent); document.body.appendChild(modal); // Cancel import cancelButton.addEventListener('click', function() { document.body.removeChild(modal); }); // Import data importButton.addEventListener('click', function() { const jsonData = textarea.value; processImportedData(jsonData); document.body.removeChild(modal); }); } // Process the imported data function processImportedData(jsonData) { try { const session = JSON.parse(jsonData); // Apply the imported session data if (session && session.tasks) { session.tasks.forEach(task => { const checkbox = document.getElementById(task.id); if (checkbox) { checkbox.checked = task.completed; } const gitHubInput = document.getElementById(`github-${task.id}`); if (gitHubInput && task.gitHubLink) { gitHubInput.value = task.gitHubLink; } const claudeInput = document.getElementById(`claude-${task.id}`); if (claudeInput && task.claudeLink) { claudeInput.value = task.claudeLink; } }); // Import notes if available const notesTextarea = document.getElementById('notesTextarea'); if (notesTextarea && session.notes) { notesTextarea.value = session.notes; } // Update time if needed if (session.timeLeft) { timeLeft = session.timeLeft; updateTimer(); } // Update progress display updateProgress(); alert('Progress imported successfully!'); } else { alert('Invalid data format. Could not import progress.'); } } catch (error) { console.error('Error importing data:', error); alert('Error importing data. Please make sure you\'ve pasted valid JSON.'); } } // Update progress function updateProgress() { let totalTasks = checkboxes.length; let completedTasks = 0; let totalTimeCompleted = 0; // Reset group completed time for (let group in groups) { groups[group].completed = 0; } // Count completed tasks and time checkboxes.forEach(checkbox => { if (checkbox.checked) { completedTasks++; const group = checkbox.dataset.group; const taskTime = parseInt(checkbox.dataset.time); groups[group].completed += taskTime; totalTimeCompleted += taskTime; } }); // Update group progress for (let group in groups) { const percentage = Math.round((groups[group].completed / groups[group].total) * 100); document.getElementById(`${group}-progress`).textContent = `${percentage}%`; document.getElementById(`${group}-bar`).style.width = `${percentage}%`; } // Update overall progress const overallPercentage = Math.round((totalTimeCompleted / 180) * 100); document.getElementById('overallProgress').style.width = `${overallPercentage}%`; document.getElementById('overallProgressText').textContent = `${overallPercentage}%`; document.getElementById('completedTasks').textContent = `${completedTasks}/${totalTasks}`; } // Timer function function updateTimer() { const hours = Math.floor(timeLeft / 3600); const minutes = Math.floor((timeLeft % 3600) / 60); const seconds = timeLeft % 60; timerDisplay.textContent = `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`; if (timeLeft <= 0) { clearInterval(timer); timerDisplay.textContent = "Time's up!"; return; } timeLeft--; } // Notes display and management const notesContainer = document.getElementById('notesContainer'); const notesTextarea = document.getElementById('notesTextarea'); const saveNotesBtn = document.getElementById('saveNotesBtn'); if (saveNotesBtn) { saveNotesBtn.addEventListener('click', function() { // Include notes in the export functionality alert('Notes saved! They will be included in your next export.'); }); } // Set up event listeners checkboxes.forEach(checkbox => { checkbox.addEventListener('change', updateProgress); }); copyDataBtn.addEventListener('click', copyProgressData); pasteDataBtn.addEventListener('click', showImportTextarea); // Add keyboard shortcut for copy (Ctrl+Shift+C) document.addEventListener('keydown', function(e) { if (e.ctrlKey && e.shiftKey && e.key === 'C') { e.preventDefault(); copyProgressData(); } }); // Start timer timer = setInterval(updateTimer, 1000); updateTimer(); // Initial progress update updateProgress(); }); </script> </body> </html>