diff --git a/docusaurus.config.js b/docusaurus.config.js index b20dec7729..3bf760fddc 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: '/', @@ -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'], @@ -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', }, { @@ -173,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/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 8596011fe1..15ac79ea76 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 26e4222f1e..77f1a8aeaa 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 ce34166f40..41cfb98177 100644 --- a/docs/enterprise/updating-embedded.mdx +++ b/installer_versioned_docs/version-2.0.0/updating-embedded.mdx @@ -1,7 +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 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/sidebarCompatibilityMatrix.js b/sidebarCompatibilityMatrix.js new file mode 100644 index 0000000000..2dd355bf43 --- /dev/null +++ b/sidebarCompatibilityMatrix.js @@ -0,0 +1,22 @@ +// sidebar heading is set in src/utils/sidebarProductFromPath.js in SIDEBAR_CONFIG + +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..9430f1e1b4 --- /dev/null +++ b/sidebarEnterprisePortal.js @@ -0,0 +1,12 @@ +// sidebar heading is set in src/utils/sidebarProductFromPath.js in SIDEBAR_CONFIG + +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..effd545ec3 --- /dev/null +++ b/sidebarHelm.js @@ -0,0 +1,11 @@ +// sidebar heading is set in src/utils/sidebarProductFromPath.js in SIDEBAR_CONFIG +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/sidebarInstaller.js b/sidebarInstaller.js new file mode 100644 index 0000000000..108acff285 --- /dev/null +++ b/sidebarInstaller.js @@ -0,0 +1,6 @@ +// 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 new file mode 100644 index 0000000000..a8a4483bc0 --- /dev/null +++ b/sidebarKots.js @@ -0,0 +1,170 @@ +// sidebar heading is set in src/utils/sidebarProductFromPath.js in SIDEBAR_CONFIG +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..bcb6478932 --- /dev/null +++ b/sidebarKurl.js @@ -0,0 +1,40 @@ +// sidebar heading is set in src/utils/sidebarProductFromPath.js in SIDEBAR_CONFIG +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..2fc0cd7ee0 --- /dev/null +++ b/sidebarProxyRegistry.js @@ -0,0 +1,20 @@ +// sidebar heading is set in src/utils/sidebarProductFromPath.js in SIDEBAR_CONFIG +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..ee9af0164e --- /dev/null +++ b/sidebarReplicatedSdk.js @@ -0,0 +1,11 @@ +// sidebar heading is set in src/utils/sidebarProductFromPath.js in SIDEBAR_CONFIG +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..ecdc75a3ec --- /dev/null +++ b/sidebarSecurityCenter.js @@ -0,0 +1,6 @@ +// sidebar heading is set in src/utils/sidebarProductFromPath.js in SIDEBAR_CONFIG +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..748775b227 --- /dev/null +++ b/sidebarTroubleshoot.js @@ -0,0 +1,47 @@ +// sidebar heading is set in src/utils/sidebarProductFromPath.js in SIDEBAR_CONFIG +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..3048ce0c31 --- /dev/null +++ b/sidebarVendorPortal.js @@ -0,0 +1,111 @@ +// sidebar heading is set in src/utils/sidebarProductFromPath.js in SIDEBAR_CONFIG +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 d3e43d3425..9568593697 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,546 +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: "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: "link", + href: "installer/v3/v3-placeholder", + label: "Embedded Cluster", }, { - 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: "vendor/helm-install-overview", + label: "Helm Installations with Replicated", + customProps: { + sidebar: "helmSidebar" + } }, { - 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: "intro-kots", + label: "KOTS", + customProps: { + sidebar: "kotsSidebar" + } }, { - type: "category", + type: "ref", + id: "vendor/kurl-about", + label: "kURL", + customProps: { + sidebar: "kurlSidebar" + } + }, + { + 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 }, { @@ -610,7 +207,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", @@ -932,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 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..d0bb723300 100644 --- a/src/css/sidebar.css +++ b/src/css/sidebar.css @@ -15,4 +15,86 @@ .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); +} + +/* 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 new file mode 100644 index 0000000000..6f0a813a42 --- /dev/null +++ b/src/theme/DocSidebar/Desktop/Content/index.js @@ -0,0 +1,66 @@ +/** + * 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'; +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 { getProductForPath } from '@site/src/utils/sidebarProductFromPath'; +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 product = getProductForPath(path); + const sidebarKey = product?.key ?? 'main'; + + return ( +
+ {product && product.key !== 'installer' && ( +

{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 new file mode 100644 index 0000000000..875ba9ea43 --- /dev/null +++ b/src/theme/DocSidebar/Desktop/Content/styles.module.css @@ -0,0 +1,72 @@ +/** + * DocSidebar Desktop Content styles + */ + +/* 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 { + 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..ad326b9382 --- /dev/null +++ b/src/theme/DocSidebar/Mobile/index.js @@ -0,0 +1,58 @@ +/** + * 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'; +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'; +import { getProductForPath } from '@site/src/utils/sidebarProductFromPath'; + +const DocSidebarMobileSecondaryMenu = ({ sidebar, path }) => { + const mobileSidebar = useNavbarMobileSidebar(); + const product = getProductForPath(path); + + return ( + <> + {product && product.key !== 'installer' && ( +

{product.name}

+ )} + {product?.key === 'installer' && ( +
+ +
+ )} + + + ); +}; + +function DocSidebarMobile(props) { + return ( + + ); +} + +export default React.memo(DocSidebarMobile); \ No newline at end of file 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 }; +}