John O'Keefe
acbcc61ae4
feat(ui): global confirm modal — browser dialogs retired sitewide (issues #5/#4/#7)
...
ONE styled modal answers every hx-confirm in the app: a body-level
htmx:confirm interceptor (web/src/confirm.ts, canonical htmx pattern)
preventDefaults and shows the dialog, issuing the request on Confirm.
Nine hx-confirm call sites upgrade without touching them. The modal
lives in the header partial so every page has it; confirmDialog() is
exported for JS call sites and degrades to the native dialog if the
header is absent (bare layouts).
Migrated the five window.confirm sites (admin.ts ×3, book-detail.ts ×2)
to the same promise API.
Podcast feed detail (issues #4/#7): the unsubscribe copy is
role-aware — non-admins get 'Unsubscribe from this feed?' with silent
retention (file state is admin knowledge); an admin who is the LAST
subscriber gets a three-choice modal instead: Unsubscribe (files kept,
the D6 default — sliding-window feeds make purge unrecoverable) /
Remove feed + files / Cancel. Admins with co-subscribers keep the
files-note confirm.
2026-10-29 20:12:30 -04:00
..
2026-10-28 09:37:14 -04:00
2026-10-28 09:37:14 -04:00
2026-10-28 09:37:14 -04:00
2026-10-25 11:06:08 -04:00
2026-10-13 12:24:12 -04:00
2026-10-27 23:33:52 -04:00
2026-10-27 23:33:52 -04:00
2026-10-27 13:22:54 -04:00
2026-10-27 13:22:54 -04:00
2026-10-28 00:22:00 -04:00
2026-10-28 00:22:00 -04:00
2026-10-25 18:14:44 -04:00
2026-10-27 23:33:52 -04:00
2026-10-27 23:33:52 -04:00
2026-10-25 17:22:40 -04:00
2026-10-25 18:14:44 -04:00
2026-10-25 18:14:44 -04:00
2026-10-29 16:25:44 -04:00
2026-10-29 16:25:44 -04:00
2026-10-27 19:05:23 -04:00
2026-10-27 19:05:23 -04:00
2026-10-29 16:05:03 -04:00
2026-10-29 16:05:03 -04:00
2026-05-24 21:20:24 -04:00
2026-03-27 15:52:02 -04:00
2026-10-28 10:12:20 -04:00
2026-10-28 10:12:20 -04:00
2026-10-25 11:06:08 -04:00
2026-10-18 12:08:20 -04:00
2026-10-27 23:33:52 -04:00
2026-10-25 11:06:08 -04:00
2026-10-19 15:43:59 -04:00
2026-10-27 23:33:52 -04:00
2026-10-27 23:33:52 -04:00
2026-10-27 23:33:52 -04:00
2026-10-27 23:33:52 -04:00
2026-10-27 23:33:52 -04:00
2026-10-27 23:33:52 -04:00
2026-10-26 08:17:49 -04:00
2026-10-27 23:33:52 -04:00
2026-10-27 23:33:52 -04:00
2026-10-27 23:33:52 -04:00
2026-10-27 23:33:52 -04:00
2026-10-27 23:33:52 -04:00
2026-10-27 23:33:52 -04:00
2026-10-24 14:31:36 -04:00
2026-10-27 23:33:52 -04:00
2026-10-27 23:33:52 -04:00
2026-10-25 11:06:08 -04:00
2026-08-10 13:43:13 -04:00
2026-10-25 11:06:08 -04:00
2026-10-19 18:59:36 -04:00
2026-10-25 11:06:08 -04:00
2026-08-05 16:45:02 -04:00
2026-10-29 16:17:55 -04:00
2026-10-29 20:12:30 -04:00
2026-10-29 16:17:55 -04:00
2026-10-29 16:17:55 -04:00
2026-10-25 17:22:40 -04:00
2026-10-25 16:58:28 -04:00
2026-10-29 15:44:48 -04:00
2026-10-29 15:44:48 -04:00
2026-10-25 11:06:08 -04:00
2026-10-24 19:44:34 -04:00
2026-10-26 14:58:50 -04:00
2026-10-29 16:25:44 -04:00
2026-10-29 20:12:19 -04:00
2026-10-29 20:12:19 -04:00
2026-10-29 19:49:39 -04:00
2026-10-29 19:49:39 -04:00
2026-10-26 13:59:32 -04:00
2026-10-26 13:59:32 -04:00
2026-10-25 11:06:08 -04:00
2026-08-05 16:45:02 -04:00
2026-10-27 23:33:52 -04:00
2026-10-27 23:33:52 -04:00
2026-10-27 23:33:52 -04:00
2026-10-27 23:33:52 -04:00
2026-10-27 23:33:52 -04:00
2026-10-27 23:33:52 -04:00
2026-10-24 19:44:34 -04:00
2026-10-24 19:44:34 -04:00
2026-08-05 16:45:02 -04:00
2026-08-05 16:45:02 -04:00
2026-10-27 15:11:49 -04:00
2026-10-27 15:11:49 -04:00
2026-10-28 10:12:20 -04:00
2026-10-28 10:12:20 -04:00
2026-10-03 23:54:07 -04:00
2026-10-24 19:44:34 -04:00
2026-10-24 19:44:34 -04:00
2026-10-27 23:33:52 -04:00
2026-10-27 23:33:52 -04:00
2026-10-18 12:08:07 -04:00
2026-10-18 12:08:07 -04:00
2026-10-18 12:08:07 -04:00
2026-10-25 11:06:08 -04:00
2026-05-10 16:13:21 -04:00
2026-10-29 16:25:44 -04:00
2026-10-27 23:33:52 -04:00
2026-10-27 23:33:52 -04:00
2026-10-19 18:59:36 -04:00
2026-10-29 15:44:48 -04:00