From 81d7eb6c63339e3f0dae94967b1c064ddd62f1a6 Mon Sep 17 00:00:00 2001 From: Alvin Bryan Date: Wed, 18 Dec 2024 00:15:15 +0000 Subject: [PATCH 01/12] =?UTF-8?q?new=20docs=20theme=20=E2=9C=A8?= =?UTF-8?q?=F0=9F=8E=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- website/docusaurus.config.ts | 1702 +++++++++-------- website/src/css/academy.css | 329 ++++ website/src/css/api-docs.css | 72 + website/src/css/custom.css | 572 ++---- .../static/fonts/StyreneB-Regular-Web.woff | Bin 0 -> 44207 bytes .../static/fonts/StyreneB-Regular-Web.woff2 | Bin 0 -> 31761 bytes website/static/img/mountain-texture.png | Bin 0 -> 20979 bytes 7 files changed, 1422 insertions(+), 1253 deletions(-) create mode 100644 website/src/css/academy.css create mode 100644 website/src/css/api-docs.css create mode 100644 website/static/fonts/StyreneB-Regular-Web.woff create mode 100644 website/static/fonts/StyreneB-Regular-Web.woff2 create mode 100644 website/static/img/mountain-texture.png diff --git a/website/docusaurus.config.ts b/website/docusaurus.config.ts index 7e2226dab90d..2d901ce20562 100644 --- a/website/docusaurus.config.ts +++ b/website/docusaurus.config.ts @@ -42,882 +42,936 @@ const addDocsRoutePrefix = ({ from, ...rest }) => { }; }; -const config: Config = { - title: 'Unleash Documentation', - tagline: 'The enterprise ready feature flag service', - url: 'https://docs.getunleash.io', - baseUrl: '/', - onBrokenLinks: 'throw', - onBrokenMarkdownLinks: 'throw', - favicon: 'img/favicon.ico', - organizationName: 'Unleash', // Usually your GitHub org/user name. - projectName: 'unleash.github.io', // Usually your repo name. - trailingSlash: false, - customFields: { - // expose env vars etc here - environment: process.env.NODE_ENV, - }, - themeConfig: { - defaultMode: 'light', - disableSwitch: true, - respectPrefersColorScheme: false, - algolia: { - appId: '5U05JI5NE1', - apiKey: 'dc9c4491fcf9143ee34015f22d1dd9d6', - indexName: 'getunleash', +const getUnleashRepoStars = async () => { + const response = await fetch( + `https://api.github.com/repos/unleash/unleash`, + ); + const data = await response.json(); + + const unleashRepoStars = data.stargazers_count; + const formattedStars = + unleashRepoStars >= 1000 + ? `${(unleashRepoStars / 1000).toFixed(1)}k` + : unleashRepoStars.toString(); + return formattedStars; +}; + +export default async function createConfigAsync(): Promise { + const stars = await getUnleashRepoStars(); + return { + title: 'Unleash Documentation', + tagline: 'The enterprise ready feature flag service', + url: 'https://docs.getunleash.io', + baseUrl: '/', + onBrokenLinks: 'throw', + onBrokenMarkdownLinks: 'throw', + favicon: 'img/favicon.ico', + organizationName: 'Unleash', // Usually your GitHub org/user name. + projectName: 'unleash.github.io', // Usually your repo name. + trailingSlash: false, + customFields: { + // expose env vars etc here + environment: process.env.NODE_ENV, }, - navbar: { - logo: { - alt: 'Unleash logo', - src: 'img/unleash_logo_white.svg', - href: 'https://www.getunleash.io', + themeConfig: { + defaultMode: 'light', + disableSwitch: true, + respectPrefersColorScheme: false, + algolia: { + appId: '5U05JI5NE1', + apiKey: 'dc9c4491fcf9143ee34015f22d1dd9d6', + indexName: 'getunleash', }, - items: [ - { - type: 'doc', - position: 'right', - docId: 'quickstart', - html: 'Quickstart', + navbar: { + logo: { + alt: 'Unleash logo', + src: 'https://getunleash.io/logos/unleash_pos.svg', + srcDark: 'img/unleash_logo_white.svg', + href: 'https://www.getunleash.io', + height: '2rem', }, + items: [ + { + label: 'Product', + href: 'https://www.getunleash.io/enterprise-feature-management-platform', + position: 'left', + }, + { + label: 'Plans', + href: 'https://www.getunleash.io/plans', + position: 'left', + }, + { + label: 'Blog', + href: 'https://www.getunleash.io/blog', + position: 'left', + }, + { + type: 'dropdown', + position: 'left', + html: 'Unleash Academy', + to: 'unleash-academy/introduction', + items: [ + { + type: 'doc', + docId: 'unleash-academy/foundational', + label: 'Foundational', + }, + { + type: 'doc', + docId: 'unleash-academy/advanced-for-devs', + label: 'Advanced for Developers', + }, + { + type: 'doc', + docId: 'unleash-academy/managing-unleash-for-devops', + label: 'Managing Unleash for DevOps/Admins', + }, + ], + }, + { + type: 'dropdown', + position: 'left', + html: 'Unleash Certification', + items: [ + { + label: 'Foundational Unleash', + href: 'https://docs.google.com/forms/d/1iPUk2I0k5xMzicn9aLMcPF3b9ub3ZwdVjRxCxWxV7js/viewform', + }, + { + label: 'Advanced Unleash for Developers', + href: 'https://docs.google.com/forms/d/1NUL9hyO8Ys916TB6fPV3-jkvD97OmPXZ8_TO84Wjqgc/viewform', + }, + { + label: 'Managing Unleash for DevOps/Admins', + href: 'https://docs.google.com/forms/d/1JlIqmXI3P7dj0n-OiUs2IYsYXgmqw23BChaemlSgHJA/viewform', + }, + ], + }, + { + type: 'search', + position: 'right', + }, + { + label: 'Sign in', + href: 'https://app.unleash-hosted.com/sign-in', + position: 'right', + }, + { + type: 'html', + position: 'right', + value: ` + + Stars + ${stars} + `, + }, + { + label: 'Get a demo', + href: 'https://www.getunleash.io/plans/enterprise', + position: 'right', + }, + ], + }, + prism: { + additionalLanguages: [ + 'csharp', + 'dart', + 'java', + 'php', + 'ruby', + 'bash', + 'diff', + ], + }, + languageTabs: [ { - type: 'doc', - position: 'right', - docId: 'welcome', - html: 'Docs', + highlight: 'bash', + language: 'curl', }, { - type: 'html', - value: 'Product', - position: 'right', + highlight: 'python', + language: 'python', + variant: 'requests', }, { - type: 'html', - value: 'Plans', - position: 'right', + highlight: 'go', + language: 'go', }, { - type: 'html', - value: 'Blog', - position: 'right', + highlight: 'javascript', + language: 'nodejs', + variant: 'native', }, { - type: 'html', - position: 'right', - value: '', + highlight: 'ruby', + language: 'ruby', }, { - type: 'dropdown', - position: 'right', - html: 'Unleash Academy', - to: 'unleash-academy/introduction', - items: [ - { - type: 'doc', - docId: 'unleash-academy/foundational', - label: 'Foundational', - }, - { - type: 'doc', - docId: 'unleash-academy/advanced-for-devs', - label: 'Advanced for Developers', - }, - { - type: 'doc', - docId: 'unleash-academy/managing-unleash-for-devops', - label: 'Managing Unleash for DevOps/Admins', - }, - ], + highlight: 'csharp', + language: 'csharp', + variant: 'httpclient', }, - { - type: 'dropdown', - position: 'right', - html: 'Unleash Certification', - items: [ - { - label: 'Foundational Unleash', - href: 'https://docs.google.com/forms/d/1iPUk2I0k5xMzicn9aLMcPF3b9ub3ZwdVjRxCxWxV7js/viewform', - }, - { - label: 'Advanced Unleash for Developers', - href: 'https://docs.google.com/forms/d/1NUL9hyO8Ys916TB6fPV3-jkvD97OmPXZ8_TO84Wjqgc/viewform', - }, - { - label: 'Managing Unleash for DevOps/Admins', - href: 'https://docs.google.com/forms/d/1JlIqmXI3P7dj0n-OiUs2IYsYXgmqw23BChaemlSgHJA/viewform', - }, - ], + highlight: 'php', + language: 'php', }, { - type: 'html', - position: 'right', - value: '', + highlight: 'java', + language: 'java', }, { - type: 'html', - value: 'Sign in', - position: 'right', + highlight: 'powershell', + language: 'powershell', }, - { - type: 'html', - position: 'right', - value: '', + ], + footer: { + links: [ + { + title: 'Feature Flag use cases', + items: [ + { + label: 'Secure, scalable feature flags', + to: 'EMPTY LINK', + }, + { + label: 'Rollbacks', + to: 'EMPTY LINK', + }, + { + label: 'Fedramp, SOC2, ISO2700 compliance', + to: 'EMPTY LINK', + }, + { + label: 'Progressive or gradual rollouts', + to: 'EMPTY LINK', + }, + { + label: 'Trunk-based development', + to: 'EMPTY LINK', + }, + { + label: 'Software kill switches', + to: 'EMPTY LINK', + }, + { + label: 'A/B testing', + to: 'EMPTY LINK', + }, + { + label: 'Feature Management', + to: 'EMPTY LINK', + }, + { + label: 'Canary releases', + to: 'EMPTY LINK', + }, + ], + }, + { + title: 'Product', + items: [ + { + label: 'Docs', + to: '/', + }, + { + label: 'Unleash on GitHub', + href: 'https://github.com/Unleash/unleash', + }, + { + label: 'Roadmap', + href: 'https://github.com/orgs/Unleash/projects/10', + }, + { + label: 'Unleash help center', + href: 'https://getunleash.zendesk.com/hc/en-gb', + }, + ], + }, + { + title: 'Community', + items: [ + { + label: 'GitHub discussions', + href: 'https://github.com/unleash/unleash/discussions/', + }, + { + label: 'Slack', + href: 'https://slack.unleash.run/', + }, + { + label: 'Stack Overflow', + href: 'https://stackoverflow.com/questions/tagged/unleash', + }, + { + label: 'Twitter', + href: 'https://twitter.com/getunleash', + }, + ], + }, + ], + copyright: `Copyright © ${new Date().getFullYear()} Unleash. Built with Docusaurus.`, + }, + image: 'img/logo.png', + imageZoom: { + // Optional medium-zoom options at + // https://www.npmjs.com/package/medium-zoom#options + options: { + background: 'var(--ifm-background-color)', }, + }, + }, + presets: [ + [ + '@docusaurus/preset-classic', { - href: 'https://github.com/Unleash/unleash', - position: 'right', - className: 'header-github-link', - 'aria-label': 'Unleash GitHub repository', + docs: { + // Please change this to your repo. + editUrl: + 'https://github.com/Unleash/unleash/edit/main/website/', + routeBasePath: '/', + remarkPlugins: [[pluginNpm2Yarn, { sync: true }]], + docItemComponent: '@theme/ApiItem', + sidebarPath: './sidebars.ts', + }, + theme: { + customCss: './src/css/custom.css', + }, + googleAnalytics: { + trackingID: 'UA-134882379-1', + }, + googleTagManager: { + containerId: 'GTM-KV5PRR2', + }, + sitemap: { + changefreq: 'weekly', + lastmod: 'date', + priority: 0.5, + createSitemapItems: async (params) => { + const { defaultCreateSitemapItems, ...rest } = + params; + const items = await defaultCreateSitemapItems(rest); + return items.filter( + (item) => !item.url.includes('/page/'), + ); + }, + }, }, ], - }, - prism: { - additionalLanguages: [ - 'csharp', - 'dart', - 'java', - 'php', - 'ruby', - 'bash', - 'diff', - ], - }, - languageTabs: [ - { - highlight: 'bash', - language: 'curl', - }, - { - highlight: 'python', - language: 'python', - variant: 'requests', - }, - { - highlight: 'go', - language: 'go', - }, - { - highlight: 'javascript', - language: 'nodejs', - variant: 'native', - }, - { - highlight: 'ruby', - language: 'ruby', - }, - { - highlight: 'csharp', - language: 'csharp', - variant: 'httpclient', - }, - { - highlight: 'php', - language: 'php', - }, - { - highlight: 'java', - language: 'java', - }, - { - highlight: 'powershell', - language: 'powershell', - }, ], - footer: { - style: 'dark', - links: [ + plugins: [ + [ + // heads up to anyone making redirects: + // + // remember that redirects only work in production and not in + // development, as mentioned in the docs + // https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-client-redirects/ + '@docusaurus/plugin-client-redirects', { - title: 'Product', - items: [ + fromExtensions: ['html', 'htm'], + redirects: [ + { + to: '/how-to/how-to-create-api-tokens', + from: [ + '/user_guide/api-token', + '/deploy/user_guide/api-token', + ], + }, + { + from: '/advanced/audit_log', + to: '/reference/events', + }, + { + from: '/reference/event-log', + to: '/reference/events', + }, + { + from: '/reference/event-types', + to: '/reference/events', + }, + { + from: '/advanced/api_access', + to: '/how-to/how-to-use-the-admin-api', + }, + { + from: '/advanced/archived_toggles', + to: '/reference/feature-toggles', + }, + { + from: [ + '/advanced/custom-activation-strategy', + '/advanced/custom_activation_strategy', + ], + to: '/reference/custom-activation-strategies', + }, + { + from: '/advanced/feature_toggle_types', + to: '/reference/feature-toggles', + }, + { + from: [ + '/toggle_variants', + '/advanced/feature_toggle_variants', + '/advanced/toggle_variants', + ], + to: '/reference/feature-toggle-variants', + }, + { + from: [ + '/advanced/impression-data', + '/advanced/impression_data', + ], + to: '/reference/impression-data', + }, + { + from: '/advanced/stickiness', + to: '/reference/stickiness', + }, + { + from: '/advanced/sso-google', + to: '/how-to/how-to-add-sso-google', + }, + { + from: '/advanced/sso-open-id-connect', + to: '/how-to/how-to-add-sso-open-id-connect', + }, + { + from: '/advanced/sso-saml-keycloak', + to: '/how-to/how-to-add-sso-saml-keycloak', + }, + { + from: '/advanced/sso-saml', + to: '/how-to/how-to-add-sso-saml', + }, + { + from: '/advanced/enterprise-authentication', + to: '/reference/sso', + }, + { + from: ['/addons', '/reference/addons'], + to: '/reference/integrations', + }, + { + from: [ + '/addons/datadog', + '/reference/addons/datadog', + ], + to: '/reference/integrations/datadog', + }, + { + from: ['/addons/slack', '/reference/addons/slack'], + to: '/reference/integrations/slack', + }, + { + from: [ + '/addons/slack-app', + '/reference/addons/slack-app', + ], + to: '/reference/integrations/slack-app', + }, + { + from: ['/addons/teams', '/reference/addons/teams'], + to: '/reference/integrations/teams', + }, + { + from: [ + '/addons/webhook', + '/reference/addons/webhook', + ], + to: '/reference/integrations/webhook', + }, + { + from: '/guides/feature_updates_to_slack', + to: '/how-to/how-to-send-feature-updates-to-slack-deprecated', + }, + { + from: [ + '/integrations/integrations', + '/integrations', + ], + to: '/reference/integrations', + }, + { + from: '/integrations/jira_server_plugin_installation', + to: '/reference/integrations/jira-server-plugin-installation', + }, + { + from: '/integrations/jira_server_plugin_usage', + to: '/reference/integrations/jira-server-plugin-usage', + }, + { + from: [ + '/sdks', + '/user_guide/client-sdk', + '/client-sdk', + '/user_guide/connect_sdk', + '/sdks/community', + ], + to: '/reference/sdks', + }, + { + from: '/sdks/go_sdk', + to: '/reference/sdks/go', + }, + { + from: '/sdks/java_sdk', + to: '/reference/sdks/java', + }, + { + from: '/sdks/node_sdk', + to: '/reference/sdks/node', + }, + { + from: '/sdks/php_sdk', + to: '/reference/sdks/php', + }, + { + from: '/sdks/python_sdk', + to: '/reference/sdks/python', + }, + { + from: '/sdks/dot_net_sdk', + to: '/reference/sdks/dotnet', + }, + { + from: '/sdks/ruby_sdk', + to: '/reference/sdks/ruby', + }, + { + from: '/sdks/android_proxy_sdk', + to: '/reference/sdks/android-proxy', + }, + { + from: '/sdks/proxy-ios', + to: '/reference/sdks/ios-proxy', + }, + { + from: [ + '/sdks/proxy-javascript', + '/sdks/javascript-browser', + ], + to: '/reference/sdks/javascript-browser', + }, + { + from: ['/sdks/proxy-react', '/sdks/react'], + to: '/reference/sdks/react', + }, + { + from: '/sdks/proxy-vue', + to: '/reference/sdks/vue', + }, + { + from: '/sdks/proxy-svelte', + to: '/reference/sdks/svelte', + }, + { + from: [ + '/user_guide/native_apps', + '/user_guide/proxy-api', + '/sdks/unleash-proxy', + ], + to: '/reference/unleash-proxy', + }, + { + to: '/reference/activation-strategies', + from: [ + '/user_guide/control_rollout', + '/user_guide/activation_strategy', + ], + }, + { + from: '/user_guide/environments', + to: '/reference/environments', + }, + { + from: '/user_guide/projects', + to: '/reference/projects', + }, + { + from: ['/user_guide/rbac', '/advanced/groups'], + to: '/reference/rbac', + }, + { + from: '/user_guide/technical_debt', + to: '/reference/technical-debt', + }, + { + from: '/user_guide/unleash_context', + to: '/reference/unleash-context', + }, + { + from: '/user_guide/user-management', + to: '/how-to/how-to-add-users-to-unleash', + }, + { + from: '/user_guide/v4-whats-new', + to: '/reference/whats-new-v4', + }, + { + from: [ + '/user_guide/important-concepts', + '/tutorials/important-concepts', + '/reference/concepts/', + ], + to: '/reference', + }, + { + from: [ + '/user_guide/quickstart', + '/docs/getting_started', + '/tutorials/quickstart', + '/tutorials/getting-started', + ], + to: '/quickstart', + }, + { + from: '/api/basic-auth', + to: '/reference/api/legacy/unleash/basic-auth', + }, + { + from: '/api', + to: '/reference/api/legacy/unleash', + }, + { + from: '/api/admin/addons', + to: '/reference/api/legacy/unleash/admin/addons', + }, + { + from: '/api/admin/context', + to: '/reference/api/legacy/unleash/admin/context', + }, + { + from: '/api/admin/events', + to: '/reference/api/legacy/unleash/admin/events', + }, + { + from: '/api/admin/feature-toggles-v2', + to: '/reference/api/legacy/unleash/admin/features-v2', + }, + { + from: '/api/admin/feature-types', + to: '/reference/api/legacy/unleash/admin/feature-types', + }, + { + from: '/api/admin/features', + to: '/reference/api/legacy/unleash/admin/features', + }, + { + from: '/api/admin/features-archive', + to: '/reference/api/legacy/unleash/admin/archive', + }, + { + from: '/api/admin/metrics', + to: '/reference/api/legacy/unleash/admin/metrics', + }, + { + from: '/api/admin/projects', + to: '/reference/api/legacy/unleash/admin/projects', + }, + { + from: '/api/admin/segments', + to: '/reference/api/legacy/unleash/admin/segments', + }, + { + from: '/api/admin/state', + to: '/reference/api/legacy/unleash/admin/state', + }, + { + from: '/api/admin/strategies', + to: '/reference/api/legacy/unleash/admin/strategies', + }, + { + from: '/api/admin/tags', + to: '/reference/api/legacy/unleash/admin/tags', + }, + { + from: '/api/admin/user-admin', + to: '/reference/api/legacy/unleash/admin/user-admin', + }, + { + from: '/api/client/features', + to: '/reference/api/legacy/unleash/client/features', + }, + { + from: '/api/client/metrics', + to: '/reference/api/legacy/unleash/client/metrics', + }, + { + from: '/api/client/register', + to: '/reference/api/legacy/unleash/client/register', + }, + { + from: '/api/internal/internal', + to: '/reference/api/legacy/unleash/internal/prometheus', + }, + { + from: '/api/internal/health', + to: '/reference/api/legacy/unleash/internal/health', + }, { - label: 'Docs', + from: '/help', to: '/', }, { - label: 'Unleash on GitHub', - href: 'https://github.com/Unleash/unleash', + from: [ + '/topics/feature-flags/tutorials', + '/tutorials', + ], + to: '/feature-flag-tutorials', }, { - label: 'Roadmap', - href: 'https://github.com/orgs/Unleash/projects/10', + from: ['/tutorials/academy', '/unleash-academy'], + to: '/unleash-academy/introduction', }, { - label: 'Unleash help center', - href: 'https://getunleash.zendesk.com/hc/en-gb', + from: '/tutorials/academy-foundational', + to: '/unleash-academy/foundational', }, - ], - }, - { - title: 'Community', - items: [ { - label: 'GitHub discussions', - href: 'https://github.com/unleash/unleash/discussions/', + from: '/tutorials/academy-advanced-for-devs', + to: '/unleash-academy/advanced-for-devs', }, { - label: 'Slack', - href: 'https://slack.unleash.run/', + from: '/tutorials/academy-managing-unleash-for-devops', + to: '/unleash-academy/managing-unleash-for-devops', }, { - label: 'Stack Overflow', - href: 'https://stackoverflow.com/questions/tagged/unleash', + from: '/developer-guide', + to: '/contributing', }, { - label: 'Twitter', - href: 'https://twitter.com/getunleash', + from: [ + '/tutorials/unleash-overview', + '/user_guide/unleash_overview', + ], + to: '/understanding-unleash/unleash-overview', + }, + { + from: [ + '/tutorials/managing-constraints', + '/topics/managing-constraints', + ], + to: '/understanding-unleash/managing-constraints', + }, + { + from: [ + '/tutorials/the-anatomy-of-unleash', + '/topics/the-anatomy-of-unleash', + ], + to: '/understanding-unleash/the-anatomy-of-unleash', + }, + { + from: [ + '/tutorials/proxy-hosting', + '/topics/proxy-hosting', + ], + to: '/understanding-unleash/proxy-hosting', + }, + { + from: [ + '/tutorials/data-collection', + '/topics/data-collection', + ], + to: '/understanding-unleash/data-collection', }, - ], - }, - ], - copyright: `Copyright © ${new Date().getFullYear()} Unleash. Built with Docusaurus.`, - logo: { - src: 'img/logo.svg', - alt: 'Unleash logo', - }, - }, - image: 'img/logo.png', - imageZoom: { - // Optional medium-zoom options at - // https://www.npmjs.com/package/medium-zoom#options - options: { - background: 'var(--ifm-background-color)', - }, - }, - }, - presets: [ - [ - '@docusaurus/preset-classic', - { - docs: { - // Please change this to your repo. - editUrl: - 'https://github.com/Unleash/unleash/edit/main/website/', - routeBasePath: '/', - remarkPlugins: [[pluginNpm2Yarn, { sync: true }]], - docItemComponent: '@theme/ApiItem', - sidebarPath: './sidebars.ts', - }, - theme: { - customCss: './src/css/custom.css', - }, - googleAnalytics: { - trackingID: 'UA-134882379-1', - }, - googleTagManager: { - containerId: 'GTM-KV5PRR2', - }, - sitemap: { - changefreq: 'weekly', - lastmod: 'date', - priority: 0.5, - createSitemapItems: async (params) => { - const { defaultCreateSitemapItems, ...rest } = params; - const items = await defaultCreateSitemapItems(rest); - return items.filter( - (item) => !item.url.includes('/page/'), - ); - }, - }, - }, - ], - ], - plugins: [ - [ - // heads up to anyone making redirects: - // - // remember that redirects only work in production and not in - // development, as mentioned in the docs - // https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-client-redirects/ - '@docusaurus/plugin-client-redirects', - { - fromExtensions: ['html', 'htm'], - redirects: [ - { - to: '/how-to/how-to-create-api-tokens', - from: [ - '/user_guide/api-token', - '/deploy/user_guide/api-token', - ], - }, - { - from: '/advanced/audit_log', - to: '/reference/events', - }, - { - from: '/reference/event-log', - to: '/reference/events', - }, - { - from: '/reference/event-types', - to: '/reference/events', - }, - { - from: '/advanced/api_access', - to: '/how-to/how-to-use-the-admin-api', - }, - { - from: '/advanced/archived_toggles', - to: '/reference/feature-toggles', - }, - { - from: [ - '/advanced/custom-activation-strategy', - '/advanced/custom_activation_strategy', - ], - to: '/reference/custom-activation-strategies', - }, - { - from: '/advanced/feature_toggle_types', - to: '/reference/feature-toggles', - }, - { - from: [ - '/toggle_variants', - '/advanced/feature_toggle_variants', - '/advanced/toggle_variants', - ], - to: '/reference/feature-toggle-variants', - }, - { - from: [ - '/advanced/impression-data', - '/advanced/impression_data', - ], - to: '/reference/impression-data', - }, - { - from: '/advanced/stickiness', - to: '/reference/stickiness', - }, - { - from: '/advanced/sso-google', - to: '/how-to/how-to-add-sso-google', - }, - { - from: '/advanced/sso-open-id-connect', - to: '/how-to/how-to-add-sso-open-id-connect', - }, - { - from: '/advanced/sso-saml-keycloak', - to: '/how-to/how-to-add-sso-saml-keycloak', - }, - { - from: '/advanced/sso-saml', - to: '/how-to/how-to-add-sso-saml', - }, - { - from: '/advanced/enterprise-authentication', - to: '/reference/sso', - }, - { - from: ['/addons', '/reference/addons'], - to: '/reference/integrations', - }, - { - from: ['/addons/datadog', '/reference/addons/datadog'], - to: '/reference/integrations/datadog', - }, - { - from: ['/addons/slack', '/reference/addons/slack'], - to: '/reference/integrations/slack', - }, - { - from: [ - '/addons/slack-app', - '/reference/addons/slack-app', - ], - to: '/reference/integrations/slack-app', - }, - { - from: ['/addons/teams', '/reference/addons/teams'], - to: '/reference/integrations/teams', - }, - { - from: ['/addons/webhook', '/reference/addons/webhook'], - to: '/reference/integrations/webhook', - }, - { - from: '/guides/feature_updates_to_slack', - to: '/how-to/how-to-send-feature-updates-to-slack-deprecated', - }, - { - from: ['/integrations/integrations', '/integrations'], - to: '/reference/integrations', - }, - { - from: '/integrations/jira_server_plugin_installation', - to: '/reference/integrations/jira-server-plugin-installation', - }, - { - from: '/integrations/jira_server_plugin_usage', - to: '/reference/integrations/jira-server-plugin-usage', - }, - { - from: [ - '/sdks', - '/user_guide/client-sdk', - '/client-sdk', - '/user_guide/connect_sdk', - '/sdks/community', - ], - to: '/reference/sdks', - }, - { - from: '/sdks/go_sdk', - to: '/reference/sdks/go', - }, - { - from: '/sdks/java_sdk', - to: '/reference/sdks/java', - }, - { - from: '/sdks/node_sdk', - to: '/reference/sdks/node', - }, - { - from: '/sdks/php_sdk', - to: '/reference/sdks/php', - }, - { - from: '/sdks/python_sdk', - to: '/reference/sdks/python', - }, - { - from: '/sdks/dot_net_sdk', - to: '/reference/sdks/dotnet', - }, - { - from: '/sdks/ruby_sdk', - to: '/reference/sdks/ruby', - }, - { - from: '/sdks/android_proxy_sdk', - to: '/reference/sdks/android-proxy', - }, - { - from: '/sdks/proxy-ios', - to: '/reference/sdks/ios-proxy', - }, - { - from: [ - '/sdks/proxy-javascript', - '/sdks/javascript-browser', - ], - to: '/reference/sdks/javascript-browser', - }, - { - from: ['/sdks/proxy-react', '/sdks/react'], - to: '/reference/sdks/react', - }, - { - from: '/sdks/proxy-vue', - to: '/reference/sdks/vue', - }, - { - from: '/sdks/proxy-svelte', - to: '/reference/sdks/svelte', - }, - { - from: [ - '/user_guide/native_apps', - '/user_guide/proxy-api', - '/sdks/unleash-proxy', - ], - to: '/reference/unleash-proxy', - }, - { - to: '/reference/activation-strategies', - from: [ - '/user_guide/control_rollout', - '/user_guide/activation_strategy', - ], - }, - { - from: '/user_guide/environments', - to: '/reference/environments', - }, - { - from: '/user_guide/projects', - to: '/reference/projects', - }, - { - from: ['/user_guide/rbac', '/advanced/groups'], - to: '/reference/rbac', - }, - { - from: '/user_guide/technical_debt', - to: '/reference/technical-debt', - }, - { - from: '/user_guide/unleash_context', - to: '/reference/unleash-context', - }, - { - from: '/user_guide/user-management', - to: '/how-to/how-to-add-users-to-unleash', - }, - { - from: '/user_guide/v4-whats-new', - to: '/reference/whats-new-v4', - }, - { - from: [ - '/user_guide/important-concepts', - '/tutorials/important-concepts', - '/reference/concepts/', - ], - to: '/reference', - }, - { - from: [ - '/user_guide/quickstart', - '/docs/getting_started', - '/tutorials/quickstart', - '/tutorials/getting-started', - ], - to: '/quickstart', - }, - { - from: '/api/basic-auth', - to: '/reference/api/legacy/unleash/basic-auth', - }, - { - from: '/api', - to: '/reference/api/legacy/unleash', - }, - { - from: '/api/admin/addons', - to: '/reference/api/legacy/unleash/admin/addons', - }, - { - from: '/api/admin/context', - to: '/reference/api/legacy/unleash/admin/context', - }, - { - from: '/api/admin/events', - to: '/reference/api/legacy/unleash/admin/events', - }, - { - from: '/api/admin/feature-toggles-v2', - to: '/reference/api/legacy/unleash/admin/features-v2', - }, - { - from: '/api/admin/feature-types', - to: '/reference/api/legacy/unleash/admin/feature-types', - }, - { - from: '/api/admin/features', - to: '/reference/api/legacy/unleash/admin/features', - }, - { - from: '/api/admin/features-archive', - to: '/reference/api/legacy/unleash/admin/archive', - }, - { - from: '/api/admin/metrics', - to: '/reference/api/legacy/unleash/admin/metrics', - }, - { - from: '/api/admin/projects', - to: '/reference/api/legacy/unleash/admin/projects', - }, - { - from: '/api/admin/segments', - to: '/reference/api/legacy/unleash/admin/segments', - }, - { - from: '/api/admin/state', - to: '/reference/api/legacy/unleash/admin/state', - }, - { - from: '/api/admin/strategies', - to: '/reference/api/legacy/unleash/admin/strategies', - }, - { - from: '/api/admin/tags', - to: '/reference/api/legacy/unleash/admin/tags', - }, - { - from: '/api/admin/user-admin', - to: '/reference/api/legacy/unleash/admin/user-admin', - }, - { - from: '/api/client/features', - to: '/reference/api/legacy/unleash/client/features', - }, - { - from: '/api/client/metrics', - to: '/reference/api/legacy/unleash/client/metrics', - }, - { - from: '/api/client/register', - to: '/reference/api/legacy/unleash/client/register', - }, - { - from: '/api/internal/internal', - to: '/reference/api/legacy/unleash/internal/prometheus', - }, - { - from: '/api/internal/health', - to: '/reference/api/legacy/unleash/internal/health', - }, - { - from: '/help', - to: '/', - }, - { - from: ['/topics/feature-flags/tutorials', '/tutorials'], - to: '/feature-flag-tutorials', - }, - { - from: ['/tutorials/academy', '/unleash-academy'], - to: '/unleash-academy/introduction', - }, - { - from: '/tutorials/academy-foundational', - to: '/unleash-academy/foundational', - }, - { - from: '/tutorials/academy-advanced-for-devs', - to: '/unleash-academy/advanced-for-devs', - }, - { - from: '/tutorials/academy-managing-unleash-for-devops', - to: '/unleash-academy/managing-unleash-for-devops', - }, - { - from: '/developer-guide', - to: '/contributing', - }, - { - from: [ - '/tutorials/unleash-overview', - '/user_guide/unleash_overview', - ], - to: '/understanding-unleash/unleash-overview', - }, - { - from: [ - '/tutorials/managing-constraints', - '/topics/managing-constraints', - ], - to: '/understanding-unleash/managing-constraints', - }, - { - from: [ - '/tutorials/the-anatomy-of-unleash', - '/topics/the-anatomy-of-unleash', - ], - to: '/understanding-unleash/the-anatomy-of-unleash', - }, - { - from: [ - '/tutorials/proxy-hosting', - '/topics/proxy-hosting', - ], - to: '/understanding-unleash/proxy-hosting', - }, - { - from: [ - '/tutorials/data-collection', - '/topics/data-collection', - ], - to: '/understanding-unleash/data-collection', - }, - { - from: '/how-to/how-to-troubleshoot-flag-exposure', - to: '/using-unleash/troubleshooting/flag-exposure', - }, - { - from: '/how-to/how-to-troubleshoot-flag-not-returned', - to: '/using-unleash/troubleshooting/flag-not-returned', - }, - { - from: '/how-to/how-to-troubleshoot-cors', - to: '/using-unleash/troubleshooting/cors', - }, - { - from: '/how-to/how-to-troubleshoot-https', - to: '/using-unleash/troubleshooting/https', - }, - { - from: '/how-to/how-to-troubleshoot-feature-not-available', - to: '/using-unleash/troubleshooting/feature-not-available', - }, - { - from: ['/reference/deploy', '/deploy'], - to: '/using-unleash/deploy', - }, - { - from: [ - '/reference/deploy/getting-started', - '/deploy/getting_started', - ], - to: '/using-unleash/deploy/getting-started', - }, - { - from: [ - '/reference/deploy/configuring-unleash', - '/deploy/configuring_unleash', - ], - to: '/using-unleash/deploy/configuring-unleash', - }, - { - from: [ - '/reference/deploy/database-setup', - '/deploy/database-setup', - ], - to: '/using-unleash/deploy/database-setup', - }, - { - from: [ - '/reference/deploy/database-backup', - '/deploy/database-backup', - ], - to: '/using-unleash/deploy/database-backup', - }, - { - from: [ - '/reference/deploy/email-service', - '/deploy/email', - ], - to: '/using-unleash/deploy/email-service', - }, - { - from: [ - '/reference/deploy/google-auth-hook', - '/deploy/google_auth', - ], - to: '/using-unleash/deploy/google-auth-hook', - }, - { - from: [ - '/deploy/migration_guide', - '/reference/deploy/migration-guide', - ], - to: '/using-unleash/deploy/upgrading-unleash', - }, - { - from: [ - '/reference/deploy/securing-unleash', - '/deploy/securing_unleash', - ], - to: '/using-unleash/deploy/securing-unleash', - }, - { - from: [ - '/reference/deploy/import-export', - '/deploy/import_export', - ], - to: '/how-to/how-to-import-export', - }, - { - from: [ - '/reference/deploy/environment-import-export', - '/deploy/environment-import-export', - ], - to: '/how-to/how-to-environment-import-export', - }, - { - from: [ - '/topics/feature-flags/runtime-control', - '/topics/feature-flags/never-expose-pii', - '/topics/feature-flags/evaluate-flags-close-to-user', - '/topics/feature-flags/scale-horizontally', - '/topics/feature-flags/limit-payloads', - '/topics/feature-flags/availability-over-consistency', - '/topics/feature-flags/short-lived-feature-flags', - '/topics/feature-flags/unique-names', - '/topics/feature-flags/democratize-feature-flag-access', - '/topics/feature-flags/prioritize-ux', - '/topics/feature-flags/enable-traceability', - ], - to: '/topics/feature-flags/feature-flag-best-practices', - }, - { - from: [ - '/topics/feature-flag-migration/feature-flag-migration-scope', - '/topics/feature-flag-migration/business-case-feature-flag-migration', - '/topics/feature-flag-migration/planning-feature-flag-migration', - '/topics/feature-flag-migration/how-to-execute-feature-flag-migration', - '/topics/feature-flag-migration/onbording-users-to-feature-flag-service', - ], - to: '/topics/feature-flag-migration/feature-flag-migration-best-practices', - }, - { - from: '/topics/a-b-testing', - to: '/feature-flag-tutorials/use-cases/a-b-testing', + { + from: '/how-to/how-to-troubleshoot-flag-exposure', + to: '/using-unleash/troubleshooting/flag-exposure', + }, + { + from: '/how-to/how-to-troubleshoot-flag-not-returned', + to: '/using-unleash/troubleshooting/flag-not-returned', + }, + { + from: '/how-to/how-to-troubleshoot-cors', + to: '/using-unleash/troubleshooting/cors', + }, + { + from: '/how-to/how-to-troubleshoot-https', + to: '/using-unleash/troubleshooting/https', + }, + { + from: '/how-to/how-to-troubleshoot-feature-not-available', + to: '/using-unleash/troubleshooting/feature-not-available', + }, + { + from: ['/reference/deploy', '/deploy'], + to: '/using-unleash/deploy', + }, + { + from: [ + '/reference/deploy/getting-started', + '/deploy/getting_started', + ], + to: '/using-unleash/deploy/getting-started', + }, + { + from: [ + '/reference/deploy/configuring-unleash', + '/deploy/configuring_unleash', + ], + to: '/using-unleash/deploy/configuring-unleash', + }, + { + from: [ + '/reference/deploy/database-setup', + '/deploy/database-setup', + ], + to: '/using-unleash/deploy/database-setup', + }, + { + from: [ + '/reference/deploy/database-backup', + '/deploy/database-backup', + ], + to: '/using-unleash/deploy/database-backup', + }, + { + from: [ + '/reference/deploy/email-service', + '/deploy/email', + ], + to: '/using-unleash/deploy/email-service', + }, + { + from: [ + '/reference/deploy/google-auth-hook', + '/deploy/google_auth', + ], + to: '/using-unleash/deploy/google-auth-hook', + }, + { + from: [ + '/deploy/migration_guide', + '/reference/deploy/migration-guide', + ], + to: '/using-unleash/deploy/upgrading-unleash', + }, + { + from: [ + '/reference/deploy/securing-unleash', + '/deploy/securing_unleash', + ], + to: '/using-unleash/deploy/securing-unleash', + }, + { + from: [ + '/reference/deploy/import-export', + '/deploy/import_export', + ], + to: '/how-to/how-to-import-export', + }, + { + from: [ + '/reference/deploy/environment-import-export', + '/deploy/environment-import-export', + ], + to: '/how-to/how-to-environment-import-export', + }, + { + from: [ + '/topics/feature-flags/runtime-control', + '/topics/feature-flags/never-expose-pii', + '/topics/feature-flags/evaluate-flags-close-to-user', + '/topics/feature-flags/scale-horizontally', + '/topics/feature-flags/limit-payloads', + '/topics/feature-flags/availability-over-consistency', + '/topics/feature-flags/short-lived-feature-flags', + '/topics/feature-flags/unique-names', + '/topics/feature-flags/democratize-feature-flag-access', + '/topics/feature-flags/prioritize-ux', + '/topics/feature-flags/enable-traceability', + ], + to: '/topics/feature-flags/feature-flag-best-practices', + }, + { + from: [ + '/topics/feature-flag-migration/feature-flag-migration-scope', + '/topics/feature-flag-migration/business-case-feature-flag-migration', + '/topics/feature-flag-migration/planning-feature-flag-migration', + '/topics/feature-flag-migration/how-to-execute-feature-flag-migration', + '/topics/feature-flag-migration/onbording-users-to-feature-flag-service', + ], + to: '/topics/feature-flag-migration/feature-flag-migration-best-practices', + }, + { + from: '/topics/a-b-testing', + to: '/feature-flag-tutorials/use-cases/a-b-testing', + }, + ].map(addDocsRoutePrefix), // add /docs prefixes + createRedirects: (toPath) => { + if ( + toPath.indexOf('/docs/') === -1 && + toPath.indexOf('index.html') === -1 + ) { + return `/docs/${toPath}`; + } }, - ].map(addDocsRoutePrefix), // add /docs prefixes - createRedirects: (toPath) => { - if ( - toPath.indexOf('/docs/') === -1 && - toPath.indexOf('index.html') === -1 - ) { - return `/docs/${toPath}`; - } }, - }, - ], - [ - 'docusaurus-plugin-openapi-docs', - { - id: 'api-operations', - docsPluginId: 'classic', - config: { - server: { - specPath: 'docs/generated/openapi.json', - outputDir: 'docs/reference/api/unleash', - sidebarOptions: { - groupPathsBy: 'tag', - categoryLinkSource: 'tag', + ], + [ + 'docusaurus-plugin-openapi-docs', + { + id: 'api-operations', + docsPluginId: 'classic', + config: { + server: { + specPath: 'docs/generated/openapi.json', + outputDir: 'docs/reference/api/unleash', + sidebarOptions: { + groupPathsBy: 'tag', + categoryLinkSource: 'tag', + }, }, }, }, - }, + ], + [ + 'docusaurus-plugin-remote-content', + { + // more info at https://github.com/rdilweb/docusaurus-plugin-remote-content#options + name: 'content-sdks', + sourceBaseUrl: 'https://raw.githubusercontent.com/Unleash/', // gets prepended to all of the documents when fetching + outDir: 'docs/generated', // the base directory to output to. + documents: sdks.urls, // the file names to download + modifyContent: sdks.modifyContent, + noRuntimeDownloads: true, + }, + ], + [ + 'docusaurus-plugin-remote-content', + { + // more info at https://github.com/rdilweb/docusaurus-plugin-remote-content#options + name: 'content-external', + sourceBaseUrl: 'https://raw.githubusercontent.com/Unleash/', // gets prepended to all of the documents when fetching + outDir: 'docs/generated/', // the base directory to output to. + documents: edgeAndProxy.urls, // the file names to download + modifyContent: edgeAndProxy.modifyContent, + noRuntimeDownloads: true, + }, + ], + 'plugin-image-zoom', ], - [ - 'docusaurus-plugin-remote-content', - { - // more info at https://github.com/rdilweb/docusaurus-plugin-remote-content#options - name: 'content-sdks', - sourceBaseUrl: 'https://raw.githubusercontent.com/Unleash/', // gets prepended to all of the documents when fetching - outDir: 'docs/generated', // the base directory to output to. - documents: sdks.urls, // the file names to download - modifyContent: sdks.modifyContent, - noRuntimeDownloads: true, - }, + themes: [ + 'docusaurus-theme-openapi-docs', // Allows use of @theme/ApiItem and other components ], - [ - 'docusaurus-plugin-remote-content', + scripts: [ { - // more info at https://github.com/rdilweb/docusaurus-plugin-remote-content#options - name: 'content-external', - sourceBaseUrl: 'https://raw.githubusercontent.com/Unleash/', // gets prepended to all of the documents when fetching - outDir: 'docs/generated/', // the base directory to output to. - documents: edgeAndProxy.urls, // the file names to download - modifyContent: edgeAndProxy.modifyContent, - noRuntimeDownloads: true, + src: 'https://widget.kapa.ai/kapa-widget.bundle.js', + 'data-website-id': '1d187510-1726-4011-b0f7-62742ae064ee', + 'data-project-name': 'Unleash', + 'data-project-color': '#1A4049', + 'data-project-logo': + 'https://cdn.getunleash.io/uploads/2022/05/logo.png', + defer: true, }, ], - 'plugin-image-zoom', - ], - themes: [ - 'docusaurus-theme-openapi-docs', // Allows use of @theme/ApiItem and other components - ], - scripts: [ - { - src: 'https://widget.kapa.ai/kapa-widget.bundle.js', - 'data-website-id': '1d187510-1726-4011-b0f7-62742ae064ee', - 'data-project-name': 'Unleash', - 'data-project-color': '#1A4049', - 'data-project-logo': - 'https://cdn.getunleash.io/uploads/2022/05/logo.png', - defer: true, - }, - ], - clientModules: ['./global.js'], -}; - -export default config; + clientModules: ['./global.js'], + }; +} diff --git a/website/src/css/academy.css b/website/src/css/academy.css new file mode 100644 index 000000000000..fa04ca262897 --- /dev/null +++ b/website/src/css/academy.css @@ -0,0 +1,329 @@ +/* Unleash academy content */ + +/* breakpoints: + show wide: >=1247 + show narrow: 997-1246 + show wide: 711-996 + show narrow: <=710 +*/ + +/* shared academy styles */ + +.unleash-academy-level-badge { + border: 2px solid; + border-radius: 60px; + padding-inline: 0.5em; + text-transform: capitalize; +} + +html[data-theme="light"] .unleash-academy-level-badge { + border-color: var(--unleash-logo-purple); + color: var(--unleash-logo-purple); +} + +html[data-theme="dark"] .unleash-academy-level-badge { + border-color: var(--ifm-link-color); + color: var(--ifm-link-color); +} + +.unleash-academy-level-container.advanced { + background-image: url("/img/unleash-academy/advanced-pixels.svg"); +} + +.unleash-academy-level-container.beginners { + background-image: url("/img/unleash-academy/beginner-pixels.svg"); +} + +.unleash-academy-banner { + --banner-padding: calc(var(--ifm-spacing-vertical) * 3); + --unleash-academy-logo-width: 85px; + --banner-padding: calc(var(--ifm-spacing-vertical) * 3); + --banner-font-color: #000; + --button-color: var(--unleash-logo-purple); + + margin-block-start: var(--ifm-spacing-vertical); + margin-block-end: var(--ifm-spacing-vertical); + position: relative; + border: var(--ifm-global-border-width) solid var(--ifm-color-emphasis-200); + padding: var(--banner-padding); + border-radius: var(--ifm-global-radius); + background-color: #f1f0fc; + background-image: url("/img/unleash-academy/banner-bg-pixels.svg"); + background-position: top right; + background-repeat: no-repeat; + overflow: hidden; + color: var(--banner-font-color); +} + +html[data-theme="dark"] .course-banner-container { + background-color: inherit; + color: inherit; +} + +.academy-banner-main-text { + font-weight: normal; + font-size: 1.4em; +} + +.unleash-academy-banner-list { + grid-area: bullets; + display: flex; + flex-flow: column; + gap: calc(var(--ifm-spacing-horizontal) * 2); + padding-inline-start: 0; +} + +.unleash-academy-banner-list > li { + font-weight: bold; + list-style-type: none; + background-image: url("/img/unleash-academy/bullet-check.svg"); + background-repeat: no-repeat; + background-position: left center; + padding-left: 30px; +} + +.unleash-academy-banner-list > li::marker { + height: 100%; +} + +.unleash-academy-banner-list > li + li { + margin-block-start: 0; +} + +@media (min-width: 711px) and (max-width: 996px), (min-width: 1247px) { + .unleash-academy-banner-list { + flex-flow: row; + } +} + +.unleash-action-button { + --button-color: #6c65e5; + --button-hover-color: #615bc2; + display: block; + border-radius: var(--ifm-global-radius); + width: 100%; + background: var(--button-color); + color: white; + text-align: center; + padding: calc(var(--ifm-spacing-horizontal) * 0.5); +} + +.unleash-action-button:hover { + background: var(--button-hover-color); + color: white; + text-decoration: none; +} + +/* begin certification links */ +.unleash-academy-links-container { + margin-block-start: var(--ifm-spacing-vertical); + margin-block-end: var(--ifm-spacing-vertical); + --button-background-color: var(--color-purple); + --border-color: var(--ifm-color); +} + +.unleash-academy-links { + list-style: none; + margin: 0; + padding: 0; + display: flex; + flex-flow: column; + width: 100%; + gap: var(--ifm-spacing-vertical); +} + +.unleash-academy-links-container li:has(article) { + margin: 0; + padding: 0; +} + +.unleash-academy-links-container article { + border-radius: var(--ifm-global-radius); + border: var(--ifm-global-border-width) solid var(--ifm-color-emphasis-200); + padding: calc(var(--ifm-spacing-vertical) * 2); + display: grid; + grid-template-rows: min-content auto min-content; + background-position: top right; + background-repeat: no-repeat; + height: 100%; +} + +.unleash-academy-links-container article .header > * + * { + margin-block-start: calc(var(--ifm-spacing-vertical) * 0.5); +} + +.unleash-academy-links-container article p { + font-size: var(--unleash-font-size-smaller); +} + +@media (min-width: 711px) and (max-width: 996px), (min-width: 1247px) { + .unleash-academy-links { + display: grid; + grid-template-columns: repeat(3, 1fr); + } + + .unleash-academy-links-container article { + height: 100%; + } +} + +/* End of certification links styles */ + +/* Specific styles for the main Unleash academy banner */ +.academy-general-banner-content { + display: grid; + grid-template-areas: "header logo" "bullets bullets" "button button"; + grid-template-columns: auto var(--unleash-academy-logo-width); + gap: var(--ifm-spacing-horizontal); +} + +.academy-general-banner-content .unleash-action-button { + grid-area: button; +} + +.academy-general-banner .academy-banner-main-text { + grid-area: header; +} + +.academy-general-banner .small-logo { + grid-area: logo; + background-image: url("/img/unleash-academy/academy-logo.svg"); + background-repeat: no-repeat; + background-position: center; + width: 100%; + aspect-ratio: 1; + background-size: contain; +} + +@media (min-width: 711px) and (max-width: 996px), (min-width: 1247px) { + .academy-general-banner-content { + grid-template-areas: "header logo" "bullets logo" "button logo"; + grid-template-columns: 480px auto; + } + + .academy-general-banner-content .unleash-action-button { + width: 240px; + } + + .academy-general-banner .small-logo { + display: none; + } + + .academy-general-banner .big-logo { + position: absolute; + background-image: url("/img/unleash-academy/academy-logo.svg"); + bottom: 0; + right: 40px; + width: 200px; + height: 100%; + background-repeat: no-repeat; + background-position-x: left; + background-position-y: 190%; + } +} + +/* end banner */ + +/* course banner-specific styling */ +.course-banner-container.beginners { + background-size: 108px; +} + +.course-banner-container.advanced { + background-size: 108px; +} + +.course-banner-container > * + * { + margin-block-start: var(--ifm-spacing-vertical); + margin-block-end: 0; +} + +.unleash-academy-level-badge { + border: 2px solid; + border-radius: 60px; + padding-inline: 0.5em; + text-transform: capitalize; +} + +html[data-theme="light"] .unleash-academy-level-badge { + border-color: var(--unleash-logo-purple); + color: var(--unleash-logo-purple); +} + +html[data-theme="dark"] .unleash-academy-level-badge { + border-color: var(--ifm-link-color); + color: var(--ifm-link-color); +} + +/* docusaurus-plugin-openapi-docs styling + +Taken from +https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/blob/02922a6ad6d635373e01409dac8c17a88da2b72e/demo/src/css/custom.css#L45-L9 + +Based on this thread: +https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/issues/177 + +*/ + +/* Sidebar Method labels */ +.api-method > .menu__link { + align-items: center; + justify-content: start; +} + +.api-method > .menu__link::before { + width: 50px; + height: 20px; + font-size: 12px; + line-height: 20px; + text-transform: uppercase; + font-weight: 600; + border-radius: 0.25rem; + border: 1px solid; + border-inline-start-width: 5px; + margin-right: var(--ifm-spacing-horizontal); + text-align: center; + flex-shrink: 0; +} + +.get > .menu__link::before { + content: "get"; + background-color: var(--ifm-color-info-contrast-background); + color: var(--ifm-color-info-contrast-foreground); + border-color: var(--ifm-color-info-dark); +} + +.post > .menu__link::before { + content: "post"; + background-color: var(--ifm-color-success-contrast-background); + color: var(--ifm-color-success-contrast-foreground); + border-color: var(--ifm-color-success-dark); +} + +.delete > .menu__link::before { + content: "del"; + background-color: var(--ifm-color-danger-contrast-background); + color: var(--ifm-color-danger-contrast-foreground); + border-color: var(--ifm-color-danger-dark); +} + +.put > .menu__link::before { + content: "put"; + background-color: var(--ifm-color-warning-contrast-background); + color: var(--ifm-color-warning-contrast-foreground); + border-color: var(--ifm-color-warning-dark); +} + +.patch > .menu__link::before { + content: "patch"; + background-color: var(--ifm-color-success-contrast-background); + color: var(--ifm-color-success-contrast-foreground); + border-color: var(--ifm-color-success-dark); +} + +.head > .menu__link::before { + content: "head"; + background-color: var(--ifm-color-secondary-contrast-background); + color: var(--ifm-color-secondary-contrast-foreground); + border-color: var(--ifm-color-secondary-dark); +} diff --git a/website/src/css/api-docs.css b/website/src/css/api-docs.css new file mode 100644 index 000000000000..bba733a69511 --- /dev/null +++ b/website/src/css/api-docs.css @@ -0,0 +1,72 @@ +/* docusaurus-plugin-openapi-docs styling + +Taken from +https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/blob/02922a6ad6d635373e01409dac8c17a88da2b72e/demo/src/css/custom.css#L45-L9 + +Based on this thread: +https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/issues/177 + +*/ + +/* Sidebar Method labels */ +.api-method > .menu__link { + align-items: center; + justify-content: start; +} + +.api-method > .menu__link::before { + width: 50px; + height: 20px; + font-size: 12px; + line-height: 20px; + text-transform: uppercase; + font-weight: 600; + border-radius: 0.25rem; + border: 1px solid; + border-inline-start-width: 5px; + margin-right: var(--ifm-spacing-horizontal); + text-align: center; + flex-shrink: 0; +} + +.get > .menu__link::before { + content: "get"; + background-color: var(--ifm-color-info-contrast-background); + color: var(--ifm-color-info-contrast-foreground); + border-color: var(--ifm-color-info-dark); +} + +.post > .menu__link::before { + content: "post"; + background-color: var(--ifm-color-success-contrast-background); + color: var(--ifm-color-success-contrast-foreground); + border-color: var(--ifm-color-success-dark); +} + +.delete > .menu__link::before { + content: "del"; + background-color: var(--ifm-color-danger-contrast-background); + color: var(--ifm-color-danger-contrast-foreground); + border-color: var(--ifm-color-danger-dark); +} + +.put > .menu__link::before { + content: "put"; + background-color: var(--ifm-color-warning-contrast-background); + color: var(--ifm-color-warning-contrast-foreground); + border-color: var(--ifm-color-warning-dark); +} + +.patch > .menu__link::before { + content: "patch"; + background-color: var(--ifm-color-success-contrast-background); + color: var(--ifm-color-success-contrast-foreground); + border-color: var(--ifm-color-success-dark); +} + +.head > .menu__link::before { + content: "head"; + background-color: var(--ifm-color-secondary-contrast-background); + color: var(--ifm-color-secondary-contrast-foreground); + border-color: var(--ifm-color-secondary-dark); +} diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 5c11649358f0..5728122c51a7 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -5,80 +5,38 @@ * work well for content-centric websites. */ +@import url("./academy.css"); +@import url("./api-docs.css"); + +@font-face { + font-family: Styrene B Web; + src: url(/fonts/StyreneB-Regular-Web.woff2) format("woff2"), + url(/fonts/StyreneB-Regular-Web.woff) format("woff"); + font-weight: 400; + font-style: normal; + font-stretch: normal; + font-display: swap; +} + /* You can override the default Infima variables here. */ :root { --unleash-logo-purple: #635dc5; --unleash-color-purple: var(--unleash-logo-purple); --unleash-color-gray: #ecebeb; --unleash-color-green: #1a4049; + --unleash-color-sub-background: #eaeaed; + --ifm-font-family-base: "Sen", sans-serif; --ifm-code-font-size: 90%; --ifm-font-size-base: 15px; - --navbar-link-color: #122d33; --unleash-font-size-smaller: 90%; --ifm-footer-logo-max-width: 250px; + --ifm-navbar-height: 5rem; + --ifm-footer-background-color: var(--ifm-background-color); /* navbar is independent of the theme in general */ - --ifm-navbar-background-color: var(--unleash-color-green); - /* this is the font color set on the content in dark mode */ - --unleash-navbar-font-color: #e3e3e3; - --unleash-navbar-active-background-color: #122d33; - --ifm-navbar-link-color: var(--unleash-navbar-font-color); - --unleash-navbar-highlight-color: #bab8ff; - --ifm-navbar-link-active-color: var(--unleash-navbar-highlight-color); - --ifm-navbar-link-hover-color: var(--unleash-navbar-highlight-color); -} - -.navbar { - color: var(--unleash-navbar-font-color); -} - -.navbar .navbar__link--active:has(.hide-when-active) { - display: none; -} - -.navbar button[class*="toggleButton_"]:hover { - background: var(--unleash-navbar-active-background-color); -} - -.navbar-sidebar { - background-color: var(--ifm-navbar-background-color); - --ifm-menu-color: var(--ifm-navbar-link-color); - --ifm-menu-color-active: var(--ifm-navbar-link-active-color); - --ifm-menu-color-background-active: var( - --unleash-navbar-active-background-color - ); - --ifm-menu-color-active: var(--ifm-navbar-link-active-color); - --ifm-menu-color-background-hover: var( - --unleash-navbar-active-background-color - ); -} - -.navbar__logo { - height: 3rem; -} - -@media (max-width: 1150px) { - .navbar .hide-at-small-sizes { - display: none; - } -} - -@media (min-width: 997px) { - .show-when-collapsed { - display: none; - } -} - -footer { - --ifm-footer-link-hover-color: var(--ifm-footer-link-color); -} - -article video { - display: block; - margin-block: var(--ifm-spacing-vertical); - margin-inline: auto; + --ifm-navbar-background-color: var(--ifm-background-color); } html[data-theme="light"] { @@ -120,9 +78,80 @@ html[data-theme="dark"] { --ifm-color-secondary-contrast-background ); + --ifm-background-color: #222130; + --unleash-color-sub-background: #1a1924; + --docsearch-primary-color: var(--ifm-color-primary-darkest); } +/* navbar */ + +.navbar { + color: var(--unleash-navbar-font-color); + font-family: Styrene B Web, sans-serif; +} + +.header-github-link { + color: var(--ifm-navbar-link-color); + align-items: center; + display: flex; + justify-content: space-between; + gap: 10px; + height: 100%; + border: 2px solid var(--ifm-navbar-link-color); + padding: 0.25rem 0.5rem; +} + +.header-demo-button { + background-color: var(--ifm-color-primary); + color: var(--ifm-color-primary-contrast-background); + border-radius: 4px; + padding: 0.5rem 1rem; + font-size: 1rem; + font-weight: 600; + text-transform: uppercase; + text-align: center; + display: inline-block; + margin: 0.5rem; +} + +.navbar a[href*="http"] svg { + display: none; +} + +.navbar .navbar__link--active:has(.hide-when-active) { + display: none; +} + +.navbar button[class*="toggleButton_"]:hover { + background: var(--unleash-navbar-active-background-color); +} + +.navbar-sidebar { + background-color: var(--ifm-navbar-background-color); + --ifm-menu-color: var(--ifm-navbar-link-color); + --ifm-menu-color-active: var(--ifm-navbar-link-active-color); + --ifm-menu-color-background-active: var( + --unleash-navbar-active-background-color + ); + --ifm-menu-color-active: var(--ifm-navbar-link-active-color); + --ifm-menu-color-background-hover: var( + --unleash-navbar-active-background-color + ); +} + +@media (max-width: 1150px) { + .navbar .hide-at-small-sizes { + display: none; + } +} + +@media (min-width: 997px) { + .show-when-collapsed { + display: none; + } +} + div[class^="announcementBar_"], div[class^="announcementBar_"] svg { background-color: var(--ifm-color-primary); @@ -130,16 +159,48 @@ div[class^="announcementBar_"] svg { font-size: larger; } -.visually-hidden { - border: 0; - clip: rect(0 0 0 0); - height: auto; - margin: 0; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; - white-space: nowrap; +/* Main area */ + +/* .docs-wrapper { + background-color: red; +} */ + +main { + position: relative; + background-color: var(--unleash-color-sub-background); + + .container { + background-color: var(--ifm-background-color); + margin: 0; + border-radius: 8px; + z-index: 1; + + @media (min-width: 997px) { + margin: 4rem; + } + } +} + +main:before { + /* background-color: red; */ + background-image: url("/img/mountain-texture.png"); + position: fixed; + display: block; + z-index: 0; + bottom: 0px; + right: 0px; + width: 400px; + height: 100%; + pointer-events: none; + user-select: none; + background-repeat: no-repeat; + content: ""; +} + +@media (min-width: 997px) { + .show-when-collapsed { + display: none; + } } main img { @@ -171,15 +232,14 @@ main margin: auto; } -/* mermaid diagrams */ -.docusaurus-mermaid-container { - display: flex; - justify-content: center; - margin-block: calc(1.5 * var(--ifm-spacing-vertical)); -} - -[class^="docTitle"] { - font-size: 2.5rem !important; +.table-of-contents:before { + display: inline-block; + width: 100%; + content: "Table of Contents"; + padding: 5px; + box-sizing: border-box; + background-color: var(--unleash-color-sub-background); + text-transform: uppercase; } .navbar-sidebar__back { @@ -195,6 +255,10 @@ main margin-inline: var(--ifm-spacing-horizontal); } +.footer { + z-index: 1; +} + li.theme-doc-sidebar-item-category-level-1 > div::before { width: 0.3em; height: 100%; @@ -204,26 +268,6 @@ li.theme-doc-sidebar-item-category-level-1 > div::before { position: absolute; } -.docusaurus-highlight-code-line { - background-color: rgb(72, 77, 91); - display: block; - margin: 0 calc(-1 * var(--ifm-pre-padding)); - padding: 0 var(--ifm-pre-padding); -} - -.header-github-link:hover { - opacity: 0.6; -} - -.header-github-link:before { - content: ""; - width: 24px; - height: 24px; - display: flex; - background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") - no-repeat; -} - /* Video content container */ .unleash-video-container { @@ -238,333 +282,3 @@ li.theme-doc-sidebar-item-category-level-1 > div::before { } /* end video content container */ - -/* Unleash academy content */ - -/* breakpoints: - show wide: >=1247 - show narrow: 997-1246 - show wide: 711-996 - show narrow: <=710 -*/ - -/* shared academy styles */ - -.unleash-academy-level-badge { - border: 2px solid; - border-radius: 60px; - padding-inline: 0.5em; - text-transform: capitalize; -} - -html[data-theme="light"] .unleash-academy-level-badge { - border-color: var(--unleash-logo-purple); - color: var(--unleash-logo-purple); -} - -html[data-theme="dark"] .unleash-academy-level-badge { - border-color: var(--ifm-link-color); - color: var(--ifm-link-color); -} - -.unleash-academy-level-container.advanced { - background-image: url("/img/unleash-academy/advanced-pixels.svg"); -} - -.unleash-academy-level-container.beginners { - background-image: url("/img/unleash-academy/beginner-pixels.svg"); -} - -.unleash-academy-banner { - --banner-padding: calc(var(--ifm-spacing-vertical) * 3); - --unleash-academy-logo-width: 85px; - --banner-padding: calc(var(--ifm-spacing-vertical) * 3); - --banner-font-color: #000; - --button-color: var(--unleash-logo-purple); - - margin-block-start: var(--ifm-spacing-vertical); - margin-block-end: var(--ifm-spacing-vertical); - position: relative; - border: var(--ifm-global-border-width) solid var(--ifm-color-emphasis-200); - padding: var(--banner-padding); - border-radius: var(--ifm-global-radius); - background-color: #f1f0fc; - background-image: url("/img/unleash-academy/banner-bg-pixels.svg"); - background-position: top right; - background-repeat: no-repeat; - overflow: hidden; - color: var(--banner-font-color); -} - -html[data-theme="dark"] .course-banner-container { - background-color: inherit; - color: inherit; -} - -.academy-banner-main-text { - font-weight: normal; - font-size: 1.4em; -} - -.unleash-academy-banner-list { - grid-area: bullets; - display: flex; - flex-flow: column; - gap: calc(var(--ifm-spacing-horizontal) * 2); - padding-inline-start: 0; -} - -.unleash-academy-banner-list > li { - font-weight: bold; - list-style-type: none; - background-image: url("/img/unleash-academy/bullet-check.svg"); - background-repeat: no-repeat; - background-position: left center; - padding-left: 30px; -} - -.unleash-academy-banner-list > li::marker { - height: 100%; -} - -.unleash-academy-banner-list > li + li { - margin-block-start: 0; -} - -@media (min-width: 711px) and (max-width: 996px), (min-width: 1247px) { - .unleash-academy-banner-list { - flex-flow: row; - } -} - -.unleash-action-button { - --button-color: #6c65e5; - --button-hover-color: #615bc2; - display: block; - border-radius: var(--ifm-global-radius); - width: 100%; - background: var(--button-color); - color: white; - text-align: center; - padding: calc(var(--ifm-spacing-horizontal) * 0.5); -} - -.unleash-action-button:hover { - background: var(--button-hover-color); - color: white; - text-decoration: none; -} - -/* begin certification links */ -.unleash-academy-links-container { - margin-block-start: var(--ifm-spacing-vertical); - margin-block-end: var(--ifm-spacing-vertical); - --button-background-color: var(--color-purple); - --border-color: var(--ifm-color); -} - -.unleash-academy-links { - list-style: none; - margin: 0; - padding: 0; - display: flex; - flex-flow: column; - width: 100%; - gap: var(--ifm-spacing-vertical); -} - -.unleash-academy-links-container li:has(article) { - margin: 0; - padding: 0; -} - -.unleash-academy-links-container article { - border-radius: var(--ifm-global-radius); - border: var(--ifm-global-border-width) solid var(--ifm-color-emphasis-200); - padding: calc(var(--ifm-spacing-vertical) * 2); - display: grid; - grid-template-rows: min-content auto min-content; - background-position: top right; - background-repeat: no-repeat; - height: 100%; -} - -.unleash-academy-links-container article .header > * + * { - margin-block-start: calc(var(--ifm-spacing-vertical) * 0.5); -} - -.unleash-academy-links-container article p { - font-size: var(--unleash-font-size-smaller); -} - -@media (min-width: 711px) and (max-width: 996px), (min-width: 1247px) { - .unleash-academy-links { - display: grid; - grid-template-columns: repeat(3, 1fr); - } - - .unleash-academy-links-container article { - height: 100%; - } -} - -/* End of certification links styles */ - -/* Specific styles for the main Unleash academy banner */ -.academy-general-banner-content { - display: grid; - grid-template-areas: "header logo" "bullets bullets" "button button"; - grid-template-columns: auto var(--unleash-academy-logo-width); - gap: var(--ifm-spacing-horizontal); -} - -.academy-general-banner-content .unleash-action-button { - grid-area: button; -} - -.academy-general-banner .academy-banner-main-text { - grid-area: header; -} - -.academy-general-banner .small-logo { - grid-area: logo; - background-image: url("/img/unleash-academy/academy-logo.svg"); - background-repeat: no-repeat; - background-position: center; - width: 100%; - aspect-ratio: 1; - background-size: contain; -} - -@media (min-width: 711px) and (max-width: 996px), (min-width: 1247px) { - .academy-general-banner-content { - grid-template-areas: "header logo" "bullets logo" "button logo"; - grid-template-columns: 480px auto; - } - - .academy-general-banner-content .unleash-action-button { - width: 240px; - } - - .academy-general-banner .small-logo { - display: none; - } - - .academy-general-banner .big-logo { - position: absolute; - background-image: url("/img/unleash-academy/academy-logo.svg"); - bottom: 0; - right: 40px; - width: 200px; - height: 100%; - background-repeat: no-repeat; - background-position-x: left; - background-position-y: 190%; - } -} - -/* end banner */ - -/* course banner-specific styling */ -.course-banner-container.beginners { - background-size: 108px; -} - -.course-banner-container.advanced { - background-size: 108px; -} - -.course-banner-container > * + * { - margin-block-start: var(--ifm-spacing-vertical); - margin-block-end: 0; -} - -.unleash-academy-level-badge { - border: 2px solid; - border-radius: 60px; - padding-inline: 0.5em; - text-transform: capitalize; -} - -html[data-theme="light"] .unleash-academy-level-badge { - border-color: var(--unleash-logo-purple); - color: var(--unleash-logo-purple); -} - -html[data-theme="dark"] .unleash-academy-level-badge { - border-color: var(--ifm-link-color); - color: var(--ifm-link-color); -} - -/* docusaurus-plugin-openapi-docs styling - -Taken from -https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/blob/02922a6ad6d635373e01409dac8c17a88da2b72e/demo/src/css/custom.css#L45-L9 - -Based on this thread: -https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/issues/177 - -*/ - -/* Sidebar Method labels */ -.api-method > .menu__link { - align-items: center; - justify-content: start; -} - -.api-method > .menu__link::before { - width: 50px; - height: 20px; - font-size: 12px; - line-height: 20px; - text-transform: uppercase; - font-weight: 600; - border-radius: 0.25rem; - border: 1px solid; - border-inline-start-width: 5px; - margin-right: var(--ifm-spacing-horizontal); - text-align: center; - flex-shrink: 0; -} - -.get > .menu__link::before { - content: "get"; - background-color: var(--ifm-color-info-contrast-background); - color: var(--ifm-color-info-contrast-foreground); - border-color: var(--ifm-color-info-dark); -} - -.post > .menu__link::before { - content: "post"; - background-color: var(--ifm-color-success-contrast-background); - color: var(--ifm-color-success-contrast-foreground); - border-color: var(--ifm-color-success-dark); -} - -.delete > .menu__link::before { - content: "del"; - background-color: var(--ifm-color-danger-contrast-background); - color: var(--ifm-color-danger-contrast-foreground); - border-color: var(--ifm-color-danger-dark); -} - -.put > .menu__link::before { - content: "put"; - background-color: var(--ifm-color-warning-contrast-background); - color: var(--ifm-color-warning-contrast-foreground); - border-color: var(--ifm-color-warning-dark); -} - -.patch > .menu__link::before { - content: "patch"; - background-color: var(--ifm-color-success-contrast-background); - color: var(--ifm-color-success-contrast-foreground); - border-color: var(--ifm-color-success-dark); -} - -.head > .menu__link::before { - content: "head"; - background-color: var(--ifm-color-secondary-contrast-background); - color: var(--ifm-color-secondary-contrast-foreground); - border-color: var(--ifm-color-secondary-dark); -} diff --git a/website/static/fonts/StyreneB-Regular-Web.woff b/website/static/fonts/StyreneB-Regular-Web.woff new file mode 100644 index 0000000000000000000000000000000000000000..f6d27a09a10d7e8ab87bd97fd83be140974bcc38 GIT binary patch literal 44207 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ೡV24_5&v2(#Q&<65l$#iUrL?uUbiU; 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 literal 0 HcmV?d00001 diff --git a/website/static/fonts/StyreneB-Regular-Web.woff2 b/website/static/fonts/StyreneB-Regular-Web.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c71b8825c9839ee69cbda2ce4b836ed19bff3238 GIT binary patch literal 31761 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�h_b~Z{fvnV@5u-GE%XTw}$`~286X(f{& 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 EUuqhI#Q*>R literal 0 HcmV?d00001 diff --git a/website/static/img/mountain-texture.png b/website/static/img/mountain-texture.png new file mode 100644 index 0000000000000000000000000000000000000000..36896e5e6cbeebe1decdb2e35391f1ec56b24ffb GIT binary patch literal 20979 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 m&yw$-uHZ*}dnZ;w9FLy-%0000 Date: Wed, 18 Dec 2024 09:37:45 +0000 Subject: [PATCH 02/12] Tidy up --- website/docusaurus.config.ts | 18 ++++----- website/src/css/academy.css | 72 ------------------------------------ website/src/css/custom.css | 5 +-- 3 files changed, 10 insertions(+), 85 deletions(-) diff --git a/website/docusaurus.config.ts b/website/docusaurus.config.ts index 2d901ce20562..bc955557bf3c 100644 --- a/website/docusaurus.config.ts +++ b/website/docusaurus.config.ts @@ -236,39 +236,39 @@ export default async function createConfigAsync(): Promise { items: [ { label: 'Secure, scalable feature flags', - to: 'EMPTY LINK', + to: 'https://getunleash.io/TBD', }, { label: 'Rollbacks', - to: 'EMPTY LINK', + to: 'https://getunleash.io/TBD', }, { label: 'Fedramp, SOC2, ISO2700 compliance', - to: 'EMPTY LINK', + to: 'https://getunleash.io/TBD', }, { label: 'Progressive or gradual rollouts', - to: 'EMPTY LINK', + to: 'https://getunleash.io/TBD', }, { label: 'Trunk-based development', - to: 'EMPTY LINK', + to: 'https://getunleash.io/TBD', }, { label: 'Software kill switches', - to: 'EMPTY LINK', + to: 'https://getunleash.io/TBD', }, { label: 'A/B testing', - to: 'EMPTY LINK', + to: 'https://getunleash.io/TBD', }, { label: 'Feature Management', - to: 'EMPTY LINK', + to: 'https://getunleash.io/TBD', }, { label: 'Canary releases', - to: 'EMPTY LINK', + to: 'https://getunleash.io/TBD', }, ], }, diff --git a/website/src/css/academy.css b/website/src/css/academy.css index fa04ca262897..71ab37e8efa3 100644 --- a/website/src/css/academy.css +++ b/website/src/css/academy.css @@ -255,75 +255,3 @@ html[data-theme="dark"] .unleash-academy-level-badge { color: var(--ifm-link-color); } -/* docusaurus-plugin-openapi-docs styling - -Taken from -https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/blob/02922a6ad6d635373e01409dac8c17a88da2b72e/demo/src/css/custom.css#L45-L9 - -Based on this thread: -https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/issues/177 - -*/ - -/* Sidebar Method labels */ -.api-method > .menu__link { - align-items: center; - justify-content: start; -} - -.api-method > .menu__link::before { - width: 50px; - height: 20px; - font-size: 12px; - line-height: 20px; - text-transform: uppercase; - font-weight: 600; - border-radius: 0.25rem; - border: 1px solid; - border-inline-start-width: 5px; - margin-right: var(--ifm-spacing-horizontal); - text-align: center; - flex-shrink: 0; -} - -.get > .menu__link::before { - content: "get"; - background-color: var(--ifm-color-info-contrast-background); - color: var(--ifm-color-info-contrast-foreground); - border-color: var(--ifm-color-info-dark); -} - -.post > .menu__link::before { - content: "post"; - background-color: var(--ifm-color-success-contrast-background); - color: var(--ifm-color-success-contrast-foreground); - border-color: var(--ifm-color-success-dark); -} - -.delete > .menu__link::before { - content: "del"; - background-color: var(--ifm-color-danger-contrast-background); - color: var(--ifm-color-danger-contrast-foreground); - border-color: var(--ifm-color-danger-dark); -} - -.put > .menu__link::before { - content: "put"; - background-color: var(--ifm-color-warning-contrast-background); - color: var(--ifm-color-warning-contrast-foreground); - border-color: var(--ifm-color-warning-dark); -} - -.patch > .menu__link::before { - content: "patch"; - background-color: var(--ifm-color-success-contrast-background); - color: var(--ifm-color-success-contrast-foreground); - border-color: var(--ifm-color-success-dark); -} - -.head > .menu__link::before { - content: "head"; - background-color: var(--ifm-color-secondary-contrast-background); - color: var(--ifm-color-secondary-contrast-foreground); - border-color: var(--ifm-color-secondary-dark); -} diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 5728122c51a7..bd311a0ed4b9 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -161,10 +161,6 @@ div[class^="announcementBar_"] svg { /* Main area */ -/* .docs-wrapper { - background-color: red; -} */ - main { position: relative; background-color: var(--unleash-color-sub-background); @@ -173,6 +169,7 @@ main { background-color: var(--ifm-background-color); margin: 0; border-radius: 8px; + padding: 3rem; z-index: 1; @media (min-width: 997px) { From 265bf5fd65423de0b013e4a242eed8a1e795c131 Mon Sep 17 00:00:00 2001 From: Alvin Bryan Date: Wed, 18 Dec 2024 09:47:57 +0000 Subject: [PATCH 03/12] beauty fixes --- website/src/css/custom.css | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/website/src/css/custom.css b/website/src/css/custom.css index bd311a0ed4b9..139dc59c7320 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -164,17 +164,19 @@ div[class^="announcementBar_"] svg { main { position: relative; background-color: var(--unleash-color-sub-background); +} - .container { - background-color: var(--ifm-background-color); - margin: 0; - border-radius: 8px; - padding: 3rem; - z-index: 1; +main .container { + background-color: var(--ifm-background-color); + margin: 0; + border-radius: 8px; + padding: 3rem; + z-index: 1; +} - @media (min-width: 997px) { - margin: 4rem; - } +@media (min-width: 997px) { + main .container{ + margin: 4rem; } } @@ -253,6 +255,7 @@ main } .footer { + border-top: 1px solid var(--ifm-font-color-base); z-index: 1; } From f08f3c4c8400ee9c546309a499d266683dd305a2 Mon Sep 17 00:00:00 2001 From: Alvin Bryan Date: Wed, 18 Dec 2024 22:53:41 +0000 Subject: [PATCH 04/12] fixed floating background --- website/src/css/custom.css | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 139dc59c7320..3263b25eae48 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -180,7 +180,7 @@ main .container { } } -main:before { +main:after { /* background-color: red; */ background-image: url("/img/mountain-texture.png"); position: fixed; @@ -188,8 +188,9 @@ main:before { z-index: 0; bottom: 0px; right: 0px; - width: 400px; - height: 100%; + width: 350px; + aspect-ratio: 652 / 905; + background-size: cover; pointer-events: none; user-select: none; background-repeat: no-repeat; @@ -255,7 +256,6 @@ main } .footer { - border-top: 1px solid var(--ifm-font-color-base); z-index: 1; } From 5a9109e4b2a76145a5e106da20ebedca3722bcc5 Mon Sep 17 00:00:00 2001 From: Alvin Bryan Date: Wed, 18 Dec 2024 22:57:45 +0000 Subject: [PATCH 05/12] New footer --- website/docusaurus.config.ts | 2 +- website/src/theme/Footer/footer.module.css | 39 +++++++++ website/src/theme/Footer/index.tsx | 98 ++++++++++++++++++++++ 3 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 website/src/theme/Footer/footer.module.css create mode 100644 website/src/theme/Footer/index.tsx diff --git a/website/docusaurus.config.ts b/website/docusaurus.config.ts index bc955557bf3c..1b3b1f5b95f6 100644 --- a/website/docusaurus.config.ts +++ b/website/docusaurus.config.ts @@ -315,7 +315,6 @@ export default async function createConfigAsync(): Promise { ], }, ], - copyright: `Copyright © ${new Date().getFullYear()} Unleash. Built with Docusaurus.`, }, image: 'img/logo.png', imageZoom: { @@ -969,6 +968,7 @@ export default async function createConfigAsync(): Promise { 'data-project-color': '#1A4049', 'data-project-logo': 'https://cdn.getunleash.io/uploads/2022/05/logo.png', + 'data-button-position-bottom': '80px', defer: true, }, ], diff --git a/website/src/theme/Footer/footer.module.css b/website/src/theme/Footer/footer.module.css new file mode 100644 index 000000000000..87c0076249f4 --- /dev/null +++ b/website/src/theme/Footer/footer.module.css @@ -0,0 +1,39 @@ +.wrapper { + background-color: var(--ifm-background-color); + z-index: 1; +} + +.footer { + font-family: Styrene B Web, sans-serif; + border-top: 1px solid var(--ifm-font-color-base); + display: flex; + justify-content: space-between; + flex-wrap: wrap; +} + +.unleash { + max-width: 340px; + padding-top: var(--ifm-footer-padding-vertical); + padding-left: var(--ifm-spacing-horizontal); +} + +@media screen and (min-width: 768px) { + + .footer { + flex-wrap: nowrap; + } + +} + +.copyright { + min-height: 70px; + display: flex; + justify-content: space-between; + padding: 0 1rem; + align-items: center; + border-top: 1px solid var(--ifm-font-color-base); +} + +.copyright p{ + margin-bottom: 0; +} diff --git a/website/src/theme/Footer/index.tsx b/website/src/theme/Footer/index.tsx new file mode 100644 index 000000000000..0137f36513cf --- /dev/null +++ b/website/src/theme/Footer/index.tsx @@ -0,0 +1,98 @@ +import Footer from '@theme-original/Footer'; +import type FooterType from '@theme/Footer'; +import type { WrapperProps } from '@docusaurus/types'; +import styles from './footer.module.css'; + +type Props = WrapperProps; + +export default function FooterWrapper(props: Props): JSX.Element { + return ( +
+
+
+

+ Unleash reduces the risk of releasing new features, + drives innovation by streamlining the software release + process. While we serve the needs of the world's + largest, most security-conscious organizations, we are + also rated the “Easiest Feature Management system to + use” by G2. +

+
+
+
+
+

+ + Heart + + + + + + + + + + + + + + + + Made in a cosy atmosphere in the Nordic countries. +

+

+ {`Copyright © ${new Date().getFullYear()} Unleash. Built with Docusaurus.`} +

+
+
+ ); +} From acb851035c2514622685f6c0700fe820401e4417 Mon Sep 17 00:00:00 2001 From: Alvin Bryan Date: Wed, 18 Dec 2024 22:59:10 +0000 Subject: [PATCH 06/12] =?UTF-8?q?test=20=F0=9F=91=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- website/global.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/website/global.js b/website/global.js index 035e2ee1b086..194c2fa957a6 100644 --- a/website/global.js +++ b/website/global.js @@ -1,3 +1,5 @@ if(typeof document !== 'undefined') { !function(){var e,t,n;e="5fe670e3422303a",t=function(){Reo.init({clientID:"5fe670e3422303a"})},(n=document.createElement("script")).src="https://static.reo.dev/"+e+"/reo.js",n.async=!0,n.onload=t,document.head.appendChild(n)}(); } + +console.log(window.clarity) \ No newline at end of file From 3ea5bc6e18bc83f9faf5c25bb240d0adcc4bfcef Mon Sep 17 00:00:00 2001 From: Alvin Bryan Date: Wed, 18 Dec 2024 23:06:45 +0000 Subject: [PATCH 07/12] =?UTF-8?q?test=202=20=F0=9F=98=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- website/global.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/global.js b/website/global.js index 194c2fa957a6..20eaea242e29 100644 --- a/website/global.js +++ b/website/global.js @@ -1,5 +1,5 @@ if(typeof document !== 'undefined') { !function(){var e,t,n;e="5fe670e3422303a",t=function(){Reo.init({clientID:"5fe670e3422303a"})},(n=document.createElement("script")).src="https://static.reo.dev/"+e+"/reo.js",n.async=!0,n.onload=t,document.head.appendChild(n)}(); -} -console.log(window.clarity) \ No newline at end of file + console.log(window.clarity) +} \ No newline at end of file From 5d2ce2653c0937fed9e8a71ca4cd7ab3cbcb6b02 Mon Sep 17 00:00:00 2001 From: Alvin Bryan Date: Thu, 19 Dec 2024 20:08:47 +0000 Subject: [PATCH 08/12] Fixed centering --- website/global.js | 2 -- website/src/css/custom.css | 6 ++++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/website/global.js b/website/global.js index 20eaea242e29..c5902e0b34dc 100644 --- a/website/global.js +++ b/website/global.js @@ -1,5 +1,3 @@ if(typeof document !== 'undefined') { !function(){var e,t,n;e="5fe670e3422303a",t=function(){Reo.init({clientID:"5fe670e3422303a"})},(n=document.createElement("script")).src="https://static.reo.dev/"+e+"/reo.js",n.async=!0,n.onload=t,document.head.appendChild(n)}(); - - console.log(window.clarity) } \ No newline at end of file diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 3263b25eae48..73e8c5931711 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -164,19 +164,21 @@ div[class^="announcementBar_"] svg { main { position: relative; background-color: var(--unleash-color-sub-background); + display: flex; + justify-content: center; } main .container { background-color: var(--ifm-background-color); margin: 0; border-radius: 8px; - padding: 3rem; z-index: 1; } @media (min-width: 997px) { main .container{ - margin: 4rem; + margin-top: 3rem; + margin-inline: 3rem; } } From eb2735943b1fcffd14c88fd4422f9a5b0389a789 Mon Sep 17 00:00:00 2001 From: Alvin Bryan Date: Thu, 19 Dec 2024 20:12:27 +0000 Subject: [PATCH 09/12] cleaner --- website/src/css/custom.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 73e8c5931711..73cdb233b960 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -172,13 +172,13 @@ main .container { background-color: var(--ifm-background-color); margin: 0; border-radius: 8px; + padding: 3rem; z-index: 1; } @media (min-width: 997px) { main .container{ - margin-top: 3rem; - margin-inline: 3rem; + margin: 3rem; } } From 9188bc2a9a33c2e9d9f484fce2207ec64dcaa127 Mon Sep 17 00:00:00 2001 From: Alvin Bryan Date: Fri, 20 Dec 2024 14:37:01 +0000 Subject: [PATCH 10/12] undo changes to nav and footer --- website/docusaurus.config.ts | 1708 ++++++++++---------- website/src/css/custom.css | 7 +- website/src/theme/Footer/footer.module.css | 39 - website/src/theme/Footer/index.tsx | 98 -- 4 files changed, 831 insertions(+), 1021 deletions(-) delete mode 100644 website/src/theme/Footer/footer.module.css delete mode 100644 website/src/theme/Footer/index.tsx diff --git a/website/docusaurus.config.ts b/website/docusaurus.config.ts index 1b3b1f5b95f6..0018712a9d4b 100644 --- a/website/docusaurus.config.ts +++ b/website/docusaurus.config.ts @@ -42,936 +42,888 @@ const addDocsRoutePrefix = ({ from, ...rest }) => { }; }; -const getUnleashRepoStars = async () => { - const response = await fetch( - `https://api.github.com/repos/unleash/unleash`, - ); - const data = await response.json(); - - const unleashRepoStars = data.stargazers_count; - const formattedStars = - unleashRepoStars >= 1000 - ? `${(unleashRepoStars / 1000).toFixed(1)}k` - : unleashRepoStars.toString(); - return formattedStars; -}; - -export default async function createConfigAsync(): Promise { - const stars = await getUnleashRepoStars(); - return { - title: 'Unleash Documentation', - tagline: 'The enterprise ready feature flag service', - url: 'https://docs.getunleash.io', - baseUrl: '/', - onBrokenLinks: 'throw', - onBrokenMarkdownLinks: 'throw', - favicon: 'img/favicon.ico', - organizationName: 'Unleash', // Usually your GitHub org/user name. - projectName: 'unleash.github.io', // Usually your repo name. - trailingSlash: false, - customFields: { - // expose env vars etc here - environment: process.env.NODE_ENV, +const config: Config = { + title: 'Unleash Documentation', + tagline: 'The enterprise ready feature flag service', + url: 'https://docs.getunleash.io', + baseUrl: '/', + onBrokenLinks: 'throw', + onBrokenMarkdownLinks: 'throw', + favicon: 'img/favicon.ico', + organizationName: 'Unleash', // Usually your GitHub org/user name. + projectName: 'unleash.github.io', // Usually your repo name. + trailingSlash: false, + customFields: { + // expose env vars etc here + environment: process.env.NODE_ENV, + }, + themeConfig: { + defaultMode: 'light', + disableSwitch: true, + respectPrefersColorScheme: false, + algolia: { + appId: '5U05JI5NE1', + apiKey: 'dc9c4491fcf9143ee34015f22d1dd9d6', + indexName: 'getunleash', }, - themeConfig: { - defaultMode: 'light', - disableSwitch: true, - respectPrefersColorScheme: false, - algolia: { - appId: '5U05JI5NE1', - apiKey: 'dc9c4491fcf9143ee34015f22d1dd9d6', - indexName: 'getunleash', - }, - navbar: { - logo: { - alt: 'Unleash logo', - src: 'https://getunleash.io/logos/unleash_pos.svg', - srcDark: 'img/unleash_logo_white.svg', - href: 'https://www.getunleash.io', - height: '2rem', - }, - items: [ - { - label: 'Product', - href: 'https://www.getunleash.io/enterprise-feature-management-platform', - position: 'left', - }, - { - label: 'Plans', - href: 'https://www.getunleash.io/plans', - position: 'left', - }, - { - label: 'Blog', - href: 'https://www.getunleash.io/blog', - position: 'left', - }, - { - type: 'dropdown', - position: 'left', - html: 'Unleash Academy', - to: 'unleash-academy/introduction', - items: [ - { - type: 'doc', - docId: 'unleash-academy/foundational', - label: 'Foundational', - }, - { - type: 'doc', - docId: 'unleash-academy/advanced-for-devs', - label: 'Advanced for Developers', - }, - { - type: 'doc', - docId: 'unleash-academy/managing-unleash-for-devops', - label: 'Managing Unleash for DevOps/Admins', - }, - ], - }, - { - type: 'dropdown', - position: 'left', - html: 'Unleash Certification', - items: [ - { - label: 'Foundational Unleash', - href: 'https://docs.google.com/forms/d/1iPUk2I0k5xMzicn9aLMcPF3b9ub3ZwdVjRxCxWxV7js/viewform', - }, - { - label: 'Advanced Unleash for Developers', - href: 'https://docs.google.com/forms/d/1NUL9hyO8Ys916TB6fPV3-jkvD97OmPXZ8_TO84Wjqgc/viewform', - }, - { - label: 'Managing Unleash for DevOps/Admins', - href: 'https://docs.google.com/forms/d/1JlIqmXI3P7dj0n-OiUs2IYsYXgmqw23BChaemlSgHJA/viewform', - }, - ], - }, - { - type: 'search', - position: 'right', - }, - { - label: 'Sign in', - href: 'https://app.unleash-hosted.com/sign-in', - position: 'right', - }, - { - type: 'html', - position: 'right', - value: `
- - Stars - ${stars} - `, - }, - { - label: 'Get a demo', - href: 'https://www.getunleash.io/plans/enterprise', - position: 'right', - }, - ], - }, - prism: { - additionalLanguages: [ - 'csharp', - 'dart', - 'java', - 'php', - 'ruby', - 'bash', - 'diff', - ], + navbar: { + logo: { + alt: 'Unleash logo', + src: 'https://getunleash.io/logos/unleash_pos.svg', + srcDark: 'img/unleash_logo_white.svg', + href: 'https://www.getunleash.io', }, - languageTabs: [ - { - highlight: 'bash', - language: 'curl', - }, - { - highlight: 'python', - language: 'python', - variant: 'requests', - }, + items: [ { - highlight: 'go', - language: 'go', + type: 'doc', + position: 'right', + docId: 'quickstart', + html: 'Quickstart', }, { - highlight: 'javascript', - language: 'nodejs', - variant: 'native', + type: 'doc', + position: 'right', + docId: 'welcome', + html: 'Docs', }, { - highlight: 'ruby', - language: 'ruby', + type: 'html', + value: 'Product', + position: 'right', }, { - highlight: 'csharp', - language: 'csharp', - variant: 'httpclient', + type: 'html', + value: 'Plans', + position: 'right', }, { - highlight: 'php', - language: 'php', - }, - { - highlight: 'java', - language: 'java', - }, - { - highlight: 'powershell', - language: 'powershell', - }, - ], - footer: { - links: [ - { - title: 'Feature Flag use cases', - items: [ - { - label: 'Secure, scalable feature flags', - to: 'https://getunleash.io/TBD', - }, - { - label: 'Rollbacks', - to: 'https://getunleash.io/TBD', - }, - { - label: 'Fedramp, SOC2, ISO2700 compliance', - to: 'https://getunleash.io/TBD', - }, - { - label: 'Progressive or gradual rollouts', - to: 'https://getunleash.io/TBD', - }, - { - label: 'Trunk-based development', - to: 'https://getunleash.io/TBD', - }, - { - label: 'Software kill switches', - to: 'https://getunleash.io/TBD', - }, - { - label: 'A/B testing', - to: 'https://getunleash.io/TBD', - }, - { - label: 'Feature Management', - to: 'https://getunleash.io/TBD', - }, - { - label: 'Canary releases', - to: 'https://getunleash.io/TBD', - }, - ], - }, - { - title: 'Product', - items: [ - { - label: 'Docs', - to: '/', - }, - { - label: 'Unleash on GitHub', - href: 'https://github.com/Unleash/unleash', - }, - { - label: 'Roadmap', - href: 'https://github.com/orgs/Unleash/projects/10', - }, - { - label: 'Unleash help center', - href: 'https://getunleash.zendesk.com/hc/en-gb', - }, - ], - }, - { - title: 'Community', - items: [ - { - label: 'GitHub discussions', - href: 'https://github.com/unleash/unleash/discussions/', - }, - { - label: 'Slack', - href: 'https://slack.unleash.run/', - }, - { - label: 'Stack Overflow', - href: 'https://stackoverflow.com/questions/tagged/unleash', - }, - { - label: 'Twitter', - href: 'https://twitter.com/getunleash', - }, - ], - }, - ], - }, - image: 'img/logo.png', - imageZoom: { - // Optional medium-zoom options at - // https://www.npmjs.com/package/medium-zoom#options - options: { - background: 'var(--ifm-background-color)', + type: 'html', + value: 'Blog', + position: 'right', }, - }, - }, - presets: [ - [ - '@docusaurus/preset-classic', { - docs: { - // Please change this to your repo. - editUrl: - 'https://github.com/Unleash/unleash/edit/main/website/', - routeBasePath: '/', - remarkPlugins: [[pluginNpm2Yarn, { sync: true }]], - docItemComponent: '@theme/ApiItem', - sidebarPath: './sidebars.ts', - }, - theme: { - customCss: './src/css/custom.css', - }, - googleAnalytics: { - trackingID: 'UA-134882379-1', - }, - googleTagManager: { - containerId: 'GTM-KV5PRR2', - }, - sitemap: { - changefreq: 'weekly', - lastmod: 'date', - priority: 0.5, - createSitemapItems: async (params) => { - const { defaultCreateSitemapItems, ...rest } = - params; - const items = await defaultCreateSitemapItems(rest); - return items.filter( - (item) => !item.url.includes('/page/'), - ); - }, - }, + type: 'html', + position: 'right', + value: '', }, - ], - ], - plugins: [ - [ - // heads up to anyone making redirects: - // - // remember that redirects only work in production and not in - // development, as mentioned in the docs - // https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-client-redirects/ - '@docusaurus/plugin-client-redirects', { - fromExtensions: ['html', 'htm'], - redirects: [ - { - to: '/how-to/how-to-create-api-tokens', - from: [ - '/user_guide/api-token', - '/deploy/user_guide/api-token', - ], - }, - { - from: '/advanced/audit_log', - to: '/reference/events', - }, - { - from: '/reference/event-log', - to: '/reference/events', - }, - { - from: '/reference/event-types', - to: '/reference/events', - }, - { - from: '/advanced/api_access', - to: '/how-to/how-to-use-the-admin-api', - }, - { - from: '/advanced/archived_toggles', - to: '/reference/feature-toggles', - }, - { - from: [ - '/advanced/custom-activation-strategy', - '/advanced/custom_activation_strategy', - ], - to: '/reference/custom-activation-strategies', - }, - { - from: '/advanced/feature_toggle_types', - to: '/reference/feature-toggles', - }, - { - from: [ - '/toggle_variants', - '/advanced/feature_toggle_variants', - '/advanced/toggle_variants', - ], - to: '/reference/feature-toggle-variants', - }, - { - from: [ - '/advanced/impression-data', - '/advanced/impression_data', - ], - to: '/reference/impression-data', - }, - { - from: '/advanced/stickiness', - to: '/reference/stickiness', - }, - { - from: '/advanced/sso-google', - to: '/how-to/how-to-add-sso-google', - }, - { - from: '/advanced/sso-open-id-connect', - to: '/how-to/how-to-add-sso-open-id-connect', - }, - { - from: '/advanced/sso-saml-keycloak', - to: '/how-to/how-to-add-sso-saml-keycloak', - }, - { - from: '/advanced/sso-saml', - to: '/how-to/how-to-add-sso-saml', - }, - { - from: '/advanced/enterprise-authentication', - to: '/reference/sso', - }, - { - from: ['/addons', '/reference/addons'], - to: '/reference/integrations', - }, - { - from: [ - '/addons/datadog', - '/reference/addons/datadog', - ], - to: '/reference/integrations/datadog', - }, - { - from: ['/addons/slack', '/reference/addons/slack'], - to: '/reference/integrations/slack', - }, - { - from: [ - '/addons/slack-app', - '/reference/addons/slack-app', - ], - to: '/reference/integrations/slack-app', - }, - { - from: ['/addons/teams', '/reference/addons/teams'], - to: '/reference/integrations/teams', - }, - { - from: [ - '/addons/webhook', - '/reference/addons/webhook', - ], - to: '/reference/integrations/webhook', - }, - { - from: '/guides/feature_updates_to_slack', - to: '/how-to/how-to-send-feature-updates-to-slack-deprecated', - }, - { - from: [ - '/integrations/integrations', - '/integrations', - ], - to: '/reference/integrations', - }, - { - from: '/integrations/jira_server_plugin_installation', - to: '/reference/integrations/jira-server-plugin-installation', - }, - { - from: '/integrations/jira_server_plugin_usage', - to: '/reference/integrations/jira-server-plugin-usage', - }, - { - from: [ - '/sdks', - '/user_guide/client-sdk', - '/client-sdk', - '/user_guide/connect_sdk', - '/sdks/community', - ], - to: '/reference/sdks', - }, - { - from: '/sdks/go_sdk', - to: '/reference/sdks/go', - }, - { - from: '/sdks/java_sdk', - to: '/reference/sdks/java', - }, - { - from: '/sdks/node_sdk', - to: '/reference/sdks/node', - }, - { - from: '/sdks/php_sdk', - to: '/reference/sdks/php', - }, - { - from: '/sdks/python_sdk', - to: '/reference/sdks/python', - }, - { - from: '/sdks/dot_net_sdk', - to: '/reference/sdks/dotnet', - }, - { - from: '/sdks/ruby_sdk', - to: '/reference/sdks/ruby', - }, - { - from: '/sdks/android_proxy_sdk', - to: '/reference/sdks/android-proxy', - }, - { - from: '/sdks/proxy-ios', - to: '/reference/sdks/ios-proxy', - }, - { - from: [ - '/sdks/proxy-javascript', - '/sdks/javascript-browser', - ], - to: '/reference/sdks/javascript-browser', - }, - { - from: ['/sdks/proxy-react', '/sdks/react'], - to: '/reference/sdks/react', - }, - { - from: '/sdks/proxy-vue', - to: '/reference/sdks/vue', - }, - { - from: '/sdks/proxy-svelte', - to: '/reference/sdks/svelte', - }, - { - from: [ - '/user_guide/native_apps', - '/user_guide/proxy-api', - '/sdks/unleash-proxy', - ], - to: '/reference/unleash-proxy', - }, - { - to: '/reference/activation-strategies', - from: [ - '/user_guide/control_rollout', - '/user_guide/activation_strategy', - ], - }, - { - from: '/user_guide/environments', - to: '/reference/environments', - }, - { - from: '/user_guide/projects', - to: '/reference/projects', - }, - { - from: ['/user_guide/rbac', '/advanced/groups'], - to: '/reference/rbac', - }, - { - from: '/user_guide/technical_debt', - to: '/reference/technical-debt', - }, - { - from: '/user_guide/unleash_context', - to: '/reference/unleash-context', - }, - { - from: '/user_guide/user-management', - to: '/how-to/how-to-add-users-to-unleash', - }, - { - from: '/user_guide/v4-whats-new', - to: '/reference/whats-new-v4', - }, - { - from: [ - '/user_guide/important-concepts', - '/tutorials/important-concepts', - '/reference/concepts/', - ], - to: '/reference', - }, - { - from: [ - '/user_guide/quickstart', - '/docs/getting_started', - '/tutorials/quickstart', - '/tutorials/getting-started', - ], - to: '/quickstart', - }, - { - from: '/api/basic-auth', - to: '/reference/api/legacy/unleash/basic-auth', - }, - { - from: '/api', - to: '/reference/api/legacy/unleash', - }, - { - from: '/api/admin/addons', - to: '/reference/api/legacy/unleash/admin/addons', - }, - { - from: '/api/admin/context', - to: '/reference/api/legacy/unleash/admin/context', - }, - { - from: '/api/admin/events', - to: '/reference/api/legacy/unleash/admin/events', - }, - { - from: '/api/admin/feature-toggles-v2', - to: '/reference/api/legacy/unleash/admin/features-v2', - }, - { - from: '/api/admin/feature-types', - to: '/reference/api/legacy/unleash/admin/feature-types', - }, - { - from: '/api/admin/features', - to: '/reference/api/legacy/unleash/admin/features', - }, - { - from: '/api/admin/features-archive', - to: '/reference/api/legacy/unleash/admin/archive', - }, - { - from: '/api/admin/metrics', - to: '/reference/api/legacy/unleash/admin/metrics', - }, - { - from: '/api/admin/projects', - to: '/reference/api/legacy/unleash/admin/projects', - }, - { - from: '/api/admin/segments', - to: '/reference/api/legacy/unleash/admin/segments', - }, - { - from: '/api/admin/state', - to: '/reference/api/legacy/unleash/admin/state', - }, - { - from: '/api/admin/strategies', - to: '/reference/api/legacy/unleash/admin/strategies', - }, - { - from: '/api/admin/tags', - to: '/reference/api/legacy/unleash/admin/tags', - }, - { - from: '/api/admin/user-admin', - to: '/reference/api/legacy/unleash/admin/user-admin', - }, - { - from: '/api/client/features', - to: '/reference/api/legacy/unleash/client/features', - }, - { - from: '/api/client/metrics', - to: '/reference/api/legacy/unleash/client/metrics', - }, - { - from: '/api/client/register', - to: '/reference/api/legacy/unleash/client/register', - }, - { - from: '/api/internal/internal', - to: '/reference/api/legacy/unleash/internal/prometheus', - }, - { - from: '/api/internal/health', - to: '/reference/api/legacy/unleash/internal/health', - }, - { - from: '/help', - to: '/', - }, + type: 'dropdown', + position: 'right', + html: 'Unleash Academy', + to: 'unleash-academy/introduction', + items: [ { - from: [ - '/topics/feature-flags/tutorials', - '/tutorials', - ], - to: '/feature-flag-tutorials', + type: 'doc', + docId: 'unleash-academy/foundational', + label: 'Foundational', }, { - from: ['/tutorials/academy', '/unleash-academy'], - to: '/unleash-academy/introduction', + type: 'doc', + docId: 'unleash-academy/advanced-for-devs', + label: 'Advanced for Developers', }, { - from: '/tutorials/academy-foundational', - to: '/unleash-academy/foundational', - }, - { - from: '/tutorials/academy-advanced-for-devs', - to: '/unleash-academy/advanced-for-devs', - }, - { - from: '/tutorials/academy-managing-unleash-for-devops', - to: '/unleash-academy/managing-unleash-for-devops', - }, - { - from: '/developer-guide', - to: '/contributing', - }, - { - from: [ - '/tutorials/unleash-overview', - '/user_guide/unleash_overview', - ], - to: '/understanding-unleash/unleash-overview', - }, - { - from: [ - '/tutorials/managing-constraints', - '/topics/managing-constraints', - ], - to: '/understanding-unleash/managing-constraints', - }, - { - from: [ - '/tutorials/the-anatomy-of-unleash', - '/topics/the-anatomy-of-unleash', - ], - to: '/understanding-unleash/the-anatomy-of-unleash', - }, - { - from: [ - '/tutorials/proxy-hosting', - '/topics/proxy-hosting', - ], - to: '/understanding-unleash/proxy-hosting', - }, - { - from: [ - '/tutorials/data-collection', - '/topics/data-collection', - ], - to: '/understanding-unleash/data-collection', + type: 'doc', + docId: 'unleash-academy/managing-unleash-for-devops', + label: 'Managing Unleash for DevOps/Admins', }, + ], + }, + { + type: 'dropdown', + position: 'right', + html: 'Unleash Certification', + items: [ { - from: '/how-to/how-to-troubleshoot-flag-exposure', - to: '/using-unleash/troubleshooting/flag-exposure', - }, - { - from: '/how-to/how-to-troubleshoot-flag-not-returned', - to: '/using-unleash/troubleshooting/flag-not-returned', - }, - { - from: '/how-to/how-to-troubleshoot-cors', - to: '/using-unleash/troubleshooting/cors', - }, - { - from: '/how-to/how-to-troubleshoot-https', - to: '/using-unleash/troubleshooting/https', - }, - { - from: '/how-to/how-to-troubleshoot-feature-not-available', - to: '/using-unleash/troubleshooting/feature-not-available', - }, - { - from: ['/reference/deploy', '/deploy'], - to: '/using-unleash/deploy', + label: 'Foundational Unleash', + href: 'https://docs.google.com/forms/d/1iPUk2I0k5xMzicn9aLMcPF3b9ub3ZwdVjRxCxWxV7js/viewform', }, { - from: [ - '/reference/deploy/getting-started', - '/deploy/getting_started', - ], - to: '/using-unleash/deploy/getting-started', + label: 'Advanced Unleash for Developers', + href: 'https://docs.google.com/forms/d/1NUL9hyO8Ys916TB6fPV3-jkvD97OmPXZ8_TO84Wjqgc/viewform', }, { - from: [ - '/reference/deploy/configuring-unleash', - '/deploy/configuring_unleash', - ], - to: '/using-unleash/deploy/configuring-unleash', + label: 'Managing Unleash for DevOps/Admins', + href: 'https://docs.google.com/forms/d/1JlIqmXI3P7dj0n-OiUs2IYsYXgmqw23BChaemlSgHJA/viewform', }, + ], + }, + { + type: 'html', + position: 'right', + value: '', + }, + { + type: 'html', + value: 'Sign in', + position: 'right', + }, + { + type: 'html', + position: 'right', + value: '', + }, + { + type: 'html', + position: 'right', + value: ` + +`, + }, + ], + }, + prism: { + additionalLanguages: [ + 'csharp', + 'dart', + 'java', + 'php', + 'ruby', + 'bash', + 'diff', + ], + }, + languageTabs: [ + { + highlight: 'bash', + language: 'curl', + }, + { + highlight: 'python', + language: 'python', + variant: 'requests', + }, + { + highlight: 'go', + language: 'go', + }, + { + highlight: 'javascript', + language: 'nodejs', + variant: 'native', + }, + { + highlight: 'ruby', + language: 'ruby', + }, + { + highlight: 'csharp', + language: 'csharp', + variant: 'httpclient', + }, + { + highlight: 'php', + language: 'php', + }, + { + highlight: 'java', + language: 'java', + }, + { + highlight: 'powershell', + language: 'powershell', + }, + ], + footer: { + style: 'dark', + links: [ + { + title: 'Product', + items: [ { - from: [ - '/reference/deploy/database-setup', - '/deploy/database-setup', - ], - to: '/using-unleash/deploy/database-setup', + label: 'Docs', + to: '/', }, { - from: [ - '/reference/deploy/database-backup', - '/deploy/database-backup', - ], - to: '/using-unleash/deploy/database-backup', + label: 'Unleash on GitHub', + href: 'https://github.com/Unleash/unleash', }, { - from: [ - '/reference/deploy/email-service', - '/deploy/email', - ], - to: '/using-unleash/deploy/email-service', + label: 'Roadmap', + href: 'https://github.com/orgs/Unleash/projects/10', }, { - from: [ - '/reference/deploy/google-auth-hook', - '/deploy/google_auth', - ], - to: '/using-unleash/deploy/google-auth-hook', + label: 'Unleash help center', + href: 'https://getunleash.zendesk.com/hc/en-gb', }, + ], + }, + { + title: 'Community', + items: [ { - from: [ - '/deploy/migration_guide', - '/reference/deploy/migration-guide', - ], - to: '/using-unleash/deploy/upgrading-unleash', + label: 'GitHub discussions', + href: 'https://github.com/unleash/unleash/discussions/', }, { - from: [ - '/reference/deploy/securing-unleash', - '/deploy/securing_unleash', - ], - to: '/using-unleash/deploy/securing-unleash', + label: 'Slack', + href: 'https://slack.unleash.run/', }, { - from: [ - '/reference/deploy/import-export', - '/deploy/import_export', - ], - to: '/how-to/how-to-import-export', + label: 'Stack Overflow', + href: 'https://stackoverflow.com/questions/tagged/unleash', }, { - from: [ - '/reference/deploy/environment-import-export', - '/deploy/environment-import-export', - ], - to: '/how-to/how-to-environment-import-export', + label: 'Twitter', + href: 'https://twitter.com/getunleash', }, - { - from: [ - '/topics/feature-flags/runtime-control', - '/topics/feature-flags/never-expose-pii', - '/topics/feature-flags/evaluate-flags-close-to-user', - '/topics/feature-flags/scale-horizontally', - '/topics/feature-flags/limit-payloads', - '/topics/feature-flags/availability-over-consistency', - '/topics/feature-flags/short-lived-feature-flags', - '/topics/feature-flags/unique-names', - '/topics/feature-flags/democratize-feature-flag-access', - '/topics/feature-flags/prioritize-ux', - '/topics/feature-flags/enable-traceability', - ], - to: '/topics/feature-flags/feature-flag-best-practices', - }, - { - from: [ - '/topics/feature-flag-migration/feature-flag-migration-scope', - '/topics/feature-flag-migration/business-case-feature-flag-migration', - '/topics/feature-flag-migration/planning-feature-flag-migration', - '/topics/feature-flag-migration/how-to-execute-feature-flag-migration', - '/topics/feature-flag-migration/onbording-users-to-feature-flag-service', - ], - to: '/topics/feature-flag-migration/feature-flag-migration-best-practices', - }, - { - from: '/topics/a-b-testing', - to: '/feature-flag-tutorials/use-cases/a-b-testing', - }, - ].map(addDocsRoutePrefix), // add /docs prefixes - createRedirects: (toPath) => { - if ( - toPath.indexOf('/docs/') === -1 && - toPath.indexOf('index.html') === -1 - ) { - return `/docs/${toPath}`; - } - }, + ], }, ], - [ - 'docusaurus-plugin-openapi-docs', - { - id: 'api-operations', - docsPluginId: 'classic', - config: { - server: { - specPath: 'docs/generated/openapi.json', - outputDir: 'docs/reference/api/unleash', - sidebarOptions: { - groupPathsBy: 'tag', - categoryLinkSource: 'tag', - }, - }, + copyright: `Copyright © ${new Date().getFullYear()} Unleash. Built with Docusaurus.`, + logo: { + src: 'img/logo.svg', + alt: 'Unleash logo', + }, + }, + image: 'img/logo.png', + imageZoom: { + // Optional medium-zoom options at + // https://www.npmjs.com/package/medium-zoom#options + options: { + background: 'var(--ifm-background-color)', + }, + }, + }, + presets: [ + [ + '@docusaurus/preset-classic', + { + docs: { + // Please change this to your repo. + editUrl: + 'https://github.com/Unleash/unleash/edit/main/website/', + routeBasePath: '/', + remarkPlugins: [[pluginNpm2Yarn, { sync: true }]], + docItemComponent: '@theme/ApiItem', + sidebarPath: './sidebars.ts', + }, + theme: { + customCss: './src/css/custom.css', + }, + googleAnalytics: { + trackingID: 'UA-134882379-1', + }, + googleTagManager: { + containerId: 'GTM-KV5PRR2', + }, + sitemap: { + changefreq: 'weekly', + lastmod: 'date', + priority: 0.5, + createSitemapItems: async (params) => { + const { defaultCreateSitemapItems, ...rest } = params; + const items = await defaultCreateSitemapItems(rest); + return items.filter( + (item) => !item.url.includes('/page/'), + ); }, }, - ], - [ - 'docusaurus-plugin-remote-content', - { - // more info at https://github.com/rdilweb/docusaurus-plugin-remote-content#options - name: 'content-sdks', - sourceBaseUrl: 'https://raw.githubusercontent.com/Unleash/', // gets prepended to all of the documents when fetching - outDir: 'docs/generated', // the base directory to output to. - documents: sdks.urls, // the file names to download - modifyContent: sdks.modifyContent, - noRuntimeDownloads: true, + }, + ], + ], + plugins: [ + [ + // heads up to anyone making redirects: + // + // remember that redirects only work in production and not in + // development, as mentioned in the docs + // https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-client-redirects/ + '@docusaurus/plugin-client-redirects', + { + fromExtensions: ['html', 'htm'], + redirects: [ + { + to: '/how-to/how-to-create-api-tokens', + from: [ + '/user_guide/api-token', + '/deploy/user_guide/api-token', + ], + }, + { + from: '/advanced/audit_log', + to: '/reference/events', + }, + { + from: '/reference/event-log', + to: '/reference/events', + }, + { + from: '/reference/event-types', + to: '/reference/events', + }, + { + from: '/advanced/api_access', + to: '/how-to/how-to-use-the-admin-api', + }, + { + from: '/advanced/archived_toggles', + to: '/reference/feature-toggles', + }, + { + from: [ + '/advanced/custom-activation-strategy', + '/advanced/custom_activation_strategy', + ], + to: '/reference/custom-activation-strategies', + }, + { + from: '/advanced/feature_toggle_types', + to: '/reference/feature-toggles', + }, + { + from: [ + '/toggle_variants', + '/advanced/feature_toggle_variants', + '/advanced/toggle_variants', + ], + to: '/reference/feature-toggle-variants', + }, + { + from: [ + '/advanced/impression-data', + '/advanced/impression_data', + ], + to: '/reference/impression-data', + }, + { + from: '/advanced/stickiness', + to: '/reference/stickiness', + }, + { + from: '/advanced/sso-google', + to: '/how-to/how-to-add-sso-google', + }, + { + from: '/advanced/sso-open-id-connect', + to: '/how-to/how-to-add-sso-open-id-connect', + }, + { + from: '/advanced/sso-saml-keycloak', + to: '/how-to/how-to-add-sso-saml-keycloak', + }, + { + from: '/advanced/sso-saml', + to: '/how-to/how-to-add-sso-saml', + }, + { + from: '/advanced/enterprise-authentication', + to: '/reference/sso', + }, + { + from: ['/addons', '/reference/addons'], + to: '/reference/integrations', + }, + { + from: ['/addons/datadog', '/reference/addons/datadog'], + to: '/reference/integrations/datadog', + }, + { + from: ['/addons/slack', '/reference/addons/slack'], + to: '/reference/integrations/slack', + }, + { + from: [ + '/addons/slack-app', + '/reference/addons/slack-app', + ], + to: '/reference/integrations/slack-app', + }, + { + from: ['/addons/teams', '/reference/addons/teams'], + to: '/reference/integrations/teams', + }, + { + from: ['/addons/webhook', '/reference/addons/webhook'], + to: '/reference/integrations/webhook', + }, + { + from: '/guides/feature_updates_to_slack', + to: '/how-to/how-to-send-feature-updates-to-slack-deprecated', + }, + { + from: ['/integrations/integrations', '/integrations'], + to: '/reference/integrations', + }, + { + from: '/integrations/jira_server_plugin_installation', + to: '/reference/integrations/jira-server-plugin-installation', + }, + { + from: '/integrations/jira_server_plugin_usage', + to: '/reference/integrations/jira-server-plugin-usage', + }, + { + from: [ + '/sdks', + '/user_guide/client-sdk', + '/client-sdk', + '/user_guide/connect_sdk', + '/sdks/community', + ], + to: '/reference/sdks', + }, + { + from: '/sdks/go_sdk', + to: '/reference/sdks/go', + }, + { + from: '/sdks/java_sdk', + to: '/reference/sdks/java', + }, + { + from: '/sdks/node_sdk', + to: '/reference/sdks/node', + }, + { + from: '/sdks/php_sdk', + to: '/reference/sdks/php', + }, + { + from: '/sdks/python_sdk', + to: '/reference/sdks/python', + }, + { + from: '/sdks/dot_net_sdk', + to: '/reference/sdks/dotnet', + }, + { + from: '/sdks/ruby_sdk', + to: '/reference/sdks/ruby', + }, + { + from: '/sdks/android_proxy_sdk', + to: '/reference/sdks/android-proxy', + }, + { + from: '/sdks/proxy-ios', + to: '/reference/sdks/ios-proxy', + }, + { + from: [ + '/sdks/proxy-javascript', + '/sdks/javascript-browser', + ], + to: '/reference/sdks/javascript-browser', + }, + { + from: ['/sdks/proxy-react', '/sdks/react'], + to: '/reference/sdks/react', + }, + { + from: '/sdks/proxy-vue', + to: '/reference/sdks/vue', + }, + { + from: '/sdks/proxy-svelte', + to: '/reference/sdks/svelte', + }, + { + from: [ + '/user_guide/native_apps', + '/user_guide/proxy-api', + '/sdks/unleash-proxy', + ], + to: '/reference/unleash-proxy', + }, + { + to: '/reference/activation-strategies', + from: [ + '/user_guide/control_rollout', + '/user_guide/activation_strategy', + ], + }, + { + from: '/user_guide/environments', + to: '/reference/environments', + }, + { + from: '/user_guide/projects', + to: '/reference/projects', + }, + { + from: ['/user_guide/rbac', '/advanced/groups'], + to: '/reference/rbac', + }, + { + from: '/user_guide/technical_debt', + to: '/reference/technical-debt', + }, + { + from: '/user_guide/unleash_context', + to: '/reference/unleash-context', + }, + { + from: '/user_guide/user-management', + to: '/how-to/how-to-add-users-to-unleash', + }, + { + from: '/user_guide/v4-whats-new', + to: '/reference/whats-new-v4', + }, + { + from: [ + '/user_guide/important-concepts', + '/tutorials/important-concepts', + '/reference/concepts/', + ], + to: '/reference', + }, + { + from: [ + '/user_guide/quickstart', + '/docs/getting_started', + '/tutorials/quickstart', + '/tutorials/getting-started', + ], + to: '/quickstart', + }, + { + from: '/api/basic-auth', + to: '/reference/api/legacy/unleash/basic-auth', + }, + { + from: '/api', + to: '/reference/api/legacy/unleash', + }, + { + from: '/api/admin/addons', + to: '/reference/api/legacy/unleash/admin/addons', + }, + { + from: '/api/admin/context', + to: '/reference/api/legacy/unleash/admin/context', + }, + { + from: '/api/admin/events', + to: '/reference/api/legacy/unleash/admin/events', + }, + { + from: '/api/admin/feature-toggles-v2', + to: '/reference/api/legacy/unleash/admin/features-v2', + }, + { + from: '/api/admin/feature-types', + to: '/reference/api/legacy/unleash/admin/feature-types', + }, + { + from: '/api/admin/features', + to: '/reference/api/legacy/unleash/admin/features', + }, + { + from: '/api/admin/features-archive', + to: '/reference/api/legacy/unleash/admin/archive', + }, + { + from: '/api/admin/metrics', + to: '/reference/api/legacy/unleash/admin/metrics', + }, + { + from: '/api/admin/projects', + to: '/reference/api/legacy/unleash/admin/projects', + }, + { + from: '/api/admin/segments', + to: '/reference/api/legacy/unleash/admin/segments', + }, + { + from: '/api/admin/state', + to: '/reference/api/legacy/unleash/admin/state', + }, + { + from: '/api/admin/strategies', + to: '/reference/api/legacy/unleash/admin/strategies', + }, + { + from: '/api/admin/tags', + to: '/reference/api/legacy/unleash/admin/tags', + }, + { + from: '/api/admin/user-admin', + to: '/reference/api/legacy/unleash/admin/user-admin', + }, + { + from: '/api/client/features', + to: '/reference/api/legacy/unleash/client/features', + }, + { + from: '/api/client/metrics', + to: '/reference/api/legacy/unleash/client/metrics', + }, + { + from: '/api/client/register', + to: '/reference/api/legacy/unleash/client/register', + }, + { + from: '/api/internal/internal', + to: '/reference/api/legacy/unleash/internal/prometheus', + }, + { + from: '/api/internal/health', + to: '/reference/api/legacy/unleash/internal/health', + }, + { + from: '/help', + to: '/', + }, + { + from: ['/topics/feature-flags/tutorials', '/tutorials'], + to: '/feature-flag-tutorials', + }, + { + from: ['/tutorials/academy', '/unleash-academy'], + to: '/unleash-academy/introduction', + }, + { + from: '/tutorials/academy-foundational', + to: '/unleash-academy/foundational', + }, + { + from: '/tutorials/academy-advanced-for-devs', + to: '/unleash-academy/advanced-for-devs', + }, + { + from: '/tutorials/academy-managing-unleash-for-devops', + to: '/unleash-academy/managing-unleash-for-devops', + }, + { + from: '/developer-guide', + to: '/contributing', + }, + { + from: [ + '/tutorials/unleash-overview', + '/user_guide/unleash_overview', + ], + to: '/understanding-unleash/unleash-overview', + }, + { + from: [ + '/tutorials/managing-constraints', + '/topics/managing-constraints', + ], + to: '/understanding-unleash/managing-constraints', + }, + { + from: [ + '/tutorials/the-anatomy-of-unleash', + '/topics/the-anatomy-of-unleash', + ], + to: '/understanding-unleash/the-anatomy-of-unleash', + }, + { + from: [ + '/tutorials/proxy-hosting', + '/topics/proxy-hosting', + ], + to: '/understanding-unleash/proxy-hosting', + }, + { + from: [ + '/tutorials/data-collection', + '/topics/data-collection', + ], + to: '/understanding-unleash/data-collection', + }, + + { + from: '/how-to/how-to-troubleshoot-flag-exposure', + to: '/using-unleash/troubleshooting/flag-exposure', + }, + { + from: '/how-to/how-to-troubleshoot-flag-not-returned', + to: '/using-unleash/troubleshooting/flag-not-returned', + }, + { + from: '/how-to/how-to-troubleshoot-cors', + to: '/using-unleash/troubleshooting/cors', + }, + { + from: '/how-to/how-to-troubleshoot-https', + to: '/using-unleash/troubleshooting/https', + }, + { + from: '/how-to/how-to-troubleshoot-feature-not-available', + to: '/using-unleash/troubleshooting/feature-not-available', + }, + { + from: ['/reference/deploy', '/deploy'], + to: '/using-unleash/deploy', + }, + { + from: [ + '/reference/deploy/getting-started', + '/deploy/getting_started', + ], + to: '/using-unleash/deploy/getting-started', + }, + { + from: [ + '/reference/deploy/configuring-unleash', + '/deploy/configuring_unleash', + ], + to: '/using-unleash/deploy/configuring-unleash', + }, + { + from: [ + '/reference/deploy/database-setup', + '/deploy/database-setup', + ], + to: '/using-unleash/deploy/database-setup', + }, + { + from: [ + '/reference/deploy/database-backup', + '/deploy/database-backup', + ], + to: '/using-unleash/deploy/database-backup', + }, + { + from: [ + '/reference/deploy/email-service', + '/deploy/email', + ], + to: '/using-unleash/deploy/email-service', + }, + { + from: [ + '/reference/deploy/google-auth-hook', + '/deploy/google_auth', + ], + to: '/using-unleash/deploy/google-auth-hook', + }, + { + from: [ + '/deploy/migration_guide', + '/reference/deploy/migration-guide', + ], + to: '/using-unleash/deploy/upgrading-unleash', + }, + { + from: [ + '/reference/deploy/securing-unleash', + '/deploy/securing_unleash', + ], + to: '/using-unleash/deploy/securing-unleash', + }, + { + from: [ + '/reference/deploy/import-export', + '/deploy/import_export', + ], + to: '/how-to/how-to-import-export', + }, + { + from: [ + '/reference/deploy/environment-import-export', + '/deploy/environment-import-export', + ], + to: '/how-to/how-to-environment-import-export', + }, + { + from: [ + '/topics/feature-flags/runtime-control', + '/topics/feature-flags/never-expose-pii', + '/topics/feature-flags/evaluate-flags-close-to-user', + '/topics/feature-flags/scale-horizontally', + '/topics/feature-flags/limit-payloads', + '/topics/feature-flags/availability-over-consistency', + '/topics/feature-flags/short-lived-feature-flags', + '/topics/feature-flags/unique-names', + '/topics/feature-flags/democratize-feature-flag-access', + '/topics/feature-flags/prioritize-ux', + '/topics/feature-flags/enable-traceability', + ], + to: '/topics/feature-flags/feature-flag-best-practices', + }, + { + from: [ + '/topics/feature-flag-migration/feature-flag-migration-scope', + '/topics/feature-flag-migration/business-case-feature-flag-migration', + '/topics/feature-flag-migration/planning-feature-flag-migration', + '/topics/feature-flag-migration/how-to-execute-feature-flag-migration', + '/topics/feature-flag-migration/onbording-users-to-feature-flag-service', + ], + to: '/topics/feature-flag-migration/feature-flag-migration-best-practices', + }, + { + from: '/topics/a-b-testing', + to: '/feature-flag-tutorials/use-cases/a-b-testing', + }, + ].map(addDocsRoutePrefix), // add /docs prefixes + createRedirects: (toPath) => { + if ( + toPath.indexOf('/docs/') === -1 && + toPath.indexOf('index.html') === -1 + ) { + return `/docs/${toPath}`; + } }, - ], - [ - 'docusaurus-plugin-remote-content', - { - // more info at https://github.com/rdilweb/docusaurus-plugin-remote-content#options - name: 'content-external', - sourceBaseUrl: 'https://raw.githubusercontent.com/Unleash/', // gets prepended to all of the documents when fetching - outDir: 'docs/generated/', // the base directory to output to. - documents: edgeAndProxy.urls, // the file names to download - modifyContent: edgeAndProxy.modifyContent, - noRuntimeDownloads: true, + }, + ], + [ + 'docusaurus-plugin-openapi-docs', + { + id: 'api-operations', + docsPluginId: 'classic', + config: { + server: { + specPath: 'docs/generated/openapi.json', + outputDir: 'docs/reference/api/unleash', + sidebarOptions: { + groupPathsBy: 'tag', + categoryLinkSource: 'tag', + }, + }, }, - ], - 'plugin-image-zoom', + }, ], - themes: [ - 'docusaurus-theme-openapi-docs', // Allows use of @theme/ApiItem and other components + [ + 'docusaurus-plugin-remote-content', + { + // more info at https://github.com/rdilweb/docusaurus-plugin-remote-content#options + name: 'content-sdks', + sourceBaseUrl: 'https://raw.githubusercontent.com/Unleash/', // gets prepended to all of the documents when fetching + outDir: 'docs/generated', // the base directory to output to. + documents: sdks.urls, // the file names to download + modifyContent: sdks.modifyContent, + noRuntimeDownloads: true, + }, ], - scripts: [ + [ + 'docusaurus-plugin-remote-content', { - src: 'https://widget.kapa.ai/kapa-widget.bundle.js', - 'data-website-id': '1d187510-1726-4011-b0f7-62742ae064ee', - 'data-project-name': 'Unleash', - 'data-project-color': '#1A4049', - 'data-project-logo': - 'https://cdn.getunleash.io/uploads/2022/05/logo.png', - 'data-button-position-bottom': '80px', - defer: true, + // more info at https://github.com/rdilweb/docusaurus-plugin-remote-content#options + name: 'content-external', + sourceBaseUrl: 'https://raw.githubusercontent.com/Unleash/', // gets prepended to all of the documents when fetching + outDir: 'docs/generated/', // the base directory to output to. + documents: edgeAndProxy.urls, // the file names to download + modifyContent: edgeAndProxy.modifyContent, + noRuntimeDownloads: true, }, ], - clientModules: ['./global.js'], - }; -} + 'plugin-image-zoom', + ], + themes: [ + 'docusaurus-theme-openapi-docs', // Allows use of @theme/ApiItem and other components + ], + scripts: [ + { + src: 'https://widget.kapa.ai/kapa-widget.bundle.js', + 'data-website-id': '1d187510-1726-4011-b0f7-62742ae064ee', + 'data-project-name': 'Unleash', + 'data-project-color': '#1A4049', + 'data-project-logo': + 'https://cdn.getunleash.io/uploads/2022/05/logo.png', + defer: true, + }, + ], + clientModules: ['./global.js'], +}; + +export default config; diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 73cdb233b960..dc6801d85101 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -98,7 +98,6 @@ html[data-theme="dark"] { justify-content: space-between; gap: 10px; height: 100%; - border: 2px solid var(--ifm-navbar-link-color); padding: 0.25rem 0.5rem; } @@ -115,10 +114,6 @@ html[data-theme="dark"] { margin: 0.5rem; } -.navbar a[href*="http"] svg { - display: none; -} - .navbar .navbar__link--active:has(.hide-when-active) { display: none; } @@ -252,7 +247,7 @@ main .navbar__item:has(.navbar-separator) { width: 1px; height: 100%; - background: rgba(255, 255, 255, 0.3); + background: rgba(0, 0, 0, 0.3); padding: 0; margin-inline: var(--ifm-spacing-horizontal); } diff --git a/website/src/theme/Footer/footer.module.css b/website/src/theme/Footer/footer.module.css deleted file mode 100644 index 87c0076249f4..000000000000 --- a/website/src/theme/Footer/footer.module.css +++ /dev/null @@ -1,39 +0,0 @@ -.wrapper { - background-color: var(--ifm-background-color); - z-index: 1; -} - -.footer { - font-family: Styrene B Web, sans-serif; - border-top: 1px solid var(--ifm-font-color-base); - display: flex; - justify-content: space-between; - flex-wrap: wrap; -} - -.unleash { - max-width: 340px; - padding-top: var(--ifm-footer-padding-vertical); - padding-left: var(--ifm-spacing-horizontal); -} - -@media screen and (min-width: 768px) { - - .footer { - flex-wrap: nowrap; - } - -} - -.copyright { - min-height: 70px; - display: flex; - justify-content: space-between; - padding: 0 1rem; - align-items: center; - border-top: 1px solid var(--ifm-font-color-base); -} - -.copyright p{ - margin-bottom: 0; -} diff --git a/website/src/theme/Footer/index.tsx b/website/src/theme/Footer/index.tsx deleted file mode 100644 index 0137f36513cf..000000000000 --- a/website/src/theme/Footer/index.tsx +++ /dev/null @@ -1,98 +0,0 @@ -import Footer from '@theme-original/Footer'; -import type FooterType from '@theme/Footer'; -import type { WrapperProps } from '@docusaurus/types'; -import styles from './footer.module.css'; - -type Props = WrapperProps; - -export default function FooterWrapper(props: Props): JSX.Element { - return ( -
-
-
-

- Unleash reduces the risk of releasing new features, - drives innovation by streamlining the software release - process. While we serve the needs of the world's - largest, most security-conscious organizations, we are - also rated the “Easiest Feature Management system to - use” by G2. -

-
-
-
-
-

- - Heart - - - - - - - - - - - - - - - - Made in a cosy atmosphere in the Nordic countries. -

-

- {`Copyright © ${new Date().getFullYear()} Unleash. Built with Docusaurus.`} -

-
-
- ); -} From 85adf13371800b41ac70fba27493aa46b0d951fe Mon Sep 17 00:00:00 2001 From: Alvin Bryan Date: Fri, 20 Dec 2024 14:50:38 +0000 Subject: [PATCH 11/12] nicer logo --- website/docusaurus.config.ts | 2 +- website/static/img/unleash_logo_dark.svg | 7 +++++++ website/static/img/unleash_logo_white.svg | 8 +++++++- 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 website/static/img/unleash_logo_dark.svg diff --git a/website/docusaurus.config.ts b/website/docusaurus.config.ts index 0018712a9d4b..9ee6b656fc9c 100644 --- a/website/docusaurus.config.ts +++ b/website/docusaurus.config.ts @@ -69,7 +69,7 @@ const config: Config = { navbar: { logo: { alt: 'Unleash logo', - src: 'https://getunleash.io/logos/unleash_pos.svg', + src: 'img/unleash_logo_dark.svg', srcDark: 'img/unleash_logo_white.svg', href: 'https://www.getunleash.io', }, diff --git a/website/static/img/unleash_logo_dark.svg b/website/static/img/unleash_logo_dark.svg new file mode 100644 index 000000000000..88dd8c1edb9c --- /dev/null +++ b/website/static/img/unleash_logo_dark.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/website/static/img/unleash_logo_white.svg b/website/static/img/unleash_logo_white.svg index c051faf90af0..fb8583b1a52d 100644 --- a/website/static/img/unleash_logo_white.svg +++ b/website/static/img/unleash_logo_white.svg @@ -1 +1,7 @@ - \ No newline at end of file + + + + + + + From a67989f3f6bf9f544448220179b805edee704a28 Mon Sep 17 00:00:00 2001 From: Alvin Bryan Date: Fri, 20 Dec 2024 15:19:08 +0000 Subject: [PATCH 12/12] Old navbar color --- website/docusaurus.config.ts | 4 ++-- website/src/css/custom.css | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/website/docusaurus.config.ts b/website/docusaurus.config.ts index 9ee6b656fc9c..50460b565582 100644 --- a/website/docusaurus.config.ts +++ b/website/docusaurus.config.ts @@ -67,10 +67,10 @@ const config: Config = { indexName: 'getunleash', }, navbar: { + style: 'dark', logo: { alt: 'Unleash logo', - src: 'img/unleash_logo_dark.svg', - srcDark: 'img/unleash_logo_white.svg', + src: 'img/unleash_logo_white.svg', href: 'https://www.getunleash.io', }, items: [ diff --git a/website/src/css/custom.css b/website/src/css/custom.css index dc6801d85101..4f6d270a37b9 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -89,6 +89,9 @@ html[data-theme="dark"] { .navbar { color: var(--unleash-navbar-font-color); font-family: Styrene B Web, sans-serif; + height: 3.75rem; + background-color: #1a4049; + color: var(--ifm-navbar-link-color); } .header-github-link { @@ -98,7 +101,6 @@ html[data-theme="dark"] { justify-content: space-between; gap: 10px; height: 100%; - padding: 0.25rem 0.5rem; } .header-demo-button { @@ -247,7 +249,7 @@ main .navbar__item:has(.navbar-separator) { width: 1px; height: 100%; - background: rgba(0, 0, 0, 0.3); + background: rgba(255, 255, 255, 0.3); padding: 0; margin-inline: var(--ifm-spacing-horizontal); }