diff --git a/README.md b/README.md index d9f4807..abe9ca4 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ The date, storage, rollover, task and undo logic lives in `src/lib/` as plain mo ### Managing Tasks - **Add a task**: Type in the input field and press Enter - **Complete a task**: Click the checkbox next to the task -- **Edit a task**: Click its text. Enter saves, Escape cancels, and clicking away saves too +- **Edit a task**: Click the pencil on the task. Enter saves, Escape cancels, and clicking away saves too - **Delete a task**: Click the delete icon on the task (it shows on hover, and is always visible on touch), or press `Delete` with the task focused - **Undo**: An Undo button appears for a few seconds after a task is deleted, cleared or moved to another day. `Cmd/Ctrl+Z` does the same. Either way the task returns to where it was - **Move a task to Tomorrow**: Click the arrow on the task, or press `Alt+→`. From Tomorrow, the arrow points back and `Alt+←` returns it to Today diff --git a/src/App.svelte b/src/App.svelte index ddf60e5..2f49ebd 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -94,12 +94,9 @@ let editingId = $state(null); let editingText = $state(''); - // A drag ends with a click event, which would otherwise drop the row you - // just moved straight into edit mode. - let suppressClick = false; function startEditing(task) { - if (suppressClick || draggedId) return; + if (draggedId) return; editingId = task.id; editingText = task.text; } @@ -478,10 +475,6 @@ if (!wasActive) return; - // Swallow the click the browser fires after this drag. - suppressClick = true; - setTimeout(() => { suppressClick = false; }, 0); - // Clearing the inline transform while the settling class supplies a // transition eases the card into its slot. Nothing else on the list moves, // because nothing else changed. @@ -769,10 +762,20 @@ aria-label="Edit {task.text}" /> {:else} - + {task.text} {/if} + +
+ + + +
{/each} diff --git a/src/style.css b/src/style.css index 230f89e..b81862c 100644 --- a/src/style.css +++ b/src/style.css @@ -280,6 +280,9 @@ html.dark .day-option.selected { .task-item { display: flex; + /* The row is a drag handle, so pressing and moving across it should carry + the card rather than highlight words. */ + user-select: none; align-items: flex-start; gap: 16px; padding: 16px 20px; @@ -385,16 +388,9 @@ html.dark .task-item.dragging { .task-text { flex: 1; min-width: 0; - text-align: left; - background: transparent; - border: none; - padding-inline: 0; /* Pads the 24px line box out to the 32px first-line band the row buttons - set, so the text centres against the checkbox. Declared as a longhand - because a `padding: 0` shorthand here would reset it. */ + set, so the text centres against the checkbox. */ padding-block: 4px; - font-family: inherit; - cursor: text; font-size: 16px; /* 24px line box, the same height as the checkbox, so the two align on the first line without nudging either. */ @@ -414,6 +410,8 @@ html.dark .task-item.dragging { .task-edit { flex: 1; min-width: 0; + /* The one place text stays selectable, so it can still be copied out. */ + user-select: text; font-family: inherit; font-size: 16px; line-height: 1.5; @@ -426,6 +424,15 @@ html.dark .task-item.dragging { outline: none; } +/* One group rather than three loose children, so the gaps between the actions + do not multiply across the row on a narrow screen. */ +.row-actions { + display: flex; + align-items: flex-start; + gap: 2px; + flex-shrink: 0; +} + .row-btn { width: 32px; height: 32px; @@ -443,6 +450,11 @@ html.dark .task-item.dragging { flex-shrink: 0; } +.edit-btn:hover { + background-color: var(--hover); + color: var(--accent); +} + .defer-btn:hover { background-color: var(--hover); color: var(--accent); @@ -617,9 +629,13 @@ html.dark .data-status.error { /* Smaller drawn box, same 44px target from the overlay below, and the margin keeps it in the 32px first-line band. */ .row-btn { - width: 28px; - height: 28px; - margin-block: 2px; + width: 26px; + height: 26px; + margin-block: 3px; + } + + .row-actions { + gap: 0; } .checkbox::after, @@ -777,7 +793,6 @@ html.dark .data-status.error { longer exists, while five newer controls had no focus ring at all. */ .checkbox:focus-visible, .row-btn:focus-visible, -.task-text:focus-visible, .task-edit:focus-visible, .theme-toggle:focus-visible, .day-option:focus-visible,