From 09e27344681bc85361722c8960b2b90d60251256 Mon Sep 17 00:00:00 2001 From: Paige Calvert Date: Tue, 10 Mar 2026 19:13:21 -0600 Subject: [PATCH 1/4] WIP: Embedded Cluster v3 --- docusaurus.config.js | 36 ++++- installer/v3-placeholder.md | 1 + .../embedded-cluster-admin-console.mdx | 0 .../embedded-cluster-completion.mdx | 0 .../embedded-cluster-enable-ha.mdx | 0 .../embedded-cluster-install.mdx | 8 +- .../embedded-cluster-join-print-command.mdx | 0 .../version-2.0.0}/embedded-cluster-join.mdx | 0 .../version-2.0.0}/embedded-cluster-reset.mdx | 0 .../embedded-cluster-restore.mdx | 0 .../version-2.0.0}/embedded-cluster-shell.mdx | 0 .../embedded-cluster-support-bundle.mdx | 0 .../embedded-cluster-update.mdx | 0 .../embedded-cluster-version.mdx | 0 .../version-2.0.0}/embedded-config.mdx | 2 +- .../embedded-disaster-recovery.mdx | 0 .../version-2.0.0}/embedded-manage-nodes.mdx | 4 +- .../version-2.0.0}/embedded-overview.mdx | 4 +- .../version-2.0.0}/embedded-tls-certs.mdx | 0 .../embedded-troubleshooting.mdx | 6 +- .../version-2.0.0}/embedded-using.mdx | 6 +- .../installing-embedded-air-gap.mdx | 10 +- .../installing-embedded-automation.mdx | 6 +- .../installing-embedded-requirements.mdx | 8 +- .../version-2.0.0}/installing-embedded.mdx | 2 +- .../version-2.0.0}/updating-embedded.mdx | 10 +- .../version-2.0.0-sidebars.json | 40 ++++++ installer_versions.json | 3 + sidebarInstaller.js | 5 + sidebars.js | 89 +++++++------ .../InstallerVersionSelector/index.js | 124 ++++++++++++++++++ src/css/navbar.css | 25 +++- src/css/sidebar.css | 74 ++++++++++- src/theme/DocSidebar/Desktop/Content/index.js | 57 ++++++++ .../Desktop/Content/styles.module.css | 20 +++ src/theme/DocSidebar/Mobile/index.js | 54 ++++++++ 36 files changed, 508 insertions(+), 86 deletions(-) create mode 100644 installer/v3-placeholder.md rename {docs/reference => installer_versioned_docs/version-2.0.0}/embedded-cluster-admin-console.mdx (100%) rename {docs/reference => installer_versioned_docs/version-2.0.0}/embedded-cluster-completion.mdx (100%) rename {docs/reference => installer_versioned_docs/version-2.0.0}/embedded-cluster-enable-ha.mdx (100%) rename {docs/reference => installer_versioned_docs/version-2.0.0}/embedded-cluster-install.mdx (96%) rename {docs/reference => installer_versioned_docs/version-2.0.0}/embedded-cluster-join-print-command.mdx (100%) rename {docs/reference => installer_versioned_docs/version-2.0.0}/embedded-cluster-join.mdx (100%) rename {docs/reference => installer_versioned_docs/version-2.0.0}/embedded-cluster-reset.mdx (100%) rename {docs/reference => installer_versioned_docs/version-2.0.0}/embedded-cluster-restore.mdx (100%) rename {docs/reference => installer_versioned_docs/version-2.0.0}/embedded-cluster-shell.mdx (100%) rename {docs/reference => installer_versioned_docs/version-2.0.0}/embedded-cluster-support-bundle.mdx (100%) rename {docs/reference => installer_versioned_docs/version-2.0.0}/embedded-cluster-update.mdx (100%) rename {docs/reference => installer_versioned_docs/version-2.0.0}/embedded-cluster-version.mdx (100%) rename {docs/reference => installer_versioned_docs/version-2.0.0}/embedded-config.mdx (99%) rename {docs/vendor => installer_versioned_docs/version-2.0.0}/embedded-disaster-recovery.mdx (100%) rename {docs/enterprise => installer_versioned_docs/version-2.0.0}/embedded-manage-nodes.mdx (98%) rename {docs/vendor => installer_versioned_docs/version-2.0.0}/embedded-overview.mdx (99%) rename {docs/enterprise => installer_versioned_docs/version-2.0.0}/embedded-tls-certs.mdx (100%) rename {docs/vendor => installer_versioned_docs/version-2.0.0}/embedded-troubleshooting.mdx (96%) rename {docs/vendor => installer_versioned_docs/version-2.0.0}/embedded-using.mdx (97%) rename {docs/enterprise => installer_versioned_docs/version-2.0.0}/installing-embedded-air-gap.mdx (95%) rename {docs/enterprise => installer_versioned_docs/version-2.0.0}/installing-embedded-automation.mdx (94%) rename {docs/enterprise => installer_versioned_docs/version-2.0.0}/installing-embedded-requirements.mdx (88%) rename {docs/enterprise => installer_versioned_docs/version-2.0.0}/installing-embedded.mdx (98%) rename {docs/enterprise => installer_versioned_docs/version-2.0.0}/updating-embedded.mdx (86%) create mode 100644 installer_versioned_sidebars/version-2.0.0-sidebars.json create mode 100644 installer_versions.json create mode 100644 sidebarInstaller.js create mode 100644 src/components/InstallerVersionSelector/index.js create mode 100644 src/theme/DocSidebar/Desktop/Content/index.js create mode 100644 src/theme/DocSidebar/Desktop/Content/styles.module.css create mode 100644 src/theme/DocSidebar/Mobile/index.js diff --git a/docusaurus.config.js b/docusaurus.config.js index b20dec7729..6c48ffdd61 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -7,7 +7,7 @@ const darkTheme = themes.dracula; /** @type {import('@docusaurus/types').Config} */ const config = { - title: 'Replicated Docs', + title: 'Replicated', tagline: 'Technical documentation for Replicated vendors and their enterprise end-customers.', url: 'https://docs.replicated.com', baseUrl: '/', @@ -50,7 +50,36 @@ const config = { }), ], ], - + plugins: [ + [ + '@docusaurus/plugin-content-docs', + { + id: 'installer', + path: 'installer', + routeBasePath: 'installer', + sidebarPath: './sidebarInstaller.js', + breadcrumbs: true, + editUrl: 'https://github.com/replicatedhq/replicated-docs/edit/main/', + // Versioning configuration + lastVersion: 'current', // Make 3.0.0 the default version + includeCurrentVersion: true, // Include the "next" version from installer/ folder + versions: { + current: { + label: 'Embedded Cluster 3.0.0', + path: 'v3', + banner: 'none', + badge: false, + }, + '2.0.0': { + label: 'Embedded Cluster 2.13.3', + path: 'v2', + banner: 'unmaintained', + badge: false, + }, + }, + }, + ], + ], scripts: [ { src: @@ -136,7 +165,8 @@ const config = { }, { type: 'doc', - docId: 'vendor/embedded-overview', + docId: 'v3-placeholder', + docsPluginId: 'installer', label: 'Embedded Cluster', }, { diff --git a/installer/v3-placeholder.md b/installer/v3-placeholder.md new file mode 100644 index 0000000000..aeb4c25e02 --- /dev/null +++ b/installer/v3-placeholder.md @@ -0,0 +1 @@ +# v3 placeholder \ No newline at end of file diff --git a/docs/reference/embedded-cluster-admin-console.mdx b/installer_versioned_docs/version-2.0.0/embedded-cluster-admin-console.mdx similarity index 100% rename from docs/reference/embedded-cluster-admin-console.mdx rename to installer_versioned_docs/version-2.0.0/embedded-cluster-admin-console.mdx diff --git a/docs/reference/embedded-cluster-completion.mdx b/installer_versioned_docs/version-2.0.0/embedded-cluster-completion.mdx similarity index 100% rename from docs/reference/embedded-cluster-completion.mdx rename to installer_versioned_docs/version-2.0.0/embedded-cluster-completion.mdx diff --git a/docs/reference/embedded-cluster-enable-ha.mdx b/installer_versioned_docs/version-2.0.0/embedded-cluster-enable-ha.mdx similarity index 100% rename from docs/reference/embedded-cluster-enable-ha.mdx rename to installer_versioned_docs/version-2.0.0/embedded-cluster-enable-ha.mdx diff --git a/docs/reference/embedded-cluster-install.mdx b/installer_versioned_docs/version-2.0.0/embedded-cluster-install.mdx similarity index 96% rename from docs/reference/embedded-cluster-install.mdx rename to installer_versioned_docs/version-2.0.0/embedded-cluster-install.mdx index f68e5b75ff..9a7e481900 100644 --- a/docs/reference/embedded-cluster-install.mdx +++ b/installer_versioned_docs/version-2.0.0/embedded-cluster-install.mdx @@ -1,7 +1,7 @@ -import ProxyLimitations from "../partials/embedded-cluster/_proxy-install-limitations.mdx" -import ProxyRequirements from "../partials/embedded-cluster/_proxy-install-reqs.mdx" -import ProxyEnvVars from "../partials/embedded-cluster/_proxy-env-vars.mdx" -import DeprecatedPrivateCa from "../partials/embedded-cluster/_deprecated-private-ca.mdx" +import ProxyLimitations from "../../docs/partials/embedded-cluster/_proxy-install-limitations.mdx" +import ProxyRequirements from "../../docs/partials/embedded-cluster/_proxy-install-reqs.mdx" +import ProxyEnvVars from "../../docs/partials/embedded-cluster/_proxy-env-vars.mdx" +import DeprecatedPrivateCa from "../../docs/partials/embedded-cluster/_deprecated-private-ca.mdx" # install diff --git a/docs/reference/embedded-cluster-join-print-command.mdx b/installer_versioned_docs/version-2.0.0/embedded-cluster-join-print-command.mdx similarity index 100% rename from docs/reference/embedded-cluster-join-print-command.mdx rename to installer_versioned_docs/version-2.0.0/embedded-cluster-join-print-command.mdx diff --git a/docs/reference/embedded-cluster-join.mdx b/installer_versioned_docs/version-2.0.0/embedded-cluster-join.mdx similarity index 100% rename from docs/reference/embedded-cluster-join.mdx rename to installer_versioned_docs/version-2.0.0/embedded-cluster-join.mdx diff --git a/docs/reference/embedded-cluster-reset.mdx b/installer_versioned_docs/version-2.0.0/embedded-cluster-reset.mdx similarity index 100% rename from docs/reference/embedded-cluster-reset.mdx rename to installer_versioned_docs/version-2.0.0/embedded-cluster-reset.mdx diff --git a/docs/reference/embedded-cluster-restore.mdx b/installer_versioned_docs/version-2.0.0/embedded-cluster-restore.mdx similarity index 100% rename from docs/reference/embedded-cluster-restore.mdx rename to installer_versioned_docs/version-2.0.0/embedded-cluster-restore.mdx diff --git a/docs/reference/embedded-cluster-shell.mdx b/installer_versioned_docs/version-2.0.0/embedded-cluster-shell.mdx similarity index 100% rename from docs/reference/embedded-cluster-shell.mdx rename to installer_versioned_docs/version-2.0.0/embedded-cluster-shell.mdx diff --git a/docs/reference/embedded-cluster-support-bundle.mdx b/installer_versioned_docs/version-2.0.0/embedded-cluster-support-bundle.mdx similarity index 100% rename from docs/reference/embedded-cluster-support-bundle.mdx rename to installer_versioned_docs/version-2.0.0/embedded-cluster-support-bundle.mdx diff --git a/docs/reference/embedded-cluster-update.mdx b/installer_versioned_docs/version-2.0.0/embedded-cluster-update.mdx similarity index 100% rename from docs/reference/embedded-cluster-update.mdx rename to installer_versioned_docs/version-2.0.0/embedded-cluster-update.mdx diff --git a/docs/reference/embedded-cluster-version.mdx b/installer_versioned_docs/version-2.0.0/embedded-cluster-version.mdx similarity index 100% rename from docs/reference/embedded-cluster-version.mdx rename to installer_versioned_docs/version-2.0.0/embedded-cluster-version.mdx diff --git a/docs/reference/embedded-config.mdx b/installer_versioned_docs/version-2.0.0/embedded-config.mdx similarity index 99% rename from docs/reference/embedded-config.mdx rename to installer_versioned_docs/version-2.0.0/embedded-config.mdx index 4912f7d4e0..710ac36564 100644 --- a/docs/reference/embedded-config.mdx +++ b/installer_versioned_docs/version-2.0.0/embedded-config.mdx @@ -1,4 +1,4 @@ -import DoNotDowngrade from "../partials/embedded-cluster/_warning-do-not-downgrade.mdx" +import DoNotDowngrade from "../../docs/partials/embedded-cluster/_warning-do-not-downgrade.mdx" # Embedded Cluster Config diff --git a/docs/vendor/embedded-disaster-recovery.mdx b/installer_versioned_docs/version-2.0.0/embedded-disaster-recovery.mdx similarity index 100% rename from docs/vendor/embedded-disaster-recovery.mdx rename to installer_versioned_docs/version-2.0.0/embedded-disaster-recovery.mdx diff --git a/docs/enterprise/embedded-manage-nodes.mdx b/installer_versioned_docs/version-2.0.0/embedded-manage-nodes.mdx similarity index 98% rename from docs/enterprise/embedded-manage-nodes.mdx rename to installer_versioned_docs/version-2.0.0/embedded-manage-nodes.mdx index dd5805538f..69fb03d267 100644 --- a/docs/enterprise/embedded-manage-nodes.mdx +++ b/installer_versioned_docs/version-2.0.0/embedded-manage-nodes.mdx @@ -1,5 +1,5 @@ -import HaArchitecture from "../partials/embedded-cluster/_multi-node-ha-arch.mdx" -import ShellCommand from "../partials/embedded-cluster/_shell-command.mdx" +import HaArchitecture from "../../docs/partials/embedded-cluster/_multi-node-ha-arch.mdx" +import ShellCommand from "../../docs/partials/embedded-cluster/_shell-command.mdx" # Access and manage embedded clusters diff --git a/docs/vendor/embedded-overview.mdx b/installer_versioned_docs/version-2.0.0/embedded-overview.mdx similarity index 99% rename from docs/vendor/embedded-overview.mdx rename to installer_versioned_docs/version-2.0.0/embedded-overview.mdx index cb001d533c..8106d5b96a 100644 --- a/docs/vendor/embedded-overview.mdx +++ b/installer_versioned_docs/version-2.0.0/embedded-overview.mdx @@ -1,5 +1,5 @@ -import EmbeddedCluster from "../partials/embedded-cluster/_definition.mdx" -import HaArchitecture from "../partials/embedded-cluster/_multi-node-ha-arch.mdx" +import EmbeddedCluster from "../../docs/partials/embedded-cluster/_definition.mdx" +import HaArchitecture from "../../docs/partials/embedded-cluster/_multi-node-ha-arch.mdx" # Embedded Cluster overview diff --git a/docs/enterprise/embedded-tls-certs.mdx b/installer_versioned_docs/version-2.0.0/embedded-tls-certs.mdx similarity index 100% rename from docs/enterprise/embedded-tls-certs.mdx rename to installer_versioned_docs/version-2.0.0/embedded-tls-certs.mdx diff --git a/docs/vendor/embedded-troubleshooting.mdx b/installer_versioned_docs/version-2.0.0/embedded-troubleshooting.mdx similarity index 96% rename from docs/vendor/embedded-troubleshooting.mdx rename to installer_versioned_docs/version-2.0.0/embedded-troubleshooting.mdx index 6c1a8faa25..fda8dbb6ba 100644 --- a/docs/vendor/embedded-troubleshooting.mdx +++ b/installer_versioned_docs/version-2.0.0/embedded-troubleshooting.mdx @@ -1,6 +1,6 @@ -import SupportBundleIntro from "../partials/support-bundles/_ec-support-bundle-intro.mdx" -import EmbeddedClusterSupportBundle from "../partials/support-bundles/_generate-bundle-ec.mdx" -import ShellCommand from "../partials/embedded-cluster/_shell-command.mdx" +import SupportBundleIntro from "../../docs/partials/support-bundles/_ec-support-bundle-intro.mdx" +import EmbeddedClusterSupportBundle from "../../docs/partials/support-bundles/_generate-bundle-ec.mdx" +import ShellCommand from "../../docs/partials/embedded-cluster/_shell-command.mdx" import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; diff --git a/docs/vendor/embedded-using.mdx b/installer_versioned_docs/version-2.0.0/embedded-using.mdx similarity index 97% rename from docs/vendor/embedded-using.mdx rename to installer_versioned_docs/version-2.0.0/embedded-using.mdx index bcefc3f41b..74fa000c83 100644 --- a/docs/vendor/embedded-using.mdx +++ b/installer_versioned_docs/version-2.0.0/embedded-using.mdx @@ -1,6 +1,6 @@ -import UpdateOverview from "../partials/embedded-cluster/_update-overview.mdx" -import EcConfig from "../partials/embedded-cluster/_ec-config.mdx" -import ShellCommand from "../partials/embedded-cluster/_shell-command.mdx" +import UpdateOverview from "../../docs/partials/embedded-cluster/_update-overview.mdx" +import EcConfig from "../../docs/partials/embedded-cluster/_ec-config.mdx" +import ShellCommand from "../../docs/partials/embedded-cluster/_shell-command.mdx" # Configure Embedded Cluster diff --git a/docs/enterprise/installing-embedded-air-gap.mdx b/installer_versioned_docs/version-2.0.0/installing-embedded-air-gap.mdx similarity index 95% rename from docs/enterprise/installing-embedded-air-gap.mdx rename to installer_versioned_docs/version-2.0.0/installing-embedded-air-gap.mdx index d6f8ff581a..4b0c4f172b 100644 --- a/docs/enterprise/installing-embedded-air-gap.mdx +++ b/installer_versioned_docs/version-2.0.0/installing-embedded-air-gap.mdx @@ -1,8 +1,8 @@ -import UpdateAirGapAdm from "../partials/embedded-cluster/_update-air-gap-admin-console.mdx" -import UpdateAirGapCli from "../partials/embedded-cluster/_update-air-gap-cli.mdx" -import UpdateAirGapOverview from "../partials/embedded-cluster/_update-air-gap-overview.mdx" -import DoNotDowngrade from "../partials/embedded-cluster/_warning-do-not-downgrade.mdx" -import Prerequisites from "../partials/install/_ec-prereqs.mdx" +import UpdateAirGapAdm from "../../docs/partials/embedded-cluster/_update-air-gap-admin-console.mdx" +import UpdateAirGapCli from "../../docs/partials/embedded-cluster/_update-air-gap-cli.mdx" +import UpdateAirGapOverview from "../../docs/partials/embedded-cluster/_update-air-gap-overview.mdx" +import DoNotDowngrade from "../../docs/partials/embedded-cluster/_warning-do-not-downgrade.mdx" +import Prerequisites from "../../docs/partials/install/_ec-prereqs.mdx" # Air gap installation with Embedded Cluster diff --git a/docs/enterprise/installing-embedded-automation.mdx b/installer_versioned_docs/version-2.0.0/installing-embedded-automation.mdx similarity index 94% rename from docs/enterprise/installing-embedded-automation.mdx rename to installer_versioned_docs/version-2.0.0/installing-embedded-automation.mdx index 422b1d37f7..7aff906b8c 100644 --- a/docs/enterprise/installing-embedded-automation.mdx +++ b/installer_versioned_docs/version-2.0.0/installing-embedded-automation.mdx @@ -1,6 +1,6 @@ -import ConfigValuesExample from "../partials/configValues/_configValuesExample.mdx" -import ConfigValuesProcedure from "../partials/configValues/_config-values-procedure.mdx" -import ConfigValuesRequirements from "../partials/configValues/_requirements.mdx" +import ConfigValuesExample from "../../docs/partials/configValues/_configValuesExample.mdx" +import ConfigValuesProcedure from "../../docs/partials/configValues/_config-values-procedure.mdx" +import ConfigValuesRequirements from "../../docs/partials/configValues/_requirements.mdx" # Automate installation with Embedded Cluster diff --git a/docs/enterprise/installing-embedded-requirements.mdx b/installer_versioned_docs/version-2.0.0/installing-embedded-requirements.mdx similarity index 88% rename from docs/enterprise/installing-embedded-requirements.mdx rename to installer_versioned_docs/version-2.0.0/installing-embedded-requirements.mdx index 3d7508ba9b..6db6c11aec 100644 --- a/docs/enterprise/installing-embedded-requirements.mdx +++ b/installer_versioned_docs/version-2.0.0/installing-embedded-requirements.mdx @@ -1,7 +1,7 @@ -import EmbeddedClusterRequirements from "../partials/embedded-cluster/_requirements.mdx" -import EmbeddedClusterPortRequirements from "../partials/embedded-cluster/_port-reqs.mdx" -import FirewallOpeningsIntro from "../partials/install/_firewall-openings-intro.mdx" -import FirewallOpeningsEc from "../partials/install/_firewall-openings-embedded-cluster.mdx" +import EmbeddedClusterRequirements from "../../docs/partials/embedded-cluster/_requirements.mdx" +import EmbeddedClusterPortRequirements from "../../docs/partials/embedded-cluster/_port-reqs.mdx" +import FirewallOpeningsIntro from "../../docs/partials/install/_firewall-openings-intro.mdx" +import FirewallOpeningsEc from "../../docs/partials/install/_firewall-openings-embedded-cluster.mdx" # Embedded Cluster installation requirements diff --git a/docs/enterprise/installing-embedded.mdx b/installer_versioned_docs/version-2.0.0/installing-embedded.mdx similarity index 98% rename from docs/enterprise/installing-embedded.mdx rename to installer_versioned_docs/version-2.0.0/installing-embedded.mdx index dafb7f5da4..10f19171de 100644 --- a/docs/enterprise/installing-embedded.mdx +++ b/installer_versioned_docs/version-2.0.0/installing-embedded.mdx @@ -1,4 +1,4 @@ -import Prerequisites from "../partials/install/_ec-prereqs.mdx" +import Prerequisites from "../../docs/partials/install/_ec-prereqs.mdx" # Online installation with Embedded Cluster diff --git a/docs/enterprise/updating-embedded.mdx b/installer_versioned_docs/version-2.0.0/updating-embedded.mdx similarity index 86% rename from docs/enterprise/updating-embedded.mdx rename to installer_versioned_docs/version-2.0.0/updating-embedded.mdx index a63f2d7985..e27caa4a11 100644 --- a/docs/enterprise/updating-embedded.mdx +++ b/installer_versioned_docs/version-2.0.0/updating-embedded.mdx @@ -1,8 +1,8 @@ -import UpdateAirGapAdm from "../partials/embedded-cluster/_update-air-gap-admin-console.mdx" -import UpdateAirGapCli from "../partials/embedded-cluster/_update-air-gap-cli.mdx" -import UpdateAirGapOverview from "../partials/embedded-cluster/_update-air-gap-overview.mdx" -import DoNotDowngrade from "../partials/embedded-cluster/_warning-do-not-downgrade.mdx" -import Overview from "../partials/embedded-cluster/_update-overview.mdx" +import UpdateAirGapAdm from "../../docs/partials/embedded-cluster/_update-air-gap-admin-console.mdx" +import UpdateAirGapCli from "../../docs/partials/embedded-cluster/_update-air-gap-cli.mdx" +import UpdateAirGapOverview from "../../docs/partials/embedded-cluster/_update-air-gap-overview.mdx" +import DoNotDowngrade from "../../docs/partials/embedded-cluster/_warning-do-not-downgrade.mdx" +import Overview from "../../docs/partials/embedded-cluster/_update-overview.mdx" # Perform updates in embedded clusters diff --git a/installer_versioned_sidebars/version-2.0.0-sidebars.json b/installer_versioned_sidebars/version-2.0.0-sidebars.json new file mode 100644 index 0000000000..02c2eea51c --- /dev/null +++ b/installer_versioned_sidebars/version-2.0.0-sidebars.json @@ -0,0 +1,40 @@ +{ + "installerSidebar": [ + "embedded-overview", + "embedded-using", + "embedded-config", + { + "type": "category", + "label": "Install with Embedded Cluster", + "items": [ + "installing-embedded-requirements", + "installing-embedded", + "installing-embedded-air-gap", + "installing-embedded-automation" + ] + }, + "embedded-manage-nodes", + "updating-embedded", + "embedded-troubleshooting", + "embedded-tls-certs", + "embedded-disaster-recovery", + { + "type": "category", + "label": "Embedded Cluster Commands", + "items": [ + "embedded-cluster-admin-console", + "embedded-cluster-completion", + "embedded-cluster-enable-ha", + "embedded-cluster-install", + "embedded-cluster-join", + "embedded-cluster-join-print-command", + "embedded-cluster-reset", + "embedded-cluster-restore", + "embedded-cluster-shell", + "embedded-cluster-support-bundle", + "embedded-cluster-update", + "embedded-cluster-version" + ] + } + ] +} diff --git a/installer_versions.json b/installer_versions.json new file mode 100644 index 0000000000..ca7ffcdaa9 --- /dev/null +++ b/installer_versions.json @@ -0,0 +1,3 @@ +[ + "2.0.0" +] \ No newline at end of file diff --git a/sidebarInstaller.js b/sidebarInstaller.js new file mode 100644 index 0000000000..5a3a296127 --- /dev/null +++ b/sidebarInstaller.js @@ -0,0 +1,5 @@ +module.exports = { + installerSidebar: [ + "v3-placeholder", + ], +}; diff --git a/sidebars.js b/sidebars.js index d3e43d3425..e3a1c37c1f 100644 --- a/sidebars.js +++ b/sidebars.js @@ -245,47 +245,52 @@ const sidebars = { }, ], }, - { - type: "category", - label: "Embedded Cluster", - items: [ - "vendor/embedded-overview", - "vendor/embedded-using", - { - type: "category", - label: "Install with Embedded Cluster", - items: [ - "enterprise/installing-embedded-requirements", - "enterprise/installing-embedded", - "enterprise/installing-embedded-air-gap", - "enterprise/installing-embedded-automation", - ], - }, - "enterprise/embedded-manage-nodes", - "enterprise/updating-embedded", - "vendor/embedded-troubleshooting", - "enterprise/embedded-tls-certs", - "vendor/embedded-disaster-recovery", - { - type: "category", - label: "Embedded Cluster commands", - items: [ - "reference/embedded-cluster-admin-console", - "reference/embedded-cluster-completion", - "reference/embedded-cluster-enable-ha", - "reference/embedded-cluster-install", - "reference/embedded-cluster-join", - "reference/embedded-cluster-join-print-command", - "reference/embedded-cluster-reset", - "reference/embedded-cluster-restore", - "reference/embedded-cluster-shell", - "reference/embedded-cluster-support-bundle", - "reference/embedded-cluster-update", - "reference/embedded-cluster-version", - ], - }, - ], - }, + { + type: "link", + href: "/installer/v3/v3-placeholder", + label: "Embedded Cluster", + }, + // { + // type: "category", + // label: "Embedded Cluster", + // items: [ + // "vendor/embedded-overview", + // "vendor/embedded-using", + // { + // type: "category", + // label: "Install with Embedded Cluster", + // items: [ + // "enterprise/installing-embedded-requirements", + // "enterprise/installing-embedded", + // "enterprise/installing-embedded-air-gap", + // "enterprise/installing-embedded-automation", + // ], + // }, + // "enterprise/embedded-manage-nodes", + // "enterprise/updating-embedded", + // "vendor/embedded-troubleshooting", + // "enterprise/embedded-tls-certs", + // "vendor/embedded-disaster-recovery", + // { + // type: "category", + // label: "Embedded Cluster commands", + // items: [ + // "reference/embedded-cluster-admin-console", + // "reference/embedded-cluster-completion", + // "reference/embedded-cluster-enable-ha", + // "reference/embedded-cluster-install", + // "reference/embedded-cluster-join", + // "reference/embedded-cluster-join-print-command", + // "reference/embedded-cluster-reset", + // "reference/embedded-cluster-restore", + // "reference/embedded-cluster-shell", + // "reference/embedded-cluster-support-bundle", + // "reference/embedded-cluster-update", + // "reference/embedded-cluster-version", + // ], + // }, + // ], + // }, { type: "category", label: "KOTS", @@ -610,7 +615,7 @@ const sidebars = { "reference/custom-resource-application", "reference/custom-resource-config", "reference/custom-resource-configvalues", - "reference/embedded-config", + // "reference/embedded-config", "reference/custom-resource-helmchart-v2", "reference/custom-resource-helmchart", "reference/custom-resource-lintconfig", diff --git a/src/components/InstallerVersionSelector/index.js b/src/components/InstallerVersionSelector/index.js new file mode 100644 index 0000000000..7c5fac1fd4 --- /dev/null +++ b/src/components/InstallerVersionSelector/index.js @@ -0,0 +1,124 @@ +/** + * Version selector for the installer docs, displayed at the top of the + * installer sidebar. Uses Docusaurus dropdown styles to match navbar dropdowns. + */ +import React, { useState, useRef, useEffect } from 'react'; +import Link from '@docusaurus/Link'; +import { + useVersions, + useActiveDocContext, + useDocsVersionCandidates, + useDocsPreferredVersion, +} from '@docusaurus/plugin-content-docs/client'; +import { useHistorySelector } from '@docusaurus/theme-common'; +import clsx from 'clsx'; + +const DOCS_PLUGIN_ID = 'installer'; + +function getVersionMainDoc(version) { + return version.docs.find((doc) => doc.id === version.mainDocId); +} + +function getVersionTargetDoc(version, activeDocContext) { + return ( + activeDocContext.alternateDocVersions?.[version.name] ?? + getVersionMainDoc(version) + ); +} + +export default function InstallerVersionSelector() { + const dropdownRef = useRef(null); + const [showDropdown, setShowDropdown] = useState(false); + const search = useHistorySelector((h) => h.location.search); + const hash = useHistorySelector((h) => h.location.hash); + const versions = useVersions(DOCS_PLUGIN_ID); + const activeDocContext = useActiveDocContext(DOCS_PLUGIN_ID); + const { savePreferredVersionName } = useDocsPreferredVersion(DOCS_PLUGIN_ID); + const candidates = useDocsVersionCandidates(DOCS_PLUGIN_ID); + + useEffect(() => { + const handleClickOutside = (event) => { + if (!dropdownRef.current?.contains(event.target)) { + setShowDropdown(false); + } + }; + document.addEventListener('mousedown', handleClickOutside); + document.addEventListener('touchstart', handleClickOutside); + document.addEventListener('focusin', handleClickOutside); + return () => { + document.removeEventListener('mousedown', handleClickOutside); + document.removeEventListener('touchstart', handleClickOutside); + document.removeEventListener('focusin', handleClickOutside); + }; + }, []); + + if (!versions?.length || versions.length <= 1) { + return null; + } + + const versionItems = versions.map((v) => ({ version: v, label: v.label })); + const displayedCandidate = candidates?.[0]; + const currentItem = versionItems.find( + (vi) => vi.version === displayedCandidate + ) ?? versionItems[0]; + + return ( +
+ + +
+ ); +} \ No newline at end of file diff --git a/src/css/navbar.css b/src/css/navbar.css index ea4be68ca3..d9e6e4df27 100644 --- a/src/css/navbar.css +++ b/src/css/navbar.css @@ -2,19 +2,30 @@ display: none; } +.navbar__title { + display: none; +} + .DocSearch-Footer { justify-content: center !important; } -.dropdown__link:hover, .navbar__link { - background-color: transparent; - color: var(--ifm-dropdown-link-color); - text-decoration: none; +.dropdown__link, +.navbar__link { + background-color: transparent; + text-decoration: none; +} + +.navbar__link:hover, +.dropdown__link:hover { + color: var(--replicated-red); + background-color: transparent; } -.dropdown__link--active, .navbar__link--active { - background-color: transparent; - color: #2f2f2f; +.dropdown__link--active, +.navbar__link--active { + background-color: transparent; + color: #2f2f2f; } .dropdown > .navbar__link:after { diff --git a/src/css/sidebar.css b/src/css/sidebar.css index 7d20320301..51609266d3 100644 --- a/src/css/sidebar.css +++ b/src/css/sidebar.css @@ -15,4 +15,76 @@ .menu__list-item-collapsible > a:hover, .menu__link--active { color: var(--slate-noir); - } \ No newline at end of file + } + +/* Version selector styles for installer sidebar */ +.installer-version-selector { + padding: 0.75rem 0.5rem 0 0.5rem; + margin-bottom: 1rem; + display: block; + width: 100%; +} + +.installer-version-selector .dropdown__menu { + top: 100%; + margin-top: 0.25rem; + min-width: 100%; + left: 0; + right: 0; +} + +.installer-version-selector__trigger { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + padding: 0.45rem 0.5rem; + font-size: .9rem; + font-weight: var(--ifm-dropdown-font-weight); + color: var(--ifm-dropdown-link-color); + background-color: var(--ifm-dropdown-background-color); + border: 1px solid var(--ifm-color-emphasis-300); + border-radius: var(--ifm-global-radius); + cursor: pointer; + transition: background-color 0.2s ease, border-color 0.2s ease; + outline: none; +} + +.installer-version-selector__trigger:hover { + background-color: var(--ifm-dropdown-hover-background-color); +} + +.installer-version-selector__trigger:focus { + border-color: var(--ifm-color-emphasis-500); +} + +.installer-version-selector .dropdown__link { + font-size: .9rem; + padding: 0.35rem 0.5rem; +} + +.installer-version-selector .dropdown__link:hover { + color: var(--ifm-dropdown-link-color); + background-color: var(--ifm-dropdown-hover-background-color); +} + +.installer-version-selector .dropdown__link--active, +.installer-version-selector .dropdown__link--active:hover { + color: var(--ifm-font-color-base); +} + +.installer-version-selector__trigger-label { + flex: 1; + text-align: left; +} + +.installer-version-selector__trigger-icon { + width: 1rem; + height: 1rem; + margin-left: 0.25rem; + flex-shrink: 0; +} + +.installer-version-selector.dropdown--show .installer-version-selector__trigger-icon { + transform: rotate(180deg); +} \ No newline at end of file diff --git a/src/theme/DocSidebar/Desktop/Content/index.js b/src/theme/DocSidebar/Desktop/Content/index.js new file mode 100644 index 0000000000..8f2e70e9bb --- /dev/null +++ b/src/theme/DocSidebar/Desktop/Content/index.js @@ -0,0 +1,57 @@ +/** + * Custom DocSidebar Desktop Content: shows the installer version selector + * at the top of the sidebar when the user is on an installer docs page. + */ +import React, { useState } from 'react'; +import clsx from 'clsx'; +import { ThemeClassNames } from '@docusaurus/theme-common'; +import { + useAnnouncementBar, + useScrollPosition, +} from '@docusaurus/theme-common/internal'; +import { translate } from '@docusaurus/Translate'; +import DocSidebarItems from '@theme/DocSidebarItems'; +import InstallerVersionSelector from '@site/src/components/InstallerVersionSelector'; +import styles from './styles.module.css'; + +function useShowAnnouncementBar() { + const { isActive } = useAnnouncementBar(); + const [showAnnouncementBar, setShowAnnouncementBar] = useState(isActive); + useScrollPosition( + ({ scrollY }) => { + if (isActive) { + setShowAnnouncementBar(scrollY === 0); + } + }, + [isActive] + ); + return isActive && showAnnouncementBar; +} + +export default function DocSidebarDesktopContent({ path, sidebar, className }) { + const showAnnouncementBar = useShowAnnouncementBar(); + const isInstallerDocs = path?.startsWith('/installer'); + + return ( + <> + {isInstallerDocs && } + + + ); +} \ No newline at end of file diff --git a/src/theme/DocSidebar/Desktop/Content/styles.module.css b/src/theme/DocSidebar/Desktop/Content/styles.module.css new file mode 100644 index 0000000000..7f6b2fc2fa --- /dev/null +++ b/src/theme/DocSidebar/Desktop/Content/styles.module.css @@ -0,0 +1,20 @@ +/** + * DocSidebar Desktop Content styles + */ + + @media (min-width: 997px) { + .menu { + flex-grow: 1; + padding: 0.5rem; + } + @supports (scrollbar-gutter: stable) { + .menu { + padding: 0.5rem 0 0.5rem 0.5rem; + scrollbar-gutter: stable; + } + } + + .menuWithAnnouncementBar { + margin-bottom: var(--docusaurus-announcement-bar-height); + } + } \ No newline at end of file diff --git a/src/theme/DocSidebar/Mobile/index.js b/src/theme/DocSidebar/Mobile/index.js new file mode 100644 index 0000000000..c210d275d1 --- /dev/null +++ b/src/theme/DocSidebar/Mobile/index.js @@ -0,0 +1,54 @@ +/** + * Custom DocSidebar Mobile: shows the installer version selector + * at the top when the user is on an installer docs page. + */ +import React from 'react'; +import clsx from 'clsx'; +import { + NavbarSecondaryMenuFiller, + ThemeClassNames, +} from '@docusaurus/theme-common'; +import { useNavbarMobileSidebar } from '@docusaurus/theme-common/internal'; +import DocSidebarItems from '@theme/DocSidebarItems'; +import InstallerVersionSelector from '@site/src/components/InstallerVersionSelector'; + +const DocSidebarMobileSecondaryMenu = ({ sidebar, path }) => { + const mobileSidebar = useNavbarMobileSidebar(); + const isInstallerDocs = path?.startsWith('/installer'); + + return ( + <> + {isInstallerDocs && ( +
+ +
+ )} + + + ); +}; + +function DocSidebarMobile(props) { + return ( + + ); +} + +export default React.memo(DocSidebarMobile); \ No newline at end of file From 5e06ae95d212ed0f614adeb612c544eb3abe851a Mon Sep 17 00:00:00 2001 From: Paige Calvert Date: Wed, 11 Mar 2026 11:51:37 -0600 Subject: [PATCH 2/4] add product-specific sidebars --- docusaurus.config.js | 14 +- sidebarCompatibilityMatrix.js | 20 ++ sidebarEnterprisePortal.js | 10 + sidebarHelm.js | 10 + sidebarKots.js | 169 +++++++++ sidebarKurl.js | 39 +++ sidebarProxyRegistry.js | 19 + sidebarReplicatedSdk.js | 10 + sidebarSecurityCenter.js | 5 + sidebarTroubleshoot.js | 46 +++ sidebarVendorPortal.js | 110 ++++++ sidebars.js | 631 +++++++--------------------------- 12 files changed, 568 insertions(+), 515 deletions(-) create mode 100644 sidebarCompatibilityMatrix.js create mode 100644 sidebarEnterprisePortal.js create mode 100644 sidebarHelm.js create mode 100644 sidebarKots.js create mode 100644 sidebarKurl.js create mode 100644 sidebarProxyRegistry.js create mode 100644 sidebarReplicatedSdk.js create mode 100644 sidebarSecurityCenter.js create mode 100644 sidebarTroubleshoot.js create mode 100644 sidebarVendorPortal.js diff --git a/docusaurus.config.js b/docusaurus.config.js index 6c48ffdd61..3bf760fddc 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -29,7 +29,7 @@ const config = { docs: { routeBasePath: '/', // Serve the docs at the site's root sidebarPath: require.resolve('./sidebars.js'), - breadcrumbs: false, + breadcrumbs: true, editUrl: 'https://github.com/replicatedhq/replicated-docs/edit/main/', admonitions: { keywords: ['note','important', 'tip', 'info', 'caution', 'danger'], @@ -203,9 +203,19 @@ const config = { }, { type: 'dropdown', - label: 'Developer tools', + label: 'Reference', position: 'left', items: [ + { + type: 'doc', + docId: 'reference/custom-resource-about', + label: 'Custom resources', + }, + { + type: 'doc', + docId: 'reference/template-functions-about', + label: 'Template functions', + }, { type: 'doc', docId: 'reference/kots-cli-getting-started', diff --git a/sidebarCompatibilityMatrix.js b/sidebarCompatibilityMatrix.js new file mode 100644 index 0000000000..41ba20e927 --- /dev/null +++ b/sidebarCompatibilityMatrix.js @@ -0,0 +1,20 @@ +module.exports = { + compatibilityMatrixSidebar: [ + "vendor/testing-about", + "vendor/testing-supported-clusters", + "vendor/testing-how-to", + "vendor/testing-vm-create", + "vendor/testing-ingress", + "vendor/testing-network-policy", + "vendor/testing-cluster-addons", + "vendor/testing-ci-cd", + { + type: "category", + label: "Manage cost and usage", + items: [ + "vendor/testing-pricing", + "vendor/compatibility-matrix-usage", + ], + }, + ], +}; \ No newline at end of file diff --git a/sidebarEnterprisePortal.js b/sidebarEnterprisePortal.js new file mode 100644 index 0000000000..da62b85648 --- /dev/null +++ b/sidebarEnterprisePortal.js @@ -0,0 +1,10 @@ +module.exports = { + enterprisePortalSidebar: [ + "vendor/enterprise-portal-about", + "vendor/enterprise-portal-configure", + "vendor/enterprise-portal-invite", + "vendor/enterprise-portal-self-serve-signup", + "vendor/enterprise-portal-access", + "vendor/enterprise-portal-use", + ], +}; \ No newline at end of file diff --git a/sidebarHelm.js b/sidebarHelm.js new file mode 100644 index 0000000000..6163a74502 --- /dev/null +++ b/sidebarHelm.js @@ -0,0 +1,10 @@ +module.exports = { + helmSidebar: [ + "vendor/helm-install-overview", + "vendor/helm-install-values-schema", + "vendor/install-with-helm", + "vendor/helm-install-airgap", + "vendor/using-third-party-registry-proxy", + "vendor/helm-install-troubleshooting", + ], + }; \ No newline at end of file diff --git a/sidebarKots.js b/sidebarKots.js new file mode 100644 index 0000000000..ef1b29250c --- /dev/null +++ b/sidebarKots.js @@ -0,0 +1,169 @@ +module.exports = { + kotsSidebar: [ + "intro-kots", + { + type: "category", + label: "Configure KOTS", + items: [ + { + type: "category", + label: "Configure the HelmChart Custom Resource", + items: [ + "vendor/helm-native-about", + "vendor/helm-native-v2-using", + "vendor/helm-packaging-airgap-bundles", + "vendor/helm-optional-value-keys", + "vendor/helm-v2-migrate", + ], + }, + { + type: "category", + label: "Customize the Admin Console and Download Portal", + items: [ + "vendor/admin-console-customize-app-icon", + "vendor/admin-console-adding-buttons-links", + "vendor/admin-console-port-forward", + "vendor/admin-console-prometheus-monitoring", + ], + }, + { + type: "category", + label: "Configure the Admin Console Config Screen", + items: [ + "vendor/config-screen-about", + "vendor/admin-console-customize-config-screen", + "vendor/config-screen-map-inputs", + "vendor/config-screen-conditional", + ], + }, + { + type: "category", + label: "Manage Resources and Objects", + items: [ + "vendor/admin-console-display-app-status", + { + type: "category", + label: "Conditionally Deploy Resources", + items: [ + "vendor/packaging-include-resources", + "vendor/tutorial-adding-db-config", + ], + }, + "vendor/resources-annotations-templating", + "vendor/orchestrating-resource-deployment", + "vendor/database-config-adding-options", + "vendor/packaging-cleaning-up-jobs", + "vendor/packaging-ingress", + ], + }, + { + type: "category", + label: "Manage KOTS", + items: [ + "vendor/packaging-kots-versions", + "vendor/packaging-rbac", + "vendor/packaging-air-gap-excluding-minio", + ], + }, + { + type: "category", + label: "Distribute Kubernetes Operators with KOTS", + items: [ + "vendor/operator-packaging-about", + "vendor/operator-defining-additional-images", + "vendor/operator-referencing-images", + "vendor/operator-defining-additional-namespaces", + ], + }, + ], + }, + { + type: "category", + label: "Install in Existing Clusters with KOTS", + items: [ + "enterprise/installing-overview", + "enterprise/installing-general-requirements", + "enterprise/installing-existing-cluster", + "enterprise/installing-existing-cluster-airgapped", + "enterprise/installing-existing-cluster-automation", + "enterprise/installing-stateful-component-requirements", + ], + }, + { + type: "category", + label: "Perform Updates in Existing Cluster KOTS Installations", + items: [ + "enterprise/updating-app-manager", + "enterprise/updating-apps", + "enterprise/updating-patching-with-kustomize", + ], + }, + { + type: "category", + label: "Configure Local Image Registries", + items: [ + "enterprise/image-registry-settings", + "enterprise/image-registry-rate-limits", + ], + }, + "enterprise/updating-licenses", + { + type: "category", + label: "Perform Backup and Restore with Snapshots", + items: [ + "vendor/snapshots-overview", + { + type: "category", + label: "Enable and Configure Snapshots", + items: [ + "vendor/snapshots-configuring-backups", + "reference/custom-resource-backup", + "vendor/snapshots-hooks", + ], + }, + { + type: "category", + label: "Configure Backup Storage for Snaphots", + items: [ + "enterprise/snapshots-velero-cli-installing", + "enterprise/snapshots-configuring-hostpath", + "enterprise/snapshots-configuring-nfs", + "enterprise/snapshots-storage-destinations", + "enterprise/snapshots-velero-installing-config", + ], + }, + "enterprise/snapshots-creating", + "enterprise/snapshots-restoring-full", + "enterprise/snapshots-updating-with-admin-console", + "enterprise/snapshots-troubleshooting-backup-restore", + ], + }, + { + type: "category", + label: "Manage Admin Console User Access", + items: [ + "enterprise/auth-changing-passwords", + "enterprise/auth-identity-provider", + "enterprise/auth-configuring-rbac", + ], + }, + { + type: "category", + label: "Monitor Applications with Prometheus", + items: [ + "enterprise/monitoring-applications", + "enterprise/monitoring-access-dashboards", + ], + }, + "enterprise/status-viewing-details", + "enterprise/delete-admin-console", + { + type: "category", + label: "Use a GitOps Workflow", + items: [ + "enterprise/gitops-workflow", + "enterprise/gitops-managing-secrets", + ], + }, + ], + }; \ No newline at end of file diff --git a/sidebarKurl.js b/sidebarKurl.js new file mode 100644 index 0000000000..aeae834671 --- /dev/null +++ b/sidebarKurl.js @@ -0,0 +1,39 @@ +module.exports = { + kurlSidebar: [ + "vendor/kurl-about", + { + type: "category", + label: "Configure kURL Installers", + items: [ + "vendor/packaging-embedded-kubernetes", + "vendor/packaging-installer-storage", + "vendor/installer-history", + "vendor/kurl-nodeport-services", + ], + }, + { + type: "category", + label: "Install with kURL", + items: [ + "enterprise/installing-kurl-requirements", + "enterprise/installing-kurl", + "enterprise/installing-kurl-airgap", + "enterprise/installing-kurl-automation", + ], + }, + "enterprise/cluster-management-add-nodes", + { + type: "category", + label: "Perform Updates with kURL", + items: [ + "enterprise/updating-kurl-about", + "enterprise/updating-kurl", + ], + }, + "vendor/packaging-using-tls-certs", + "enterprise/updating-tls-cert", + "enterprise/image-registry-kurl", + "enterprise/monitoring-external-prometheus", + "vendor/kurl-reset", + ], + }; \ No newline at end of file diff --git a/sidebarProxyRegistry.js b/sidebarProxyRegistry.js new file mode 100644 index 0000000000..bbb6187b94 --- /dev/null +++ b/sidebarProxyRegistry.js @@ -0,0 +1,19 @@ +module.exports = { + proxyRegistrySidebar: [ + "vendor/private-images-about", + "vendor/packaging-private-images", + "vendor/helm-image-registry", + "vendor/private-images-kots", + "vendor/private-images-tags-digests", + "vendor/packaging-public-images", + { + type: "category", + label: "Replicated Private Registry", + items: [ + "vendor/private-images-replicated", + "vendor/packaging-private-registry-security", + ], + }, + "vendor/tutorial-ecr-private-images", + ], + }; \ No newline at end of file diff --git a/sidebarReplicatedSdk.js b/sidebarReplicatedSdk.js new file mode 100644 index 0000000000..61096504f5 --- /dev/null +++ b/sidebarReplicatedSdk.js @@ -0,0 +1,10 @@ +module.exports = { + replicatedSdkSidebar: [ + "vendor/replicated-sdk-overview", + "vendor/replicated-sdk-installing", + "vendor/replicated-sdk-airgap", + "vendor/replicated-sdk-development", + "vendor/replicated-sdk-customizing", + "reference/replicated-sdk-apis", + ], + }; \ No newline at end of file diff --git a/sidebarSecurityCenter.js b/sidebarSecurityCenter.js new file mode 100644 index 0000000000..65f317313b --- /dev/null +++ b/sidebarSecurityCenter.js @@ -0,0 +1,5 @@ +module.exports = { + securityCenterSidebar: [ + "vendor/security-center-about", + ], + }; \ No newline at end of file diff --git a/sidebarTroubleshoot.js b/sidebarTroubleshoot.js new file mode 100644 index 0000000000..5f3f82ab1a --- /dev/null +++ b/sidebarTroubleshoot.js @@ -0,0 +1,46 @@ +module.exports = { + troubleshootSidebar: [ + "vendor/preflight-support-bundle-about", + { + type: "category", + label: "Preflight checks", + items: [ + "vendor/preflight-defining", + "vendor/preflight-examples", + "vendor/preflight-running", + "vendor/preflight-host-preflights", + ], + }, + { + type: "category", + label: "Support bundles", + items: [ + "vendor/support-bundle-customizing", + "vendor/support-bundle-examples", + "vendor/support-online-support-bundle-specs", + "vendor/support-modular-support-bundle-specs", + { + type: "category", + label: "Generate support bundles", + items: [ + "vendor/support-bundle-generating", + "vendor/support-bundle-embedded", + "enterprise/troubleshooting-an-app", + "vendor/support-host-support-bundles", + ], + }, + "vendor/support-inspecting-support-bundles", + "vendor/support-enabling-direct-bundle-uploads", + ], + }, + "vendor/preflight-sb-helm-templates-about", + { + type: "category", + label: "Troubleshoot custom resources", + items: [ + "reference/custom-resource-preflight", + "reference/custom-resource-redactor", + ], + }, + ], + }; \ No newline at end of file diff --git a/sidebarVendorPortal.js b/sidebarVendorPortal.js new file mode 100644 index 0000000000..dbaf79fb92 --- /dev/null +++ b/sidebarVendorPortal.js @@ -0,0 +1,110 @@ +module.exports = { + vendorPortalSidebar: [ + { + type: "category", + label: "Vendor Portal Teams and Accounts", + items: [ + "vendor/vendor-portal-creating-account", + "vendor/team-management", + "vendor/team-management-github-username", + { + type: "category", + label: "Configure Role-based Access Control", + items: [ + "vendor/team-management-rbac-configuring", + "vendor/team-management-rbac-resource-names", + ], + }, + { + type: "category", + label: "Configure Authentication", + items: [ + "vendor/team-management-two-factor-auth", + "vendor/team-management-google-auth", + "vendor/team-management-saml-auth", + "vendor/team-management-scim-provisioning", + ], + }, + "vendor/team-management-slack-config", + "vendor/replicated-api-tokens", + ], + }, + { + type: "category", + label: "Applications", + items: [ + "vendor/vendor-portal-manage-app", + "vendor/vendor-portal-application-settings", + ], + }, + { + type: "category", + label: "Channels and releases", + items: [ + "vendor/releases-about", + "vendor/releases-creating-channels", + "vendor/releases-creating-releases", + "vendor/releases-creating-cli", + "vendor/helm-install-release", + "vendor/releases-sharing-license-install-script", + "reference/linter", + ], + }, + { + type: "category", + label: "Customers and licenses", + items: [ + "vendor/licenses-about", + "vendor/releases-creating-customer", + "vendor/licenses-adding-custom-fields", + "vendor/licenses-install-types", + "vendor/releases-share-download-portal", + "vendor/licenses-about-types", + "vendor/licenses-download", + { + type: "category", + label: "Query license entitlements", + items: [ + "vendor/licenses-using-builtin-fields", + "vendor/licenses-reference-sdk", + "vendor/licenses-reference-helm", + "vendor/licenses-referencing-fields", + "vendor/licenses-reference-kots-runtime", + "vendor/licenses-verify-fields-sdk-api", + ], + }, + ], + }, + { + type: "category", + label: "Custom domains", + items: ["vendor/custom-domains", "vendor/custom-domains-using"], + }, + { + type: "category", + label: "Insights and telemetry", + items: [ + "vendor/instance-insights-event-data", + "vendor/insights-app-status", + "vendor/custom-metrics", + "vendor/telemetry-air-gap", + "vendor/customer-adoption", + "vendor/customer-reporting", + "vendor/instance-insights-details", + { + type: "category", + label: "Event Notifications (Beta)", + items: [ + "vendor/event-notifications", + "vendor/event-notifications-create", + "vendor/event-notifications-manage", + "vendor/event-notifications-webhooks", + ], + }, + "vendor/instance-notifications-config", + "vendor/instance-data-export", + ], + }, + "vendor/support-submit-request", + ], +}; diff --git a/sidebars.js b/sidebars.js index e3a1c37c1f..1117406e1b 100644 --- a/sidebars.js +++ b/sidebars.js @@ -11,6 +11,18 @@ // @ts-check +// Import modular sidebars +const vendorPlatformSidebar = require('./sidebarVendorPortal'); +const enterprisePortalSidebar = require('./sidebarEnterprisePortal'); +const securityCenterSidebar = require('./sidebarSecurityCenter'); +const compatibilityMatrixSidebar = require('./sidebarCompatibilityMatrix'); +const kotsSidebar = require('./sidebarKots'); +const kurlSidebar = require('./sidebarKurl'); +const helmInstallationsSidebar = require('./sidebarHelm'); +const replicatedSdkSidebar = require('./sidebarReplicatedSdk'); +const preflightSupportSidebar = require('./sidebarTroubleshoot'); +const proxyRegistrySidebar = require('./sidebarProxyRegistry'); + // @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} const sidebars = { // By default, Docusaurus generates a sidebar from the docs folder structure @@ -60,551 +72,131 @@ const sidebars = { }, { type: "category", - label: "Labs", + label: "Add Replicated to CI/CD Workflows", items: [ - { - type: "link", - href: "https://play.instruqt.com/embed/replicated/tracks/distributing-with-replicated?token=em_VHOEfNnBgU3auAnN", - label: "Distributing Your Application with Replicated", - }, - { - type: "link", - href: "https://play.instruqt.com/embed/replicated/tracks/delivering-as-an-appliance?token=em_lUZdcv0LrF6alIa3", - label: "Delivering Your Application as a Kubernetes Appliance", - }, - { - type: "link", - href: "https://play.instruqt.com/embed/replicated/tracks/avoiding-installation-pitfalls?token=em_gJjtIzzTTtdd5RFG", - label: "Avoiding Installation Pitfalls", - }, - { - type: "link", - href: "https://play.instruqt.com/embed/replicated/tracks/closing-information-gap?token=em_MO2XXCz3bAgwtEca", - label: "Closing the Support Information Gap", - }, - { - type: "link", - href: "https://play.instruqt.com/embed/replicated/tracks/protecting-your-assets?token=em_7QjY34G_UHKoREBd", - label: "Protecting Your Assets", - }, + "vendor/ci-overview", + "vendor/ci-workflows", + "vendor/ci-workflows-github-actions", ], }, + // { + // type: "category", + // label: "Labs", + // items: [ + // { + // type: "link", + // href: "https://play.instruqt.com/embed/replicated/tracks/distributing-with-replicated?token=em_VHOEfNnBgU3auAnN", + // label: "Distributing Your Application with Replicated", + // }, + // { + // type: "link", + // href: "https://play.instruqt.com/embed/replicated/tracks/delivering-as-an-appliance?token=em_lUZdcv0LrF6alIa3", + // label: "Delivering Your Application as a Kubernetes Appliance", + // }, + // { + // type: "link", + // href: "https://play.instruqt.com/embed/replicated/tracks/avoiding-installation-pitfalls?token=em_gJjtIzzTTtdd5RFG", + // label: "Avoiding Installation Pitfalls", + // }, + // { + // type: "link", + // href: "https://play.instruqt.com/embed/replicated/tracks/closing-information-gap?token=em_MO2XXCz3bAgwtEca", + // label: "Closing the Support Information Gap", + // }, + // { + // type: "link", + // href: "https://play.instruqt.com/embed/replicated/tracks/protecting-your-assets?token=em_7QjY34G_UHKoREBd", + // label: "Protecting Your Assets", + // }, + // ], + // }, // PRODUCT DOCS { type: "html", value: "
Product docs
", defaultStyle: true }, { - type: "category", + type: "ref", + id: "vendor/vendor-portal-creating-account", label: "Vendor Portal", - items: [ - { - type: "category", - label: "Vendor Portal Teams and Accounts", - items: [ - "vendor/vendor-portal-creating-account", - "vendor/team-management", - "vendor/team-management-github-username", - { - type: "category", - label: "Configure Role-based Access Control", - items: [ - "vendor/team-management-rbac-configuring", - "vendor/team-management-rbac-resource-names", - ], - }, - { - type: "category", - label: "Configure Authentication", - items: [ - "vendor/team-management-two-factor-auth", - "vendor/team-management-google-auth", - "vendor/team-management-saml-auth", - "vendor/team-management-scim-provisioning", - ], - }, - "vendor/team-management-slack-config", - "vendor/replicated-api-tokens", - ], - }, - { - type: "category", - label: "Applications", - items: [ - "vendor/vendor-portal-manage-app", - "vendor/vendor-portal-application-settings", - ], - }, - { - type: "category", - label: "Channels and releases", - items: [ - "vendor/releases-about", - "vendor/releases-creating-channels", - "vendor/releases-creating-releases", - "vendor/releases-creating-cli", - "vendor/helm-install-release", - "vendor/releases-sharing-license-install-script", - "reference/linter", - ], - }, - { - type: "category", - label: "Customers and licenses", - items: [ - "vendor/licenses-about", - "vendor/releases-creating-customer", - "vendor/licenses-adding-custom-fields", - "vendor/licenses-install-types", - "vendor/releases-share-download-portal", - "vendor/licenses-about-types", - "vendor/licenses-download", - { - type: "category", - label: "Query license entitlements", - items: [ - "vendor/licenses-using-builtin-fields", - "vendor/licenses-reference-sdk", - "vendor/licenses-reference-helm", - "vendor/licenses-referencing-fields", - "vendor/licenses-reference-kots-runtime", - "vendor/licenses-verify-fields-sdk-api", - ], - }, - ], - }, - { - type: "category", - label: "Custom domains", - items: ["vendor/custom-domains", "vendor/custom-domains-using"], - }, - { - type: "category", - label: "Insights and telemetry", - items: [ - "vendor/instance-insights-event-data", - "vendor/insights-app-status", - "vendor/custom-metrics", - "vendor/telemetry-air-gap", - "vendor/customer-adoption", - "vendor/customer-reporting", - "vendor/instance-insights-details", - { - type: "category", - label: "Event Notifications (Beta)", - items: [ - "vendor/event-notifications", - "vendor/event-notifications-create", - "vendor/event-notifications-manage", - "vendor/event-notifications-webhooks", - ], - }, - "vendor/instance-notifications-config", - "vendor/instance-data-export", - ], - }, - "vendor/support-submit-request", - ], + customProps: { + sidebar: "vendorPortalSidebar" + } }, { - type: "category", + type: "ref", + id: "vendor/enterprise-portal-about", label: "Enterprise Portal", - items: [ - "vendor/enterprise-portal-about", - "vendor/enterprise-portal-configure", - "vendor/enterprise-portal-invite", - "vendor/enterprise-portal-self-serve-signup", - "vendor/enterprise-portal-access", - "vendor/enterprise-portal-use", - ], + customProps: { + sidebar: "enterprisePortalSidebar" + } }, { - type: "category", + type: "ref", + id: "vendor/security-center-about", label: "Security Center (Alpha)", - items: ["vendor/security-center-about"], + customProps: { + sidebar: "securityCenterSidebar" + } }, { - type: "category", + type: "ref", + id: "vendor/testing-about", label: "Compatibility Matrix", - items: [ - "vendor/testing-about", - "vendor/testing-supported-clusters", - "vendor/testing-how-to", - "vendor/testing-vm-create", - // "vendor/testing-vm-transfer-files", - "vendor/testing-ingress", - // "vendor/testing-vm-about", - // "vendor/testing-vm-networking", - "vendor/testing-network-policy", - "vendor/testing-cluster-addons", - "vendor/testing-ci-cd", - { - type: "category", - label: "Manage cost and usage", - items: [ - "vendor/testing-pricing", - "vendor/compatibility-matrix-usage", - ], - }, - ], + customProps: { + sidebar: "compatibilityMatrixSidebar" + } }, { type: "link", - href: "/installer/v3/v3-placeholder", + href: "/installer/v3/embedded-overview", label: "Embedded Cluster", }, - // { - // type: "category", - // label: "Embedded Cluster", - // items: [ - // "vendor/embedded-overview", - // "vendor/embedded-using", - // { - // type: "category", - // label: "Install with Embedded Cluster", - // items: [ - // "enterprise/installing-embedded-requirements", - // "enterprise/installing-embedded", - // "enterprise/installing-embedded-air-gap", - // "enterprise/installing-embedded-automation", - // ], - // }, - // "enterprise/embedded-manage-nodes", - // "enterprise/updating-embedded", - // "vendor/embedded-troubleshooting", - // "enterprise/embedded-tls-certs", - // "vendor/embedded-disaster-recovery", - // { - // type: "category", - // label: "Embedded Cluster commands", - // items: [ - // "reference/embedded-cluster-admin-console", - // "reference/embedded-cluster-completion", - // "reference/embedded-cluster-enable-ha", - // "reference/embedded-cluster-install", - // "reference/embedded-cluster-join", - // "reference/embedded-cluster-join-print-command", - // "reference/embedded-cluster-reset", - // "reference/embedded-cluster-restore", - // "reference/embedded-cluster-shell", - // "reference/embedded-cluster-support-bundle", - // "reference/embedded-cluster-update", - // "reference/embedded-cluster-version", - // ], - // }, - // ], - // }, - { - type: "category", - label: "KOTS", - items: [ - "intro-kots", - { - type: "category", - label: "Configure KOTS", - items: [ - { - type: "category", - label: "Configure the HelmChart custom resource", - items: [ - "vendor/helm-native-about", - "vendor/helm-native-v2-using", - "vendor/helm-packaging-airgap-bundles", - "vendor/helm-optional-value-keys", - "vendor/helm-v2-migrate", - ], - }, - { - type: "category", - label: "Customize the Admin Console and Download Portal", - items: [ - "vendor/admin-console-customize-app-icon", - "vendor/admin-console-adding-buttons-links", - "vendor/admin-console-port-forward", - "vendor/admin-console-prometheus-monitoring", - ], - }, - { - type: "category", - label: "Configure the Admin Console config screen", - items: [ - "vendor/config-screen-about", - "vendor/admin-console-customize-config-screen", - "vendor/config-screen-map-inputs", - "vendor/config-screen-conditional", - ], - }, - { - type: "category", - label: "Manage resources and objects", - items: [ - "vendor/admin-console-display-app-status", - { - type: "category", - label: "Conditionally deploy resources", - items: [ - "vendor/packaging-include-resources", - "vendor/tutorial-adding-db-config", - ], - }, - "vendor/resources-annotations-templating", - "vendor/orchestrating-resource-deployment", - "vendor/database-config-adding-options", - "vendor/packaging-cleaning-up-jobs", - "vendor/packaging-ingress", - ], - }, - { - type: "category", - label: "Manage KOTS", - items: [ - "vendor/packaging-kots-versions", - "vendor/packaging-rbac", - "vendor/packaging-air-gap-excluding-minio", - ], - }, - { - type: "category", - label: "Distribute Kubernetes Operators with KOTS", - items: [ - "vendor/operator-packaging-about", - "vendor/operator-defining-additional-images", - "vendor/operator-referencing-images", - "vendor/operator-defining-additional-namespaces", - ], - }, - ], - }, - { - type: "category", - label: "Install in existing clusters with KOTS", - items: [ - "enterprise/installing-overview", - "enterprise/installing-general-requirements", - "enterprise/installing-existing-cluster", - "enterprise/installing-existing-cluster-airgapped", - "enterprise/installing-existing-cluster-automation", - "enterprise/installing-stateful-component-requirements", - ], - }, - { - type: "category", - label: "Perform updates in existing cluster KOTS installations", - items: [ - "enterprise/updating-app-manager", - "enterprise/updating-apps", - "enterprise/updating-patching-with-kustomize", - ], - }, - { - type: "category", - label: "Configure local image registries", - items: [ - "enterprise/image-registry-settings", - "enterprise/image-registry-rate-limits", - ], - }, - "enterprise/updating-licenses", - { - type: "category", - label: "Perform backup and restore with snapshots", - items: [ - "vendor/snapshots-overview", - { - type: "category", - label: "Enable and configure snapshots", - items: [ - "vendor/snapshots-configuring-backups", - "reference/custom-resource-backup", - "vendor/snapshots-hooks", - ], - }, - { - type: "category", - label: "Configure backup storage for snapshots", - items: [ - "enterprise/snapshots-velero-cli-installing", - "enterprise/snapshots-configuring-hostpath", - "enterprise/snapshots-configuring-nfs", - "enterprise/snapshots-storage-destinations", - "enterprise/snapshots-velero-installing-config", - ], - }, - "enterprise/snapshots-creating", - "enterprise/snapshots-restoring-full", - "enterprise/snapshots-updating-with-admin-console", - "enterprise/snapshots-troubleshooting-backup-restore", - ], - }, - { - type: "category", - label: "Manage Admin Console user access", - items: [ - "enterprise/auth-changing-passwords", - "enterprise/auth-identity-provider", - "enterprise/auth-configuring-rbac", - ], - }, - { - type: "category", - label: "Monitor applications with Prometheus", - items: [ - "enterprise/monitoring-applications", - "enterprise/monitoring-access-dashboards", - ], - }, - "enterprise/status-viewing-details", - "enterprise/delete-admin-console", - { - type: "category", - label: "Use a GitOps workflow", - items: [ - "enterprise/gitops-workflow", - "enterprise/gitops-managing-secrets", - ], - }, - ], - }, - { - type: "category", - label: "kURL", - items: [ - "vendor/kurl-about", - { - type: "category", - label: "Configure kURL Installers", - items: [ - "vendor/packaging-embedded-kubernetes", - "vendor/packaging-installer-storage", - "vendor/installer-history", - "vendor/kurl-nodeport-services", - ], - }, - { - type: "category", - label: "Install with kURL", - items: [ - "enterprise/installing-kurl-requirements", - "enterprise/installing-kurl", - "enterprise/installing-kurl-airgap", - "enterprise/installing-kurl-automation", - ], - }, - "enterprise/cluster-management-add-nodes", - { - type: "category", - label: "Perform updates with kURL", - items: [ - "enterprise/updating-kurl-about", - "enterprise/updating-kurl", - ], - }, - "vendor/packaging-using-tls-certs", - "enterprise/updating-tls-cert", - "enterprise/image-registry-kurl", - "enterprise/monitoring-external-prometheus", - "vendor/kurl-reset", - ], - }, { - type: "category", - label: "Helm installations with Replicated", - items: [ - "vendor/helm-install-overview", - "vendor/helm-install-values-schema", - "vendor/install-with-helm", - "vendor/helm-install-airgap", - "vendor/using-third-party-registry-proxy", - "vendor/helm-install-troubleshooting", - ], + type: "ref", + id: "vendor/helm-install-overview", + label: "Helm Installations with Replicated", + customProps: { + sidebar: "helmSidebar" + } }, { - type: "category", - label: "Replicated SDK", - items: [ - "vendor/replicated-sdk-overview", - "vendor/replicated-sdk-installing", - "vendor/replicated-sdk-airgap", - "vendor/replicated-sdk-development", - "vendor/replicated-sdk-customizing", - ], + type: "ref", + id: "intro-kots", + label: "KOTS", + customProps: { + sidebar: "kotsSidebar" + } }, { - type: "category", - label: "Preflight checks and support bundles", - items: [ - "vendor/preflight-support-bundle-about", - { - type: "category", - label: "Preflight checks", - items: [ - "vendor/preflight-defining", - "vendor/preflight-examples", - "vendor/preflight-running", - "vendor/preflight-host-preflights", - ], - }, - { - type: "category", - label: "Support bundles", - items: [ - "vendor/support-bundle-customizing", - "vendor/support-bundle-examples", - "vendor/support-online-support-bundle-specs", - "vendor/support-modular-support-bundle-specs", - { - type: "category", - label: "Generate support bundles", - items: [ - "vendor/support-bundle-generating", - "vendor/support-bundle-embedded", - "enterprise/troubleshooting-an-app", - "vendor/support-host-support-bundles", - ], - }, - "vendor/support-inspecting-support-bundles", - "vendor/support-enabling-direct-bundle-uploads", - ], - }, - "vendor/preflight-sb-helm-templates-about", - { - type: "category", - label: "Troubleshoot custom resources", - items: [ - "reference/custom-resource-preflight", - "reference/custom-resource-redactor", - ], - }, - ], + type: "ref", + id: "vendor/kurl-about", + label: "kURL", + customProps: { + sidebar: "kurlSidebar" + } }, { - type: "category", + type: "ref", + id: "vendor/private-images-about", label: "Replicated proxy registry", - items: [ - "vendor/private-images-about", - "vendor/packaging-private-images", - "vendor/helm-image-registry", - "vendor/private-images-kots", - "vendor/private-images-tags-digests", - { - type: "category", - label: "Replicated Private Registry", - items: [ - "vendor/private-images-replicated", - "vendor/packaging-private-registry-security", - ], - }, - "vendor/packaging-public-images", - "vendor/tutorial-ecr-private-images", - ], + customProps: { + sidebar: "proxyRegistrySidebar" + } }, { - type: "category", - label: "Add Replicated to CI/CD workflows", - items: [ - "vendor/ci-overview", - "vendor/ci-workflows", - "vendor/ci-workflows-github-actions", - ], + type: "ref", + id: "vendor/replicated-sdk-overview", + label: "Replicated SDK", + customProps: { + sidebar: "replicatedSdkSidebar" + } + }, + { + type: "ref", + id: "vendor/preflight-support-bundle-about", + label: "Preflight Checks and support bundles", + customProps: { + sidebar: "troubleshootSidebar" + } }, - // Reference { type: "html", value: "
Reference
", defaultStyle: true }, { @@ -937,6 +529,19 @@ const sidebars = { ], }, ], + + // Product-specific sidebars + ...vendorPlatformSidebar, + ...enterprisePortalSidebar, + ...securityCenterSidebar, + ...compatibilityMatrixSidebar, + ...kotsSidebar, + ...kurlSidebar, + ...helmInstallationsSidebar, + ...replicatedSdkSidebar, + ...preflightSupportSidebar, + ...proxyRegistrySidebar, + }; module.exports = sidebars; \ No newline at end of file From 8d16c38e2e98ef017e6268ba3028e8da30b25d68 Mon Sep 17 00:00:00 2001 From: Paige Calvert Date: Wed, 11 Mar 2026 13:13:13 -0600 Subject: [PATCH 3/4] add headings to each product sidebar --- sidebarCompatibilityMatrix.js | 2 + sidebarEnterprisePortal.js | 2 + sidebarHelm.js | 1 + sidebarInstaller.js | 1 + sidebarKots.js | 1 + sidebarKurl.js | 1 + sidebarProxyRegistry.js | 1 + sidebarReplicatedSdk.js | 1 + sidebarSecurityCenter.js | 1 + sidebarTroubleshoot.js | 1 + sidebarVendorPortal.js | 1 + sidebars.js | 2 +- src/css/sidebar.css | 10 ++ src/theme/DocSidebar/Desktop/Content/index.js | 21 +++-- .../Desktop/Content/styles.module.css | 80 +++++++++++++--- src/theme/DocSidebar/Mobile/index.js | 12 ++- src/utils/sidebarProductFromPath.js | 94 +++++++++++++++++++ 17 files changed, 207 insertions(+), 25 deletions(-) create mode 100644 src/utils/sidebarProductFromPath.js diff --git a/sidebarCompatibilityMatrix.js b/sidebarCompatibilityMatrix.js index 41ba20e927..2dd355bf43 100644 --- a/sidebarCompatibilityMatrix.js +++ b/sidebarCompatibilityMatrix.js @@ -1,3 +1,5 @@ +// sidebar heading is set in src/utils/sidebarProductFromPath.js in SIDEBAR_CONFIG + module.exports = { compatibilityMatrixSidebar: [ "vendor/testing-about", diff --git a/sidebarEnterprisePortal.js b/sidebarEnterprisePortal.js index da62b85648..9430f1e1b4 100644 --- a/sidebarEnterprisePortal.js +++ b/sidebarEnterprisePortal.js @@ -1,3 +1,5 @@ +// sidebar heading is set in src/utils/sidebarProductFromPath.js in SIDEBAR_CONFIG + module.exports = { enterprisePortalSidebar: [ "vendor/enterprise-portal-about", diff --git a/sidebarHelm.js b/sidebarHelm.js index 6163a74502..effd545ec3 100644 --- a/sidebarHelm.js +++ b/sidebarHelm.js @@ -1,3 +1,4 @@ +// sidebar heading is set in src/utils/sidebarProductFromPath.js in SIDEBAR_CONFIG module.exports = { helmSidebar: [ "vendor/helm-install-overview", diff --git a/sidebarInstaller.js b/sidebarInstaller.js index 5a3a296127..108acff285 100644 --- a/sidebarInstaller.js +++ b/sidebarInstaller.js @@ -1,3 +1,4 @@ +// sidebar heading is set in src/utils/sidebarProductFromPath.js in SIDEBAR_CONFIG module.exports = { installerSidebar: [ "v3-placeholder", diff --git a/sidebarKots.js b/sidebarKots.js index ef1b29250c..a8a4483bc0 100644 --- a/sidebarKots.js +++ b/sidebarKots.js @@ -1,3 +1,4 @@ +// sidebar heading is set in src/utils/sidebarProductFromPath.js in SIDEBAR_CONFIG module.exports = { kotsSidebar: [ "intro-kots", diff --git a/sidebarKurl.js b/sidebarKurl.js index aeae834671..bcb6478932 100644 --- a/sidebarKurl.js +++ b/sidebarKurl.js @@ -1,3 +1,4 @@ +// sidebar heading is set in src/utils/sidebarProductFromPath.js in SIDEBAR_CONFIG module.exports = { kurlSidebar: [ "vendor/kurl-about", diff --git a/sidebarProxyRegistry.js b/sidebarProxyRegistry.js index bbb6187b94..2fc0cd7ee0 100644 --- a/sidebarProxyRegistry.js +++ b/sidebarProxyRegistry.js @@ -1,3 +1,4 @@ +// sidebar heading is set in src/utils/sidebarProductFromPath.js in SIDEBAR_CONFIG module.exports = { proxyRegistrySidebar: [ "vendor/private-images-about", diff --git a/sidebarReplicatedSdk.js b/sidebarReplicatedSdk.js index 61096504f5..ee9af0164e 100644 --- a/sidebarReplicatedSdk.js +++ b/sidebarReplicatedSdk.js @@ -1,3 +1,4 @@ +// sidebar heading is set in src/utils/sidebarProductFromPath.js in SIDEBAR_CONFIG module.exports = { replicatedSdkSidebar: [ "vendor/replicated-sdk-overview", diff --git a/sidebarSecurityCenter.js b/sidebarSecurityCenter.js index 65f317313b..ecdc75a3ec 100644 --- a/sidebarSecurityCenter.js +++ b/sidebarSecurityCenter.js @@ -1,3 +1,4 @@ +// sidebar heading is set in src/utils/sidebarProductFromPath.js in SIDEBAR_CONFIG module.exports = { securityCenterSidebar: [ "vendor/security-center-about", diff --git a/sidebarTroubleshoot.js b/sidebarTroubleshoot.js index 5f3f82ab1a..748775b227 100644 --- a/sidebarTroubleshoot.js +++ b/sidebarTroubleshoot.js @@ -1,3 +1,4 @@ +// sidebar heading is set in src/utils/sidebarProductFromPath.js in SIDEBAR_CONFIG module.exports = { troubleshootSidebar: [ "vendor/preflight-support-bundle-about", diff --git a/sidebarVendorPortal.js b/sidebarVendorPortal.js index dbaf79fb92..3048ce0c31 100644 --- a/sidebarVendorPortal.js +++ b/sidebarVendorPortal.js @@ -1,3 +1,4 @@ +// sidebar heading is set in src/utils/sidebarProductFromPath.js in SIDEBAR_CONFIG module.exports = { vendorPortalSidebar: [ { diff --git a/sidebars.js b/sidebars.js index 1117406e1b..9568593697 100644 --- a/sidebars.js +++ b/sidebars.js @@ -146,7 +146,7 @@ const sidebars = { }, { type: "link", - href: "/installer/v3/embedded-overview", + href: "installer/v3/v3-placeholder", label: "Embedded Cluster", }, { diff --git a/src/css/sidebar.css b/src/css/sidebar.css index 51609266d3..d0bb723300 100644 --- a/src/css/sidebar.css +++ b/src/css/sidebar.css @@ -87,4 +87,14 @@ .installer-version-selector.dropdown--show .installer-version-selector__trigger-icon { transform: rotate(180deg); +} + +/* Product name heading (mobile sidebar, padding aligned with menu) */ +.sidebar-product-heading-mobile { + font-size: 0.95rem; + font-weight: 600; + margin: 0 0 0.5rem 0; + padding: 0.75rem 1rem 0 1rem; + color: var(--ifm-font-color-base); + line-height: 1.3; } \ No newline at end of file diff --git a/src/theme/DocSidebar/Desktop/Content/index.js b/src/theme/DocSidebar/Desktop/Content/index.js index 8f2e70e9bb..a26b8def2a 100644 --- a/src/theme/DocSidebar/Desktop/Content/index.js +++ b/src/theme/DocSidebar/Desktop/Content/index.js @@ -1,6 +1,6 @@ /** - * Custom DocSidebar Desktop Content: shows the installer version selector - * at the top of the sidebar when the user is on an installer docs page. + * Custom DocSidebar Desktop Content: product heading, installer version selector, + * and slide+fade transition when switching between main and product sidebars. */ import React, { useState } from 'react'; import clsx from 'clsx'; @@ -12,6 +12,7 @@ import { import { translate } from '@docusaurus/Translate'; import DocSidebarItems from '@theme/DocSidebarItems'; import InstallerVersionSelector from '@site/src/components/InstallerVersionSelector'; +import { getProductForPath } from '@site/src/utils/sidebarProductFromPath'; import styles from './styles.module.css'; function useShowAnnouncementBar() { @@ -30,11 +31,19 @@ function useShowAnnouncementBar() { export default function DocSidebarDesktopContent({ path, sidebar, className }) { const showAnnouncementBar = useShowAnnouncementBar(); - const isInstallerDocs = path?.startsWith('/installer'); + const product = getProductForPath(path); + const sidebarKey = product?.key ?? 'main'; return ( - <> - {isInstallerDocs && } +
+ {product && ( +

{product.name}

+ )} + {product?.key === 'installer' && } - +
); } \ No newline at end of file diff --git a/src/theme/DocSidebar/Desktop/Content/styles.module.css b/src/theme/DocSidebar/Desktop/Content/styles.module.css index 7f6b2fc2fa..875ba9ea43 100644 --- a/src/theme/DocSidebar/Desktop/Content/styles.module.css +++ b/src/theme/DocSidebar/Desktop/Content/styles.module.css @@ -2,19 +2,71 @@ * DocSidebar Desktop Content styles */ - @media (min-width: 997px) { +/* Wrapper: flex column so the nav can fill and scroll; min-height: 0 allows overflow */ +.sidebarContentTransition { + display: flex; + flex-direction: column; + flex: 1; + min-height: 0; + overflow: hidden; +} + +/* Product sidebars (installer + main-docs product sidebars) slide in from right */ +.sidebarContentTransition[data-sidebar]:not([data-sidebar='main']) { + animation: sidebarSlideInFromRight 0.2s ease-out forwards; +} + +.sidebarContentTransition[data-sidebar='main'] { + animation: sidebarSlideInFromLeft 0.2s ease-out forwards; +} + +@keyframes sidebarSlideInFromRight { + from { + opacity: 0; + transform: translateX(12px); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +@keyframes sidebarSlideInFromLeft { + from { + opacity: 0; + transform: translateX(-12px); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +/* Product name heading at top of product-specific sidebars */ +.sidebarProductHeading { + font-size: 0.9rem; + font-weight: 600; + margin: 0; + padding: 18px 12px 8px 18px; + color: var(--ifm-font-color-base); + line-height: 1.3; +} + +@media (min-width: 997px) { + .menu { + flex: 1; + min-height: 0; + overflow-y: auto; + padding: 0.5rem; + } + @supports (scrollbar-gutter: stable) { .menu { - flex-grow: 1; - padding: 0.5rem; - } - @supports (scrollbar-gutter: stable) { - .menu { - padding: 0.5rem 0 0.5rem 0.5rem; - scrollbar-gutter: stable; - } + padding: 0.5rem 0 0.5rem 0.5rem; + scrollbar-gutter: stable; } - - .menuWithAnnouncementBar { - margin-bottom: var(--docusaurus-announcement-bar-height); - } - } \ No newline at end of file + } + + .menuWithAnnouncementBar { + margin-bottom: var(--docusaurus-announcement-bar-height); + } +} \ No newline at end of file diff --git a/src/theme/DocSidebar/Mobile/index.js b/src/theme/DocSidebar/Mobile/index.js index c210d275d1..138c3c7efd 100644 --- a/src/theme/DocSidebar/Mobile/index.js +++ b/src/theme/DocSidebar/Mobile/index.js @@ -1,6 +1,6 @@ /** - * Custom DocSidebar Mobile: shows the installer version selector - * at the top when the user is on an installer docs page. + * Custom DocSidebar Mobile: product heading and installer version selector + * when the user is on an installer docs page. */ import React from 'react'; import clsx from 'clsx'; @@ -11,14 +11,18 @@ import { import { useNavbarMobileSidebar } from '@docusaurus/theme-common/internal'; import DocSidebarItems from '@theme/DocSidebarItems'; import InstallerVersionSelector from '@site/src/components/InstallerVersionSelector'; +import { getProductForPath } from '@site/src/utils/sidebarProductFromPath'; const DocSidebarMobileSecondaryMenu = ({ sidebar, path }) => { const mobileSidebar = useNavbarMobileSidebar(); - const isInstallerDocs = path?.startsWith('/installer'); + const product = getProductForPath(path); return ( <> - {isInstallerDocs && ( + {product && ( +

{product.name}

+ )} + {product?.key === 'installer' && (
diff --git a/src/utils/sidebarProductFromPath.js b/src/utils/sidebarProductFromPath.js new file mode 100644 index 0000000000..6736c6dd11 --- /dev/null +++ b/src/utils/sidebarProductFromPath.js @@ -0,0 +1,94 @@ +/** + * Maps current doc path to a product name for the sidebar heading. + * Built from the same sidebar configs as sidebars.js so product boundaries stay in sync. + * + * Order matters: first sidebar that contains a doc id wins (main sidebar is not listed, + * so main docs get no product heading). + */ + +function extractDocIds(items, ids = new Set()) { + if (!items || !Array.isArray(items)) return ids; + for (const item of items) { + if (typeof item === 'string') { + ids.add(item); + } else if (item && typeof item === 'object' && item.items) { + extractDocIds(item.items, ids); + } + } + return ids; +} + +// Sidebar module path (from repo root) -> display name +const SIDEBAR_CONFIG = [ + ['vendorPortalSidebar', 'Vendor Portal'], + ['enterprisePortalSidebar', 'Enterprise Portal'], + ['securityCenterSidebar', 'Security Center (Alpha)'], + ['compatibilityMatrixSidebar', 'Compatibility Matrix'], + ['kotsSidebar', 'KOTS'], + ['kurlSidebar', 'kURL'], + ['helmSidebar', 'Helm installations with Replicated'], + ['replicatedSdkSidebar', 'Replicated SDK'], + ['troubleshootSidebar', 'Troubleshoot'], + ['proxyRegistrySidebar', 'Replicated proxy registry'], +]; + +// Lazy-build docId -> product name (avoids require at module load if not needed) +let docIdToProduct = null; + +function buildDocIdMap() { + if (docIdToProduct) return docIdToProduct; + docIdToProduct = {}; + try { + const sidebars = [ + require('../../sidebarVendorPortal'), + require('../../sidebarEnterprisePortal'), + require('../../sidebarSecurityCenter'), + require('../../sidebarCompatibilityMatrix'), + require('../../sidebarKots'), + require('../../sidebarKurl'), + require('../../sidebarHelm'), + require('../../sidebarReplicatedSdk'), + require('../../sidebarTroubleshoot'), + require('../../sidebarProxyRegistry'), + ]; + SIDEBAR_CONFIG.forEach(([key, name], i) => { + const items = sidebars[i]?.[key]; + if (!items) return; + const ids = extractDocIds(items); + ids.forEach((id) => { + if (!docIdToProduct[id]) docIdToProduct[id] = name; + }); + }); + } catch (e) { + console.warn('[sidebarProductFromPath] Could not load sidebars:', e.message); + } + return docIdToProduct; +} + +/** + * Path prefix for the installer docs (separate plugin). Takes precedence over main-docs mapping. + */ +const INSTALLER_PREFIX = '/installer'; +const INSTALLER_NAME = 'Embedded Cluster'; + +/** + * @param {string} path - Current doc path (e.g. /vendor/kurl-about or /intro-kots) + * @returns {{ name: string } | null} Product to show in sidebar heading, or null for main/generic docs + */ +export function getProductForPath(path) { + if (!path || typeof path !== 'string') return null; + + // Installer (separate docs plugin) has its own path prefix + if (path.startsWith(INSTALLER_PREFIX)) { + return { key: 'installer', name: INSTALLER_NAME }; + } + + const docId = path.replace(/^\//, ''); + const map = buildDocIdMap(); + const name = map[docId]; + if (!name) return null; + + // Use a stable key for main-docs product sidebars (for transition/animation) + const key = docId.split('/')[0] + '-' + name.replace(/\s+/g, '-').toLowerCase().slice(0, 12); + return { key, name }; +} From 9b297ecdc75f5091ff103d0254d861168ad3597f Mon Sep 17 00:00:00 2001 From: Paige Calvert Date: Wed, 11 Mar 2026 14:30:38 -0600 Subject: [PATCH 4/4] adjust sidebar styles for installer --- src/theme/DocSidebar/Desktop/Content/index.js | 2 +- src/theme/DocSidebar/Mobile/index.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/theme/DocSidebar/Desktop/Content/index.js b/src/theme/DocSidebar/Desktop/Content/index.js index a26b8def2a..6f0a813a42 100644 --- a/src/theme/DocSidebar/Desktop/Content/index.js +++ b/src/theme/DocSidebar/Desktop/Content/index.js @@ -40,7 +40,7 @@ export default function DocSidebarDesktopContent({ path, sidebar, className }) { data-sidebar={sidebarKey} className={styles.sidebarContentTransition} > - {product && ( + {product && product.key !== 'installer' && (

{product.name}

)} {product?.key === 'installer' && } diff --git a/src/theme/DocSidebar/Mobile/index.js b/src/theme/DocSidebar/Mobile/index.js index 138c3c7efd..ad326b9382 100644 --- a/src/theme/DocSidebar/Mobile/index.js +++ b/src/theme/DocSidebar/Mobile/index.js @@ -19,7 +19,7 @@ const DocSidebarMobileSecondaryMenu = ({ sidebar, path }) => { return ( <> - {product && ( + {product && product.key !== 'installer' && (

{product.name}

)} {product?.key === 'installer' && (