Hermes
c6be2ebae8
[pending-judge] feat(DC-168): calendar widget UX + theming — "No upcoming appointments" state, month grid with highlighted appointment days, theme-correct styling
Owner directives (2026-10-10/11, verbatim in brief): show "no upcoming
appointments" when empty; show a month calendar with days and times
highlighted when there are events; stylize to fit every theme; keep the
widget weather-widget-sized.
Changes (status/ frontend + tests):
- status/js/calendar-widget.js: rewritten render path — chip states ("No
upcoming appointments" / next appointment with highlighted when-span),
month grid modal (cal-grid + prev/next nav, appointment days highlighted,
per-event time dots), upcoming list with day/time emphasis, month-following
fetch with window-authoritative event merge (via calendar-cache.js),
forced refresh on periodic tick + source mutations, local escapeHtml (was
an undefined global).
- status/js/calendar-cache.js (new): uid+start-keyed event cache; fetched
window is authoritative for entries starting inside it (deletions and
reschedules propagate), entries outside survive. Dual export (module +
window) for tests and browser bundle.
- status/build.js: calendar-cache.js bundled before calendar-widget.js.
- status/css/dashboard.css: DC-168 block — chip states, month grid, day
highlight states, dots, list/source rows, universal light-bg contrast
rules (color-mix; WCAG >= 4.5:1 verified for all 10 builtin themes, worst
4.60:1 ocean) + light-surface rules.
Tests: 20 total in __tests__/calendar — 9 in caldav-default-ns (extraction
incl. mixed docs, empty multistatus, namespace-aware fixture validation,
undeclared-prefix rejection both quote styles, positive declared-attr),
5 in dc168-cache-contract (merge, duplicate suppression, recurring uid+start,
window-authoritative removal on refetch, cross-window survival, ended-
exclusion), 6 in dc168-widget-contract (navigation fetch windows, forced-
refresh semantics, cache+widget integration, interval coverage). Existing
suites pass unmodified; eslint 0 errors on touched files.
2026-10-12 01:04:48 -07:00
..
2026-08-23 20:24:42 -07:00
2026-10-12 01:04:48 -07:00
2026-10-09 02:56:41 -07:00
2026-06-13 12:16:56 -07:00
2026-10-08 03:46:56 -07:00
2026-08-12 12:25:26 -07:00
2026-10-08 15:04:56 -07:00
2026-10-08 23:25:41 -07:00
2026-06-26 12:16:38 -07:00
2026-10-07 20:44:07 -07:00
2026-08-18 08:22:29 -07:00
2026-08-22 16:22:53 -07:00
2026-07-01 07:37:45 -07:00
2026-06-13 12:16:56 -07:00
2026-08-23 01:57:20 -07:00
2026-08-23 09:05:27 -07:00
2026-08-23 08:01:29 -07:00
2026-07-01 04:20:57 -07:00
2026-06-13 12:16:56 -07:00
2026-07-20 17:44:11 -07:00
2026-07-20 01:40:33 -07:00
2026-07-02 18:27:03 -07:00
2026-08-18 05:52:32 -07:00
2026-06-27 07:02:47 -07:00
2026-08-22 19:42:25 -07:00
2026-08-23 02:31:16 -07:00
2026-08-23 12:40:32 -07:00
2026-08-23 12:40:32 -07:00
2026-08-23 15:53:58 -07:00
2026-10-07 00:58:03 -07:00
2026-06-13 12:16:56 -07:00
2026-08-12 12:35:58 -07:00
2026-08-22 17:22:13 -07:00
2026-08-23 04:40:41 -07:00
2026-06-13 12:16:56 -07:00
2026-08-18 04:17:50 -07:00
2026-10-09 02:56:41 -07:00
2026-06-26 12:16:38 -07:00
2026-08-17 16:04:18 -07:00
2026-06-13 12:16:56 -07:00
2026-06-13 12:16:56 -07:00
2026-08-12 04:50:16 -07:00
2026-08-12 12:30:57 -07:00
2026-06-13 12:16:56 -07:00
2026-08-23 15:02:00 -07:00
2026-08-22 14:23:25 -07:00
2026-08-22 16:52:53 -07:00
2026-08-22 16:52:53 -07:00
2026-08-22 15:14:25 -07:00
2026-08-22 15:14:25 -07:00
2026-08-13 16:30:20 -07:00
2026-06-13 12:16:56 -07:00
2026-07-20 17:44:11 -07:00
2026-04-06 21:36:46 -07:00
2026-08-04 14:18:49 -07:00
2026-08-22 18:15:37 -07:00
2026-08-22 18:15:37 -07:00
2026-08-22 18:15:37 -07:00
2026-07-20 21:40:26 -07:00
2026-06-13 12:16:56 -07:00
2026-08-23 07:28:10 -07:00
2026-08-23 05:22:04 -07:00
2026-06-25 17:16:16 -07:00
2026-08-12 12:35:58 -07:00
2026-08-18 01:29:19 -07:00
2026-08-22 21:35:51 -07:00
2026-08-18 17:07:13 -07:00
2026-10-03 21:12:35 -07:00
2026-10-03 21:12:35 -07:00
2026-10-03 21:26:29 -07:00
2026-10-03 21:26:29 -07:00
2026-10-03 21:43:11 -07:00
2026-10-03 23:25:23 -07:00
2026-10-03 21:37:13 -07:00
2026-10-03 21:31:57 -07:00
2026-07-06 15:06:28 -07:00
2026-10-03 21:29:41 -07:00
2026-10-03 21:29:41 -07:00
2026-10-04 03:12:23 -07:00
2026-10-03 21:14:20 -07:00
2026-10-03 22:55:22 -07:00
2026-10-03 22:34:02 -07:00
2026-10-03 21:16:20 -07:00
2026-10-03 21:37:13 -07:00
2026-10-03 22:47:27 -07:00
2026-10-03 21:39:33 -07:00
2026-10-03 21:35:15 -07:00
2026-10-03 21:40:09 -07:00
2026-10-03 21:47:34 -07:00
2026-08-22 23:28:36 -07:00
2026-08-22 19:42:25 -07:00
2026-08-22 23:28:36 -07:00
2026-06-13 12:16:56 -07:00
2026-08-12 05:07:24 -07:00
2026-06-13 12:16:56 -07:00
2026-07-21 21:59:03 -07:00
2026-10-09 02:56:41 -07:00
2026-08-23 07:28:10 -07:00
2026-06-13 12:16:56 -07:00
2026-09-13 05:32:14 -07:00
2026-07-24 22:39:29 -07:00
2026-08-22 05:41:38 -07:00
2026-08-19 00:10:37 -07:00
2026-08-19 00:10:37 -07:00
2026-07-21 00:45:46 -07:00
2026-10-07 00:58:03 -07:00
2026-06-13 12:16:56 -07:00
2026-08-22 05:41:38 -07:00
2026-06-13 12:16:56 -07:00
2026-07-06 21:28:03 -07:00
2026-07-06 18:55:16 -07:00
2026-08-18 19:45:08 -07:00
2026-08-18 17:35:59 -07:00
2026-06-13 12:16:56 -07:00
2026-07-20 17:44:11 -07:00
2026-08-18 13:16:44 -07:00
2026-08-18 13:34:51 -07:00
2026-08-31 23:37:00 -07:00
2026-08-18 01:59:14 -07:00
2026-08-18 09:03:58 -07:00
2026-08-15 00:01:16 -07:00