Merge pull request #16790 from backstage/remove-old-microsite
Remove old microsite
This commit is contained in:
@@ -7,6 +7,5 @@
|
||||
**/.git/**
|
||||
**/public/**
|
||||
**/microsite/**
|
||||
**/microsite-next/**
|
||||
**/templates/**
|
||||
**/sample-templates/**
|
||||
|
||||
@@ -33,7 +33,7 @@ jobs:
|
||||
run: yarn install --immutable
|
||||
- name: microsite yarn install
|
||||
run: yarn install --immutable
|
||||
working-directory: microsite-next
|
||||
working-directory: microsite
|
||||
- name: storybook yarn install
|
||||
run: yarn install --immutable
|
||||
working-directory: storybook
|
||||
@@ -43,20 +43,20 @@ jobs:
|
||||
|
||||
- name: build microsite
|
||||
run: yarn build
|
||||
working-directory: microsite-next
|
||||
working-directory: microsite
|
||||
|
||||
- name: build storybook
|
||||
run: yarn build-storybook
|
||||
working-directory: storybook
|
||||
|
||||
- name: move storybook dist into microsite
|
||||
run: mv storybook/dist/ microsite-next/build/storybook
|
||||
run: mv storybook/dist/ microsite/build/storybook
|
||||
|
||||
- name: Check the build output
|
||||
run: ls microsite-next/build && ls microsite-next/build/storybook
|
||||
run: ls microsite/build && ls microsite/build/storybook
|
||||
|
||||
- name: Deploy both microsite and storybook to gh-pages
|
||||
uses: JamesIves/github-pages-deploy-action@v4.4.1
|
||||
with:
|
||||
branch: gh-pages
|
||||
folder: microsite-next/build
|
||||
folder: microsite/build
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
name: Verify Microsite Next
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/verify_microsite-next.yml'
|
||||
- 'microsite-next/**'
|
||||
- 'docs/**'
|
||||
|
||||
jobs:
|
||||
build-microsite:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [16.x]
|
||||
|
||||
env:
|
||||
CI: true
|
||||
NODE_OPTIONS: --max-old-space-size=8192
|
||||
DOCUSAURUS_SSR_CONCURRENCY: 5
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: use node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
|
||||
# Skip caching of microsite dependencies, it keeps the global cache size
|
||||
# smaller, which make Windows builds a lot faster for the rest of the project.
|
||||
- name: top-level install
|
||||
run: yarn install --immutable
|
||||
|
||||
- name: yarn install
|
||||
run: yarn install --immutable
|
||||
working-directory: microsite-next
|
||||
|
||||
- name: build API reference
|
||||
run: yarn build:api-docs
|
||||
|
||||
- name: verify yarn dependency duplicates
|
||||
run: node scripts/verify-lockfile-duplicates.js
|
||||
|
||||
- name: prettier
|
||||
run: yarn prettier:check
|
||||
working-directory: microsite-next
|
||||
|
||||
- name: build microsite-next
|
||||
run: yarn build
|
||||
working-directory: microsite-next
|
||||
@@ -1,8 +1,8 @@
|
||||
name: Verify Microsite
|
||||
name: Verify Microsite Next
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/verify_microsite.yml'
|
||||
- '.github/workflows/verify_microsite-next.yml'
|
||||
- 'microsite/**'
|
||||
- 'docs/**'
|
||||
|
||||
@@ -16,7 +16,8 @@ jobs:
|
||||
|
||||
env:
|
||||
CI: true
|
||||
NODE_OPTIONS: --max-old-space-size=4096
|
||||
NODE_OPTIONS: --max-old-space-size=8192
|
||||
DOCUSAURUS_SSR_CONCURRENCY: 5
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
@@ -28,10 +29,16 @@ jobs:
|
||||
|
||||
# Skip caching of microsite dependencies, it keeps the global cache size
|
||||
# smaller, which make Windows builds a lot faster for the rest of the project.
|
||||
- name: top-level install
|
||||
run: yarn install --immutable
|
||||
|
||||
- name: yarn install
|
||||
run: yarn install --immutable
|
||||
working-directory: microsite
|
||||
|
||||
- name: build API reference
|
||||
run: yarn build:api-docs
|
||||
|
||||
- name: verify yarn dependency duplicates
|
||||
run: node scripts/verify-lockfile-duplicates.js
|
||||
|
||||
@@ -42,7 +49,3 @@ jobs:
|
||||
- name: build microsite
|
||||
run: yarn build
|
||||
working-directory: microsite
|
||||
|
||||
- name: verify sidebars
|
||||
run: yarn verify:sidebars
|
||||
working-directory: microsite
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
|
||||
# Build output
|
||||
build
|
||||
i18n
|
||||
.docusaurus
|
||||
@@ -1 +0,0 @@
|
||||
.docusaurus
|
||||
@@ -1,43 +0,0 @@
|
||||
{
|
||||
"version": "0.0.0",
|
||||
"name": "backstage-microsite",
|
||||
"license": "Apache-2.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"start": "node scripts/pre-build.js && docusaurus start",
|
||||
"build": "node scripts/pre-build.js && docusaurus build",
|
||||
"prettier:check": "prettier --check .",
|
||||
"publish-gh-pages": "docusaurus-publish",
|
||||
"write-translations": "docusaurus-write-translations",
|
||||
"version": "docusaurus-version",
|
||||
"rename-version": "docusaurus-rename-version",
|
||||
"verify:sidebars": "node ./scripts/verify-sidebars",
|
||||
"swizzle": "docusaurus swizzle",
|
||||
"deploy": "docusaurus deploy",
|
||||
"docusaurus": "docusaurus"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@docusaurus/module-type-aliases": "2.3.1",
|
||||
"@spotify/prettier-config": "^14.0.0",
|
||||
"@tsconfig/docusaurus": "^1.0.6",
|
||||
"@types/webpack-env": "^1.18.0",
|
||||
"js-yaml": "^4.1.0",
|
||||
"prettier": "^2.6.2",
|
||||
"replace": "^1.2.2",
|
||||
"typescript": "^4.9.4",
|
||||
"yaml-loader": "^0.8.0"
|
||||
},
|
||||
"prettier": "@spotify/prettier-config",
|
||||
"dependencies": {
|
||||
"@docusaurus/core": "2.3.1",
|
||||
"@docusaurus/plugin-client-redirects": "^2.3.1",
|
||||
"@docusaurus/preset-classic": "2.3.1",
|
||||
"@swc/core": "^1.3.36",
|
||||
"clsx": "^1.1.1",
|
||||
"docusaurus-plugin-sass": "^0.2.3",
|
||||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2",
|
||||
"sass": "^1.57.1",
|
||||
"swc-loader": "^0.2.3"
|
||||
}
|
||||
}
|
||||
@@ -1,409 +0,0 @@
|
||||
{
|
||||
"releases": {
|
||||
"Release Notes": [
|
||||
"releases/v1.11.0",
|
||||
"releases/v1.10.0",
|
||||
"releases/v1.9.0",
|
||||
"releases/v1.8.0",
|
||||
"releases/v1.7.0",
|
||||
"releases/v1.6.0",
|
||||
"releases/v1.5.0",
|
||||
"releases/v1.4.0",
|
||||
"releases/v1.3.0",
|
||||
"releases/v1.2.0",
|
||||
"releases/v1.1.0",
|
||||
"releases/v1.0.0"
|
||||
]
|
||||
},
|
||||
"docs": {
|
||||
"Overview": [
|
||||
"overview/what-is-backstage",
|
||||
"overview/architecture-overview",
|
||||
"overview/roadmap",
|
||||
"overview/vision",
|
||||
"overview/background",
|
||||
"overview/adopting",
|
||||
"overview/versioning-policy",
|
||||
"overview/threat-model",
|
||||
"overview/support",
|
||||
"overview/glossary",
|
||||
"overview/logos"
|
||||
],
|
||||
"Getting Started": [
|
||||
"getting-started/index",
|
||||
"getting-started/configuration",
|
||||
"getting-started/create-an-app",
|
||||
"getting-started/running-backstage-locally",
|
||||
{
|
||||
"type": "category",
|
||||
"label": "App configuration",
|
||||
"items": [
|
||||
"getting-started/configure-app-with-plugins",
|
||||
"getting-started/app-custom-theme",
|
||||
"getting-started/homepage"
|
||||
]
|
||||
},
|
||||
"getting-started/keeping-backstage-updated",
|
||||
"getting-started/concepts",
|
||||
"getting-started/contributors",
|
||||
"getting-started/getting-involved",
|
||||
"getting-started/project-structure"
|
||||
],
|
||||
"Local Development": [
|
||||
{
|
||||
"type": "category",
|
||||
"label": "CLI",
|
||||
"items": [
|
||||
"local-dev/cli-overview",
|
||||
"local-dev/cli-build-system",
|
||||
"local-dev/cli-commands"
|
||||
]
|
||||
},
|
||||
"local-dev/linking-local-packages"
|
||||
],
|
||||
"Core Features": [
|
||||
{
|
||||
"type": "category",
|
||||
"label": "Software Catalog",
|
||||
"items": [
|
||||
"features/software-catalog/software-catalog-overview",
|
||||
"features/software-catalog/life-of-an-entity",
|
||||
"features/software-catalog/configuration",
|
||||
"features/software-catalog/system-model",
|
||||
"features/software-catalog/descriptor-format",
|
||||
"features/software-catalog/references",
|
||||
"features/software-catalog/well-known-annotations",
|
||||
"features/software-catalog/well-known-relations",
|
||||
"features/software-catalog/well-known-statuses",
|
||||
"features/software-catalog/extending-the-model",
|
||||
"features/software-catalog/external-integrations",
|
||||
"features/software-catalog/catalog-customization",
|
||||
"features/software-catalog/software-catalog-api"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "category",
|
||||
"label": "Kubernetes",
|
||||
"items": [
|
||||
"features/kubernetes/overview",
|
||||
"features/kubernetes/installation",
|
||||
"features/kubernetes/configuration",
|
||||
"features/kubernetes/authentication",
|
||||
"features/kubernetes/troubleshooting",
|
||||
"features/kubernetes/proxy"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "category",
|
||||
"label": "Software Templates",
|
||||
"items": [
|
||||
"features/software-templates/software-templates-index",
|
||||
"features/software-templates/configuration",
|
||||
"features/software-templates/adding-templates",
|
||||
"features/software-templates/writing-templates",
|
||||
"features/software-templates/input-examples",
|
||||
"features/software-templates/builtin-actions",
|
||||
"features/software-templates/writing-custom-actions",
|
||||
"features/software-templates/writing-custom-field-extensions",
|
||||
"features/software-templates/writing-custom-step-layouts",
|
||||
"features/software-templates/testing-scaffolder-alpha",
|
||||
"features/software-templates/migrating-from-v1beta2-to-v1beta3"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "category",
|
||||
"label": "Backstage Search",
|
||||
"items": [
|
||||
"features/search/search-overview",
|
||||
"features/search/getting-started",
|
||||
"features/search/concepts",
|
||||
"features/search/architecture",
|
||||
"features/search/search-engines",
|
||||
"features/search/how-to-guides"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "category",
|
||||
"label": "TechDocs",
|
||||
"items": [
|
||||
"features/techdocs/techdocs-overview",
|
||||
"features/techdocs/getting-started",
|
||||
"features/techdocs/concepts",
|
||||
"features/techdocs/addons",
|
||||
"features/techdocs/architecture",
|
||||
"features/techdocs/creating-and-publishing",
|
||||
"features/techdocs/configuration",
|
||||
"features/techdocs/using-cloud-storage",
|
||||
"features/techdocs/configuring-ci-cd",
|
||||
"features/techdocs/cli",
|
||||
"features/techdocs/how-to-guides",
|
||||
"features/techdocs/troubleshooting",
|
||||
"features/techdocs/faqs"
|
||||
]
|
||||
}
|
||||
],
|
||||
"Integrations": [
|
||||
"integrations/index",
|
||||
{
|
||||
"type": "category",
|
||||
"label": "AWS S3",
|
||||
"items": [
|
||||
"integrations/aws-s3/locations",
|
||||
"integrations/aws-s3/discovery"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "category",
|
||||
"label": "Azure",
|
||||
"items": [
|
||||
"integrations/azure/locations",
|
||||
"integrations/azure/discovery",
|
||||
"integrations/azure/org"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "category",
|
||||
"label": "Bitbucket Cloud",
|
||||
"items": [
|
||||
"integrations/bitbucketCloud/locations",
|
||||
"integrations/bitbucketCloud/discovery"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "category",
|
||||
"label": "Bitbucket Server",
|
||||
"items": [
|
||||
"integrations/bitbucketServer/locations",
|
||||
"integrations/bitbucketServer/discovery"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "category",
|
||||
"label": "Datadog",
|
||||
"items": ["integrations/datadog-rum/installation"]
|
||||
},
|
||||
{
|
||||
"type": "category",
|
||||
"label": "Gerrit",
|
||||
"items": [
|
||||
"integrations/gerrit/locations",
|
||||
"integrations/gerrit/discovery"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "category",
|
||||
"label": "GitHub",
|
||||
"items": [
|
||||
"integrations/github/locations",
|
||||
"integrations/github/discovery",
|
||||
"integrations/github/org",
|
||||
"integrations/github/github-apps"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "category",
|
||||
"label": "GitLab",
|
||||
"items": [
|
||||
"integrations/gitlab/locations",
|
||||
"integrations/gitlab/discovery",
|
||||
"integrations/gitlab/org"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "category",
|
||||
"label": "Gitea",
|
||||
"items": ["integrations/gitea/locations"]
|
||||
},
|
||||
{
|
||||
"type": "category",
|
||||
"label": "Google GCS",
|
||||
"items": ["integrations/google-cloud-storage/locations"]
|
||||
},
|
||||
{
|
||||
"type": "category",
|
||||
"label": "LDAP",
|
||||
"items": ["integrations/ldap/org"]
|
||||
}
|
||||
],
|
||||
"Plugins": [
|
||||
"plugins/index",
|
||||
"plugins/existing-plugins",
|
||||
"plugins/create-a-plugin",
|
||||
"plugins/plugin-development",
|
||||
"plugins/structure-of-a-plugin",
|
||||
"plugins/integrating-plugin-into-software-catalog",
|
||||
"plugins/integrating-search-into-plugins",
|
||||
"plugins/composability",
|
||||
"plugins/customization",
|
||||
"plugins/analytics",
|
||||
"plugins/feature-flags",
|
||||
{
|
||||
"type": "category",
|
||||
"label": "Backends and APIs",
|
||||
"items": [
|
||||
"plugins/proxying",
|
||||
"plugins/backend-plugin",
|
||||
"plugins/call-existing-api",
|
||||
"plugins/url-reader"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "category",
|
||||
"label": "Testing",
|
||||
"items": ["plugins/testing"]
|
||||
},
|
||||
{
|
||||
"type": "category",
|
||||
"label": "Publishing",
|
||||
"items": [
|
||||
"plugins/publish-private",
|
||||
"plugins/add-to-marketplace",
|
||||
"plugins/observability"
|
||||
]
|
||||
}
|
||||
],
|
||||
"Configuration": [
|
||||
"conf/index",
|
||||
"conf/reading",
|
||||
"conf/writing",
|
||||
"conf/defining"
|
||||
],
|
||||
"Auth and identity": [
|
||||
"auth/index",
|
||||
{
|
||||
"type": "category",
|
||||
"label": "Included providers",
|
||||
"items": [
|
||||
"auth/auth0/provider",
|
||||
"auth/atlassian/provider",
|
||||
"auth/bitbucket/provider",
|
||||
"auth/microsoft/provider",
|
||||
"auth/github/provider",
|
||||
"auth/gitlab/provider",
|
||||
"auth/google/provider",
|
||||
"auth/google/gcp-iap-auth",
|
||||
"auth/okta/provider",
|
||||
"auth/onelogin/provider",
|
||||
"auth/oauth2-proxy/provider"
|
||||
]
|
||||
},
|
||||
"auth/identity-resolver",
|
||||
"auth/oauth",
|
||||
"auth/oidc",
|
||||
"auth/add-auth-provider",
|
||||
"auth/service-to-service-auth",
|
||||
"auth/troubleshooting",
|
||||
"auth/glossary"
|
||||
],
|
||||
"Permissions": [
|
||||
"permissions/overview",
|
||||
"permissions/concepts",
|
||||
"permissions/getting-started",
|
||||
"permissions/writing-a-policy",
|
||||
"permissions/frontend-integration",
|
||||
"permissions/custom-rules",
|
||||
{
|
||||
"type": "category",
|
||||
"label": "Tutorial: using Permissions in your plugin",
|
||||
"items": [
|
||||
"permissions/plugin-authors/01-setup",
|
||||
"permissions/plugin-authors/02-adding-a-basic-permission-check",
|
||||
"permissions/plugin-authors/03-adding-a-resource-permission-check",
|
||||
"permissions/plugin-authors/04-authorizing-access-to-paginated-data",
|
||||
"permissions/plugin-authors/05-frontend-authorization"
|
||||
]
|
||||
}
|
||||
],
|
||||
"Deployment": [
|
||||
"deployment/index",
|
||||
"deployment/scaling",
|
||||
"deployment/docker",
|
||||
"deployment/k8s",
|
||||
"deployment/heroku"
|
||||
],
|
||||
"Designing for Backstage": [
|
||||
"dls/design",
|
||||
"dls/component-design-guidelines",
|
||||
"dls/contributing-to-storybook",
|
||||
"dls/figma"
|
||||
],
|
||||
"API Reference": [
|
||||
{
|
||||
"type": "category",
|
||||
"label": "Guides",
|
||||
"items": ["api/utility-apis"]
|
||||
},
|
||||
{
|
||||
"type": "category",
|
||||
"label": "API Reference",
|
||||
"items": ["reference/index"]
|
||||
},
|
||||
"api/deprecations"
|
||||
],
|
||||
"Tutorials": [
|
||||
"tutorials/journey",
|
||||
"tutorials/quickstart-app-plugin",
|
||||
"tutorials/react-router-stable-migration",
|
||||
"tutorials/package-role-migration",
|
||||
"tutorials/migrating-away-from-core",
|
||||
"tutorials/configuring-plugin-databases",
|
||||
"tutorials/switching-sqlite-postgres",
|
||||
"tutorials/using-backstage-proxy-within-plugin",
|
||||
"tutorials/yarn-migration"
|
||||
],
|
||||
"Architecture Decision Records (ADRs)": [
|
||||
"architecture-decisions/adrs-overview",
|
||||
"architecture-decisions/adrs-adr001",
|
||||
"architecture-decisions/adrs-adr002",
|
||||
"architecture-decisions/adrs-adr003",
|
||||
"architecture-decisions/adrs-adr004",
|
||||
"architecture-decisions/adrs-adr005",
|
||||
"architecture-decisions/adrs-adr006",
|
||||
"architecture-decisions/adrs-adr007",
|
||||
"architecture-decisions/adrs-adr008",
|
||||
"architecture-decisions/adrs-adr009",
|
||||
"architecture-decisions/adrs-adr010",
|
||||
"architecture-decisions/adrs-adr011",
|
||||
"architecture-decisions/adrs-adr012",
|
||||
"architecture-decisions/adrs-adr013"
|
||||
],
|
||||
"FAQ": ["FAQ"],
|
||||
"Experimental Backend System": [
|
||||
"backend-system/index",
|
||||
{
|
||||
"type": "category",
|
||||
"label": "Architecture",
|
||||
"items": [
|
||||
"backend-system/architecture/index",
|
||||
"backend-system/architecture/services",
|
||||
"backend-system/architecture/plugins",
|
||||
"backend-system/architecture/extension-points",
|
||||
"backend-system/architecture/modules",
|
||||
"backend-system/architecture/naming-patterns"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "category",
|
||||
"label": "Building Backends",
|
||||
"items": [
|
||||
"backend-system/building-backends/index",
|
||||
"backend-system/building-backends/migrating"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "category",
|
||||
"label": "Building Plugins & Modules",
|
||||
"items": [
|
||||
"backend-system/building-plugins-and-modules/index",
|
||||
"backend-system/building-plugins-and-modules/testing",
|
||||
"backend-system/building-plugins-and-modules/migrating"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "category",
|
||||
"label": "Core Services",
|
||||
"items": ["backend-system/core-services/index"]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
../microsite/static
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2,3 +2,4 @@
|
||||
# Build output
|
||||
build
|
||||
i18n
|
||||
.docusaurus
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
registry=https://registry.npmjs.org/
|
||||
engine-strict=true
|
||||
@@ -1 +1 @@
|
||||
build
|
||||
.docusaurus
|
||||
|
||||
@@ -1,143 +0,0 @@
|
||||
const React = require('react');
|
||||
const PropTypes = require('prop-types');
|
||||
const simpleComponent = (Component, baseClassName = '', mods = []) => {
|
||||
const SimpleComponent = props => {
|
||||
// Extra BEM modifiers, e.g. `Block__Container--reversed`
|
||||
const modClasses = [];
|
||||
const otherProps = {};
|
||||
for (const prop in props) {
|
||||
if (mods.indexOf(prop) !== -1) {
|
||||
modClasses.push(`${baseClassName}--${prop}`);
|
||||
} else {
|
||||
otherProps[prop] = props[prop];
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<Component
|
||||
{...otherProps}
|
||||
className={`${baseClassName} ${props.className || ''} ${modClasses}`}
|
||||
/>
|
||||
);
|
||||
};
|
||||
SimpleComponent.displayName = `SimpleComponent(${Component}, ${baseClassName})`;
|
||||
|
||||
SimpleComponent.propTypes = {};
|
||||
for (const mod of mods) {
|
||||
SimpleComponent.propTypes[mod] = PropTypes.bool;
|
||||
}
|
||||
|
||||
return SimpleComponent;
|
||||
};
|
||||
|
||||
const Block = simpleComponent('section', 'Block', ['small', 'wrapped']);
|
||||
Block.Container = simpleComponent('div', 'Block__Container', [
|
||||
'reversed',
|
||||
'wrapped',
|
||||
'column',
|
||||
]);
|
||||
Block.TitleBox = simpleComponent('h1', 'Block__TitleBox', ['large', 'story']);
|
||||
Block.TextBox = simpleComponent('div', 'Block__TextBox', ['wide', 'small']);
|
||||
|
||||
Block.Title = simpleComponent('h1', 'Block__Title', ['half', 'main']);
|
||||
Block.Subtitle = simpleComponent('h1', 'Block__Subtitle');
|
||||
|
||||
Block.SmallTitle = simpleComponent('h2', 'Block__SmallTitle');
|
||||
Block.SmallestTitle = simpleComponent('h3', 'Block__SmallestTitle');
|
||||
|
||||
const BulletLine = simpleComponent('div', 'BulletLine');
|
||||
|
||||
Block.Paragraph = simpleComponent('p', 'Block__Paragraph');
|
||||
Block.LinkButton = simpleComponent('a', 'Block__LinkButton', ['stretch']);
|
||||
Block.QuoteContainer = simpleComponent('div', 'Block__QuoteContainer');
|
||||
Block.Quote = simpleComponent('p', 'Block__Quote');
|
||||
Block.Divider = simpleComponent('p', 'Block__Divider', ['quote']);
|
||||
Block.MediaFrame = simpleComponent('div', 'Block__MediaFrame');
|
||||
Block.Graphics = ({ padding, children, innerPadding, width }) => {
|
||||
const style = {};
|
||||
const innerStyle = {};
|
||||
if (padding) {
|
||||
style.padding = `${padding}% 0`;
|
||||
}
|
||||
|
||||
if (width) {
|
||||
style.width = width;
|
||||
}
|
||||
|
||||
if (innerPadding) {
|
||||
innerStyle.padding = `${innerPadding}% 0`;
|
||||
}
|
||||
return (
|
||||
<div className="Block__GraphicsContainer" style={style}>
|
||||
<div className="Block__Graphics" children={children} style={innerStyle} />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
Block.Graphic = props => {
|
||||
/* Coordinates and size are in % of graphics container size, e.g. width={50} is 50% of parent width */
|
||||
const { x = 0, y = 0, width = 0, src, className = '' } = props;
|
||||
const style = Object.assign(
|
||||
{ left: `${x}%`, top: `${y}%`, width: `${width}%` },
|
||||
props.style,
|
||||
);
|
||||
return (
|
||||
<img
|
||||
src={src}
|
||||
alt=""
|
||||
{...props}
|
||||
style={style}
|
||||
className={`Block__Graphic ${className}`}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
Block.Image = props => {
|
||||
/* Coordinates and size are in % of graphics container size, e.g. width={50} is 50% of parent width */
|
||||
return (
|
||||
<div
|
||||
{...props}
|
||||
className={`Block__Image${
|
||||
props.wide ? '--wide' : props.narrow ? '--narrow' : ''
|
||||
}`}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
const ActionBlock = simpleComponent('section', 'ActionBlock');
|
||||
ActionBlock.Title = simpleComponent('h1', 'ActionBlock__Title');
|
||||
ActionBlock.Subtitle = simpleComponent('h2', 'ActionBlock__Subtitle');
|
||||
ActionBlock.Link = simpleComponent('a', 'ActionBlock__Link');
|
||||
|
||||
const Breakpoint = ({ narrow, wide }) => (
|
||||
<React.Fragment>
|
||||
<div className="Breakpoint--narrow">{narrow}</div>
|
||||
<div className="Breakpoint--wide">{wide}</div>
|
||||
</React.Fragment>
|
||||
);
|
||||
|
||||
const Banner = simpleComponent('div', 'Banner', ['hidden']);
|
||||
Banner.Container = simpleComponent('div', 'Banner__Container');
|
||||
|
||||
const BannerDismissButton = simpleComponent(
|
||||
props => (
|
||||
<svg {...props} data-banner-dismiss viewBox="0 0 24 24">
|
||||
<path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" />
|
||||
</svg>
|
||||
),
|
||||
'Banner__DismissButton',
|
||||
);
|
||||
|
||||
Banner.Dismissable = ({ storageKey, children }) => (
|
||||
<Banner hidden data-banner={storageKey}>
|
||||
{children}
|
||||
<BannerDismissButton />
|
||||
</Banner>
|
||||
);
|
||||
|
||||
module.exports = {
|
||||
Block,
|
||||
ActionBlock,
|
||||
Breakpoint,
|
||||
BulletLine,
|
||||
Banner,
|
||||
};
|
||||
@@ -1,102 +0,0 @@
|
||||
/*
|
||||
* Copyright 2020 Backstage Project Authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
const React = require('react');
|
||||
|
||||
class Footer extends React.Component {
|
||||
render() {
|
||||
return (
|
||||
<footer className="nav-footer" id="footer">
|
||||
<section className="sitemap">
|
||||
<div className="footer-title">
|
||||
<a href={this.props.config.baseUrl}>
|
||||
<h2 className="footerLogo"></h2>
|
||||
</a>
|
||||
</div>
|
||||
<div>
|
||||
<h5>Docs</h5>
|
||||
<a href={`/docs/overview/what-is-backstage`}>What is Backstage?</a>
|
||||
<a href={`/docs/getting-started/`}>Getting started</a>
|
||||
<a
|
||||
href={`/docs/features/software-catalog/software-catalog-overview`}
|
||||
>
|
||||
Software Catalog
|
||||
</a>
|
||||
<a href={`/docs/plugins/create-a-plugin`}>Create a Plugin</a>
|
||||
<a href={`/docs/dls/design`}>Designing for Backstage</a>
|
||||
</div>
|
||||
<div>
|
||||
<h5>Community</h5>
|
||||
<a href="https://discord.gg/backstage-687207715902193673">
|
||||
Support chatroom
|
||||
</a>
|
||||
<a href="https://github.com/backstage/backstage/blob/master/CONTRIBUTING.md">
|
||||
Contributing
|
||||
</a>
|
||||
<a href="https://backstage.spotify.com">Adopting</a>
|
||||
<a href="https://github.com/backstage/community">
|
||||
Community Sessions
|
||||
</a>
|
||||
<a href="https://info.backstage.spotify.com/newsletter_subscribe">
|
||||
Subscribe to our newsletter
|
||||
</a>
|
||||
<a href="https://www.cncf.io/projects/">CNCF Incubation</a>
|
||||
</div>
|
||||
<div>
|
||||
<h5>More</h5>
|
||||
<a href={this.props.config.fossWebsite}>
|
||||
Open Source @ {this.props.config.organizationName}
|
||||
</a>
|
||||
|
||||
<a href="https://engineering.atspotify.com/">
|
||||
Spotify Engineering Blog
|
||||
</a>
|
||||
<a href="https://developer.spotify.com/">Spotify for Developers</a>
|
||||
|
||||
<a href={this.props.config.repoUrl}>GitHub</a>
|
||||
<a
|
||||
className="github-button"
|
||||
href={this.props.config.repoUrl}
|
||||
data-icon="octicon-star"
|
||||
data-count-href="/backstage/backstage/stargazers"
|
||||
data-show-count="true"
|
||||
data-count-aria-label="# stargazers on GitHub"
|
||||
aria-label="Star this project on GitHub"
|
||||
>
|
||||
Star
|
||||
</a>
|
||||
{this.props.config.twitterUsername && (
|
||||
<div className="social">
|
||||
<a
|
||||
href={`https://twitter.com/${this.props.config.twitterUsername}`}
|
||||
className="twitter-follow-button"
|
||||
>
|
||||
Follow @{this.props.config.twitterUsername}
|
||||
</a>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</section>
|
||||
<p style={{ textAlign: 'center' }}>
|
||||
<a href="https://spotify.github.io">Made with ❤️ at Spotify</a>
|
||||
</p>
|
||||
<p className="copyright">{this.props.config.copyright}</p>
|
||||
</footer>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Footer;
|
||||
@@ -1,40 +0,0 @@
|
||||
import React from 'react';
|
||||
|
||||
export class HubSpotForm extends React.Component {
|
||||
render() {
|
||||
return (
|
||||
<>
|
||||
<script src="https://js.hsforms.net/forms/v2.js" />
|
||||
<div
|
||||
className="Sidebar__Container"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: `
|
||||
<button class="Sidebar__Button" onclick="toggleFormVisibility()">New Adopters</button>
|
||||
<div id="Sidebar__HubSpotContainer"></div>
|
||||
`,
|
||||
}}
|
||||
/>
|
||||
<script
|
||||
type="text/javascript"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: `
|
||||
if (typeof window !== undefined) {
|
||||
window.hbspt.forms.create({
|
||||
portalId: '21894833',
|
||||
formId: '9a5aa2af-87f3-4a44-819f-88ee243bb61e',
|
||||
target: '#Sidebar__HubSpotContainer',
|
||||
pageId: '79735607665',
|
||||
})
|
||||
}
|
||||
|
||||
function toggleFormVisibility() {
|
||||
var form = document.querySelector('.Sidebar__Container');
|
||||
form.classList.toggle('Sidebar__Container--open');
|
||||
}
|
||||
`,
|
||||
}}
|
||||
></script>
|
||||
</>
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -52,7 +52,7 @@ module.exports = {
|
||||
sidebarPath: 'sidebars.json',
|
||||
},
|
||||
blog: {
|
||||
path: '../microsite/blog',
|
||||
path: 'blog',
|
||||
},
|
||||
theme: {
|
||||
customCss: 'src/css/customTheme.css',
|
||||
+26
-7
@@ -4,21 +4,40 @@
|
||||
"license": "Apache-2.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"examples": "docusaurus-examples",
|
||||
"start": "docusaurus-start",
|
||||
"build": "docusaurus-build",
|
||||
"start": "node scripts/pre-build.js && docusaurus start",
|
||||
"build": "node scripts/pre-build.js && docusaurus build",
|
||||
"prettier:check": "prettier --check .",
|
||||
"publish-gh-pages": "docusaurus-publish",
|
||||
"write-translations": "docusaurus-write-translations",
|
||||
"version": "docusaurus-version",
|
||||
"rename-version": "docusaurus-rename-version",
|
||||
"verify:sidebars": "node ./scripts/verify-sidebars"
|
||||
"verify:sidebars": "node ./scripts/verify-sidebars",
|
||||
"swizzle": "docusaurus swizzle",
|
||||
"deploy": "docusaurus deploy",
|
||||
"docusaurus": "docusaurus"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@docusaurus/module-type-aliases": "2.3.1",
|
||||
"@spotify/prettier-config": "^14.0.0",
|
||||
"docusaurus": "^2.0.0-alpha.70",
|
||||
"@tsconfig/docusaurus": "^1.0.6",
|
||||
"@types/webpack-env": "^1.18.0",
|
||||
"js-yaml": "^4.1.0",
|
||||
"prettier": "^2.6.2"
|
||||
"prettier": "^2.6.2",
|
||||
"replace": "^1.2.2",
|
||||
"typescript": "^4.9.4",
|
||||
"yaml-loader": "^0.8.0"
|
||||
},
|
||||
"prettier": "@spotify/prettier-config"
|
||||
"prettier": "@spotify/prettier-config",
|
||||
"dependencies": {
|
||||
"@docusaurus/core": "2.3.1",
|
||||
"@docusaurus/plugin-client-redirects": "^2.3.1",
|
||||
"@docusaurus/preset-classic": "2.3.1",
|
||||
"@swc/core": "^1.3.36",
|
||||
"clsx": "^1.1.1",
|
||||
"docusaurus-plugin-sass": "^0.2.3",
|
||||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2",
|
||||
"sass": "^1.57.1",
|
||||
"swc-loader": "^0.2.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,231 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) 2017-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
const React = require('react');
|
||||
const Components = require(`${process.cwd()}/core/Components.js`);
|
||||
const Block = Components.Block;
|
||||
const BulletLine = Components.BulletLine;
|
||||
|
||||
const PARTNERS = [
|
||||
{
|
||||
name: 'Frontside Software',
|
||||
url: 'https://frontside.com/backstage/',
|
||||
logo: 'img/partner-logo-frontside.png',
|
||||
},
|
||||
{
|
||||
name: 'Roadie',
|
||||
url: 'https://roadie.io/',
|
||||
logo: 'img/partner-logo-roadie.png',
|
||||
},
|
||||
{
|
||||
name: 'ThoughtWorks',
|
||||
url: 'https://www.thoughtworks.com',
|
||||
logo: 'img/partner-logo-thoughtworks.png',
|
||||
},
|
||||
{
|
||||
name: 'VMWare',
|
||||
url: 'https://www.vmware.com',
|
||||
logo: 'img/partner-logo-vmware.png',
|
||||
},
|
||||
];
|
||||
|
||||
const Background = props => {
|
||||
const { config: siteConfig } = props;
|
||||
const { baseUrl } = siteConfig;
|
||||
return (
|
||||
<main className="MainContent">
|
||||
<Block small className="stripe-bottom bg-black-grey">
|
||||
<Block.Container style={{ justifyContent: 'flex-start' }}>
|
||||
<Block.TextBox>
|
||||
<Block.Title main>Backstage Community</Block.Title>
|
||||
<Block.Paragraph>
|
||||
Join the vibrant community around Backstage through social media
|
||||
and different meetups. To ensure that you have a welcoming
|
||||
environment, we follow{' '}
|
||||
<a href="https://github.com/cncf/foundation/blob/master/code-of-conduct.md">
|
||||
{' '}
|
||||
CNCF Code of Conduct
|
||||
</a>{' '}
|
||||
in everything we do.
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
<Block.TextBox style={{ margin: 'auto' }}>
|
||||
<Block.Paragraph>
|
||||
<Block.SmallTitle small>
|
||||
Get started in our community!
|
||||
</Block.SmallTitle>
|
||||
<ul>
|
||||
<li>
|
||||
<Block.Paragraph style={{ marginBottom: '0' }}>
|
||||
Chat and get support on our{' '}
|
||||
<a href="https://discord.gg/backstage-687207715902193673">
|
||||
Discord
|
||||
</a>
|
||||
</Block.Paragraph>
|
||||
</li>
|
||||
<li>
|
||||
<Block.Paragraph style={{ marginBottom: '0' }}>
|
||||
Get into contributing with the{' '}
|
||||
<a href="https://github.com/backstage/backstage/contribute">
|
||||
Good First Issues
|
||||
</a>
|
||||
</Block.Paragraph>
|
||||
</li>
|
||||
<li>
|
||||
<Block.Paragraph style={{ marginBottom: '0' }}>
|
||||
Subscribe to the{' '}
|
||||
<a href="https://info.backstage.spotify.com/newsletter_subscribe">
|
||||
Community newsletter
|
||||
</a>
|
||||
</Block.Paragraph>
|
||||
</li>
|
||||
<li>
|
||||
<Block.Paragraph style={{ marginBottom: '0' }}>
|
||||
Join the{' '}
|
||||
<a href="https://twitter.com/i/communities/1494019781716062215">
|
||||
Twitter community
|
||||
</a>
|
||||
</Block.Paragraph>
|
||||
</li>
|
||||
</ul>
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
|
||||
<Block className="stripe-top stripe-bottom bg-teal-bottom">
|
||||
<Block.Container style={{ flexFlow: 'column nowrap' }}>
|
||||
<Block.TextBox wide>
|
||||
<Block.Subtitle>Offical Backstage initiatives</Block.Subtitle>
|
||||
<Block.Title small>
|
||||
Stay tuned to the latest developments
|
||||
</Block.Title>
|
||||
</Block.TextBox>
|
||||
|
||||
<Block.Container>
|
||||
<Block.TextBox style={{ flexShrink: '1', alignSelf: 'stretch' }}>
|
||||
<Block.Container column>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>Community sessions</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
Maintainers and adopters meet monthly to share updates, demos,
|
||||
and ideas. Yep, all sessions are recorded!
|
||||
</Block.Paragraph>
|
||||
</Block.Container>
|
||||
<Block.LinkButton href="/on-demand">
|
||||
Join a session
|
||||
</Block.LinkButton>
|
||||
</Block.TextBox>
|
||||
|
||||
<Block.TextBox style={{ flexShrink: '1', alignSelf: 'stretch' }}>
|
||||
<Block.Container column>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>Newsletter</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
The official monthly Backstage newsletter. Don't miss the
|
||||
latest news from your favorite project!
|
||||
</Block.Paragraph>
|
||||
</Block.Container>
|
||||
<Block.LinkButton href="https://info.backstage.spotify.com/newsletter_subscribe">
|
||||
Subscribe
|
||||
</Block.LinkButton>
|
||||
</Block.TextBox>
|
||||
|
||||
<Block.TextBox style={{ flexShrink: '1', alignSelf: 'stretch' }}>
|
||||
<Block.Container column>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>Contributor Spotlight</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
A recognition for valuable community work. Nominate
|
||||
contributing members for their efforts! We'll put them in the
|
||||
spotlight ❤️
|
||||
</Block.Paragraph>
|
||||
</Block.Container>
|
||||
<Block.LinkButton href="/nominate">Nominate now</Block.LinkButton>
|
||||
</Block.TextBox>
|
||||
</Block.Container>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
|
||||
<Block className="stripe-bottom bg-black-grey">
|
||||
<Block.Container wrapped style={{ justifyContent: 'flex-start' }}>
|
||||
<Block.TextBox wide>
|
||||
<Block.Subtitle>Community initiatives</Block.Subtitle>
|
||||
</Block.TextBox>
|
||||
<Block.TextBox small style={{ alignSelf: 'stretch' }}>
|
||||
<Block.Container column>
|
||||
<Block.SmallTitle>Open Mic Meetup</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
A casual get together of Backstage users sharing their
|
||||
experiences and helping each other. Hosted by{' '}
|
||||
<a href="https://roadie.io/">Roadie.io</a> and{' '}
|
||||
<a href="https://frontside.com/">Frontside Software</a>.
|
||||
</Block.Paragraph>
|
||||
</Block.Container>
|
||||
<Block.LinkButton href="https://backstage-openmic.com/">
|
||||
Learn more
|
||||
</Block.LinkButton>
|
||||
</Block.TextBox>
|
||||
<Block.TextBox small style={{ alignSelf: 'stretch' }}>
|
||||
<Block.Container column>
|
||||
<Block.SmallTitle>Backstage Weekly Newsletter</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
A weekly newsletter with news, updates and things community from
|
||||
your friends at <a href="https://roadie.io/">Roadie.io</a>.
|
||||
</Block.Paragraph>
|
||||
</Block.Container>
|
||||
<Block.LinkButton href="https://roadie.io/backstage-weekly/">
|
||||
Learn more
|
||||
</Block.LinkButton>
|
||||
</Block.TextBox>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
|
||||
<Block className="stripe-top stripe-bottom">
|
||||
<Block.Container style={{ flexFlow: 'column nowrap' }}>
|
||||
<Block.TextBox wide>
|
||||
<Block.Subtitle>Trainings and Certifications</Block.Subtitle>
|
||||
</Block.TextBox>
|
||||
<Block.TextBox style={{ flexShrink: '1', alignSelf: 'stretch' }}>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>
|
||||
Introduction to Backstage: Developer Portals Made Easy (LFS142x)
|
||||
</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
This is a course produced and curated by the Linux Foundation.
|
||||
This course introduces you to Backstage and how to get started
|
||||
with the project.
|
||||
</Block.Paragraph>
|
||||
|
||||
<Block.LinkButton href="https://training.linuxfoundation.org/training/introduction-to-backstage-developer-portals-made-easy-lfs142x/">
|
||||
Learn more
|
||||
</Block.LinkButton>
|
||||
</Block.TextBox>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
|
||||
<Block className="stripe-top bg-black-grey">
|
||||
<Block.Container wrapped style={{ justifyContent: 'flex-start' }}>
|
||||
<Block.TextBox wide>
|
||||
<Block.Subtitle>Commercial Partners</Block.Subtitle>
|
||||
</Block.TextBox>
|
||||
{PARTNERS.map(partner => (
|
||||
<Block.TextBox small>
|
||||
<Block.SmallTitle>
|
||||
<a href={partner.url}>
|
||||
<img src={`${baseUrl}${partner.logo}`} alt={partner.name} />
|
||||
</a>
|
||||
</Block.SmallTitle>
|
||||
</Block.TextBox>
|
||||
))}
|
||||
</Block.Container>
|
||||
</Block>
|
||||
</main>
|
||||
);
|
||||
};
|
||||
|
||||
module.exports = Background;
|
||||
@@ -1,296 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) 2017-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
const React = require('react');
|
||||
const Components = require(`${process.cwd()}/core/Components.js`);
|
||||
const Block = Components.Block;
|
||||
|
||||
const Background = props => {
|
||||
const { config: siteConfig } = props;
|
||||
const { baseUrl } = siteConfig;
|
||||
return (
|
||||
<main className="MainContent">
|
||||
<Block small className="stripe-bottom bg-black-grey">
|
||||
<Block.Container style={{ justifyContent: 'flex-start' }}>
|
||||
<Block.TextBox>
|
||||
<Block.Title>See us in action</Block.Title>
|
||||
<Block.Paragraph>
|
||||
Watch the videos below to get an introduction to Backstage and to
|
||||
see how we use different plugins to customize{' '}
|
||||
<a href="https://engineering.atspotify.com/2020/04/21/how-we-use-backstage-at-spotify/">
|
||||
our internal version of Backstage at Spotify
|
||||
</a>
|
||||
.
|
||||
</Block.Paragraph>
|
||||
<Block.Paragraph>
|
||||
To see how other companies have already started using Backstage,
|
||||
watch these presentations from{' '}
|
||||
<a href="https://youtu.be/rRphwXeq33Q?t=1508">Expedia</a>,{' '}
|
||||
<a href="https://youtu.be/6sg5uMCLxTA?t=153">Zalando</a>, and{' '}
|
||||
<a href="https://youtu.be/UZTVjv-AvZA?t=188">TELUS</a>. For more,
|
||||
join our{' '}
|
||||
<a href="https://github.com/backstage/community">
|
||||
Community Sessions
|
||||
</a>
|
||||
.
|
||||
</Block.Paragraph>
|
||||
<Block.Paragraph>
|
||||
To explore the UI and basic features of Backstage firsthand, go
|
||||
to: <a href="https://demo.backstage.io">demo.backstage.io</a>.
|
||||
(Tip: click “All” to view all the example components in the
|
||||
software catalog.)
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
<Block.Graphics>
|
||||
<Block.Graphic
|
||||
x={-7}
|
||||
y={-12}
|
||||
width={120}
|
||||
src={`${baseUrl}img/demo-screen.png`}
|
||||
/>
|
||||
</Block.Graphics>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
|
||||
<Block small className="stripe bg-black">
|
||||
<Block.Container style={{ justifyContent: 'flex-start' }}>
|
||||
<Block.TextBox>
|
||||
<Block.Title>Introduction to Backstage</Block.Title>
|
||||
<Block.Paragraph>
|
||||
Backstage is an open source platform for building developer
|
||||
portals. We’ve been using our homegrown version at Spotify for
|
||||
years — so it’s already packed with features. (We have over 120
|
||||
internal plugins, built by 60 different teams.) In this live demo
|
||||
recording, Stefan Ålund, product manager for Backstage, tells the
|
||||
origin story of Backstage and gives you a tour of how we use it
|
||||
here at Spotify.
|
||||
</Block.Paragraph>
|
||||
<Block.LinkButton
|
||||
href={'https://www.youtube.com/watch?v=1XtJ5FAOjPk'}
|
||||
>
|
||||
Watch now
|
||||
</Block.LinkButton>
|
||||
</Block.TextBox>
|
||||
<Block.MediaFrame>
|
||||
<iframe
|
||||
width="800"
|
||||
height="500"
|
||||
src="https://www.youtube.com/embed/1XtJ5FAOjPk"
|
||||
frameBorder="0"
|
||||
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
|
||||
allowFullScreen
|
||||
></iframe>
|
||||
</Block.MediaFrame>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
|
||||
<Block className="stripe bg-black-grey">
|
||||
<Block.Container style={{ justifyContent: 'flex-start' }}>
|
||||
<Block.TextBox>
|
||||
<Block.Title>Control cloud costs</Block.Title>
|
||||
<Block.Paragraph>
|
||||
How do you control cloud costs while maintaining the speed and
|
||||
independence of your development teams? With the{' '}
|
||||
<a href="https://backstage.io/plugins">Cost Insights plugin</a>{' '}
|
||||
for Backstage, managing cloud costs becomes just another part of
|
||||
an engineer’s daily development process. They get a clear view of
|
||||
their spending — and can decide for themselves how they want to
|
||||
optimize it. Learn more about the{' '}
|
||||
<a href="https://backstage.io/blog/2020/10/22/cost-insights-plugin">
|
||||
Cost Insights plugin
|
||||
</a>
|
||||
.
|
||||
</Block.Paragraph>
|
||||
<Block.LinkButton href="https://youtu.be/YLAd5hdXR_Q">
|
||||
Watch now
|
||||
</Block.LinkButton>
|
||||
</Block.TextBox>
|
||||
<Block.MediaFrame>
|
||||
<iframe
|
||||
width="560"
|
||||
height="315"
|
||||
src="https://www.youtube.com/embed/YLAd5hdXR_Q"
|
||||
frameBorder="0"
|
||||
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
|
||||
allowFullScreen
|
||||
></iframe>
|
||||
</Block.MediaFrame>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
|
||||
<Block className="stripe bg-black">
|
||||
<Block.Container style={{ justifyContent: 'flex-start' }}>
|
||||
<Block.TextBox>
|
||||
<Block.Title id="techdocs-demo">
|
||||
Make documentation easy
|
||||
</Block.Title>
|
||||
<Block.Paragraph>
|
||||
Documentation! Everyone needs it, no one wants to create it, and
|
||||
no one can ever find it. Backstage follows a “docs like code”
|
||||
approach: you write documentation in Markdown files right
|
||||
alongside your code. This makes documentation easier to create,
|
||||
maintain, find — and, you know, actually use. This demo video
|
||||
showcases Spotify’s internal version of TechDocs. Learn more about{' '}
|
||||
<a href="https://backstage.io/blog/2020/09/08/announcing-tech-docs">
|
||||
TechDocs
|
||||
</a>
|
||||
.
|
||||
</Block.Paragraph>
|
||||
<Block.LinkButton href="https://youtu.be/mOLCgdPw1iA">
|
||||
Watch now
|
||||
</Block.LinkButton>
|
||||
</Block.TextBox>
|
||||
<Block.MediaFrame>
|
||||
<iframe
|
||||
width="560"
|
||||
height="315"
|
||||
src="https://www.youtube.com/embed/mOLCgdPw1iA"
|
||||
frameBorder="0"
|
||||
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
|
||||
allowFullScreen
|
||||
></iframe>
|
||||
</Block.MediaFrame>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
|
||||
<Block small className="bg-black-grey">
|
||||
<Block.Container style={{ justifyContent: 'flex-start' }}>
|
||||
<Block.TextBox>
|
||||
<Block.Title>Manage your tech health</Block.Title>
|
||||
<Block.Paragraph>
|
||||
Instead of manually updating a spreadsheet, what if you had a
|
||||
beautiful dashboard that could give you an instant, interactive
|
||||
picture of your entire org’s tech stack? That’s how we do it at
|
||||
Spotify. With our Tech Insights plugin for Backstage, anyone at
|
||||
Spotify can see which version of which software anyone else at
|
||||
Spotify is using — and a whole a lot more. From managing
|
||||
migrations to fighting tech entropy, Backstage makes managing our
|
||||
tech health actually kind of pleasant.
|
||||
</Block.Paragraph>
|
||||
|
||||
<Block.LinkButton
|
||||
href={
|
||||
'https://www.youtube.com/watch?v=K3xz6VAbgH8&list=PLf1KFlSkDLIBtMGwRDfaVlKMqTMrjD2yO&index=6'
|
||||
}
|
||||
>
|
||||
Watch now
|
||||
</Block.LinkButton>
|
||||
</Block.TextBox>
|
||||
<Block.MediaFrame>
|
||||
<iframe
|
||||
width="800"
|
||||
height="500"
|
||||
src="https://www.youtube.com/embed/K3xz6VAbgH8"
|
||||
frameBorder="0"
|
||||
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
|
||||
allowFullScreen
|
||||
></iframe>
|
||||
</Block.MediaFrame>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
|
||||
<Block small className="stripe bg-black">
|
||||
<Block.Container style={{ justifyContent: 'flex-start' }}>
|
||||
<Block.TextBox>
|
||||
<Block.Title>Create a microservice</Block.Title>
|
||||
<Block.Paragraph>
|
||||
You’re a Spotify engineer about to build a new microservice (or
|
||||
any component) using Spring Boot. Where do you start? Search for a
|
||||
quick start guide online? Create an empty repo on GitHub? Copy and
|
||||
paste an old project? Nope. Just go to Backstage, and you’ll be up
|
||||
and running in two minutes — with a “Hello World” app, CI, and
|
||||
documentation all automatically set up and configured in a
|
||||
standardized way.
|
||||
</Block.Paragraph>
|
||||
|
||||
<Block.LinkButton
|
||||
href={'https://www.youtube.com/watch?v=U1iwe3L5pzc'}
|
||||
>
|
||||
Watch now
|
||||
</Block.LinkButton>
|
||||
</Block.TextBox>
|
||||
<Block.MediaFrame>
|
||||
<iframe
|
||||
width="800"
|
||||
height="500"
|
||||
src="https://www.youtube.com/embed/U1iwe3L5pzc"
|
||||
frameBorder="0"
|
||||
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
|
||||
allowFullScreen
|
||||
></iframe>
|
||||
</Block.MediaFrame>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
|
||||
<Block small className="bg-black-grey">
|
||||
<Block.Container style={{ justifyContent: 'flex-start' }}>
|
||||
<Block.TextBox>
|
||||
<Block.Title>Search all your services</Block.Title>
|
||||
<Block.Paragraph>
|
||||
All of Spotify’s services are automatically indexed in Backstage.
|
||||
So our engineers can stop playing detective — no more spamming
|
||||
Slack channels asking if anyone knows who owns a particular
|
||||
service and where you can find its API, only to discover that the
|
||||
owner went on sabbatical three months ago and you have to hunt
|
||||
them down on a mountain in Tibet where they’re on a 12-day silent
|
||||
meditation retreat. At Spotify, anyone can always find anyone
|
||||
else’s service, inspect its APIs, and contact its current owner —
|
||||
all with one search.
|
||||
</Block.Paragraph>
|
||||
<Block.LinkButton
|
||||
href={'https://www.youtube.com/watch?v=vcDL9tOv7Eo'}
|
||||
>
|
||||
Watch now
|
||||
</Block.LinkButton>
|
||||
</Block.TextBox>
|
||||
<Block.MediaFrame>
|
||||
<iframe
|
||||
width="800"
|
||||
height="500"
|
||||
src="https://www.youtube.com/embed/vcDL9tOv7Eo"
|
||||
frameBorder="0"
|
||||
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
|
||||
allowFullScreen
|
||||
></iframe>
|
||||
</Block.MediaFrame>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
|
||||
<Block className="stripe bg-black">
|
||||
<Block.Container style={{ justifyContent: 'flex-start' }}>
|
||||
<Block.TextBox>
|
||||
<Block.Title>Manage data pipelines</Block.Title>
|
||||
<Block.Paragraph>
|
||||
We manage a lot of data pipelines (also known as workflows) here
|
||||
at Spotify. So, of course, we made a great workflows plugin for
|
||||
our version of Backstage. All our workflow tools — including a
|
||||
scheduler, log inspector, data lineage graph, and configurable
|
||||
alerts — are integrated into one simple interface.
|
||||
</Block.Paragraph>
|
||||
<Block.LinkButton
|
||||
href={'https://www.youtube.com/watch?v=rH46MLNZIPM '}
|
||||
>
|
||||
Watch now
|
||||
</Block.LinkButton>
|
||||
</Block.TextBox>
|
||||
<Block.MediaFrame>
|
||||
<iframe
|
||||
width="800"
|
||||
height="500"
|
||||
src="https://www.youtube.com/embed/rH46MLNZIPM"
|
||||
frameBorder="0"
|
||||
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
|
||||
allowFullScreen
|
||||
></iframe>
|
||||
</Block.MediaFrame>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
</main>
|
||||
);
|
||||
};
|
||||
|
||||
module.exports = Background;
|
||||
@@ -1,12 +0,0 @@
|
||||
const React = require('react');
|
||||
const Redirect = require('../../core/Redirect.js');
|
||||
|
||||
const siteConfig = require(process.cwd() + '/siteConfig.js');
|
||||
|
||||
function Docs() {
|
||||
return (
|
||||
<Redirect redirect="/docs/overview/what-is-backstage" config={siteConfig} />
|
||||
);
|
||||
}
|
||||
|
||||
module.exports = Docs;
|
||||
@@ -1,15 +0,0 @@
|
||||
const React = require('react');
|
||||
const Redirect = require('../../../../../core/Redirect.js');
|
||||
|
||||
const siteConfig = require(process.cwd() + '/siteConfig.js');
|
||||
|
||||
function Docs() {
|
||||
return (
|
||||
<Redirect
|
||||
redirect="/docs/features/software-catalog/software-catalog-overview"
|
||||
config={siteConfig}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
module.exports = Docs;
|
||||
@@ -1,15 +0,0 @@
|
||||
const React = require('react');
|
||||
const Redirect = require('../../../../../core/Redirect.js');
|
||||
|
||||
const siteConfig = require(process.cwd() + '/siteConfig.js');
|
||||
|
||||
function Docs() {
|
||||
return (
|
||||
<Redirect
|
||||
redirect="/docs/features/software-templates/software-templates-index"
|
||||
config={siteConfig}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
module.exports = Docs;
|
||||
@@ -1,15 +0,0 @@
|
||||
const React = require('react');
|
||||
const Redirect = require('../../../../../core/Redirect.js');
|
||||
|
||||
const siteConfig = require(process.cwd() + '/siteConfig.js');
|
||||
|
||||
function Docs() {
|
||||
return (
|
||||
<Redirect
|
||||
redirect="/docs/features/techdocs/techdocs-overview"
|
||||
config={siteConfig}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
module.exports = Docs;
|
||||
@@ -1,671 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) 2017-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
const React = require('react');
|
||||
const { HubSpotForm } = require(`${process.cwd()}/core/HubSpotForm.js`);
|
||||
const Components = require(`${process.cwd()}/core/Components.js`);
|
||||
const Block = Components.Block;
|
||||
const ActionBlock = Components.ActionBlock;
|
||||
const Breakpoint = Components.Breakpoint;
|
||||
const BulletLine = Components.BulletLine;
|
||||
const Banner = Components.Banner;
|
||||
|
||||
class Index extends React.Component {
|
||||
render() {
|
||||
const { config: siteConfig } = this.props;
|
||||
const { baseUrl } = siteConfig;
|
||||
return (
|
||||
<React.Fragment>
|
||||
<main className="MainContent MainContent--gradient">
|
||||
<Banner.Container>
|
||||
<Banner.Dismissable storageKey="2022-03-16-newsletter-cta">
|
||||
<div>
|
||||
🗞️ Want to stay up to date with Backstage? Sign up for our{' '}
|
||||
<a href="https://info.backstage.spotify.com/newsletter_subscribe">
|
||||
Newsletter
|
||||
</a>
|
||||
!
|
||||
</div>
|
||||
</Banner.Dismissable>
|
||||
</Banner.Container>
|
||||
|
||||
<Block small className="bg-black-grey stripe-bottom">
|
||||
<Block.Container>
|
||||
<Block.TextBox>
|
||||
<Block.Title main>
|
||||
An open platform for building developer portals
|
||||
</Block.Title>
|
||||
<Block.Paragraph>
|
||||
Powered by a centralized software catalog, Backstage restores
|
||||
order to your infrastructure and enables your product teams to
|
||||
ship high-quality code quickly — without compromising
|
||||
autonomy.
|
||||
</Block.Paragraph>
|
||||
<Block.Container wrapped>
|
||||
<Block.LinkButton
|
||||
style={{ marginRight: '2rem' }}
|
||||
href={
|
||||
'https://github.com/backstage/backstage#getting-started'
|
||||
}
|
||||
>
|
||||
GitHub
|
||||
</Block.LinkButton>
|
||||
<Block.LinkButton
|
||||
href={'https://info.backstage.spotify.com/office-hours'}
|
||||
>
|
||||
Office Hours
|
||||
</Block.LinkButton>
|
||||
</Block.Container>
|
||||
</Block.TextBox>
|
||||
<Block.Graphics>
|
||||
<Block.Graphic
|
||||
x={-12.5}
|
||||
y={16}
|
||||
width={120}
|
||||
src={`${baseUrl}img/laptop.svg`}
|
||||
/>
|
||||
<Block.Graphic
|
||||
x={5.8}
|
||||
y={20}
|
||||
width={88}
|
||||
src={`${baseUrl}animations/backstage-logos-hero-8.gif`}
|
||||
/>
|
||||
</Block.Graphics>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
|
||||
<Block small className="stripe-top bg-black">
|
||||
<Block.Container wrapped>
|
||||
<Block.TextBox>
|
||||
<img
|
||||
className="Block__GIF"
|
||||
src={`${baseUrl}animations/backstage-speed-paradox-7.gif`}
|
||||
/>
|
||||
<Block.SmallTitle small>The Speed Paradox</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
At Spotify, we've always believed in the speed and ingenuity
|
||||
that comes from having autonomous development teams. But as we
|
||||
learned firsthand, the faster you grow, the more fragmented
|
||||
and complex your software ecosystem becomes. And then
|
||||
everything slows down again.
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
<Block.TextBox>
|
||||
<img
|
||||
className="Block__GIF"
|
||||
src={`${baseUrl}animations/backstage-standards-paradox-4.gif`}
|
||||
/>
|
||||
<Block.SmallTitle small>The Standards Paradox</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
By centralizing services and standardizing your tooling,
|
||||
Backstage streamlines your development environment from end to
|
||||
end. Instead of restricting autonomy, standardization frees
|
||||
your engineers from infrastructure complexity. So you can
|
||||
return to building and scaling, quickly and safely.
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
|
||||
<Block className="stripe-top bg-teal-top-right" wrapped>
|
||||
<Block.Container wrapped>
|
||||
<Block.TextBox wide>
|
||||
{' '}
|
||||
<img
|
||||
className="Block__GIF"
|
||||
src={`${baseUrl}animations/backstage-software-catalog-icon-1.gif`}
|
||||
/>
|
||||
<Block.Subtitle>Backstage Software Catalog</Block.Subtitle>
|
||||
<Block.Title half>
|
||||
Build an ecosystem, not a wilderness
|
||||
</Block.Title>
|
||||
</Block.TextBox>
|
||||
<Breakpoint
|
||||
narrow={
|
||||
<Block.Graphics padding={5}>
|
||||
<Block.Graphic
|
||||
y={-8}
|
||||
width={100}
|
||||
src={`${baseUrl}img/components-with-filter-small.png`}
|
||||
/>
|
||||
</Block.Graphics>
|
||||
}
|
||||
/>
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>
|
||||
Manage all your software, all in one place{' '}
|
||||
</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
Backstage makes it easy for one team to manage 10 services —
|
||||
and makes it possible for your company to manage thousands of
|
||||
them
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>A uniform overview</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
Every team can see all the services they own and related
|
||||
resources (deployments, data pipelines, pull request status,
|
||||
etc.)
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
<Block.Image
|
||||
wide
|
||||
style={{
|
||||
background: `url(${baseUrl}img/components-with-filter.png)`,
|
||||
backgroundSize: '594px 435.5px',
|
||||
width: '594px',
|
||||
height: '435.5px',
|
||||
margin: '-380px 105px 0 10px',
|
||||
}}
|
||||
/>
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>Metadata on tap</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
All that information can be shared with plugins inside
|
||||
Backstage to enable other management features, like resource
|
||||
monitoring and testing
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>Not just services</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
Libraries, websites, ML models — you name it, Backstage knows
|
||||
all about it, including who owns it, dependencies, and more
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>
|
||||
Discoverability & accountability
|
||||
</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
No more orphan software hiding in the dark corners of your
|
||||
tech stack
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
<Block.TextBox small></Block.TextBox>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
|
||||
<ActionBlock className="stripe bg-teal">
|
||||
<ActionBlock.Title>
|
||||
Learn more about the software catalog
|
||||
</ActionBlock.Title>
|
||||
<ActionBlock.Link
|
||||
href={`https://backstage.io/docs/features/software-catalog/software-catalog-overview`}
|
||||
>
|
||||
Read
|
||||
</ActionBlock.Link>
|
||||
</ActionBlock>
|
||||
|
||||
<Block className="stripe-top bg-teal-bottom" wrapped>
|
||||
<Block.Container wrapped>
|
||||
<Block.TextBox wide>
|
||||
<img
|
||||
className="Block__GIF"
|
||||
src={`${baseUrl}animations/backstage-software-templates-icon-5.gif`}
|
||||
/>
|
||||
<Block.Subtitle>Backstage Software Templates</Block.Subtitle>
|
||||
<Block.Title small>Standards can set you free</Block.Title>
|
||||
</Block.TextBox>
|
||||
<Breakpoint
|
||||
narrow={
|
||||
<Block.Graphics padding={20}>
|
||||
<Block.Graphic
|
||||
y={-38}
|
||||
width={100}
|
||||
src={`${baseUrl}img/service-cards.png`}
|
||||
/>
|
||||
</Block.Graphics>
|
||||
}
|
||||
/>
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>
|
||||
Like automated getting started guides
|
||||
</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
Using templates, engineers can spin up a new microservice with
|
||||
your organization's best practices built-in, right from the
|
||||
start
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>
|
||||
Push-button deployment
|
||||
</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
Click a button to create a Spring Boot project with your repo
|
||||
automatically configured on GitHub and your CI already running
|
||||
the first build
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>
|
||||
Built to your standards
|
||||
</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
Go instead of Java? CircleCI instead of Jenkins? Serverless
|
||||
instead of Kubernetes? GCP instead of AWS? Customize your
|
||||
recipes with your best practices baked-in
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>
|
||||
Golden Paths pave the way
|
||||
</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
When the right way is also the easiest way, engineers get up
|
||||
and running faster — and more safely
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
<Breakpoint
|
||||
wide={
|
||||
<Block.Graphics>
|
||||
<Block.Graphic
|
||||
x={-50}
|
||||
y={-2}
|
||||
width={200}
|
||||
src={`${baseUrl}img/cards.png`}
|
||||
/>
|
||||
</Block.Graphics>
|
||||
}
|
||||
/>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
|
||||
<ActionBlock className="stripe bg-teal">
|
||||
<ActionBlock.Title>
|
||||
Build your own software templates
|
||||
</ActionBlock.Title>
|
||||
<ActionBlock.Link
|
||||
href={`https://backstage.io/docs/features/software-templates`}
|
||||
>
|
||||
Contribute
|
||||
</ActionBlock.Link>
|
||||
</ActionBlock>
|
||||
|
||||
<Block className="stripe-top bg-teal-bottom" wrapped>
|
||||
<Block.Container wrapped>
|
||||
<Block.TextBox wide>
|
||||
<img
|
||||
className="Block__GIF"
|
||||
src={`${baseUrl}animations/backstage-techdocs-icon-1.gif`}
|
||||
/>
|
||||
|
||||
<Block.Subtitle>Backstage TechDocs</Block.Subtitle>
|
||||
<Block.Title small>Docs like code</Block.Title>
|
||||
</Block.TextBox>
|
||||
<Breakpoint
|
||||
narrow={
|
||||
<React.Fragment>
|
||||
<Block.Graphics padding={26}>
|
||||
<Block.Graphic
|
||||
x={-1.4}
|
||||
y={-45}
|
||||
width={107}
|
||||
src={`${baseUrl}img/techdocs-static-mobile.png`}
|
||||
/>
|
||||
</Block.Graphics>
|
||||
</React.Fragment>
|
||||
}
|
||||
/>
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>Free documentation</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
Whenever you use a Backstage Software Template, your project
|
||||
automatically gets a TechDocs site, for free
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>Easy to write</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
With our docs-like-code approach, engineers write their
|
||||
documentation in Markdown files right alongside their code
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>Easy to maintain</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
Updating code? Update your documentation while you're there —
|
||||
with docs and code in the same place, it becomes a natural
|
||||
part of your workstream
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>Easy to find and use</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
Since all your documentation is in Backstage, finding any
|
||||
TechDoc is just a search query away
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
<Breakpoint
|
||||
wide={
|
||||
<Block.Graphics padding={0}>
|
||||
<Block.Graphic
|
||||
x={-55}
|
||||
y={-5}
|
||||
width={210}
|
||||
src={`${baseUrl}img/techdocs-web.png`}
|
||||
/>
|
||||
<Block.Graphic
|
||||
x={-55}
|
||||
y={-5}
|
||||
width={210}
|
||||
src={`${baseUrl}img/techdocs2.gif`}
|
||||
/>
|
||||
</Block.Graphics>
|
||||
}
|
||||
/>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
|
||||
<ActionBlock className="stripe bg-teal">
|
||||
<ActionBlock.Title>Learn more about TechDocs</ActionBlock.Title>
|
||||
<ActionBlock.Link
|
||||
href={`https://backstage.io/docs/features/techdocs/techdocs-overview`}
|
||||
>
|
||||
Docs
|
||||
</ActionBlock.Link>
|
||||
</ActionBlock>
|
||||
|
||||
<Block className="stripe-top bg-teal-top-right" wrapped>
|
||||
<Block.Container wrapped>
|
||||
<Block.TextBox wide>
|
||||
{' '}
|
||||
<img
|
||||
className="Block__GIF"
|
||||
src={`${baseUrl}animations/backstage-search-platform-icon-1.gif`}
|
||||
/>
|
||||
<Block.Subtitle>Backstage Search Platform</Block.Subtitle>
|
||||
<Block.Title half>
|
||||
A search platform made just for you
|
||||
</Block.Title>
|
||||
</Block.TextBox>
|
||||
<Breakpoint
|
||||
narrow={
|
||||
<Block.Graphics innerPadding={20}>
|
||||
<Block.Graphic
|
||||
y={-8}
|
||||
padding={0}
|
||||
width={100}
|
||||
src={`${baseUrl}img/search-platform-overview-small.png`}
|
||||
/>
|
||||
</Block.Graphics>
|
||||
}
|
||||
/>
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>
|
||||
Way more than a text box{' '}
|
||||
</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
Backstage Search more than just a box you type questions into
|
||||
— it's an entire platform all by itself, which you can
|
||||
customize to fit your organization's needs
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>
|
||||
Search the way you want
|
||||
</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
Bring your own search engine, create a customized search page
|
||||
experience, or edit the look and feel of each search result
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>
|
||||
Index everything, find anything
|
||||
</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
With an extensible backend, you can search beyond the Software
|
||||
Catalog and index any source you'd like — whether it's
|
||||
TechDocs or Confluence and Stack Overflow
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>
|
||||
Discoverability unlocked
|
||||
</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
New hires and seasoned employees alike can easily search your
|
||||
infrastructure instead of getting lost in it
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
</Block.Container>
|
||||
<Breakpoint
|
||||
wide={
|
||||
<Block.Graphics innerPadding={25} width={'1100px'}>
|
||||
<Block.Graphic
|
||||
padding={0}
|
||||
src={`${baseUrl}img/search-platform-overview.png`}
|
||||
width={100}
|
||||
style={{
|
||||
borderRadius: '8px',
|
||||
boxShadow: '3px 8px 8px rgba(0,0,0,0.3)',
|
||||
bottom: '8px',
|
||||
}}
|
||||
/>
|
||||
</Block.Graphics>
|
||||
}
|
||||
/>
|
||||
</Block>
|
||||
|
||||
<ActionBlock className="stripe bg-teal">
|
||||
<ActionBlock.Title>
|
||||
Learn more about Backstage Search
|
||||
</ActionBlock.Title>
|
||||
<ActionBlock.Link
|
||||
href={`https://backstage.io/docs/features/search/search-overview`}
|
||||
>
|
||||
Read
|
||||
</ActionBlock.Link>
|
||||
</ActionBlock>
|
||||
|
||||
<Block className="stripe-top bg-teal-bottom" wrapped>
|
||||
<Block.Container wrapped>
|
||||
<Block.TextBox wide>
|
||||
<img
|
||||
className="Block__GIF"
|
||||
src={`${baseUrl}animations/backstage-kubernetes-icon-1.gif`}
|
||||
/>
|
||||
|
||||
<Block.Subtitle>Backstage Kubernetes</Block.Subtitle>
|
||||
<Block.Title small>
|
||||
Manage your services, not clusters
|
||||
</Block.Title>
|
||||
</Block.TextBox>
|
||||
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>
|
||||
Kubernetes made just for service owners
|
||||
</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
Backstage features the first Kubernetes monitoring tool
|
||||
designed around the needs of service owners, not cluster
|
||||
admins
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>
|
||||
Your service at a glance
|
||||
</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
Get all your service's deployments in one, aggregated view —
|
||||
no more digging through cluster logs in a CLI, no more combing
|
||||
through lists of services you don't own
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>
|
||||
Pick a cloud, any cloud
|
||||
</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
Since Backstage uses the Kubernetes API, it's cloud agnostic —
|
||||
so it works no matter which cloud provider or managed
|
||||
Kubernetes service you use, and even works in multi-cloud orgs
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>Any K8s, one UI</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
Now you don't have to switch dashboards when you move from
|
||||
local testing to production, or from one cloud provider to
|
||||
another
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
<ActionBlock className="stripe bg-teal">
|
||||
<ActionBlock.Title>
|
||||
Learn more about the K8s plugin
|
||||
</ActionBlock.Title>
|
||||
<ActionBlock.Link
|
||||
href={`https://backstage.io/blog/2021/01/12/new-backstage-feature-kubernetes-for-service-owners`}
|
||||
>
|
||||
Read
|
||||
</ActionBlock.Link>
|
||||
</ActionBlock>
|
||||
|
||||
<Block className="stripe-top bg-teal-bottom" wrapped>
|
||||
<Block.Container wrapped>
|
||||
<Block.TextBox wide>
|
||||
<img
|
||||
className="Block__GIF"
|
||||
src={`${baseUrl}animations/backstage-plugin-icon-2.gif`}
|
||||
/>
|
||||
|
||||
<Block.Subtitle>
|
||||
Customize Backstage with plugins
|
||||
</Block.Subtitle>
|
||||
<Block.Title small>
|
||||
An app store for your infrastructure
|
||||
</Block.Title>
|
||||
</Block.TextBox>
|
||||
<Breakpoint
|
||||
narrow={
|
||||
<Block.Graphics padding={10}>
|
||||
<Block.Graphic
|
||||
y={-20}
|
||||
width={100}
|
||||
src={`${baseUrl}img/plugins.png`}
|
||||
/>
|
||||
</Block.Graphics>
|
||||
}
|
||||
/>
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>Add functionality</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
Want scalable website testing? Add the{' '}
|
||||
<a href="https://backstage.io/blog/2020/04/06/lighthouse-plugin">
|
||||
Lighthouse
|
||||
</a>{' '}
|
||||
plugin. Wondering about recommended frameworks? Add the{' '}
|
||||
<a href="https://backstage.io/blog/2020/05/14/tech-radar-plugin">
|
||||
Tech Radar
|
||||
</a>{' '}
|
||||
plugin.{' '}
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>BYO Plugins</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
If you don't see the plugin you need, it's simple to build
|
||||
your own
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>
|
||||
Integrate your own custom tooling
|
||||
</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
Building internal plugins lets you tailor your version of
|
||||
Backstage to be a perfect fit for your infrastructure
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
|
||||
<Block.TextBox small>
|
||||
<BulletLine />
|
||||
<Block.SmallTitle small>
|
||||
Share with the community
|
||||
</Block.SmallTitle>
|
||||
<Block.Paragraph>
|
||||
Building <a href="/plugins">open source plugins</a>{' '}
|
||||
contributes to the entire Backstage ecosystem, which benefits
|
||||
everyone
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
|
||||
<Breakpoint
|
||||
wide={<img src={`${baseUrl}img/cards-plugins.png`} />}
|
||||
/>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
|
||||
<ActionBlock className="stripe-top bg-teal">
|
||||
<ActionBlock.Title>Build a plugin</ActionBlock.Title>
|
||||
<ActionBlock.Link href="/docs/plugins/create-a-plugin">
|
||||
Contribute
|
||||
</ActionBlock.Link>
|
||||
</ActionBlock>
|
||||
|
||||
<Block small className="bg-black-grey cncf-block">
|
||||
<Block.Container center>
|
||||
<Block.SmallTitle small>
|
||||
Backstage is a{' '}
|
||||
<a href="https://www.cncf.io">
|
||||
Cloud Native Computing Foundation
|
||||
</a>{' '}
|
||||
incubation project
|
||||
<div className="cncf-logo" />
|
||||
</Block.SmallTitle>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
</main>
|
||||
<HubSpotForm />
|
||||
</React.Fragment>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Index;
|
||||
@@ -1,29 +0,0 @@
|
||||
const React = require('react');
|
||||
|
||||
// This is an index of stable short-links to different doc sites
|
||||
// for example https://backstage.io/link?bind-routes
|
||||
const redirects = {
|
||||
'bind-routes':
|
||||
'/docs/plugins/composability#binding-external-routes-in-the-app',
|
||||
'scm-auth': '/docs/auth/#scaffolder-configuration-software-templates',
|
||||
'backend-system': '/docs/plugins/new-backend-system',
|
||||
};
|
||||
const fallback = '/docs';
|
||||
|
||||
function Link() {
|
||||
return (
|
||||
<html lang="en">
|
||||
<script
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: `
|
||||
const redirects = ${JSON.stringify(redirects)};
|
||||
const target = redirects[window.location.search.slice(1)] || '${fallback}';
|
||||
window.location.href = target;
|
||||
`,
|
||||
}}
|
||||
/>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
|
||||
module.exports = Link;
|
||||
@@ -1,85 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) 2017-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
const React = require('react');
|
||||
const Components = require(`${process.cwd()}/core/Components.js`);
|
||||
const Block = Components.Block;
|
||||
|
||||
const Background = props => {
|
||||
const { config: siteConfig } = props;
|
||||
const { baseUrl } = siteConfig;
|
||||
return (
|
||||
<main className="MainContent">
|
||||
<Block small className="stripe-bottom bg-black-grey">
|
||||
<Block.Container style={{ justifyContent: 'flex-start' }}>
|
||||
<Block.TextBox>
|
||||
<Block.Title>Community Sessions</Block.Title>
|
||||
<Block.Paragraph>
|
||||
Please be aware we follow the{' '}
|
||||
<a href="https://github.com/cncf/foundation/blob/master/code-of-conduct.md">
|
||||
{' '}
|
||||
CNCF Code of Conduct
|
||||
</a>
|
||||
.
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
|
||||
<Block className="stripe bg-black">
|
||||
<Block.Container style={{ justifyContent: 'flex-start' }}>
|
||||
<Block.MediaFrame>
|
||||
<iframe
|
||||
src="https://www.youtube.com/embed/wuztcqiQIa0"
|
||||
title="YouTube video player"
|
||||
frameborder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
</Block.MediaFrame>
|
||||
<Block.MediaFrame>
|
||||
<iframe
|
||||
width="300"
|
||||
height="500"
|
||||
src="https://www.youtube.com/live_chat?v=wuztcqiQIa0&embed_domain=backstage.io&dark_theme=1"
|
||||
></iframe>
|
||||
</Block.MediaFrame>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
|
||||
<Block className="stripe bg-black-grey">
|
||||
<Block.Container style={{ justifyContent: 'flex-start' }}>
|
||||
<Block.TextBox>
|
||||
<Block.Title>Don't be a stranger</Block.Title>
|
||||
<Block.Paragraph>
|
||||
Main community channels
|
||||
<br />- Chat and get support on our{' '}
|
||||
<a href="https://discord.gg/backstage-687207715902193673">
|
||||
Discord
|
||||
</a>
|
||||
<br />- Get into contributing with the{' '}
|
||||
<a href="https://github.com/backstage/backstage/contribute">
|
||||
Good First Issues
|
||||
</a>
|
||||
<br />- Subscribe to the{' '}
|
||||
<a href="https://info.backstage.spotify.com/newsletter_subscribe">
|
||||
Community newsletter
|
||||
</a>
|
||||
<br />- Join the{' '}
|
||||
<a href="https://twitter.com/i/communities/1494019781716062215">
|
||||
Twitter community
|
||||
</a>
|
||||
<br />
|
||||
</Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
</main>
|
||||
);
|
||||
};
|
||||
|
||||
module.exports = Background;
|
||||
@@ -1,44 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) 2017-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
const React = require('react');
|
||||
const Components = require(`${process.cwd()}/core/Components.js`);
|
||||
const Block = Components.Block;
|
||||
|
||||
const Background = props => {
|
||||
const { config: siteConfig } = props;
|
||||
const { baseUrl } = siteConfig;
|
||||
return (
|
||||
<main className="MainContent">
|
||||
<Block small className="stripe-bottom bg-black-grey">
|
||||
<Block.Container style={{ justifyContent: 'flex-start' }}>
|
||||
<Block.Title>Contributor Spotlight nomination</Block.Title>
|
||||
<Block.TextBox>
|
||||
<Block.Paragraph></Block.Paragraph>
|
||||
</Block.TextBox>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
|
||||
<Block className="stripe bg-black">
|
||||
<Block.Container style={{ justifyContent: 'flex-start' }}>
|
||||
<iframe
|
||||
src="https://docs.google.com/forms/d/e/1FAIpQLSdiZ28O7vwHo6NrwirEzGSbuVyBANSv7ItHqRlgVvSz3Z5xqQ/viewform?embedded=true"
|
||||
width="800"
|
||||
height="1262"
|
||||
frameborder="0"
|
||||
marginheight="0"
|
||||
marginwidth="0"
|
||||
>
|
||||
Loading…
|
||||
</iframe>
|
||||
</Block.Container>
|
||||
</Block>
|
||||
</main>
|
||||
);
|
||||
};
|
||||
|
||||
module.exports = Background;
|
||||
@@ -1,148 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) 2017-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
const fs = require('fs');
|
||||
const yaml = require('js-yaml');
|
||||
const React = require('react');
|
||||
const Components = require(`${process.cwd()}/core/Components.js`);
|
||||
const {
|
||||
Block: { Container },
|
||||
BulletLine,
|
||||
} = Components;
|
||||
|
||||
const ondemandDirectory = require('path').join(process.cwd(), 'data/on-demand');
|
||||
const ondemandMetadata = fs
|
||||
.readdirSync(ondemandDirectory)
|
||||
.sort()
|
||||
.reverse()
|
||||
.map(file => yaml.load(fs.readFileSync(`./data/on-demand/${file}`, 'utf8')));
|
||||
const truncate = text =>
|
||||
text.length > 170 ? text.slice(0, 170) + '...' : text;
|
||||
|
||||
const addVideoDocsLink = '/docs/overview/support';
|
||||
const defaultIconUrl = 'img/logo-gradient-on-dark.svg';
|
||||
|
||||
const Ondemand = () => (
|
||||
<main className="MainContent">
|
||||
<div className="VideoPageLayout">
|
||||
<div className="VideoPageHeader">
|
||||
<h2>Upcoming live events</h2>
|
||||
<p>Upcoming Backstage events</p>
|
||||
<span>
|
||||
<a className="VideoAddNewButton ButtonFilled" href={addVideoDocsLink}>
|
||||
<b>Add an event or recording</b>
|
||||
</a>
|
||||
</span>
|
||||
</div>
|
||||
<Container wrapped className="VideoGrid">
|
||||
{ondemandMetadata
|
||||
.filter(video => video.category === 'Upcoming')
|
||||
.map(
|
||||
({
|
||||
title,
|
||||
description,
|
||||
category,
|
||||
date,
|
||||
youtubeUrl,
|
||||
youtubeImgUrl,
|
||||
rsvpUrl,
|
||||
eventUrl,
|
||||
}) => (
|
||||
<div className="VideoCard">
|
||||
<div className="VideoCardHeader">
|
||||
<div className="VideoCardInfo">
|
||||
<h3 className="VideoCardTitle">{title}</h3>
|
||||
<p className="VideoCardDate">on {date}</p>
|
||||
|
||||
<span className="VideoCardChipOutlined">{category}</span>
|
||||
<p>
|
||||
<br />
|
||||
<img src={youtubeImgUrl} alt={title} />
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="VideoCardBody">
|
||||
<p>{truncate(description)}</p>
|
||||
</div>
|
||||
<div className="VideoCardFooter">
|
||||
<a className="VideoButtonFilled" href={eventUrl}>
|
||||
Event page
|
||||
</a>
|
||||
<a className="VideoButtonFilled" href={rsvpUrl}>
|
||||
Remind me
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
),
|
||||
)}
|
||||
</Container>
|
||||
<BulletLine style={{ width: '100%' }} />
|
||||
<div className="VideoPageHeader">
|
||||
<h2>Community on demand</h2>
|
||||
</div>
|
||||
<Container wrapped className="VideoGrid">
|
||||
{ondemandMetadata
|
||||
.filter(video => video.category !== 'Upcoming')
|
||||
.map(
|
||||
({
|
||||
title,
|
||||
description,
|
||||
category,
|
||||
date,
|
||||
youtubeUrl,
|
||||
youtubeImgUrl,
|
||||
}) => (
|
||||
<div className="VideoCard">
|
||||
<div className="VideoCardHeader">
|
||||
<div className="VideoCardInfo">
|
||||
<h3 className="VideoCardTitle">{title}</h3>
|
||||
<p className="VideoCardDate">on {date}</p>
|
||||
|
||||
<span className="VideoCardChipOutlined">{category}</span>
|
||||
<p>
|
||||
<br />
|
||||
<img src={youtubeImgUrl} alt={title} />
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="VideoCardBody">
|
||||
<p>{truncate(description)}</p>
|
||||
</div>
|
||||
<div className="VideoCardFooter">
|
||||
<a className="VideoButtonFilled" href={youtubeUrl}>
|
||||
Watch on YouTube
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
),
|
||||
)}
|
||||
<div className="VideoCard" id="add-video-card">
|
||||
<div className="VideoCardBody">
|
||||
<p>Do you have a recording of a meetup to include on this page?</p>
|
||||
<p
|
||||
style={{
|
||||
marginTop: '20px',
|
||||
textAlign: 'center',
|
||||
}}
|
||||
>
|
||||
<a className="VideoButtonFilled" href={addVideoDocsLink}>
|
||||
<b>Add to the On-demand page</b>
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
<Container className="VideoCardFooter">
|
||||
<p>
|
||||
Help us create a go-to place for hours of Backstage related
|
||||
content.
|
||||
</p>
|
||||
</Container>
|
||||
</div>
|
||||
</Container>
|
||||
</div>
|
||||
</main>
|
||||
);
|
||||
|
||||
module.exports = Ondemand;
|
||||
@@ -1,174 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) 2017-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
const fs = require('fs');
|
||||
const yaml = require('js-yaml');
|
||||
const React = require('react');
|
||||
const Components = require(`${process.cwd()}/core/Components.js`);
|
||||
const {
|
||||
Block: { Container },
|
||||
BulletLine,
|
||||
} = Components;
|
||||
|
||||
const pluginsDirectory = require('path').join(process.cwd(), 'data/plugins');
|
||||
const pluginMetadata = fs
|
||||
.readdirSync(pluginsDirectory)
|
||||
.map(file => yaml.load(fs.readFileSync(`./data/plugins/${file}`, 'utf8')))
|
||||
.sort((a, b) => a.title.toLowerCase().localeCompare(b.title.toLowerCase()));
|
||||
const truncate = text =>
|
||||
text.length > 170 ? text.slice(0, 170) + '...' : text;
|
||||
|
||||
const newForDays = 100;
|
||||
|
||||
const addPluginDocsLink = '/docs/plugins/add-to-marketplace';
|
||||
const defaultIconUrl = '/img/logo-gradient-on-dark.svg';
|
||||
|
||||
const Plugins = () => (
|
||||
<main className="MainContent">
|
||||
<div className="PluginPageLayout">
|
||||
<div className="PluginPageHeader">
|
||||
<h2>Plugin Marketplace</h2>
|
||||
<p>
|
||||
Open source plugins that you can add to your Backstage deployment.
|
||||
Learn how to build a <a href="/docs/plugins">plugin</a>.
|
||||
</p>
|
||||
<span>
|
||||
<a
|
||||
className="PluginAddNewButton ButtonFilled"
|
||||
href={addPluginDocsLink}
|
||||
>
|
||||
<b>Add to Marketplace</b>
|
||||
</a>
|
||||
</span>
|
||||
</div>
|
||||
<BulletLine style={{ width: '100% ' }} />
|
||||
<div className="PluginPageHeader">
|
||||
<h2>Core Features</h2>
|
||||
</div>
|
||||
<Container wrapped className="PluginGrid">
|
||||
{pluginMetadata
|
||||
.filter(plugin => plugin.category === 'Core Feature')
|
||||
.sort((a, b) => a.order - b.order)
|
||||
.map(
|
||||
({
|
||||
iconUrl,
|
||||
title,
|
||||
description,
|
||||
author,
|
||||
authorUrl,
|
||||
documentation,
|
||||
category,
|
||||
}) => (
|
||||
<div className="PluginCard">
|
||||
<div className="PluginCardHeader">
|
||||
<div className="PluginCardImage">
|
||||
<img src={iconUrl || defaultIconUrl} alt={title} />
|
||||
</div>
|
||||
<div className="PluginCardInfo">
|
||||
<h3 className="PluginCardTitle">{title}</h3>
|
||||
<p className="PluginCardAuthor">
|
||||
by <a href={authorUrl}>{author}</a>
|
||||
</p>
|
||||
<span className="PluginCardChipOutlined">{category}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div className="PluginCardBody">
|
||||
<p>{truncate(description)}</p>
|
||||
</div>
|
||||
<div className="PluginCardFooter">
|
||||
<a className="ButtonFilled" href={documentation}>
|
||||
Explore
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
),
|
||||
)}
|
||||
</Container>
|
||||
<div className="PluginPageHeader">
|
||||
<h2>All Plugins</h2>
|
||||
</div>
|
||||
<Container wrapped className="PluginGrid">
|
||||
{pluginMetadata
|
||||
.filter(plugin => plugin.category !== 'Core Feature')
|
||||
.map(
|
||||
({
|
||||
iconUrl,
|
||||
title,
|
||||
description,
|
||||
author,
|
||||
authorUrl,
|
||||
documentation,
|
||||
category,
|
||||
addedDate,
|
||||
}) => (
|
||||
<div className="PluginCard">
|
||||
{Math.trunc(
|
||||
(Date.now() - new Date(addedDate)) / (1000 * 60 * 60 * 24),
|
||||
) < newForDays && (
|
||||
<div className="ribbon ribbon-top-right">
|
||||
<span>NEW</span>
|
||||
</div>
|
||||
)}
|
||||
<div className="PluginCardHeader">
|
||||
<div className="PluginCardImage">
|
||||
<img src={iconUrl || defaultIconUrl} alt={title} />
|
||||
</div>
|
||||
<div className="PluginCardInfo">
|
||||
<h3 className="PluginCardTitle">{title}</h3>
|
||||
<p className="PluginCardAuthor">
|
||||
by <a href={authorUrl}>{author}</a>
|
||||
</p>
|
||||
<span className="PluginCardChipOutlined">{category}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div className="PluginCardBody">
|
||||
<p>{truncate(description)}</p>
|
||||
</div>
|
||||
<div className="PluginCardFooter">
|
||||
<a className="ButtonFilled" href={documentation}>
|
||||
Explore
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
),
|
||||
)}
|
||||
<div className="PluginCard" id="add-plugin-card">
|
||||
<div className="PluginCardBody">
|
||||
<p>
|
||||
Do you have an existing plugin that you want to add to the
|
||||
Marketplace?
|
||||
</p>
|
||||
<p
|
||||
style={{
|
||||
marginTop: '20px',
|
||||
textAlign: 'center',
|
||||
}}
|
||||
>
|
||||
<a className="ButtonFilled" href={addPluginDocsLink}>
|
||||
<b>Add to Marketplace</b>
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
<Container className="PluginCardFooter">
|
||||
<p>
|
||||
See what plugins are already
|
||||
<a href="https://github.com/backstage/backstage/issues?q=is%3Aissue+is%3Aopen+label%3Aplugin+sort%3Areactions-%2B1-desc">
|
||||
in progress
|
||||
</a>
|
||||
and 👍. Missing a plugin for your favorite tool? Please
|
||||
<a href="https://github.com/backstage/backstage/issues/new?labels=plugin&template=plugin_template.md&title=%5BPlugin%5D+THE+PLUGIN+NAME">
|
||||
suggest
|
||||
</a>
|
||||
a new one.
|
||||
</p>
|
||||
</Container>
|
||||
</div>
|
||||
</Container>
|
||||
</div>
|
||||
</main>
|
||||
);
|
||||
|
||||
module.exports = Plugins;
|
||||
@@ -1,54 +0,0 @@
|
||||
/*
|
||||
* Copyright 2020 The Backstage Authors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* This script relies on docusaurus internals. It can be replaced in case
|
||||
* docusaurus adds proper validation of the sidebar items.
|
||||
*/
|
||||
|
||||
let metadata;
|
||||
try {
|
||||
metadata = require('docusaurus/lib/core/metadata.js');
|
||||
} catch (error) {
|
||||
console.log('❌ Run `yarn build` before running `yarn verify:sidebars`');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const errors = [];
|
||||
|
||||
// reference/index is generated, so make sure this goes through even if it's not there
|
||||
const knownIds = new Set([...Object.keys(metadata), 'reference/index']);
|
||||
|
||||
for (const id in metadata) {
|
||||
const { next, previous } = metadata[id];
|
||||
|
||||
if (next && !knownIds.has(next)) {
|
||||
errors.push(`Next ${next} does not exist in ${id}.`);
|
||||
}
|
||||
|
||||
if (previous && !knownIds.has(previous)) {
|
||||
errors.push(`Previous ${previous} does not exist in ${id}.`);
|
||||
}
|
||||
}
|
||||
|
||||
if (errors.length) {
|
||||
for (const error of errors) {
|
||||
console.log(`❌ ${error}`);
|
||||
}
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log('✅ All sidebar links are correct.');
|
||||
+59
-58
@@ -35,9 +35,9 @@
|
||||
"getting-started/create-an-app",
|
||||
"getting-started/running-backstage-locally",
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "App configuration",
|
||||
"ids": [
|
||||
"items": [
|
||||
"getting-started/configure-app-with-plugins",
|
||||
"getting-started/app-custom-theme",
|
||||
"getting-started/homepage"
|
||||
@@ -46,13 +46,14 @@
|
||||
"getting-started/keeping-backstage-updated",
|
||||
"getting-started/concepts",
|
||||
"getting-started/contributors",
|
||||
"getting-started/getting-involved",
|
||||
"getting-started/project-structure"
|
||||
],
|
||||
"Local Development": [
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "CLI",
|
||||
"ids": [
|
||||
"items": [
|
||||
"local-dev/cli-overview",
|
||||
"local-dev/cli-build-system",
|
||||
"local-dev/cli-commands"
|
||||
@@ -62,9 +63,9 @@
|
||||
],
|
||||
"Core Features": [
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "Software Catalog",
|
||||
"ids": [
|
||||
"items": [
|
||||
"features/software-catalog/software-catalog-overview",
|
||||
"features/software-catalog/life-of-an-entity",
|
||||
"features/software-catalog/configuration",
|
||||
@@ -81,9 +82,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "Kubernetes",
|
||||
"ids": [
|
||||
"items": [
|
||||
"features/kubernetes/overview",
|
||||
"features/kubernetes/installation",
|
||||
"features/kubernetes/configuration",
|
||||
@@ -93,9 +94,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "Software Templates",
|
||||
"ids": [
|
||||
"items": [
|
||||
"features/software-templates/software-templates-index",
|
||||
"features/software-templates/configuration",
|
||||
"features/software-templates/adding-templates",
|
||||
@@ -110,9 +111,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "Backstage Search",
|
||||
"ids": [
|
||||
"items": [
|
||||
"features/search/search-overview",
|
||||
"features/search/getting-started",
|
||||
"features/search/concepts",
|
||||
@@ -122,9 +123,9 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "TechDocs",
|
||||
"ids": [
|
||||
"items": [
|
||||
"features/techdocs/techdocs-overview",
|
||||
"features/techdocs/getting-started",
|
||||
"features/techdocs/concepts",
|
||||
@@ -144,55 +145,55 @@
|
||||
"Integrations": [
|
||||
"integrations/index",
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "AWS S3",
|
||||
"ids": [
|
||||
"items": [
|
||||
"integrations/aws-s3/locations",
|
||||
"integrations/aws-s3/discovery"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "Azure",
|
||||
"ids": [
|
||||
"items": [
|
||||
"integrations/azure/locations",
|
||||
"integrations/azure/discovery",
|
||||
"integrations/azure/org"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "Bitbucket Cloud",
|
||||
"ids": [
|
||||
"items": [
|
||||
"integrations/bitbucketCloud/locations",
|
||||
"integrations/bitbucketCloud/discovery"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "Bitbucket Server",
|
||||
"ids": [
|
||||
"items": [
|
||||
"integrations/bitbucketServer/locations",
|
||||
"integrations/bitbucketServer/discovery"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "Datadog",
|
||||
"ids": ["integrations/datadog-rum/installation"]
|
||||
"items": ["integrations/datadog-rum/installation"]
|
||||
},
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "Gerrit",
|
||||
"ids": [
|
||||
"items": [
|
||||
"integrations/gerrit/locations",
|
||||
"integrations/gerrit/discovery"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "GitHub",
|
||||
"ids": [
|
||||
"items": [
|
||||
"integrations/github/locations",
|
||||
"integrations/github/discovery",
|
||||
"integrations/github/org",
|
||||
@@ -200,28 +201,28 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "GitLab",
|
||||
"ids": [
|
||||
"items": [
|
||||
"integrations/gitlab/locations",
|
||||
"integrations/gitlab/discovery",
|
||||
"integrations/gitlab/org"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "Gitea",
|
||||
"ids": ["integrations/gitea/locations"]
|
||||
"items": ["integrations/gitea/locations"]
|
||||
},
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "Google GCS",
|
||||
"ids": ["integrations/google-cloud-storage/locations"]
|
||||
"items": ["integrations/google-cloud-storage/locations"]
|
||||
},
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "LDAP",
|
||||
"ids": ["integrations/ldap/org"]
|
||||
"items": ["integrations/ldap/org"]
|
||||
}
|
||||
],
|
||||
"Plugins": [
|
||||
@@ -237,9 +238,9 @@
|
||||
"plugins/analytics",
|
||||
"plugins/feature-flags",
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "Backends and APIs",
|
||||
"ids": [
|
||||
"items": [
|
||||
"plugins/proxying",
|
||||
"plugins/backend-plugin",
|
||||
"plugins/call-existing-api",
|
||||
@@ -247,14 +248,14 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "Testing",
|
||||
"ids": ["plugins/testing"]
|
||||
"items": ["plugins/testing"]
|
||||
},
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "Publishing",
|
||||
"ids": [
|
||||
"items": [
|
||||
"plugins/publish-private",
|
||||
"plugins/add-to-marketplace",
|
||||
"plugins/observability"
|
||||
@@ -270,9 +271,9 @@
|
||||
"Auth and identity": [
|
||||
"auth/index",
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "Included providers",
|
||||
"ids": [
|
||||
"items": [
|
||||
"auth/auth0/provider",
|
||||
"auth/atlassian/provider",
|
||||
"auth/bitbucket/provider",
|
||||
@@ -302,9 +303,9 @@
|
||||
"permissions/frontend-integration",
|
||||
"permissions/custom-rules",
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "Tutorial: using Permissions in your plugin",
|
||||
"ids": [
|
||||
"items": [
|
||||
"permissions/plugin-authors/01-setup",
|
||||
"permissions/plugin-authors/02-adding-a-basic-permission-check",
|
||||
"permissions/plugin-authors/03-adding-a-resource-permission-check",
|
||||
@@ -328,14 +329,14 @@
|
||||
],
|
||||
"API Reference": [
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "Guides",
|
||||
"ids": ["api/utility-apis"]
|
||||
"items": ["api/utility-apis"]
|
||||
},
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "API Reference",
|
||||
"ids": ["reference/index"]
|
||||
"items": ["reference/index"]
|
||||
},
|
||||
"api/deprecations"
|
||||
],
|
||||
@@ -370,9 +371,9 @@
|
||||
"Experimental Backend System": [
|
||||
"backend-system/index",
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "Architecture",
|
||||
"ids": [
|
||||
"items": [
|
||||
"backend-system/architecture/index",
|
||||
"backend-system/architecture/services",
|
||||
"backend-system/architecture/plugins",
|
||||
@@ -382,26 +383,26 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "Building Backends",
|
||||
"ids": [
|
||||
"items": [
|
||||
"backend-system/building-backends/index",
|
||||
"backend-system/building-backends/migrating"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "Building Plugins & Modules",
|
||||
"ids": [
|
||||
"items": [
|
||||
"backend-system/building-plugins-and-modules/index",
|
||||
"backend-system/building-plugins-and-modules/testing",
|
||||
"backend-system/building-plugins-and-modules/migrating"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "subcategory",
|
||||
"type": "category",
|
||||
"label": "Core Services",
|
||||
"ids": ["backend-system/core-services/index"]
|
||||
"items": ["backend-system/core-services/index"]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,148 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) 2017-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
// See https://docusaurus.io/docs/site-config for all the possible
|
||||
// site configuration options.
|
||||
|
||||
// This figures out what the most recent release version is, so that we can link to it in the header
|
||||
const [{ name: latestRelease }] = require('fs')
|
||||
.readdirSync(require('path').resolve(__dirname, '../docs/releases'))
|
||||
.map(file => {
|
||||
const match = file.match(/^v(\d+)\.(\d+)\.(\d+)\.md$/);
|
||||
if (!match) {
|
||||
return undefined;
|
||||
}
|
||||
const parts = match.slice(1).map(v => parseInt(v, 10));
|
||||
return {
|
||||
name: file.slice(0, file.length - '.md'.length),
|
||||
weight: parts[0] * 1000000 + parts[1] * 1000 + parts[2],
|
||||
};
|
||||
})
|
||||
.filter(Boolean)
|
||||
.sort((a, b) => b.weight - a.weight);
|
||||
|
||||
const siteConfig = {
|
||||
title: 'Backstage Software Catalog and Developer Platform', // Title for your website.
|
||||
tagline: 'An open platform for building developer portals',
|
||||
url: 'https://backstage.io', // Your website URL
|
||||
cname: 'backstage.io',
|
||||
baseUrl: '/', // Base URL for your project */
|
||||
editUrl: 'https://github.com/backstage/backstage/edit/master/docs/',
|
||||
|
||||
// Used for publishing and more
|
||||
projectName: 'backstage',
|
||||
organizationName: 'Spotify',
|
||||
fossWebsite: 'https://spotify.github.io/',
|
||||
|
||||
// Google Analytics
|
||||
gaTrackingId: 'G-KSEVGGNCJW',
|
||||
gaGtag: true,
|
||||
|
||||
// For no header links in the top nav bar -> headerLinks: [],
|
||||
headerLinks: [
|
||||
{
|
||||
href: 'https://github.com/backstage/backstage',
|
||||
label: 'GitHub',
|
||||
},
|
||||
{
|
||||
doc: 'overview/what-is-backstage',
|
||||
href: '/docs',
|
||||
label: 'Docs',
|
||||
},
|
||||
{
|
||||
page: 'plugins',
|
||||
label: 'Plugins',
|
||||
},
|
||||
{
|
||||
page: 'blog',
|
||||
blog: true,
|
||||
label: 'Blog',
|
||||
},
|
||||
{
|
||||
doc: `releases/${latestRelease}`,
|
||||
href: '/releases',
|
||||
label: 'Releases',
|
||||
},
|
||||
{
|
||||
page: 'demos',
|
||||
label: 'Demos',
|
||||
},
|
||||
{
|
||||
page: 'community',
|
||||
label: 'Community',
|
||||
},
|
||||
],
|
||||
|
||||
/* path to images for header/footer */
|
||||
// headerIcon: "img/android-chrome-192x192.png",
|
||||
footerIcon: 'img/android-chrome-192x192.png',
|
||||
favicon: 'img/favicon.ico',
|
||||
|
||||
/* Colors for website */
|
||||
colors: {
|
||||
primaryColor: '#36BAA2',
|
||||
secondaryColor: '#121212',
|
||||
textColor: '#FFFFFF',
|
||||
navigatorTitleTextColor: '#e4e4e4',
|
||||
navigatorItemTextColor: '#9e9e9e',
|
||||
navGroupSubcategoryTitleColor: '#9e9e9e',
|
||||
},
|
||||
|
||||
// This copyright info is used in /core/Footer.js and blog RSS/Atom feeds.
|
||||
copyright: `Copyright © ${new Date().getFullYear()} Backstage Project Authors. All rights reserved. The Linux Foundation has registered trademarks and uses trademarks. For a list of trademarks of The Linux Foundation, please see our Trademark Usage page: https://www.linuxfoundation.org/trademark-usage`,
|
||||
|
||||
highlight: {
|
||||
// Highlight.js theme to use for syntax highlighting in code blocks.
|
||||
theme: 'monokai',
|
||||
},
|
||||
|
||||
// Add custom scripts here that would be placed in <script> tags.
|
||||
scripts: [
|
||||
'https://buttons.github.io/buttons.js',
|
||||
'https://unpkg.com/medium-zoom@1.0.6/dist/medium-zoom.min.js',
|
||||
'/js/medium-zoom.js',
|
||||
'/js/dismissable-banner.js',
|
||||
'/js/scroll-nav-to-view-in-docs.js',
|
||||
],
|
||||
|
||||
// On page navigation for the current documentation page.
|
||||
onPageNav: 'separate',
|
||||
// No .html extensions for paths.
|
||||
cleanUrl: true,
|
||||
|
||||
// Open Graph and Twitter card images.
|
||||
ogImage: 'img/sharing-opengraph.png',
|
||||
twitterImage: 'img/twitter-summary.png',
|
||||
|
||||
// For sites with a sizable amount of content, set collapsible to true.
|
||||
// Expand/collapse the links and subcategories under categories.
|
||||
docsSideNavCollapsible: true,
|
||||
|
||||
// Show documentation's last contributor's name.
|
||||
// enableUpdateBy: true,
|
||||
|
||||
// Show documentation's last update time.
|
||||
enableUpdateTime: true,
|
||||
|
||||
// You may provide arbitrary config keys to be used as needed by your
|
||||
// template. For example, if you need your repo's URL...
|
||||
repoUrl: 'https://github.com/backstage/backstage',
|
||||
twitterUsername: 'SpotifyEng',
|
||||
|
||||
stylesheets: [
|
||||
'https://fonts.googleapis.com/css?family=IBM+Plex+Mono:500,700&display=swap',
|
||||
],
|
||||
|
||||
algolia: {
|
||||
apiKey: '10b9e6c92a4513c1cf390f50e53aad1f',
|
||||
indexName: 'backstage_io',
|
||||
appId: 'JCMFNHCHI8',
|
||||
searchParameters: {}, // Optional (if provided by Algolia)
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = siteConfig;
|
||||
+1
-1
@@ -9,7 +9,7 @@ import Link from '@docusaurus/Link';
|
||||
|
||||
//#region Plugin data import
|
||||
const onDemandContext = require.context(
|
||||
'../../../../microsite/data/on-demand',
|
||||
'../../../data/on-demand',
|
||||
false,
|
||||
/\.ya?ml/,
|
||||
);
|
||||
@@ -9,7 +9,7 @@ import { truncateDescription } from '@site/src/util/truncateDescription';
|
||||
|
||||
//#region Plugin data import
|
||||
const pluginsContext = require.context(
|
||||
'../../../../microsite/data/plugins',
|
||||
'../../../data/plugins',
|
||||
false,
|
||||
/\.ya?ml/,
|
||||
);
|
||||
+7161
-5401
File diff suppressed because it is too large
Load Diff
@@ -36,12 +36,7 @@ async function findLockFiles() {
|
||||
|
||||
if (!files.length) {
|
||||
// List all lock files that are in the root or in an immediate subdirectory
|
||||
files = [
|
||||
'yarn.lock',
|
||||
'cypress/yarn.lock',
|
||||
'microsite/yarn.lock',
|
||||
'microsite-next/yarn.lock',
|
||||
];
|
||||
files = ['yarn.lock', 'cypress/yarn.lock', 'microsite/yarn.lock'];
|
||||
}
|
||||
|
||||
return files.map(file => ({
|
||||
|
||||
Reference in New Issue
Block a user