maintain text cursor position  when toggling a task's checked state

Hunter
Saturday, March 7th, 2026 at 6:19 PM

index.html+9-4

index.html
 687  			}
 688  
 689  			function toggleTaskState(task) {
 690 +				// Save cursor position before re-rendering
 691 +				const taskInput = document.querySelector(`.task-container[data-id="${task.id}"] input[type="text"]`)
 692 +				const cursorPos = taskInput ? taskInput.selectionStart : null
 693 +				
 694  				if (task.state === 1) {
 695  					if (task.subtasks.length === 0 || !task.subtasks.every(t => t.state === 1)) {
 696  						task.state = 0;

 702  						}
 703  						
 704  						renderCurrentView();
     -						selectAndFocusTask(task);
 705 +						selectAndFocusTask(task, cursorPos);
 706  						scheduleSave();
 707  					} else {
 708  						// disallow unchecking and play a 'shake' animation

 718  					}
 719  					
 720  					renderCurrentView();
     -					selectAndFocusTask(task);
 721 +					selectAndFocusTask(task, cursorPos);
 722  					scheduleSave();
 723  				}
 724  			}

1075  				scheduleSave();
1076  			}
1077  
     -			function selectAndFocusTask(task) {
1078 +			function selectAndFocusTask(task, cursorPos) {
1079  				const taskInput = document.querySelector(`.task-container[data-id="${task.id}"] input[type="text"]`);
1080  				if (taskInput) {
1081  					taskInput.focus();
     -					taskInput.setSelectionRange(taskInput.value.length, taskInput.value.length);
1082 +					const pos = cursorPos != null ? cursorPos : taskInput.value.length
1083 +					taskInput.setSelectionRange(pos, pos);
1084  					setActiveTask(taskInput, task);
1085  				}
1086  			}