diff --git a/TODO.md b/TODO.md
index 0ecd024..3e92b8f 100644
--- a/TODO.md
+++ b/TODO.md
@@ -70,3 +70,7 @@
- [x] `partage/index.php` — warning stored as plain text (no pre-escaping); `htmlspecialchars()` applied once at render; was double-encoded before
- [x] `partage/index.php` — `flash-warning` div gets `id` + `tabindex=-1`; inline JS scrolls and focuses it on load
- [x] `admin/footer.php` — `htmx:afterSettle` listener focuses `.toast--warning` after HTMX injects the toast fragment
+
+## Sticky save/cancel buttons on edit page
+- [x] `templates/admin/edit.php` — moved `.admin-form-footer` from bottom to top-right, right after `
`
+- [x] `admin.css` — added `.admin-form-footer--sticky` variant with `position:sticky; top:0; justify-content:flex-end`
diff --git a/app/public/assets/css/admin.css b/app/public/assets/css/admin.css
index 8800b1e..75fa0cb 100644
--- a/app/public/assets/css/admin.css
+++ b/app/public/assets/css/admin.css
@@ -78,6 +78,17 @@
padding-top: var(--space-m);
}
+/* Sticky variant — pinned below admin header, top-right */
+.admin-form-footer--sticky {
+ position: sticky;
+ top: 0;
+ z-index: 10;
+ margin: 0 0 var(--space-m);
+ display: flex;
+ justify-content: flex-end;
+ gap: var(--space-s);
+}
+
.admin-btn {
padding: var(--space-2xs) var(--space-l);
background: var(--accent-primary);
diff --git a/app/storage/logs/admin.log b/app/storage/logs/admin.log
index 94b822a..1616cac 100644
--- a/app/storage/logs/admin.log
+++ b/app/storage/logs/admin.log
@@ -2,3 +2,6 @@
{"timestamp":"2026-05-04T15:53:38+00:00","ip":"127.0.0.1","user_agent":"Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0","resource":"system","action":"maintenance_off","status":"success"}
{"timestamp":"2026-05-04T15:53:44+00:00","ip":"127.0.0.1","user_agent":"Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0","resource":"system","action":"maintenance_on","status":"success"}
{"timestamp":"2026-05-04T16:11:57+00:00","ip":"127.0.0.1","user_agent":"Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0","resource":"system","action":"maintenance_off","status":"success"}
+{"timestamp":"2026-05-05T09:06:21+00:00","ip":"127.0.0.1","user_agent":"Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0","resource":"thesis","action":"add","status":"success","context":{"thesis_id":38,"identifier":"2025-013","author":"Lila Dubois, Karim Nassar"}}
+{"timestamp":"2026-05-05T09:08:03+00:00","ip":"127.0.0.1","user_agent":"Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0","resource":"thesis","action":"publish","status":"success","context":{"count":1,"ids":[38]}}
+{"timestamp":"2026-05-05T09:19:46+00:00","ip":"127.0.0.1","user_agent":"Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0","resource":"thesis","action":"edit","status":"success","context":{"thesis_id":38,"title":"Jouer l'espace : dispositifs scénographiques pour l'expérience participative"}}
diff --git a/app/storage/logs/form-submissions.log b/app/storage/logs/form-submissions.log
index 4a1b264..33a5ec2 100644
--- a/app/storage/logs/form-submissions.log
+++ b/app/storage/logs/form-submissions.log
@@ -18,3 +18,4 @@
{"source":"admin","action":"submit","status":"duplicate","author":"Théo Marchand","existing_thesis_id":37,"existing_identifier":"2025-012","timestamp":"2026-05-04T15:11:26+00:00","ip":"127.0.0.1","user_agent":"Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0"}
{"source":"partage","action":"submit","status":"duplicate","author":"Théo Marchand","existing_thesis_id":37,"existing_identifier":"2025-012","share_slug":"20260429-DZESJT6X","timestamp":"2026-05-04T15:11:36+00:00","ip":"127.0.0.1","user_agent":"Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0"}
{"source":"partage","action":"submit","status":"duplicate","author":"Théo Marchand","existing_thesis_id":37,"existing_identifier":"2025-012","share_slug":"20260429-DZESJT6X","timestamp":"2026-05-04T15:11:43+00:00","ip":"127.0.0.1","user_agent":"Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0"}
+{"source":"admin","action":"submit","status":"success","thesis_id":38,"identifier":"2025-013","author":"Lila Dubois, Karim Nassar","timestamp":"2026-05-05T09:06:21+00:00","ip":"127.0.0.1","user_agent":"Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0"}
diff --git a/app/templates/admin/edit.php b/app/templates/admin/edit.php
index 0e45125..8498153 100644
--- a/app/templates/admin/edit.php
+++ b/app/templates/admin/edit.php
@@ -2,6 +2,11 @@
Modifier un TFE