shift+down at bottom of list inserts empty task above

Hunter
Saturday, March 7th, 2026 at 7:23 PM

index.html+32 

index.html
 378  			let currentTask = rootTask;
 379  			let taskPath = [currentTask];
 380  			let lastSubtaskDownArrowReleased = false;
 381 +			let lastSubtaskShiftDownReleased = false;
 382  			let saveTimer = null;
 383  			let currentThemeIndex = 0;
 384  			let isF2Pressed = false;

 527  					canAdd: true,
 528  					blocked: false
 529  				},
 530 +				shiftArrowDown: {
 531 +					blocked: false
 532 +				},
 533  				shiftEnter: {
 534  					pressed: false
 535  				},

 615  						} else {
 616  							handleKeyDown(e, task);
 617  						}
 618 +					} else if (e.key === 'ArrowDown' && e.shiftKey && !e.metaKey && !e.ctrlKey) {
 619 +						if (keyHandler.shiftArrowDown.blocked) {
 620 +							e.preventDefault();
 621 +							return;
 622 +						}
 623 +						if (isLastSubtask(task) && lastSubtaskShiftDownReleased && task !== currentTask && !e.repeat) {
 624 +							e.preventDefault();
 625 +							keyHandler.shiftArrowDown.blocked = true;
 626 +							// Insert a new empty task above the current task, keeping current task selected
 627 +							const parentTask = findParentTask(task);
 628 +							if (parentTask) {
 629 +								const index = parentTask.subtasks.findIndex(t => t.id === task.id);
 630 +								const newSubtask = { id: generateId(), text: '', state: 0, subtasks: [], selectedSubtaskId: null };
 631 +								parentTask.subtasks.splice(index, 0, newSubtask);
 632 +								updateTaskAndAncestors(parentTask);
 633 +								renderCurrentView();
 634 +								selectAndFocusTask(task);
 635 +								scheduleSave();
 636 +							}
 637 +							lastSubtaskShiftDownReleased = false;
 638 +						} else {
 639 +							handleKeyDown(e, task);
 640 +						}
 641  					} else {
 642  						handleKeyDown(e, task);
 643  					}

 654  					} else if (e.key === 'ArrowDown') {
 655  						keyHandler.arrowDown.canAdd = true;
 656  						keyHandler.arrowDown.blocked = false;
 657 +						keyHandler.shiftArrowDown.blocked = false;
 658  						if (isLastSubtask(task)) {
 659  							lastSubtaskDownArrowReleased = true;
 660 +							lastSubtaskShiftDownReleased = true;
 661  						} else {
 662  							lastSubtaskDownArrowReleased = false;
 663 +							lastSubtaskShiftDownReleased = false;
 664  						}
 665  					} else if (e.key === 'ArrowRight') {
 666  						keyHandler.shiftRight.pressed = false;

1184  					}
1185  				}
1186  				lastSubtaskDownArrowReleased = false;
1187 +				lastSubtaskShiftDownReleased = false;
1188  			}
1189  
1190  			function navigateIntoSubtask(subtask) {

1289  				}
1290  				updateBreadcrumbs(task);
1291  				lastSubtaskDownArrowReleased = isLastSubtask(task);
1292 +				lastSubtaskShiftDownReleased = isLastSubtask(task);
1293  				input.focus();
1294  				
1295  				// Center the active task in the viewport