diff --git a/admin/src/App/AuroraAdmin.php b/admin/src/App/AuroraAdmin.php
index 64d480e..15b0ff5 100644
--- a/admin/src/App/AuroraAdmin.php
+++ b/admin/src/App/AuroraAdmin.php
@@ -47,6 +47,7 @@ use AuroraAdmin\Media\SvgUploads;
use AuroraAdmin\Media\MediaFolders;
use AuroraAdmin\ImageFormats\ImageFormats;
use AuroraAdmin\Security\Security;
+use AuroraAdmin\Code\CodeInjection;
use AuroraAdmin\Rest\MediaFolderData;
use AuroraAdmin\Rest\BugReportData;
use AuroraAdmin\Rest\CompanionPluginData;
@@ -99,6 +100,7 @@ class AuroraAdmin
new MediaFolders();
new ImageFormats();
new Security();
+ new CodeInjection();
new MediaFolderData();
new BugReportData();
new CompanionPluginData();
diff --git a/admin/src/Code/CodeInjection.php b/admin/src/Code/CodeInjection.php
new file mode 100644
index 0000000..0fc1b23
--- /dev/null
+++ b/admin/src/Code/CodeInjection.php
@@ -0,0 +1,72 @@
+ Code).
+ *
+ * Four admin-authored fields, only settable by manage_options users on the
+ * settings page:
+ * - Admin CSS → wrapped in a ", "", $css);
+ echo "\n\n"; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- admin-authored stylesheet, output raw inside a stripped above to prevent breakout.
+ }
+
+ public static function admin_js()
+ {
+ $js = trim((string) Settings::get("custom_admin_js", ""));
+ if ($js === "") {
+ return;
+ }
+ $js = str_ireplace("", "<\\/script>", $js);
+ echo "\n\n"; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- admin-authored script, output raw inside a ',
+ },
+ {
+ key: 'footer_scripts',
+ type: 'textarea',
+ mono: true,
+ rows: 8,
+ label: 'Footer scripts',
+ description:
+ 'Raw HTML/JS printed just before