diff --git a/core/src/main/java/hudson/model/ManagementLink.java b/core/src/main/java/hudson/model/ManagementLink.java
index cf7c901e7207..e827ce74f3f9 100644
--- a/core/src/main/java/hudson/model/ManagementLink.java
+++ b/core/src/main/java/hudson/model/ManagementLink.java
@@ -174,6 +174,12 @@ public enum Category {
* Configuration pages that don't fit into a more specific section.
*/
CONFIGURATION(Messages._ManagementLink_Category_CONFIGURATION()),
+ /**
+ * Configuration pages related to plugin management, including installation,
+ * updates, and administrative actions for maintaining installed plugins.
+ */
+ @Restricted(NoExternalUse.class)
+ PLUGINS(Messages._ManagementLink_Category_PLUGINS()),
/**
* Security related options. Useful for plugins providing security related {@code ManagementLink}s (e.g. security realms).
* Use {@link Category#STATUS} instead if the feature is informational.
diff --git a/core/src/main/java/jenkins/management/PluginsAvailableLink.java b/core/src/main/java/jenkins/management/PluginsAvailableLink.java
new file mode 100644
index 000000000000..2b54a096dc21
--- /dev/null
+++ b/core/src/main/java/jenkins/management/PluginsAvailableLink.java
@@ -0,0 +1,69 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2025, Jan Faracik
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+package jenkins.management;
+
+import edu.umd.cs.findbugs.annotations.NonNull;
+import hudson.Extension;
+import hudson.model.ManagementLink;
+import hudson.security.Permission;
+import jenkins.model.Jenkins;
+import jenkins.model.experimentalflags.NewManageJenkinsUserExperimentalFlag;
+
+@Extension(ordinal = Integer.MAX_VALUE - 1)
+public class PluginsAvailableLink extends ManagementLink {
+
+ @Override
+ public String getIconFileName() {
+ var flagEnabled = new NewManageJenkinsUserExperimentalFlag().getFlagValue();
+
+ if (!flagEnabled) {
+ return null;
+ }
+
+ return "symbol-shopping-bag";
+ }
+
+ @Override
+ public String getDisplayName() {
+ return Messages.PluginsAvailableLink_DisplayName();
+ }
+
+ @Override
+ public String getUrlName() {
+ return "pluginManager/available";
+ }
+
+ @NonNull
+ @Override
+ public Permission getRequiredPermission() {
+ return Jenkins.SYSTEM_READ;
+ }
+
+ @NonNull
+ @Override
+ public Category getCategory() {
+ return Category.PLUGINS;
+ }
+}
diff --git a/core/src/main/java/jenkins/management/PluginsDownloadProgressLink.java b/core/src/main/java/jenkins/management/PluginsDownloadProgressLink.java
new file mode 100644
index 000000000000..7450f054a0bd
--- /dev/null
+++ b/core/src/main/java/jenkins/management/PluginsDownloadProgressLink.java
@@ -0,0 +1,75 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2025, Jan Faracik
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+package jenkins.management;
+
+import edu.umd.cs.findbugs.annotations.NonNull;
+import hudson.Extension;
+import hudson.model.ManagementLink;
+import hudson.security.Permission;
+import jenkins.model.Jenkins;
+import jenkins.model.experimentalflags.NewManageJenkinsUserExperimentalFlag;
+
+@Extension(ordinal = Integer.MAX_VALUE - 3)
+public class PluginsDownloadProgressLink extends ManagementLink {
+
+ @Override
+ public String getIconFileName() {
+ var flagEnabled = new NewManageJenkinsUserExperimentalFlag().getFlagValue();
+
+ if (!flagEnabled) {
+ return null;
+ }
+
+ // Hide the 'Download progress' link if there are
+ // no active downloads or restarts pending
+ if (Jenkins.get().getUpdateCenter().getJobs().isEmpty()) {
+ return null;
+ }
+
+ return "symbol-list";
+ }
+
+ @Override
+ public String getDisplayName() {
+ return Messages.PluginsDownloadProgressLink_DisplayName();
+ }
+
+ @Override
+ public String getUrlName() {
+ return "pluginManager/updates/";
+ }
+
+ @NonNull
+ @Override
+ public Permission getRequiredPermission() {
+ return Jenkins.SYSTEM_READ;
+ }
+
+ @NonNull
+ @Override
+ public Category getCategory() {
+ return Category.PLUGINS;
+ }
+}
diff --git a/core/src/main/java/jenkins/management/PluginsInstalledLink.java b/core/src/main/java/jenkins/management/PluginsInstalledLink.java
new file mode 100644
index 000000000000..64c211276fd5
--- /dev/null
+++ b/core/src/main/java/jenkins/management/PluginsInstalledLink.java
@@ -0,0 +1,69 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2025, Jan Faracik
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+package jenkins.management;
+
+import edu.umd.cs.findbugs.annotations.NonNull;
+import hudson.Extension;
+import hudson.model.ManagementLink;
+import hudson.security.Permission;
+import jenkins.model.Jenkins;
+import jenkins.model.experimentalflags.NewManageJenkinsUserExperimentalFlag;
+
+@Extension(ordinal = Integer.MAX_VALUE - 2)
+public class PluginsInstalledLink extends ManagementLink {
+
+ @Override
+ public String getIconFileName() {
+ var flagEnabled = new NewManageJenkinsUserExperimentalFlag().getFlagValue();
+
+ if (!flagEnabled) {
+ return null;
+ }
+
+ return "symbol-plugins";
+ }
+
+ @Override
+ public String getDisplayName() {
+ return Messages.PluginsInstalledLink_DisplayName();
+ }
+
+ @Override
+ public String getUrlName() {
+ return "pluginManager/installed";
+ }
+
+ @NonNull
+ @Override
+ public Permission getRequiredPermission() {
+ return Jenkins.SYSTEM_READ;
+ }
+
+ @NonNull
+ @Override
+ public Category getCategory() {
+ return Category.PLUGINS;
+ }
+}
diff --git a/core/src/main/java/jenkins/management/PluginsLink.java b/core/src/main/java/jenkins/management/PluginsLink.java
index 0db05bfc8d43..d83024acab13 100644
--- a/core/src/main/java/jenkins/management/PluginsLink.java
+++ b/core/src/main/java/jenkins/management/PluginsLink.java
@@ -30,6 +30,7 @@
import hudson.model.UpdateCenter;
import hudson.security.Permission;
import jenkins.model.Jenkins;
+import jenkins.model.experimentalflags.NewManageJenkinsUserExperimentalFlag;
import org.jenkinsci.Symbol;
/**
@@ -40,6 +41,12 @@ public class PluginsLink extends ManagementLink {
@Override
public String getIconFileName() {
+ var flagEnabled = new NewManageJenkinsUserExperimentalFlag().getFlagValue();
+
+ if (flagEnabled) {
+ return null;
+ }
+
return "plugin.svg";
}
diff --git a/core/src/main/java/jenkins/management/PluginsUpdatesLink.java b/core/src/main/java/jenkins/management/PluginsUpdatesLink.java
new file mode 100644
index 000000000000..1704035c2957
--- /dev/null
+++ b/core/src/main/java/jenkins/management/PluginsUpdatesLink.java
@@ -0,0 +1,76 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2025, Jan Faracik
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+package jenkins.management;
+
+import edu.umd.cs.findbugs.annotations.NonNull;
+import hudson.Extension;
+import hudson.model.ManagementLink;
+import hudson.model.UpdateCenter;
+import hudson.security.Permission;
+import jenkins.model.Jenkins;
+import jenkins.model.experimentalflags.NewManageJenkinsUserExperimentalFlag;
+
+@Extension(ordinal = Integer.MAX_VALUE)
+public class PluginsUpdatesLink extends ManagementLink {
+
+ @Override
+ public String getIconFileName() {
+ var flagEnabled = new NewManageJenkinsUserExperimentalFlag().getFlagValue();
+
+ if (!flagEnabled) {
+ return null;
+ }
+
+ return "symbol-download";
+ }
+
+ @Override
+ public String getDisplayName() {
+ return Messages.PluginsUpdatesLink_DisplayName();
+ }
+
+ @Override
+ public String getUrlName() {
+ return "pluginManager";
+ }
+
+ @NonNull
+ @Override
+ public Permission getRequiredPermission() {
+ return Jenkins.SYSTEM_READ;
+ }
+
+ @NonNull
+ @Override
+ public Category getCategory() {
+ return Category.PLUGINS;
+ }
+
+ @Override
+ public Badge getBadge() {
+ final UpdateCenter updateCenter = Jenkins.get().getUpdateCenter();
+ return updateCenter.getBadge();
+ }
+}
diff --git a/core/src/main/resources/hudson/PluginManager/advanced.jelly b/core/src/main/resources/hudson/PluginManager/advanced.jelly
index 81948afa6e80..dbee7b09a090 100644
--- a/core/src/main/resources/hudson/PluginManager/advanced.jelly
+++ b/core/src/main/resources/hudson/PluginManager/advanced.jelly
@@ -28,83 +28,73 @@ THE SOFTWARE.
-
+
-
-
+
+
@@ -257,6 +252,5 @@ THE SOFTWARE.
-
-
+
diff --git a/core/src/main/resources/hudson/model/Messages.properties b/core/src/main/resources/hudson/model/Messages.properties
index a685e1e9358c..ffc8f6432f2c 100644
--- a/core/src/main/resources/hudson/model/Messages.properties
+++ b/core/src/main/resources/hudson/model/Messages.properties
@@ -417,6 +417,7 @@ TimeZoneProperty.current_time_in_=Current time in {0}: {1}
TimeZoneProperty.current_time_on_server_in_in_proposed_di=Current time on server in {0}: {1}; in proposed display zone: {2}
ManagementLink.Category.CONFIGURATION=System Configuration
+ManagementLink.Category.PLUGINS=Plugins
ManagementLink.Category.SECURITY=Security
ManagementLink.Category.STATUS=Status Information
ManagementLink.Category.TROUBLESHOOTING=Troubleshooting
diff --git a/core/src/main/resources/hudson/model/UpdateCenter/index.jelly b/core/src/main/resources/hudson/model/UpdateCenter/index.jelly
index feffecd43ae4..f3a9beaf16a8 100644
--- a/core/src/main/resources/hudson/model/UpdateCenter/index.jelly
+++ b/core/src/main/resources/hudson/model/UpdateCenter/index.jelly
@@ -27,14 +27,11 @@ THE SOFTWARE.
This page shows the status of the plugin installation
-->
-
-
+
+
-
-
-
${%Download progress}
-
-
-
+
+
+
diff --git a/core/src/main/resources/hudson/model/UpdateCenter/sidepanel.jelly b/core/src/main/resources/hudson/model/UpdateCenter/sidepanel.jelly
index 7254e2214b91..00a73f552a35 100644
--- a/core/src/main/resources/hudson/model/UpdateCenter/sidepanel.jelly
+++ b/core/src/main/resources/hudson/model/UpdateCenter/sidepanel.jelly
@@ -27,11 +27,6 @@ THE SOFTWARE.
-->
-
-
-
-
-
-
-
+
+
diff --git a/core/src/main/resources/hudson/model/UpdateCenter/update-center.js b/core/src/main/resources/hudson/model/UpdateCenter/update-center.js
index 90441d4f005f..b5bf1f4fffea 100644
--- a/core/src/main/resources/hudson/model/UpdateCenter/update-center.js
+++ b/core/src/main/resources/hudson/model/UpdateCenter/update-center.js
@@ -50,5 +50,4 @@ function refresh() {
}, 5000);
}
-window.scrollTo(0, 10000);
refresh();
diff --git a/core/src/main/resources/jenkins/management/Messages.properties b/core/src/main/resources/jenkins/management/Messages.properties
index d81533310b66..9ecf46aa9834 100644
--- a/core/src/main/resources/jenkins/management/Messages.properties
+++ b/core/src/main/resources/jenkins/management/Messages.properties
@@ -66,3 +66,8 @@ ShutdownLink.Description=Stops executing new builds, so that the system can be e
ShutdownLink.ShuttingDownInProgressDescription=Jenkins is currently shutting down. New builds are not executing.
ShutdownLink.ShutDownReason_title=Reason
ShutdownLink.ShutDownReason_update=Update reason
+
+PluginsUpdatesLink.DisplayName=Updates
+PluginsAvailableLink.DisplayName=Available plugins
+PluginsInstalledLink.DisplayName=Installed plugins
+PluginsDownloadProgressLink.DisplayName=Download progress
diff --git a/core/src/main/resources/jenkins/management/Messages_fr.properties b/core/src/main/resources/jenkins/management/Messages_fr.properties
index 7b8a2a1fa4bc..b81bf78c4ec1 100644
--- a/core/src/main/resources/jenkins/management/Messages_fr.properties
+++ b/core/src/main/resources/jenkins/management/Messages_fr.properties
@@ -52,3 +52,8 @@ NodesLink.Description=Ajouter, supprimer, contrôler et monitorer les divers nœ
ShutdownLink.DisplayName_cancel=Annuler la fermeture
ShutdownLink.DisplayName_prepare=Préparer à la fermeture
ShutdownLink.Description=Cesser d''exécuter de nouveaux builds, afin que le système puisse se fermer.
+
+PluginsUpdatesLink.DisplayName=Mises à jour
+PluginsAvailableLink.DisplayName=Plugins disponibles
+PluginsInstalledLink.DisplayName=Plugins installés
+PluginsDownloadProgressLink.DisplayName=Progression des téléchargements
diff --git a/core/src/main/resources/jenkins/management/Messages_pl.properties b/core/src/main/resources/jenkins/management/Messages_pl.properties
index 15e3e98ac9ba..eb8fcedae5c5 100644
--- a/core/src/main/resources/jenkins/management/Messages_pl.properties
+++ b/core/src/main/resources/jenkins/management/Messages_pl.properties
@@ -50,3 +50,8 @@ ShutdownLink.DisplayName_cancel=Anuluj wyłączenie
ShutdownLink.Description=Zatrzyma wykonanie nowych buildów, tak by system mógłbyć bezpiecznie wyłączony.
# Configure tools, their locations and automatic installers.
ConfigureTools.Description=Konfiguruj narzędzia, ścieżki do nich i automatyczne instalatory
+
+PluginsUpdatesLink.DisplayName=Aktualizacje
+PluginsAvailableLink.DisplayName=Dostępne wtyczki
+PluginsInstalledLink.DisplayName=Zainstalowane wtyczki
+PluginsDownloadProgressLink.DisplayName=Status pobierania
diff --git a/core/src/main/resources/jenkins/management/Messages_pt_BR.properties b/core/src/main/resources/jenkins/management/Messages_pt_BR.properties
index ceafae850c3f..406e18303da7 100644
--- a/core/src/main/resources/jenkins/management/Messages_pt_BR.properties
+++ b/core/src/main/resources/jenkins/management/Messages_pt_BR.properties
@@ -48,3 +48,8 @@ ShutdownLink.ShutDownReason_update=Atualizar razão
ConfigureTools.Description=Configurar ferramentas, suas localizações e instaladores automáticos.
ShutdownLink.ShuttingDownInProgressDescription=O Jenkins está sendo desligado no momento. Novas construções não serão executadas.
ShutdownLink.ShutDownReason_title=Razão
+
+PluginsUpdatesLink.DisplayName=Atualizações
+PluginsAvailableLink.DisplayName=Extensões disponíveis
+PluginsInstalledLink.DisplayName=Extensões instaladas
+PluginsDownloadProgressLink.DisplayName=Andamento do download
diff --git a/core/src/main/resources/jenkins/management/Messages_sv_SE.properties b/core/src/main/resources/jenkins/management/Messages_sv_SE.properties
index 2b4b0e65026f..516315de0402 100644
--- a/core/src/main/resources/jenkins/management/Messages_sv_SE.properties
+++ b/core/src/main/resources/jenkins/management/Messages_sv_SE.properties
@@ -66,3 +66,8 @@ ShutdownLink.Description=Slutar köra nya byggen så att systemet eventuellt kan
ShutdownLink.ShuttingDownInProgressDescription=Jenkins stängs ned för tillfället. Nya byggen körs inte.
ShutdownLink.ShutDownReason_title=Anledning
ShutdownLink.ShutDownReason_update=Uppdatera anledning
+
+PluginsUpdatesLink.DisplayName=Uppdateringar
+PluginsAvailableLink.DisplayName=Tillgängliga insticksprogram
+PluginsInstalledLink.DisplayName=Installerade insticksprogram
+PluginsDownloadProgressLink.DisplayName=Nedladdningsförlopp
diff --git a/core/src/main/resources/jenkins/management/Messages_tr.properties b/core/src/main/resources/jenkins/management/Messages_tr.properties
index dfc8e093de07..dfe037c62553 100644
--- a/core/src/main/resources/jenkins/management/Messages_tr.properties
+++ b/core/src/main/resources/jenkins/management/Messages_tr.properties
@@ -52,3 +52,8 @@ CliLink.Description=Jenkins''e komut satırından veya betiklerden erişin/yöne
NodesLink.DisplayName=Sunucular ve Bulutlar
NodesLink.Description=Jenkins''in işleri çalıştırdığı sunucuları ekleyin, kaldırın, kontrol edin ve izleyin.
+
+PluginsUpdatesLink.DisplayName=Güncellemeler
+PluginsAvailableLink.DisplayName=Yüklenebilecek eklentiler
+PluginsInstalledLink.DisplayName=Yüklenmiş eklentiler
+PluginsDownloadProgressLink.DisplayName=İndirme durumu
diff --git a/core/src/main/resources/lib/layout/settings-subpage.jelly b/core/src/main/resources/lib/layout/settings-subpage.jelly
index 64e1d7f27d13..9fde7957f7fb 100644
--- a/core/src/main/resources/lib/layout/settings-subpage.jelly
+++ b/core/src/main/resources/lib/layout/settings-subpage.jelly
@@ -54,6 +54,11 @@ THE SOFTWARE.
This can be useful if you need to access 'request2' or do advanced JavaScript.
Defaults to false if not set.
+
+ This is internal only - do not use this.
+ Optional, includes the sidepanel for if the Experimental Manage Jenkins is disabled.
+ Defaults to false if not set.
+
@@ -64,7 +69,7 @@ THE SOFTWARE.
+ type="${(newManageJenkins or attrs.includeSidepanel) ? 'two-column' : 'one-column'}">
@@ -144,6 +149,10 @@ THE SOFTWARE.
+
+
+
+
diff --git a/src/main/js/components/header/index.js b/src/main/js/components/header/index.js
index cd07bb1732d1..695f5058e9a4 100644
--- a/src/main/js/components/header/index.js
+++ b/src/main/js/components/header/index.js
@@ -30,7 +30,7 @@ function init() {
Math.min(40, scrollY) + "px",
);
if (
- !document.querySelector(".jenkins-search--app-bar") &&
+ !document.querySelector("#main-panel > .jenkins-search--app-bar") &&
!document.querySelector(".app-page-body__sidebar--sticky")
) {
const prefersContrast = window.matchMedia(
@@ -49,7 +49,7 @@ function init() {
window.addEventListener("load", () => {
// We can't use :has due to HtmlUnit CSS Parser not supporting it, so
// these are workarounds for that same behaviour
- if (document.querySelector(".jenkins-app-bar--sticky")) {
+ if (document.querySelector("#main-panel > .jenkins-app-bar--sticky")) {
document
.querySelector(".jenkins-header")
.classList.add("jenkins-header--has-sticky-app-bar");
diff --git a/src/main/js/keyboard-shortcuts.js b/src/main/js/keyboard-shortcuts.js
index ef372b7f7114..a2e136ae9bdb 100644
--- a/src/main/js/keyboard-shortcuts.js
+++ b/src/main/js/keyboard-shortcuts.js
@@ -16,7 +16,7 @@ window.addEventListener("load", () => {
const pageSearchBar = document.querySelectorAll(
"#page-body .jenkins-search__input",
);
- if (pageSearchBar.length === 1) {
+ if (pageSearchBar.length > 0) {
hotkeys("/", () => {
pageSearchBar[0].focus();
diff --git a/src/main/scss/form/_search-bar.scss b/src/main/scss/form/_search-bar.scss
index d1d395fad953..426bbb9c0080 100644
--- a/src/main/scss/form/_search-bar.scss
+++ b/src/main/scss/form/_search-bar.scss
@@ -152,7 +152,7 @@
margin-block: -5px;
@media (min-width: breakpoints.$tablet-breakpoint) {
- max-width: 50vw;
+ max-width: 45vw;
}
.jenkins-keyboard-shortcut {
diff --git a/src/main/scss/pages/_build.scss b/src/main/scss/pages/_build.scss
index 2b05d6a0c417..01d89345909f 100644
--- a/src/main/scss/pages/_build.scss
+++ b/src/main/scss/pages/_build.scss
@@ -172,10 +172,40 @@ body:has(.app-settings-container) {
&__inner {
max-width: 900px;
margin: auto;
- overflow-x: clip;
padding: var(--section-padding);
display: flex;
flex-direction: column;
+
+ &:has(.jenkins-app-bar--sticky) {
+ max-width: 1200px;
+ }
+
+ // TODO - this can be moved to app-bar.scss when Manage Jenkins flag is removed
+ .jenkins-app-bar--sticky {
+ padding: var(--section-padding) 0 !important;
+ margin: -1rem 0 0.5rem !important;
+
+ &::before,
+ &::after {
+ inset: 0 !important;
+ }
+
+ &::before {
+ background: color-mix(
+ in sRGB,
+ var(--text-color-secondary) 2%,
+ var(--card-background)
+ ) !important;
+ mask-image: linear-gradient(black 60%, transparent) !important;
+ opacity: 0.75 !important;
+ }
+
+ &::after {
+ left: calc(var(--section-padding) * -1) !important;
+ right: calc(var(--section-padding) * -1) !important;
+ mask-image: linear-gradient(black 65%, transparent) !important;
+ }
+ }
}
}