diff --git a/docusaurus.config.js b/docusaurus.config.js index b20dec7729..66ef839156 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: 'embedded-cluster', + path: 'embedded-cluster', + routeBasePath: 'embedded-cluster', + sidebarPath: './sidebarEmbeddedCluster.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: 'embedded-cluster', 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/embedded-cluster/v3-placeholder.md b/embedded-cluster/v3-placeholder.md new file mode 100644 index 0000000000..aeb4c25e02 --- /dev/null +++ b/embedded-cluster/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/embedded-cluster_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 embedded-cluster_versioned_docs/version-2.0.0/embedded-cluster-admin-console.mdx diff --git a/docs/reference/embedded-cluster-completion.mdx b/embedded-cluster_versioned_docs/version-2.0.0/embedded-cluster-completion.mdx similarity index 100% rename from docs/reference/embedded-cluster-completion.mdx rename to embedded-cluster_versioned_docs/version-2.0.0/embedded-cluster-completion.mdx diff --git a/docs/reference/embedded-cluster-enable-ha.mdx b/embedded-cluster_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 embedded-cluster_versioned_docs/version-2.0.0/embedded-cluster-enable-ha.mdx diff --git a/docs/reference/embedded-cluster-install.mdx b/embedded-cluster_versioned_docs/version-2.0.0/embedded-cluster-install.mdx similarity index 96% rename from docs/reference/embedded-cluster-install.mdx rename to embedded-cluster_versioned_docs/version-2.0.0/embedded-cluster-install.mdx index f68e5b75ff..9a7e481900 100644 --- a/docs/reference/embedded-cluster-install.mdx +++ b/embedded-cluster_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/embedded-cluster_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 embedded-cluster_versioned_docs/version-2.0.0/embedded-cluster-join-print-command.mdx diff --git a/docs/reference/embedded-cluster-join.mdx b/embedded-cluster_versioned_docs/version-2.0.0/embedded-cluster-join.mdx similarity index 100% rename from docs/reference/embedded-cluster-join.mdx rename to embedded-cluster_versioned_docs/version-2.0.0/embedded-cluster-join.mdx diff --git a/docs/reference/embedded-cluster-reset.mdx b/embedded-cluster_versioned_docs/version-2.0.0/embedded-cluster-reset.mdx similarity index 100% rename from docs/reference/embedded-cluster-reset.mdx rename to embedded-cluster_versioned_docs/version-2.0.0/embedded-cluster-reset.mdx diff --git a/docs/reference/embedded-cluster-restore.mdx b/embedded-cluster_versioned_docs/version-2.0.0/embedded-cluster-restore.mdx similarity index 100% rename from docs/reference/embedded-cluster-restore.mdx rename to embedded-cluster_versioned_docs/version-2.0.0/embedded-cluster-restore.mdx diff --git a/docs/reference/embedded-cluster-shell.mdx b/embedded-cluster_versioned_docs/version-2.0.0/embedded-cluster-shell.mdx similarity index 100% rename from docs/reference/embedded-cluster-shell.mdx rename to embedded-cluster_versioned_docs/version-2.0.0/embedded-cluster-shell.mdx diff --git a/docs/reference/embedded-cluster-support-bundle.mdx b/embedded-cluster_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 embedded-cluster_versioned_docs/version-2.0.0/embedded-cluster-support-bundle.mdx diff --git a/docs/reference/embedded-cluster-update.mdx b/embedded-cluster_versioned_docs/version-2.0.0/embedded-cluster-update.mdx similarity index 100% rename from docs/reference/embedded-cluster-update.mdx rename to embedded-cluster_versioned_docs/version-2.0.0/embedded-cluster-update.mdx diff --git a/docs/reference/embedded-cluster-version.mdx b/embedded-cluster_versioned_docs/version-2.0.0/embedded-cluster-version.mdx similarity index 100% rename from docs/reference/embedded-cluster-version.mdx rename to embedded-cluster_versioned_docs/version-2.0.0/embedded-cluster-version.mdx diff --git a/docs/reference/embedded-config.mdx b/embedded-cluster_versioned_docs/version-2.0.0/embedded-config.mdx similarity index 99% rename from docs/reference/embedded-config.mdx rename to embedded-cluster_versioned_docs/version-2.0.0/embedded-config.mdx index 8596011fe1..15ac79ea76 100644 --- a/docs/reference/embedded-config.mdx +++ b/embedded-cluster_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/embedded-cluster_versioned_docs/version-2.0.0/embedded-disaster-recovery.mdx similarity index 100% rename from docs/vendor/embedded-disaster-recovery.mdx rename to embedded-cluster_versioned_docs/version-2.0.0/embedded-disaster-recovery.mdx diff --git a/docs/enterprise/embedded-manage-nodes.mdx b/embedded-cluster_versioned_docs/version-2.0.0/embedded-manage-nodes.mdx similarity index 98% rename from docs/enterprise/embedded-manage-nodes.mdx rename to embedded-cluster_versioned_docs/version-2.0.0/embedded-manage-nodes.mdx index dd5805538f..69fb03d267 100644 --- a/docs/enterprise/embedded-manage-nodes.mdx +++ b/embedded-cluster_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/embedded-cluster_versioned_docs/version-2.0.0/embedded-overview.mdx similarity index 99% rename from docs/vendor/embedded-overview.mdx rename to embedded-cluster_versioned_docs/version-2.0.0/embedded-overview.mdx index 26e4222f1e..77f1a8aeaa 100644 --- a/docs/vendor/embedded-overview.mdx +++ b/embedded-cluster_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/embedded-cluster_versioned_docs/version-2.0.0/embedded-tls-certs.mdx similarity index 100% rename from docs/enterprise/embedded-tls-certs.mdx rename to embedded-cluster_versioned_docs/version-2.0.0/embedded-tls-certs.mdx diff --git a/docs/vendor/embedded-troubleshooting.mdx b/embedded-cluster_versioned_docs/version-2.0.0/embedded-troubleshooting.mdx similarity index 96% rename from docs/vendor/embedded-troubleshooting.mdx rename to embedded-cluster_versioned_docs/version-2.0.0/embedded-troubleshooting.mdx index 6c1a8faa25..fda8dbb6ba 100644 --- a/docs/vendor/embedded-troubleshooting.mdx +++ b/embedded-cluster_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/embedded-cluster_versioned_docs/version-2.0.0/embedded-using.mdx similarity index 97% rename from docs/vendor/embedded-using.mdx rename to embedded-cluster_versioned_docs/version-2.0.0/embedded-using.mdx index bcefc3f41b..74fa000c83 100644 --- a/docs/vendor/embedded-using.mdx +++ b/embedded-cluster_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/embedded-cluster_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 embedded-cluster_versioned_docs/version-2.0.0/installing-embedded-air-gap.mdx index d6f8ff581a..4b0c4f172b 100644 --- a/docs/enterprise/installing-embedded-air-gap.mdx +++ b/embedded-cluster_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/embedded-cluster_versioned_docs/version-2.0.0/installing-embedded-automation.mdx similarity index 94% rename from docs/enterprise/installing-embedded-automation.mdx rename to embedded-cluster_versioned_docs/version-2.0.0/installing-embedded-automation.mdx index 422b1d37f7..7aff906b8c 100644 --- a/docs/enterprise/installing-embedded-automation.mdx +++ b/embedded-cluster_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/embedded-cluster_versioned_docs/version-2.0.0/installing-embedded-requirements.mdx similarity index 88% rename from docs/enterprise/installing-embedded-requirements.mdx rename to embedded-cluster_versioned_docs/version-2.0.0/installing-embedded-requirements.mdx index 3d7508ba9b..6db6c11aec 100644 --- a/docs/enterprise/installing-embedded-requirements.mdx +++ b/embedded-cluster_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/embedded-cluster_versioned_docs/version-2.0.0/installing-embedded.mdx similarity index 98% rename from docs/enterprise/installing-embedded.mdx rename to embedded-cluster_versioned_docs/version-2.0.0/installing-embedded.mdx index dafb7f5da4..10f19171de 100644 --- a/docs/enterprise/installing-embedded.mdx +++ b/embedded-cluster_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/embedded-cluster_versioned_docs/version-2.0.0/updating-embedded.mdx similarity index 86% rename from docs/enterprise/updating-embedded.mdx rename to embedded-cluster_versioned_docs/version-2.0.0/updating-embedded.mdx index ce34166f40..41cfb98177 100644 --- a/docs/enterprise/updating-embedded.mdx +++ b/embedded-cluster_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/embedded-cluster_versioned_sidebars/version-2.0.0-sidebars.json b/embedded-cluster_versioned_sidebars/version-2.0.0-sidebars.json new file mode 100644 index 0000000000..79bcb0084a --- /dev/null +++ b/embedded-cluster_versioned_sidebars/version-2.0.0-sidebars.json @@ -0,0 +1,40 @@ +{ + "embeddedClusterSidebar": [ + "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/embedded-cluster_versions.json b/embedded-cluster_versions.json new file mode 100644 index 0000000000..ca7ffcdaa9 --- /dev/null +++ b/embedded-cluster_versions.json @@ -0,0 +1,3 @@ +[ + "2.0.0" +] \ No newline at end of file diff --git a/sidebarEmbeddedCluster.js b/sidebarEmbeddedCluster.js new file mode 100644 index 0000000000..d00bb5a1b9 --- /dev/null +++ b/sidebarEmbeddedCluster.js @@ -0,0 +1,5 @@ +module.exports = { + embeddedClusterSidebar: [ + "v3-placeholder", + ], +}; diff --git a/sidebars.js b/sidebars.js index d21d0c3939..e0f1629c7b 100644 --- a/sidebars.js +++ b/sidebars.js @@ -60,35 +60,44 @@ 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 }, { @@ -219,7 +228,9 @@ const sidebars = { { type: "category", label: "Security Center (Alpha)", - items: ["vendor/security-center-about"], + items: [ + "vendor/security-center-about", + ], }, { type: "category", @@ -229,10 +240,7 @@ const sidebars = { "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", @@ -246,269 +254,254 @@ const sidebars = { }, ], }, + { + type: "link", + href: "/embedded-cluster/v3/v3-placeholder", + label: "Embedded Cluster", + }, + { + 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: "category", + label: "KOTS", + items: [ + "intro-kots", { 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", + label: "Configure 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", + label: "Configure the HelmChart Custom Resource", 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", + "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: "Perform updates in existing cluster KOTS installations", + label: "Customize the Admin Console and Download Portal", items: [ - "enterprise/updating-app-manager", - "enterprise/updating-apps", - "enterprise/updating-patching-with-kustomize", + "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 local image registries", + label: "Configure the Admin Console Config Screen", items: [ - "enterprise/image-registry-settings", - "enterprise/image-registry-rate-limits", + "vendor/config-screen-about", + "vendor/admin-console-customize-config-screen", + "vendor/config-screen-map-inputs", + "vendor/config-screen-conditional", ], }, - "enterprise/updating-licenses", { type: "category", - label: "Perform backup and restore with snapshots", + label: "Manage Resources and Objects", items: [ - "vendor/snapshots-overview", - { - type: "category", - label: "Enable and configure snapshots", - items: [ - "vendor/snapshots-configuring-backups", - "reference/custom-resource-backup", - "vendor/snapshots-hooks", - ], - }, + "vendor/admin-console-display-app-status", { type: "category", - label: "Configure backup storage for snapshots", + label: "Conditionally Deploy Resources", items: [ - "enterprise/snapshots-velero-cli-installing", - "enterprise/snapshots-configuring-hostpath", - "enterprise/snapshots-configuring-nfs", - "enterprise/snapshots-storage-destinations", - "enterprise/snapshots-velero-installing-config", + "vendor/packaging-include-resources", + "vendor/tutorial-adding-db-config", ], }, - "enterprise/snapshots-creating", - "enterprise/snapshots-restoring-full", - "enterprise/snapshots-updating-with-admin-console", - "enterprise/snapshots-troubleshooting-backup-restore", + "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 Admin Console user access", + label: "Manage KOTS", items: [ - "enterprise/auth-changing-passwords", - "enterprise/auth-identity-provider", - "enterprise/auth-configuring-rbac", + "vendor/packaging-kots-versions", + "vendor/packaging-rbac", + "vendor/packaging-air-gap-excluding-minio", ], }, { type: "category", - label: "Monitor applications with Prometheus", + label: "Distribute Kubernetes Operators with KOTS", 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", + "vendor/operator-packaging-about", + "vendor/operator-defining-additional-images", + "vendor/operator-referencing-images", + "vendor/operator-defining-additional-namespaces", ], }, ], }, { type: "category", - label: "kURL", + label: "Install in Existing Clusters with KOTS", 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", - ], - }, + "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: "Install with kURL", + label: "Enable and Configure Snapshots", items: [ - "enterprise/installing-kurl-requirements", - "enterprise/installing-kurl", - "enterprise/installing-kurl-airgap", - "enterprise/installing-kurl-automation", + "vendor/snapshots-configuring-backups", + "reference/custom-resource-backup", + "vendor/snapshots-hooks", ], }, - "enterprise/cluster-management-add-nodes", { type: "category", - label: "Perform updates with kURL", + label: "Configure Backup Storage for Snaphots", items: [ - "enterprise/updating-kurl-about", - "enterprise/updating-kurl", + "enterprise/snapshots-velero-cli-installing", + "enterprise/snapshots-configuring-hostpath", + "enterprise/snapshots-configuring-nfs", + "enterprise/snapshots-storage-destinations", + "enterprise/snapshots-velero-installing-config", ], }, - "vendor/packaging-using-tls-certs", - "enterprise/updating-tls-cert", - "enterprise/image-registry-kurl", - "enterprise/monitoring-external-prometheus", - "vendor/kurl-reset", + "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: "Helm installations with Replicated", + label: "kURL", 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", + "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: "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", + "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", ], }, { @@ -520,11 +513,12 @@ const sidebars = { "vendor/replicated-sdk-airgap", "vendor/replicated-sdk-development", "vendor/replicated-sdk-customizing", + "reference/replicated-sdk-apis", ], }, { type: "category", - label: "Preflight checks and support bundles", + label: "Preflight Checks and support bundles", items: [ "vendor/preflight-support-bundle-about", { @@ -570,36 +564,6 @@ const sidebars = { }, ], }, - { - type: "category", - 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", - ], - }, - { - type: "category", - label: "Add Replicated to CI/CD workflows", - items: [ - "vendor/ci-overview", - "vendor/ci-workflows", - "vendor/ci-workflows-github-actions", - ], - }, // Reference { type: "html", value: "
Reference
", defaultStyle: true }, @@ -611,7 +575,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", @@ -933,6 +897,7 @@ const sidebars = { ], }, ], + }; -module.exports = sidebars; \ No newline at end of file +module.exports = sidebars; diff --git a/src/components/InstallerVersionSelector/index.js b/src/components/InstallerVersionSelector/index.js new file mode 100644 index 0000000000..425098b985 --- /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 = 'embedded-cluster'; + +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..f3052baf2a --- /dev/null +++ b/src/theme/DocSidebar/Desktop/Content/index.js @@ -0,0 +1,93 @@ +/** + * Custom DocSidebar Desktop Content: version selector for embedded cluster docs + * and slide+fade transition when switching between main and embedded cluster sidebars. + */ +import React, { useState, useRef, useEffect } 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'; + +const ANIMATION_MS = 200; + +function useShowAnnouncementBar() { + const { isActive } = useAnnouncementBar(); + const [showAnnouncementBar, setShowAnnouncementBar] = useState(isActive); + useScrollPosition( + ({ scrollY }) => { + if (isActive) { + setShowAnnouncementBar(scrollY === 0); + } + }, + [isActive] + ); + return isActive && showAnnouncementBar; +} + +const SIDEBAR_KEY_STORAGE = 'docsSidebarKey'; + +function useSidebarTransition(sidebarKey) { + const [animate, setAnimate] = useState(() => { + if (typeof sessionStorage === 'undefined') return false; + const prev = sessionStorage.getItem(SIDEBAR_KEY_STORAGE); + if (!prev || prev === sidebarKey) return false; + const wasMain = prev === 'main'; + const isMain = sidebarKey === 'main'; + return wasMain || isMain; + }); + + useEffect(() => { + if (typeof sessionStorage !== 'undefined') { + sessionStorage.setItem(SIDEBAR_KEY_STORAGE, sidebarKey); + } + }, [sidebarKey]); + + useEffect(() => { + if (!animate) return; + const id = setTimeout(() => setAnimate(false), ANIMATION_MS); + return () => clearTimeout(id); + }, [animate]); + + return animate; +} + +export default function DocSidebarDesktopContent({ path, sidebar, className }) { + const showAnnouncementBar = useShowAnnouncementBar(); + const product = getProductForPath(path); + const sidebarKey = product?.key ?? 'main'; + const shouldAnimate = useSidebarTransition(sidebarKey); + + return ( +
+ {product?.key === 'embedded-cluster' && } + +
+ ); +} 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..e05a331618 --- /dev/null +++ b/src/theme/DocSidebar/Desktop/Content/styles.module.css @@ -0,0 +1,62 @@ +/** + * 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; +} + +/* Only animate when crossing between main and embedded cluster sidebar (data-animate set by JS) */ +.sidebarContentTransition[data-animate='true'][data-sidebar]:not([data-sidebar='main']) { + animation: sidebarSlideInFromRight 0.2s ease-out forwards; +} + +.sidebarContentTransition[data-animate='true'][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); + } +} + +@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); + } +} diff --git a/src/theme/DocSidebar/Mobile/index.js b/src/theme/DocSidebar/Mobile/index.js new file mode 100644 index 0000000000..37bf79f258 --- /dev/null +++ b/src/theme/DocSidebar/Mobile/index.js @@ -0,0 +1,54 @@ +/** + * Custom DocSidebar Mobile: version selector for embedded cluster docs. + */ +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?.key === 'embedded-cluster' && ( +
+ +
+ )} + + + ); +}; + +function DocSidebarMobile(props) { + return ( + + ); +} + +export default React.memo(DocSidebarMobile); diff --git a/src/utils/sidebarProductFromPath.js b/src/utils/sidebarProductFromPath.js new file mode 100644 index 0000000000..8895858e1e --- /dev/null +++ b/src/utils/sidebarProductFromPath.js @@ -0,0 +1,22 @@ +/** + * Maps current doc path to a product identifier for the sidebar. + * Used by Desktop/Mobile DocSidebar to show the version selector + * and drive the slide transition when entering/leaving the embedded cluster docs. + */ + +const EC_PREFIX = '/embedded-cluster'; +const EC_NAME = 'Embedded Cluster'; + +/** + * @param {string} path - Current doc path (e.g. /embedded-cluster/v2/embedded-overview) + * @returns {{ key: string, name: string } | null} + */ +export function getProductForPath(path) { + if (!path || typeof path !== 'string') return null; + + if (path.startsWith(EC_PREFIX)) { + return { key: 'embedded-cluster', name: EC_NAME }; + } + + return null; +} diff --git a/static/js/generate-llms.js b/static/js/generate-llms.js index e5eb239f34..8be01d03d5 100644 --- a/static/js/generate-llms.js +++ b/static/js/generate-llms.js @@ -22,6 +22,7 @@ const fs = require('fs'); const path = require('path'); const DOCS_DIR = path.join(__dirname, "../../docs"); +const EC_DOCS_DIR = path.join(__dirname, "../../embedded-cluster_versioned_docs/version-2.0.0"); const STATIC_DIR = path.join(__dirname, "../../static"); const OUTPUT_FILE = path.join(STATIC_DIR, "llms.txt"); const OUTPUT_FULL_FILE = path.join(STATIC_DIR, "llms-full.txt"); @@ -41,14 +42,14 @@ const INCLUDED_FILES = [ 'vendor/testing-about.md', 'vendor/testing-how-to.md', 'vendor/testing-supported-clusters.md', - // Embedded Cluster docs - 'enterprise/embedded-manage-nodes.mdx', - 'enterprise/installing-embedded-air-gap.mdx', - 'enterprise/installing-embedded-automation.mdx', - 'enterprise/installing-embedded-requirements.mdx', - 'enterprise/installing-embedded.mdx', - 'reference/embedded-cluster-install.mdx', - 'vendor/embedded-overview.mdx', + // Embedded Cluster docs (in embedded-cluster plugin, prefixed with ec:) + 'ec:embedded-manage-nodes.mdx', + 'ec:installing-embedded-air-gap.mdx', + 'ec:installing-embedded-automation.mdx', + 'ec:installing-embedded-requirements.mdx', + 'ec:installing-embedded.mdx', + 'ec:embedded-cluster-install.mdx', + 'ec:embedded-overview.mdx', // Helm Install docs 'vendor/helm-install-airgap.mdx', 'vendor/helm-install-overview.mdx', @@ -79,7 +80,7 @@ const INCLUDED_FILES = [ 'reference/template-functions-license-context.md', 'reference/template-functions-static-context.md', 'vendor/helm-native-about.mdx', - 'vendor/helm-native-v2-using.md', + 'vendor/helm-native-v2-using.mdx', 'vendor/helm-packaging-airgap-bundles.mdx', 'vendor/resources-annotations-templating.md', 'vendor/snapshots-overview.mdx', @@ -109,7 +110,7 @@ const INCLUDED_FILES = [ 'reference/replicated-sdk-apis.md', 'vendor/replicated-sdk-installing.mdx', 'vendor/replicated-sdk-overview.mdx', - 'vendor/replicated-sdk-customizing.md', + 'vendor/replicated-sdk-customizing.mdx', // Vendor Portal docs 'vendor/custom-domains-using.md', 'vendor/custom-domains.md', @@ -117,7 +118,7 @@ const INCLUDED_FILES = [ 'vendor/insights-app-status.md', 'vendor/instance-insights-event-data.mdx', 'vendor/licenses-about.mdx', - 'vendor/licenses-adding-custom-fields.md', + 'vendor/licenses-adding-custom-fields.mdx', 'vendor/licenses-install-types.mdx', 'vendor/licenses-reference-sdk.mdx', 'vendor/releases-about.mdx', @@ -205,7 +206,10 @@ function shouldSkipDirectory(filePath, excludedDirs = ['.history', 'templates', return excludedDirs.some(dir => filePath.includes(dir)); } -function getAllMarkdownFiles(dir, fileList = [], excludeReleaseNotes = true) { +function getAllMarkdownFiles(dir, fileList = [], excludeReleaseNotes = true, baseDir = null) { + if (!baseDir) baseDir = dir; + const urlPrefix = (baseDir === EC_DOCS_DIR) ? 'embedded-cluster/v2/' : ''; + fs.readdirSync(dir).forEach(file => { const filePath = path.join(dir, file); @@ -219,7 +223,7 @@ function getAllMarkdownFiles(dir, fileList = [], excludeReleaseNotes = true) { } if (fs.statSync(filePath).isDirectory()) { - getAllMarkdownFiles(filePath, fileList, excludeReleaseNotes); + getAllMarkdownFiles(filePath, fileList, excludeReleaseNotes, baseDir); } else if ((path.extname(file) === '.md' || path.extname(file) === '.mdx') && !file.startsWith('_')) { const content = fs.readFileSync(filePath, 'utf8'); @@ -229,8 +233,8 @@ function getAllMarkdownFiles(dir, fileList = [], excludeReleaseNotes = true) { const titleMatch = processedContent.match(/^#\s+(.+)$/m); const title = titleMatch ? titleMatch[1] : file.replace(/\.(md|mdx)$/, ''); - const relativePath = filePath - .replace(`${DOCS_DIR}/`, '') + const relativePath = urlPrefix + filePath + .replace(`${baseDir}/`, '') .replace(/\.(md|mdx)$/, ''); fileList.push({ @@ -243,15 +247,22 @@ function getAllMarkdownFiles(dir, fileList = [], excludeReleaseNotes = true) { return fileList; } -// New function to get all markdown files including release-notes (only for static folder) +// Get all markdown files including release-notes (only for static folder) function getAllMarkdownFilesForStatic(dir, fileList = []) { - return getAllMarkdownFiles(dir, fileList, false); + return getAllMarkdownFiles(dir, fileList, false, dir); } function getCuratedFiles(dir) { const fileList = []; INCLUDED_FILES.forEach(relativePath => { - const filePath = path.join(dir, relativePath); + // Files prefixed with ec: live in the embedded cluster docs directory + const isEC = relativePath.startsWith('ec:'); + const actualRelPath = isEC ? relativePath.slice(3) : relativePath; + const filePath = isEC ? path.join(EC_DOCS_DIR, actualRelPath) : path.join(dir, actualRelPath); + // For URL paths, embedded cluster docs are under embedded-cluster/v2/ + const urlPath = isEC + ? `embedded-cluster/v2/${actualRelPath.replace(/\.(md|mdx)$/, '')}` + : actualRelPath.replace(/\.(md|mdx)$/, ''); try { const content = fs.readFileSync(filePath, 'utf8'); @@ -260,12 +271,12 @@ function getCuratedFiles(dir) { const processedContent = processContent(content, filePath); const titleMatch = processedContent.match(/^#\s+(.+)$/m); - const title = titleMatch ? titleMatch[1] : path.basename(relativePath).replace(/\.(md|mdx)$/, ''); + const title = titleMatch ? titleMatch[1] : path.basename(actualRelPath).replace(/\.(md|mdx)$/, ''); const description = extractFirstSentence(processedContent); fileList.push({ - path: relativePath.replace(/\.(md|mdx)$/, ''), + path: urlPath, title: title, description: description, content: processedContent @@ -375,10 +386,15 @@ function generateLLMsTxt(files) { // Update the main execution loadPartials(DOCS_DIR); -// Get files for llms-full.txt (excluding release-notes) + +// Get files for llms-full.txt (excluding release-notes) from both docs sources const allFiles = getAllMarkdownFiles(DOCS_DIR); +getAllMarkdownFiles(EC_DOCS_DIR, allFiles); + // Get all files including release-notes for copying to static const allFilesForStatic = getAllMarkdownFilesForStatic(DOCS_DIR); +getAllMarkdownFilesForStatic(EC_DOCS_DIR, allFilesForStatic); + const curatedFiles = getCuratedFiles(DOCS_DIR); // Generate llms-full.txt (excluding release-notes)