shift+down at bottom of list inserts empty task above
Hunter
Saturday, March 7th, 2026 at 7:23 PM
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