From d26b948b8902bf994f3d82fad45915f4ad8bb3a2 Mon Sep 17 00:00:00 2001 From: Neil MacDougall Date: Mon, 20 Jul 2020 14:28:04 +0100 Subject: [PATCH] Landing Page WIP --- .github/documentation.yml | 63 +++++++ index.yaml | 76 -------- website/README.md | 20 ++- website/blog/2019-05-28-hola.md | 11 -- website/blog/2019-05-29-hello-world.md | 17 -- website/blog/2019-05-30-welcome.md | 13 -- website/docs/old-index.html | 1 - website/docs/talks.md | 7 + website/docusaurus.config.js | 51 ++---- website/src/css/custom.css | 69 ++++++- website/src/pages/index.js | 74 +++++--- website/static/img/cloudfoundry.png | Bin 0 -> 5544 bytes website/static/img/deploy.svg | 1 + website/static/img/easy.svg | 1 + website/static/img/extend.svg | 1 + website/static/img/favicon.ico | Bin 3626 -> 15086 bytes website/static/img/kubernetes.svg | 84 +++++++++ website/static/img/logo.png | Bin 0 -> 93628 bytes website/static/img/open-source.svg | 1 + .../static/img/undraw_docusaurus_mountain.svg | 170 ------------------ .../static/img/undraw_docusaurus_react.svg | 169 ----------------- website/static/img/undraw_docusaurus_tree.svg | 1 - 22 files changed, 305 insertions(+), 525 deletions(-) create mode 100644 .github/documentation.yml delete mode 100755 index.yaml delete mode 100644 website/blog/2019-05-28-hola.md delete mode 100644 website/blog/2019-05-29-hello-world.md delete mode 100644 website/blog/2019-05-30-welcome.md delete mode 100644 website/docs/old-index.html create mode 100644 website/docs/talks.md create mode 100644 website/static/img/cloudfoundry.png create mode 100644 website/static/img/deploy.svg create mode 100644 website/static/img/easy.svg create mode 100644 website/static/img/extend.svg create mode 100644 website/static/img/kubernetes.svg create mode 100644 website/static/img/logo.png create mode 100644 website/static/img/open-source.svg delete mode 100644 website/static/img/undraw_docusaurus_mountain.svg delete mode 100644 website/static/img/undraw_docusaurus_react.svg delete mode 100644 website/static/img/undraw_docusaurus_tree.svg diff --git a/.github/documentation.yml b/.github/documentation.yml new file mode 100644 index 0000000000..6e616e5e6d --- /dev/null +++ b/.github/documentation.yml @@ -0,0 +1,63 @@ +name: documentation + +on: + pull_request: + branches: [master] + push: + branches: [master] + +jobs: + checks: + if: github.event_name != 'push' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + with: + node-version: '12.x' + - name: Test Build + run: | + if [ -e yarn.lock ]; then + yarn install --frozen-lockfile + elif [ -e package-lock.json ]; then + npm ci + else + npm i + fi + npm run build + gh-release: + if: github.event_name != 'pull_request' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + with: + node-version: '12.x' + - name: Add key to allow access to repository + env: + SSH_AUTH_SOCK: /tmp/ssh_agent.sock + run: | + mkdir -p ~/.ssh + ssh-keyscan github.com >> ~/.ssh/known_hosts + echo "${{ secrets.GH_PAGES_DEPLOY }}" > ~/.ssh/id_rsa + chmod 600 ~/.ssh/id_rsa + cat <> ~/.ssh/config + Host github.com + HostName github.com + IdentityFile ~/.ssh/id_rsa + EOT + - name: Release to GitHub Pages + env: + USE_SSH: true + GIT_USER: git + run: | + git config --global user.email "actions@gihub.com" + git config --global user.name "gh-actions" + if [ -e yarn.lock ]; then + yarn install --frozen-lockfile + elif [ -e package-lock.json ]; then + npm ci + else + npm i + fi + npx docusaurus deploy diff --git a/index.yaml b/index.yaml deleted file mode 100755 index 2d8ee50438..0000000000 --- a/index.yaml +++ /dev/null @@ -1,76 +0,0 @@ -apiVersion: v1 -entries: - console: - - apiVersion: v1 - created: 2018-01-09T11:48:55.233833731Z - description: A Helm chart for deploying Stratos UI Console - digest: 378df78adeebfad7d81b63a9f01afbb830c35cf948e3b662349e1d20a0972955 - name: console - urls: - - https://github.com/cloudfoundry-incubator/stratos/releases/download/1.0.0/console-helm-chart-1.0.0.tgz - version: 1.0.0 - - apiVersion: v1 - created: 2017-12-08T13:21:38.611521378Z - description: A Helm chart for deploying Stratos UI Console - digest: 8e8994171cf7ba37c4b37564c8efa07f1fd66dda347900b592ebfaae5407bf3d - name: console - urls: - - https://github.com/cloudfoundry-incubator/stratos/releases/download/0.9.9/console-helm-chart-0.9.9.tgz - version: 0.9.9 - - apiVersion: v1 - created: 2017-11-23T16:31:10.781104928Z - description: A Helm chart for deploying Stratos UI Console - digest: 97bdf40f53053815016e223d49082ba16984b9b5a0a5a2d237ef45bb42183ad8 - name: console - urls: - - https://github.com/cloudfoundry-incubator/stratos/releases/download/0.9.8/console-helm-chart-0.9.8.tgz - version: 0.9.8 - - apiVersion: v1 - created: 2017-11-09T11:58:41.085073375Z - description: A Helm chart for deploying Stratos UI Console - digest: 1a297cebb9bf8d34fe4d679203082fb89894d9b90583988fb0a1349a27dde920 - name: console - urls: - - https://github.com/cloudfoundry-incubator/stratos/releases/download/0.9.7/console-helm-chart-0.9.7.tgz - version: 0.9.7 - - apiVersion: v1 - created: 2017-11-01T11:57:35.330202636Z - description: A Helm chart for deploying Stratos UI Console - digest: 08611ec5de41a71567a033c4975752f31ca895b26316592a75d6dc93c2968e5f - name: console - urls: - - https://github.com/cloudfoundry-incubator/stratos/releases/download/0.9.6/console-helm-chart-0.9.6.tgz - version: 0.9.6 - - apiVersion: v1 - created: 2017-09-21T14:17:00.259268006+01:00 - description: A Helm chart for deploying Console - digest: c0aa7067eebd02cbf775f1adde1948ff679f3753f5d6bb7403798260ad8278d7 - name: console - urls: - - https://github.com/cloudfoundry-incubator/stratos/releases/download/0.9.5/console-helm-chart-0.9.5.tgz - version: 0.9.5 - - apiVersion: v1 - created: 2017-08-21T16:05:19.606723792Z - description: A Helm chart for deploying Console - digest: 488b5011edcc0b22a28f4e70e576351cc6b9f0f34198fb366cc53cddc197c9d1 - name: console - urls: - - https://github.com/cloudfoundry-incubator/stratos/releases/download/0.9.2/console-helm-chart-0.9.2.tgz - version: 0.9.2 - - apiVersion: v1 - created: 2017-08-01T10:54:22.706325757Z - description: A Helm chart for deploying Console - digest: 5c7c2769771d7648647ed33a9e7c326c95cf550cb165aa3144dc8f8062dc66bb - name: console - urls: - - https://github.com/cloudfoundry-incubator/stratos/releases/download/0.9.1/console-helm-chart-0.9.1.tgz - version: 0.9.1 - - apiVersion: v1 - created: 2017-07-27T13:08:56.409964314Z - description: A Helm chart for deploying Console - digest: e05d4dd12d3e518ce8d123480196008815988dc59fa3653ad4593042e92cc36b - name: console - urls: - - https://github.com/cloudfoundry-incubator/stratos/releases/download/0.9.0/console-helm-chart-0.9.0.tgz - version: 0.9.0 -generated: 2018-01-09T11:48:55.232685995Z diff --git a/website/README.md b/website/README.md index ee0ccc9d18..684b2ea124 100644 --- a/website/README.md +++ b/website/README.md @@ -1,33 +1,37 @@ -# Website +# Stratos Website This website is built using [Docusaurus 2](https://v2.docusaurus.io/), a modern static website generator. -### Installation +> Run the commands below in the `website` folder. + +### Installing Dependencies ``` -$ yarn +$ npm ``` ### Local Development ``` -$ yarn start +$ npm start ``` This command starts a local development server and open up a browser window. Most changes are reflected live without having to restart the server. +> Note this command will open a web browser on the locally served site (http://localhost:3000) + ### Build ``` -$ yarn build +$ npm build ``` This command generates static content into the `build` directory and can be served using any static contents hosting service. ### Deployment +We use GitHub pages - this command is a convenient way to build the website and push to the `gh-pages` branch. + ``` -$ GIT_USER= USE_SSH=true yarn deploy +$ GIT_USER= USE_SSH=true npm deploy ``` - -If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. diff --git a/website/blog/2019-05-28-hola.md b/website/blog/2019-05-28-hola.md deleted file mode 100644 index 5552da124f..0000000000 --- a/website/blog/2019-05-28-hola.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -id: hola -title: Hola -author: Gao Wei -author_title: Docusaurus Core Team -author_url: https://github.com/wgao19 -author_image_url: https://avatars1.githubusercontent.com/u/2055384?v=4 -tags: [hola, docusaurus] ---- - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet diff --git a/website/blog/2019-05-29-hello-world.md b/website/blog/2019-05-29-hello-world.md deleted file mode 100644 index 3b33193938..0000000000 --- a/website/blog/2019-05-29-hello-world.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -id: hello-world -title: Hello -author: Endilie Yacop Sucipto -author_title: Maintainer of Docusaurus -author_url: https://github.com/endiliey -author_image_url: https://avatars1.githubusercontent.com/u/17883920?s=460&v=4 -tags: [hello, docusaurus] ---- - -Welcome to this blog. This blog is created with [**Docusaurus 2 alpha**](https://v2.docusaurus.io/). - - - -This is a test post. - -A whole bunch of other information. diff --git a/website/blog/2019-05-30-welcome.md b/website/blog/2019-05-30-welcome.md deleted file mode 100644 index 3b5affedce..0000000000 --- a/website/blog/2019-05-30-welcome.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -id: welcome -title: Welcome -author: Yangshun Tay -author_title: Front End Engineer @ Facebook -author_url: https://github.com/yangshun -author_image_url: https://avatars0.githubusercontent.com/u/1315101?s=400&v=4 -tags: [facebook, hello, docusaurus] ---- - -Blog features are powered by the blog plugin. Simply add files to the `blog` directory. It supports tags as well! - -Delete the whole directory if you don't want the blog features. As simple as that! diff --git a/website/docs/old-index.html b/website/docs/old-index.html deleted file mode 100644 index a6bdc1e312..0000000000 --- a/website/docs/old-index.html +++ /dev/null @@ -1 +0,0 @@ -

Hello GH Pages

diff --git a/website/docs/talks.md b/website/docs/talks.md new file mode 100644 index 0000000000..11be680b02 --- /dev/null +++ b/website/docs/talks.md @@ -0,0 +1,7 @@ +--- +id: talks +title: Talks and Presentations +sidebar_label: Talks +--- + +Coming soon \ No newline at end of file diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index b07cd3461e..aeb2441df0 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -1,26 +1,26 @@ module.exports = { - title: 'Stratos', - tagline: 'Getting started with Stratos development', + title: 'STRATOS', + tagline: 'A Rich Open-Source UI for Cloud Foundry and Kubernetes', url: 'https://stratos.app', baseUrl: '/', favicon: 'img/favicon.ico', - organizationName: 'cloudfoundry', // Usually your GitHub org/user name. - projectName: 'stratos', // Usually your repo name. + organizationName: 'cloudfoundry', + projectName: 'stratos', themeConfig: { navbar: { - title: 'Stratos', + title: 'STRATOS', logo: { - alt: 'My Site Logo', - src: 'img/logo.svg', + alt: 'Stratos', + src: 'img/logo.png', }, links: [ { to: 'docs/', activeBasePath: 'docs', label: 'Docs', - position: 'left', + position: 'right', }, - {to: 'blog', label: 'Blog', position: 'left'}, + // {to: 'blog', label: 'Blog', position: 'left'}, { href: 'https://github.com/cloudfoundry/stratos', label: 'GitHub', @@ -35,11 +35,11 @@ module.exports = { title: 'Docs', items: [ { - label: 'Style Guide', + label: 'Getting Started', to: 'docs/', }, { - label: 'Second Doc', + label: 'Deploying Stratos', to: 'docs/doc2/', }, ], @@ -48,34 +48,27 @@ module.exports = { title: 'Community', items: [ { - label: 'Stack Overflow', - href: 'https://stackoverflow.com/questions/tagged/docusaurus', - }, - { - label: 'Discord', - href: 'https://discordapp.com/invite/docusaurus', + label: 'Slack', + href: 'https://cloudfoundry.slack.com/?redir=%2Fmessages%2Fstratos', }, { - label: 'Twitter', - href: 'https://twitter.com/docusaurus', + label: 'GitHub', + href: 'https://github.com/cloudfoundry/stratos', }, ], }, + { title: 'More', items: [ { - label: 'Blog', - to: 'blog', - }, - { - label: 'GitHub', - href: 'https://github.com/cloudfoundry/stratos', + label: 'Presentations and Talks', + to: 'docs/talks', }, ], }, ], - copyright: `Copyright © ${new Date().getFullYear()} My Project, Inc. Built with Docusaurus.`, + copyright: `Copyright © ${new Date().getFullYear()} Cloud Foundry Foundation`, }, }, presets: [ @@ -90,12 +83,6 @@ module.exports = { editUrl: 'https://github.com/cloudfoundry/stratos/edit/master/website/', }, - blog: { - showReadingTime: true, - // Please change this to your repo. - editUrl: - 'https://github.com/cloudfoundry/stratos/edit/master/website/blog/', - }, theme: { customCss: require.resolve('./src/css/custom.css'), }, diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 74ba0f27f3..8e93764abc 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -7,14 +7,15 @@ /* You can override the default Infima variables here. */ :root { - --ifm-color-primary: #25c2a0; - --ifm-color-primary-dark: rgb(33, 175, 144); - --ifm-color-primary-darker: rgb(31, 165, 136); - --ifm-color-primary-darkest: rgb(26, 136, 112); - --ifm-color-primary-light: rgb(70, 203, 174); - --ifm-color-primary-lighter: rgb(102, 212, 189); - --ifm-color-primary-lightest: rgb(146, 224, 208); + --ifm-color-primary: #2196f3; + --ifm-color-primary-dark: #0d89ec; + --ifm-color-primary-darker: #0c81df; + --ifm-color-primary-darkest: #0a6bb7; + --ifm-color-primary-light: #3ba2f4; + --ifm-color-primary-lighter: #48a9f5; + --ifm-color-primary-lightest: #70bbf7; --ifm-code-font-size: 95%; + --ifm-navbar-link-color: #fff; } .docusaurus-highlight-code-line { @@ -23,3 +24,57 @@ margin: 0 calc(-1 * var(--ifm-pre-padding)); padding: 0 var(--ifm-pre-padding); } + +img.featureImage_src-pages- { + filter: grayscale(100%); + height: 100px; + width: 100px; +} + +img.cf-logo { + width: auto; +} + +.navbar__items.navbar__items--right .react-toggle { + display: none; +} + +.navbar { + /*background-color: #2196f3;*/ + background-color: #333; +} + +.navbar__brand:hover { + color: var(--ifm-link-hover-color); +} + +.main-wrapper .hero { + min-height: 480px; +} + +.main-wrapper .hero a.button.button--outline.button--secondary { + color: #fff; +} + +.main-wrapper .hero a.button.button--outline.button--secondary:hover { + color: #2196f3; +} + +.container { + text-align: left; +} + +.container .buttons_src-pages- { + justify-content: start; + padding-top: 20px; +} + +.hero__subtitle { + font-size: 36px; +} + +/* Reduce the text sizes */ + +#__docusaurus article h1 { + font-size: 32px; +} \ No newline at end of file diff --git a/website/src/pages/index.js b/website/src/pages/index.js index de04f5c846..6b13d57ca2 100644 --- a/website/src/pages/index.js +++ b/website/src/pages/index.js @@ -1,51 +1,85 @@ -import React from 'react'; -import clsx from 'clsx'; -import Layout from '@theme/Layout'; import Link from '@docusaurus/Link'; -import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; import useBaseUrl from '@docusaurus/useBaseUrl'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import Layout from '@theme/Layout'; +import clsx from 'clsx'; +import React from 'react'; + import styles from './styles.module.css'; const features = [ { title: <>Easy to Use, - imageUrl: 'img/undraw_docusaurus_mountain.svg', + imageUrl: 'img/easy.svg', + description: ( + <> + Stratos provides an easy to use web-based management user interface + designed to meet the needs of both administrators and developers. + + ), + }, + { + title: <>Cloud Foundry, + imageUrl: 'img/cloudfoundry.png', description: ( <> - Docusaurus was designed from the ground up to be easily installed and - used to get your website up and running quickly. + Stratos is the de-facto UI for Cloud Foundry, providing a rich management experience + for all you Cloud Foundry needs... and we're an offical Cloud Foundry project too! ), + cls: 'cf-logo' }, { - title: <>Focus on What Matters, - imageUrl: 'img/undraw_docusaurus_tree.svg', + title: <>Kubernetes, + imageUrl: 'img/kubernetes.svg', description: ( <> - Docusaurus lets you focus on your docs, and we'll do the chores. Go - ahead and move your docs into the docs directory. + Stratos sports a growing feature set for Kubernetes developers, extened its reach further + towards providing a single-pane-of-glass for your Cloud Native application development needs. ), }, { - title: <>Powered by React, - imageUrl: 'img/undraw_docusaurus_react.svg', + title: <>Extensible, + imageUrl: 'img/extend.svg', description: ( <> - Extend or customize your website layout by reusing React. Docusaurus can - be extended while reusing the same header and footer. + Stratos is built with extensibility in mind and we continue to expand and improve the + extensibility experience for developers ), }, + { + title: <>Open Source, + imageUrl: 'img/open-source.svg', + description: ( + <> + Stratos is Open Source with an Apache 2.0 License. Our codes lives on GitHub and we're a project within + the Cloud Foundry Foundation + + ), + }, + { + title: <>Easy to Deploy, + imageUrl: 'img/deploy.svg', + description: ( + <> + Stratos is easy to deploy and can be deployed as an application to Cloud Foundry, to Kubernetes + and run locally as a Docker container + + ), + }, + + ]; -function Feature({imageUrl, title, description}) { +function Feature({imageUrl, title, description, cls}) { const imgUrl = useBaseUrl(imageUrl); return (
{imgUrl && ( -
- {title} +
+ {title}
)}

{title}

@@ -59,8 +93,8 @@ function Home() { const {siteConfig = {}} = context; return ( + title={`Home`} + description="Stratos - Web-based Management Interface for Cloud Foundry and Kubernetes">

{siteConfig.title}

diff --git a/website/static/img/cloudfoundry.png b/website/static/img/cloudfoundry.png new file mode 100644 index 0000000000000000000000000000000000000000..0c81f62f51e1af3b8f1e2e344a24be184a422b4e GIT binary patch literal 5544 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