João Salavisa
aa6023e421
feat(web): per-task color indicator in sidebar ( #835 )
...
* feat(web): per-task color indicator in sidebar (localStorage)
Adds a color marker to tasks in the left task list for better visual
identification. Right-click a task → Color submenu picks one of seven
colors (or None to clear). Color renders as a 3px bar on the left edge
of the row and persists in localStorage.
* fix(web): address review feedback on task color indicator
- Filter storage events to TASK_COLORS_STORAGE_KEY so cross-tab writes
to unrelated keys no longer wake every TaskItem subscriber.
- Cache the parsed color map at module level, invalidated on writes and
cross-tab storage events. Avoids re-parsing localStorage on every
getSnapshot call (N tasks × N renders).
- Drop redundant typeof string check on Object.entries keys.
- Dim the colored bar to opacity-60 when not selected so colored rows
remain distinguishable from colored-and-selected rows at the left edge.
* refactor(web): remove test-only export from task-colors
Drop the __resetTaskColorsCacheForTests escape hatch from the
production module. Tests now invalidate the cache via a synthesized
cross-tab `storage` event, exercising the same listener path the
production code uses for real cross-tab updates.
---------
Co-authored-by: Kandev Agent <agent@kandev.dev >
2026-05-06 19:05:19 +01:00
..
2026-05-05 13:55:46 +01:00
2026-05-05 19:14:57 +01:00
2026-02-19 22:18:01 +00:00
2026-05-05 22:06:24 +01:00
2026-03-07 14:53:21 +00:00
2026-05-05 22:06:24 +01:00
2026-03-10 17:30:04 +00:00
2026-05-01 13:27:25 +01:00
2026-02-24 20:33:45 +00:00
2026-04-18 10:32:24 +01:00
2026-04-28 22:23:14 +01:00
2026-05-02 20:26:42 +01:00
2026-05-02 20:26:42 +01:00
2026-05-02 20:26:42 +01:00
2026-05-05 22:09:02 +01:00
2026-05-02 20:26:42 +01:00
2026-05-02 20:26:42 +01:00
2026-05-04 17:28:04 +01:00
2026-05-04 17:28:04 +01:00
2026-05-04 17:28:04 +01:00
2026-05-05 22:09:02 +01:00
2026-05-02 20:26:42 +01:00
2026-05-05 13:55:46 +01:00
2026-02-21 22:14:56 +00:00
2026-02-23 00:16:37 +00:00
2026-02-19 22:18:01 +00:00
2026-05-02 20:26:42 +01:00
2026-05-02 20:26:42 +01:00
2026-05-02 20:26:42 +01:00
2026-05-02 20:26:42 +01:00
2026-05-04 18:53:33 +01:00
2026-05-05 13:55:46 +01:00
2026-04-28 22:23:14 +01:00
2026-05-01 22:32:28 +01:00
2026-05-02 20:26:42 +01:00
2026-05-04 18:53:33 +01:00
2026-05-04 18:53:33 +01:00
2026-05-02 15:19:02 +01:00
2026-05-03 17:32:29 +01:00
2026-05-02 15:19:02 +01:00
2026-03-13 10:44:32 +00:00
2026-02-24 23:01:41 +00:00
2026-02-19 22:18:01 +00:00
2026-05-04 18:53:33 +01:00
2026-04-09 12:49:47 +01:00
2026-04-11 17:43:21 +01:00
2026-02-19 22:18:01 +00:00
2026-04-25 21:42:59 +01:00
2026-04-11 17:43:21 +01:00
2026-04-11 17:43:21 +01:00
2026-03-24 23:38:02 +00:00
2026-03-24 23:38:02 +00:00
2026-02-19 22:18:01 +00:00
2026-02-19 22:18:01 +00:00
2026-04-02 00:08:35 +01:00
2026-04-11 17:43:21 +01:00
2026-04-11 17:43:21 +01:00
2026-02-19 22:18:01 +00:00
2026-03-29 15:33:40 +01:00
2026-02-19 22:18:01 +00:00
2026-03-12 23:22:26 +00:00
2026-03-24 23:38:02 +00:00
2026-04-24 21:31:46 +01:00
2026-04-24 21:31:46 +01:00
2026-05-01 11:00:33 +01:00
2026-05-01 11:00:33 +01:00
2026-04-20 13:44:24 +01:00
2026-05-01 22:32:28 +01:00
2026-05-01 21:02:41 +01:00
2026-05-02 15:19:02 +01:00
2026-03-13 10:44:32 +00:00
2026-05-05 13:55:46 +01:00
2026-05-05 13:55:46 +01:00
2026-03-08 11:03:30 +00:00
2026-05-01 18:01:17 +01:00
2026-05-05 13:55:46 +01:00
2026-05-05 13:55:46 +01:00
2026-05-01 21:02:41 +01:00
2026-05-02 22:25:40 +01:00
2026-05-02 22:25:40 +01:00
2026-05-02 22:25:40 +01:00
2026-05-02 22:25:40 +01:00
2026-05-02 22:25:40 +01:00
2026-05-02 22:25:40 +01:00
2026-03-02 22:47:21 +00:00
2026-04-25 18:40:31 +01:00
2026-03-29 15:33:40 +01:00
2026-05-01 11:00:33 +01:00
2026-04-20 22:31:09 +01:00
2026-04-20 22:31:09 +01:00
2026-05-05 13:55:46 +01:00
2026-02-19 22:18:01 +00:00
2026-05-01 11:00:33 +01:00
2026-04-30 14:05:35 +01:00
2026-02-19 22:18:01 +00:00
2026-04-20 13:44:24 +01:00
2026-05-05 13:55:46 +01:00
2026-04-17 23:20:10 +01:00
2026-02-19 22:18:01 +00:00
2026-03-07 14:53:21 +00:00
2026-04-02 00:08:35 +01:00
2026-04-17 16:46:08 +01:00
2026-05-02 20:26:42 +01:00
2026-05-05 19:14:57 +01:00
2026-04-08 07:55:24 +01:00
2026-04-17 23:20:10 +01:00
2026-05-02 20:26:42 +01:00
2026-02-19 22:18:01 +00:00
2026-03-03 12:41:51 +00:00
2026-05-02 23:01:21 +01:00
2026-05-06 19:05:19 +01:00
2026-02-26 11:26:30 +00:00
2026-05-05 14:13:43 +01:00
2026-05-02 20:26:42 +01:00
2026-05-04 19:20:37 +01:00
2026-04-27 10:22:58 +01:00
2026-04-27 10:22:58 +01:00
2026-04-27 10:22:58 +01:00
2026-04-27 10:22:58 +01:00
2026-04-27 10:22:58 +01:00
2026-04-27 10:22:58 +01:00
2026-02-25 02:10:16 +00:00
2026-05-02 15:19:02 +01:00
2026-04-29 09:56:26 +01:00
2026-05-02 20:26:42 +01:00
2026-05-05 22:06:24 +01:00
2026-02-19 22:18:01 +00:00
2026-05-06 19:05:19 +01:00
2026-04-20 13:44:24 +01:00
2026-05-05 22:06:24 +01:00
2026-05-04 19:20:37 +01:00
2026-03-29 22:27:37 +01:00
2026-05-01 13:27:25 +01:00
2026-04-24 17:14:03 +01:00
2026-05-04 00:53:21 +01:00
2026-05-04 00:53:21 +01:00
2026-05-01 13:27:25 +01:00
2026-05-02 15:19:02 +01:00
2026-04-27 10:22:58 +01:00
2026-05-02 20:26:42 +01:00
2026-05-05 13:55:46 +01:00
2026-04-24 17:14:03 +01:00
2026-03-08 11:03:30 +00:00
2026-02-24 23:01:41 +00:00
2026-04-16 10:14:45 +01:00
2026-02-19 22:18:01 +00:00
2026-02-19 22:18:01 +00:00
2026-05-01 13:27:25 +01:00