diff --git a/gatsby-node.js b/gatsby-node.js
index a55fc3b2d8..81ccb7742d 100755
--- a/gatsby-node.js
+++ b/gatsby-node.js
@@ -7,8 +7,6 @@ exports.onCreateNode = ({ node, getNode, actions }) => {
const { createNodeField } = actions;
// If the node type (file) is a markdown file
if (node.internal.type === 'Mdx') {
- const dir = path.resolve(__dirname, '');
- const fileNode = getNode(node.parent);
const slug = createFilePath({
node,
getNode,
@@ -102,10 +100,78 @@ exports.createPages = ({ actions, graphql }) => {
}
}
});
+
+ [
+ {
+ fromPaths: [
+ '/tutorial/overview',
+ '/tutorial/overview/',
+ '/tutorial/overview/index.html',
+ ],
+ toPath: '/tutorial/react/overview',
+ },
+ {
+ fromPaths: [
+ '/tutorial/react-step-1',
+ '/tutorial/react-step-1/',
+ '/tutorial/react-step-1/index.html',
+ ],
+ toPath: '/tutorial/react/step-1',
+ },
+ {
+ fromPaths: [
+ '/tutorial/react-step-2',
+ '/tutorial/react-step-2/',
+ '/tutorial/react-step-2/index.html',
+ ],
+ toPath: '/tutorial/react/step-2',
+ },
+ {
+ fromPaths: [
+ '/tutorial/react-step-3',
+ '/tutorial/react-step-3/',
+ '/tutorial/react-step-3/index.html',
+ ],
+ toPath: '/tutorial/react/step-3',
+ },
+ {
+ fromPaths: [
+ '/tutorial/react-step-4',
+ '/tutorial/react-step-4/',
+ '/tutorial/react-step-4/index.html',
+ ],
+ toPath: '/tutorial/react/step-4',
+ },
+ {
+ fromPaths: [
+ '/tutorial/react-step-5',
+ '/tutorial/react-step-5/',
+ '/tutorial/react-step-5/index.html',
+ ],
+ toPath: '/tutorial/react/step-5',
+ },
+ {
+ fromPaths: [
+ '/tutorial/wrapping-up',
+ '/tutorial/wrapping-up/',
+ '/tutorial/wrapping-up/index.html',
+ ],
+ toPath: '/tutorial/react/wrapping-up',
+ },
+ ].forEach(redirect => {
+ redirect.fromPaths.forEach(fromPath => {
+ createRedirect({
+ redirectInBrowser: true,
+ isPermanent: true,
+ fromPath,
+ toPath: redirect.toPath,
+ });
+ });
+ });
});
};
-exports.onCreateWebpackConfig = ({ actions, getConfig, stage, loaders }) => {
+exports.onCreateWebpackConfig = ({ actions, loaders }) => {
actions.setWebpackConfig({
module: {
rules: [
@@ -135,6 +201,7 @@ exports.onPostBuild = () => {
try {
src = path.resolve(path.dirname(require.resolve('carbon-icons')), 'svg');
} catch (err) {
+ /* eslint-disable-next-line no-console */
console.error('Error locating the icons directory', err.stack);
return;
}
diff --git a/src/content/tutorial/wrapping-up/images/carbon-badge.png b/src/content/tutorial/react/images/carbon-badge.png
similarity index 100%
rename from src/content/tutorial/wrapping-up/images/carbon-badge.png
rename to src/content/tutorial/react/images/carbon-badge.png
diff --git a/src/content/tutorial/overview/overview.mdx b/src/content/tutorial/react/overview.mdx
similarity index 89%
rename from src/content/tutorial/overview/overview.mdx
rename to src/content/tutorial/react/overview.mdx
index e137d99c12..7dc179d14d 100644
--- a/src/content/tutorial/overview/overview.mdx
+++ b/src/content/tutorial/react/overview.mdx
@@ -1,6 +1,8 @@
---
title: Tutorial overview
internal: false
+tabs:
+ ['Overview', 'Step 1', 'Step 2', 'Step 3', 'Step 4', 'Step 5', 'Wrapping up']
---
### Welcome to Carbon! This tutorial will guide you in creating a React app with the Carbon Design System. We'll teach you the ins and outs of using Carbon components, while introducing web development best practices along the way.
@@ -55,13 +57,13 @@ This tutorial uses [Yarn](https://yarnpkg.com) for dependency management so we c
Each step in this tutorial illustrates a different aspect of developing web applications with Carbon. We recommend starting with step 1, but you can pick up any step and take it from there.
-1. [**Installing Carbon**](/tutorial/react-step-1)
+1. [**Installing Carbon**](/tutorial/step-1/react)
- Create a web app with the UI shell component.
-1. [**Building pages**](/tutorial/react-step-2)
+1. [**Building pages**](/tutorial/step-2/react)
- Build out pages with the grid and various components.
-1. [**Using APIs**](/tutorial/react-step-3)
+1. [**Using APIs**](/tutorial/step-3/react)
- Populate the data table with an external data source.
-1. [**Creating components**](/tutorial/react-step-4)
+1. [**Creating components**](/tutorial/step-4/react)
- Extend Carbon by creating your own components.
-1. [**Deploying to IBM Cloud**](/tutorial/react-step-5)
+1. [**Deploying to IBM Cloud**](/tutorial/step-5/react)
- Build and host your app in a production environment.
diff --git a/src/content/tutorial/react-step-1/react-step-1.mdx b/src/content/tutorial/react/step-1.mdx
similarity index 97%
rename from src/content/tutorial/react-step-1/react-step-1.mdx
rename to src/content/tutorial/react/step-1.mdx
index 5b82fddcfe..97797644fc 100644
--- a/src/content/tutorial/react-step-1/react-step-1.mdx
+++ b/src/content/tutorial/react/step-1.mdx
@@ -1,6 +1,7 @@
---
title: 1. Installing Carbon
internal: false
+tabs: ['Overview', 'Step 1', 'Step 2', 'Step 3', 'Step 4', 'Step 5', 'Wrapping up']
---
### Starting with Create React App, let's install Carbon and begin using Carbon components. By the end you will have a React app that uses the UI Shell to navigate between pages.
@@ -589,6 +590,6 @@ _Note: If you receive a_ `non-fast-forward` _error, it's likely that your forked
### Pull request (PR)
-Finally, visit [carbon-tutorial](https://github.com/carbon-design-system/carbon-tutorial) to "Compare & pull request". In doing so, make sure that you are comparing to `react-step-1` into `base: react-step-1`. Take notice of the [Netlify](https://www.netlify.com) bot that deploys a preview of your PR every time that you push new commits. These previews can be shared and viewed by anybody to assist the PR review process.
+Finally, visit [carbon-tutorial](https://github.com/carbon-design-system/carbon-tutorial) to "Compare & pull request". In doing so, make sure that you are comparing your forked repository's `react-step-1` branch into `base: react-step-1`. Take notice of the [Netlify](https://www.netlify.com) bot that deploys a preview of your PR every time that you push new commits. These previews can be shared and viewed by anybody to assist the PR review process.
_Note: Expect your tutorial step PRs to be reviewed by the Carbon team but not merged. We'll close your PR so we can keep the repository's remote branches pristine and ready for the next person!_
diff --git a/src/content/tutorial/react-step-2/react-step-2.mdx b/src/content/tutorial/react/step-2.mdx
similarity index 97%
rename from src/content/tutorial/react-step-2/react-step-2.mdx
rename to src/content/tutorial/react/step-2.mdx
index 667ce04ab1..6bc8e93259 100644
--- a/src/content/tutorial/react-step-2/react-step-2.mdx
+++ b/src/content/tutorial/react/step-2.mdx
@@ -1,6 +1,7 @@
---
title: 2. Building pages
internal: false
+tabs: ['Overview', 'Step 1', 'Step 2', 'Step 3', 'Step 4', 'Step 5', 'Wrapping up']
---
### Now that we have a React app using the UI Shell, it's time to build a few static pages. In this step, we'll become comfortable with the Carbon grid and various Carbon components.
@@ -39,7 +40,7 @@ A [preview](https://react-step-3--carbon-tutorial.netlify.com) of what you'll bu
## Fork, clone and branch
-This tutorial has an accompanying GitHub repository called [carbon-tutorial](https://github.com/carbon-design-system/carbon-tutorial) that we'll use as a starting point for each step. If you haven't forked and cloned that repository yet, and haven't added the upstream remote, go ahead and do so by following the [step 1 instructions](/tutorial/react-step-1#fork-clone--branch).
+This tutorial has an accompanying GitHub repository called [carbon-tutorial](https://github.com/carbon-design-system/carbon-tutorial) that we'll use as a starting point for each step. If you haven't forked and cloned that repository yet, and haven't added the upstream remote, go ahead and do so by following the [step 1 instructions](/tutorial/step-1/react#fork-clone--branch).
### Branch
@@ -66,7 +67,7 @@ Then, start the app:
$ yarn start
```
-You should see something similar to where the [previous step](/tutorial/react-step-1) left off.
+You should see something similar to where the [previous step](/tutorial/step-1/react) left off.
### IE11 polyfills
@@ -119,7 +120,7 @@ We've included the designs for this tutorial app in the `design.sketch` file fou
-![Landing page grid](/images/landing-layout.png)
+![Landing page grid](../shared/step-2/images/landing-layout.png)
@@ -387,7 +388,7 @@ We've added basic layout styles in `_landing-page.scss`, so now let's add type,
-![Banner vertical spacing](/images/landing-r1-spacing.png)
+![Banner vertical spacing](../shared/step-2/images/landing-r1-spacing.png)
@@ -455,7 +456,7 @@ Next, we can see that the `h1` is using the `heading-05` type token.
-![Banner heading type](/images/landing-r1-type.png)
+![Banner heading type](../shared/step-2/images/landing-r1-type.png)
@@ -485,7 +486,7 @@ We also need to adjust our vertical spacing and type treatment. Like before, it'
-![Row 2 vertical spacing](/images/landing-r2-spacing.png)
+![Row 2 vertical spacing](../shared/step-2/images/landing-r2-spacing.png)
@@ -519,7 +520,7 @@ _Note: You may be wondering why there are vertical gaps between the type and spa
-![Row 3 vertical spacing](/images/landing-r3-spacing.png)
+![Row 3 vertical spacing](../shared/step-2/images/landing-r3-spacing.png)
@@ -759,7 +760,7 @@ Run the CI check to make sure we're all set to submit a pull request.
$ yarn ci-check
```
-_Note: Having issues running the CI check? [Step 1]() has troubleshooting notes that may help._
+_Note: Having issues running the CI check? [Step 1]() has troubleshooting notes that may help._
### Git commit and push
@@ -775,7 +776,7 @@ Then, push to your repository:
$ git push origin react-step-2
```
-_Note: Having issues pushing your changes? [Step 1](/tutorial/react-step-1#git-commit-and-push) has troubleshooting notes that may help._
+_Note: Having issues pushing your changes? [Step 1](/tutorial/step-1/react#git-commit-and-push) has troubleshooting notes that may help._
### Pull request (PR)
diff --git a/src/content/tutorial/react-step-3/react-step-3.mdx b/src/content/tutorial/react/step-3.mdx
similarity index 97%
rename from src/content/tutorial/react-step-3/react-step-3.mdx
rename to src/content/tutorial/react/step-3.mdx
index dc0c008896..c3234fd413 100644
--- a/src/content/tutorial/react-step-3/react-step-3.mdx
+++ b/src/content/tutorial/react/step-3.mdx
@@ -1,6 +1,7 @@
---
title: 3. Using APIs
internal: false
+tabs: ['Overview', 'Step 1', 'Step 2', 'Step 3', 'Step 4', 'Step 5', 'Wrapping up']
---
### This step takes our static components and populates them with data from the GitHub GraphQL API – loading states and all. We'll be displaying Carbon repository information in a data table.
@@ -43,7 +44,7 @@ A [preview](https://react-step-4--carbon-tutorial.netlify.com) of what you will
## Fork, clone and branch
-This tutorial has an accompanying GitHub repository called [carbon-tutorial](https://github.com/carbon-design-system/carbon-tutorial) that we'll use as a starting point for each step. If you haven't forked and cloned that repository yet, and haven't added the upstream remote, go ahead and do so by following the [step 1 instructions](/tutorial/react-step-1#fork-clone--branch).
+This tutorial has an accompanying GitHub repository called [carbon-tutorial](https://github.com/carbon-design-system/carbon-tutorial) that we'll use as a starting point for each step. If you haven't forked and cloned that repository yet, and haven't added the upstream remote, go ahead and do so by following the [step 1 instructions](/tutorial/step-1/react#fork-clone--branch).
### Branch
@@ -68,7 +69,7 @@ Then, start the app:
$ yarn start
```
-You should see something similar to where the [previous step](/tutorial/react-step-2) left off. Stop your app with `CTRL-C` and let's get everything installed.
+You should see something similar to where the [previous step](/tutorial/step-2/react) left off. Stop your app with `CTRL-C` and let's get everything installed.
## Install dependencies
@@ -487,7 +488,7 @@ Run the CI check to make sure we're all set to submit a pull request.
$ yarn ci-check
```
-_Note: Having issues running the CI check? [Step 1]() has troubleshooting notes that may help._
+_Note: Having issues running the CI check? [Step 1]() has troubleshooting notes that may help._
### Git commit and push
@@ -503,7 +504,7 @@ Then, push to your repository:
$ git push origin react-step-3
```
-_Note: Having issues pushing your changes? [Step 1](/tutorial/react-step-1#git-commit-and-push) has troubleshooting notes that may help._
+_Note: Having issues pushing your changes? [Step 1](/tutorial/step-1/react#git-commit-and-push) has troubleshooting notes that may help._
### Pull request (PR)
diff --git a/src/content/tutorial/react-step-4/react-step-4.mdx b/src/content/tutorial/react/step-4.mdx
similarity index 95%
rename from src/content/tutorial/react-step-4/react-step-4.mdx
rename to src/content/tutorial/react/step-4.mdx
index 8969848a1c..1807fd92ad 100644
--- a/src/content/tutorial/react-step-4/react-step-4.mdx
+++ b/src/content/tutorial/react/step-4.mdx
@@ -1,6 +1,7 @@
---
title: 4. Creating components
internal: false
+tabs: ['Overview', 'Step 1', 'Step 2', 'Step 3', 'Step 4', 'Step 5', 'Wrapping up']
---
### With two pages comprised entirely of Carbon components, let's revisit the landing page and build a couple components of our own by using Carbon icons and tokens.
@@ -41,7 +42,7 @@ A [preview](https://react-step-5--carbon-tutorial.netlify.com) of what you'll bu
## Fork, clone and branch
-This tutorial has an accompanying GitHub repository called [carbon-tutorial](https://github.com/carbon-design-system/carbon-tutorial) that we'll use as a starting point for each step. If you haven't forked and cloned that repository yet, and haven't added the upstream remote, go ahead and do so by following the [step 1 instructions](/tutorial/react-step-1#fork-clone--branch).
+This tutorial has an accompanying GitHub repository called [carbon-tutorial](https://github.com/carbon-design-system/carbon-tutorial) that we'll use as a starting point for each step. If you haven't forked and cloned that repository yet, and haven't added the upstream remote, go ahead and do so by following the [step 1 instructions](/tutorial/step-1/react#fork-clone--branch).
### Branch
@@ -68,7 +69,7 @@ Then, start the app:
$ yarn start
```
-You should see something similar to where the [previous step](/tutorial/react-step-3) left off.
+You should see something similar to where the [previous step](/tutorial/step-3/react) left off.
## Review design
@@ -76,7 +77,7 @@ Here's what we're building – an informational section that has a heading and t
-![Info section layout](/images/info-layout.png)
+![Info section layout](../shared/step-4/images/info-layout.png)
@@ -265,7 +266,7 @@ Here's our design showing the spacing tokens that we need to add. We also need t
-![Info section spacing](/images/info-spacing.png)
+![Info section spacing](../shared/step-4/images/info-spacing.png)
@@ -385,7 +386,7 @@ With the browser extension installed, Chrome in this example, open Dev Tools and
-![DAP violations](/images/DAP-violations.png)
+![DAP violations](../shared/step-4/images/DAP-violations.png)
@@ -407,7 +408,7 @@ Run the CI check to make sure we're all set to submit a pull request.
$ yarn ci-check
```
-_Note: Having issues running the CI check? [Step 1]() has troubleshooting notes that may help._
+_Note: Having issues running the CI check? [Step 1]() has troubleshooting notes that may help._
### Git commit and push
@@ -423,7 +424,7 @@ Then, push to your repository:
$ git push origin react-step-4
```
-_Note: Having issues pushing your changes? [Step 1](/tutorial/react-step-1#git-commit-and-push) has troubleshooting notes that may help._
+_Note: Having issues pushing your changes? [Step 1](/tutorial/step-1/react#git-commit-and-push) has troubleshooting notes that may help._
### Pull request (PR)
diff --git a/src/content/tutorial/react-step-5/react-step-5.mdx b/src/content/tutorial/react/step-5.mdx
similarity index 85%
rename from src/content/tutorial/react-step-5/react-step-5.mdx
rename to src/content/tutorial/react/step-5.mdx
index b0838b3871..e3c83e6512 100644
--- a/src/content/tutorial/react-step-5/react-step-5.mdx
+++ b/src/content/tutorial/react/step-5.mdx
@@ -1,6 +1,7 @@
---
title: 5. Deploying to IBM Cloud
internal: false
+tabs: ['Overview', 'Step 1', 'Step 2', 'Step 3', 'Step 4', 'Step 5', 'Wrapping up']
---
### This step takes what we've built so far and optimizes the app for a production environment. We'll be deploying the production build to IBM Cloud.
@@ -38,7 +39,7 @@ A [preview](https://react-step-6--carbon-tutorial.netlify.com) of what you'll bu
## Fork, clone and branch
-This tutorial has an accompanying GitHub repository called [carbon-tutorial](https://github.com/carbon-design-system/carbon-tutorial) that we'll use as a starting point for each step. If you haven't forked and cloned that repository yet, and haven't added the upstream remote, go ahead and do so by following the [step 1 instructions](/tutorial/react-step-1#fork-clone--branch).
+This tutorial has an accompanying GitHub repository called [carbon-tutorial](https://github.com/carbon-design-system/carbon-tutorial) that we'll use as a starting point for each step. If you haven't forked and cloned that repository yet, and haven't added the upstream remote, go ahead and do so by following the [step 1 instructions](/tutorial/step-1/react#fork-clone--branch).
### Branch
@@ -65,7 +66,7 @@ Then, start the app:
$ yarn start
```
-You should see something similar to where the [previous step](/tutorial/react-step-4) left off.
+You should see something similar to where the [previous step](/tutorial/step-4/react) left off.
## Create IBM Cloud account
@@ -127,11 +128,11 @@ As a lot of this may seem like magic since the build configuration came from Cre
## Create manifest file
-Now that we have a production build, let's get it on the cloud. We're going to use [staticfile-buildpack](https://github.com/cloudfoundry/staticfile-buildpack.git) to deploy our webapp. Since this is a Cloud Foundry buildpack, we'll be using the `cf` command line interface (CLI). If running `cf --help` doesn't work for you, chances are you need to [install the CLI](https://docs.cloudfoundry.org/cf-cli/install-go-cli.html).
+Now that we have a production build, let's get it on the cloud. We're going to use [staticfile-buildpack](https://github.com/cloudfoundry/staticfile-buildpack.git) to deploy our webapp. We'll be using the `ibmcloud` command line interface (CLI). If running `ibmcloud help` doesn't work for you, chances are you need to [install the CLI](https://cloud.ibm.com/docs/cli?topic=cloud-cli-install-ibmcloud-cli).
_Note: If unfamiliar with buildpacks, the [staticfile buildpack docs](https://docs.cloudfoundry.org/buildpacks/staticfile/index.html) has good definitions and configuration documentation._
-With the Cloud Foundry CLI installed, next, we need to create a `manifest.yml` file in the root of the project. To prevent multiple apps trying to use the `carbon-tutorial` name, replace `USERNAME` with your GitHub username below to make sure our apps are uniquely named.
+With the IBM Cloud CLI installed, next, we need to create a `manifest.yml` file in the root of the project. To prevent multiple apps trying to use the `carbon-tutorial` name, replace `USERNAME` with your GitHub username below to make sure our apps are uniquely named.
##### manifest.yml
@@ -143,7 +144,7 @@ applications:
buildpack: https://github.com/cloudfoundry/staticfile-buildpack.git
```
-_Note: With this set-up we're still using a GitHub personal access token saved in _`.env.local`_. If you haven't created a GitHub access token yet, see [step 3](/tutorial/react-step-3#create-access-token). You can put the environment variable in the manifest file, or manually add it in the IBM Cloud dashboard, but since we're building off previous tutorial steps nothing more is needed._
+_Note: With this set-up we're still using a GitHub personal access token saved in _`.env.local`_. If you haven't created a GitHub access token yet, see [step 3](/tutorial/step-3/react#create-access-token). You can put the environment variable in the manifest file, or manually add it in the IBM Cloud dashboard, but since we're building off previous tutorial steps nothing more is needed._
## Create static file
@@ -165,14 +166,14 @@ After telling Cloud Foundry what to include, we can also specify what to ignore.
node_modules/.cache
```
-You can speed up deploys by decreasing the files uploaded through cloud foundry. To accomplish this, ignore any folder not required by the production application on IBM Cloud. For example, in the case of serving static files, you can ignore `node_modules/` and `src/` because the only folder being served is `build/`.
+You can speed up deploys by decreasing the files uploaded through IBM Cloud. To accomplish this, ignore any folder not required by the production application on IBM Cloud. For example, in the case of serving static files, you can ignore `node_modules/` and `src/` because the only folder being served is `build/`.
## Deploy app
-Login to IBM Cloud with:
+Login to IBM Cloud.
```bash
-$ cf login -a https://api.ng.bluemix.net -sso
+$ cf login -sso
```
Deploy app using the `cf push` command. Since `manifest.yml` is in our root directory, we don't need to specify it in the push command. But, if you have multiple manifest files that target different environments, it's good practice to specify the file.
@@ -186,7 +187,7 @@ To make it easy on ourselves by not needing to remember that command, let's add
##### package.json
```bash
-"deploy": "rm -rf ./build && yarn build && cf push -f manifest.yml"
+"deploy": "rm -rf ./build && yarn build && ibmcloud cf push -f manifest.yml"
```
Next time you want to deploy, you can simply run `yarn deploy`.
@@ -203,7 +204,7 @@ Run the CI check to make sure we're all set to submit a pull request.
$ yarn ci-check
```
-_Note: Having issues running the CI check? [Step 1]() has troubleshooting notes that may help._
+_Note: Having issues running the CI check? [Step 1]() has troubleshooting notes that may help._
### Git commit and push
@@ -219,7 +220,7 @@ Then, push to your repository:
$ git push origin react-step-5
```
-_Note: Having issues pushing your changes? [Step 1](/tutorial/react-step-1#git-commit-and-push) has troubleshooting notes that may help._
+_Note: Having issues pushing your changes? [Step 1](/tutorial/step-1/react#git-commit-and-push) has troubleshooting notes that may help._
### Pull request (PR)
diff --git a/src/content/tutorial/wrapping-up/wrapping-up.mdx b/src/content/tutorial/react/wrapping-up.mdx
similarity index 67%
rename from src/content/tutorial/wrapping-up/wrapping-up.mdx
rename to src/content/tutorial/react/wrapping-up.mdx
index 10e4f77d61..1030f611fc 100644
--- a/src/content/tutorial/wrapping-up/wrapping-up.mdx
+++ b/src/content/tutorial/react/wrapping-up.mdx
@@ -1,13 +1,14 @@
---
title: Wrapping up
+tabs:
+ ['Overview', 'Step 1', 'Step 2', 'Step 3', 'Step 4', 'Step 5', 'Wrapping up']
---
-### Thanks for completing our tutorial and helping us improve it along the way. As a way to say thanks, you can apply for an IBM Digital Badge and a free shirt!
+### Thanks for completing our tutorial and helping us improve it along the way. You can now apply for an IBM Digital Badge!
- [Badging](#badging)
-- [Free t-shirt\*](#free-t-shirt)
- [Application](#application)
@@ -18,7 +19,7 @@ Once you complete all five steps of the tutorial, you can apply for the IBM Digi
-![](/images/carbon-badge.png)
+![](../shared/wrapping-up/images/carbon-badge.png)
@@ -27,13 +28,14 @@ Once you complete all five steps of the tutorial, you can apply for the IBM Digi
This badge demonstrates knowledge about Carbon's React components. To earn the badge:
1. Complete steps 1 through 5 of the React Carbon tutorial
- - Step 1. [Installing Carbon](/tutorial/react-step-1)
- - Step 2. [Building pages](/tutorial/react-step-2)
- - Step 3. [Using APIs](/tutorial/react-step-3)
- - Step 4. [Creating components](/tutorial/react-step-4)
- - Step 5. [Deploying to IBM Cloud](/tutorial/react-step-5)
+ - Step 1. [Installing Carbon](/tutorial/step-1/react)
+ - Step 2. [Building pages](/tutorial/step-2/react)
+ - Step 3. [Using APIs](/tutorial/step-3/react)
+ - Step 4. [Creating components](/tutorial/step-4/react)
+ - Step 5. [Deploying to IBM Cloud](/tutorial/step-5/react)
2. Submit links to approved pull requests for steps 1 through 5 of the React Carbon tutorial in the [carbon-tutorial repository](https://github.com/carbon-design-system/carbon-tutorial).
- To quickly find your submitted PRs, you can [filter by author](https://github.com/carbon-design-system/carbon-tutorial/pulls?utf8=%E2%9C%93&q=author%3Ausername) (e.g. `author:${username}`)
+3. Complete the [badge application](http://www.carbondesignsystem.com/tutorial/wrapping-up/react#application)
### FAQ and help
@@ -45,18 +47,6 @@ Acclaim Support: For questions related to your Acclaim badge earner account and
NOTICE: IBM leverages the services of Credly's Acclaim platform, a 3rd party data processor authorized by IBM and located in the United States, to assist in the administration of the IBM Digital Badge program. In order to issue you an IBM Digital Badge, your personal information (name, email address, and badge earned) will be shared with the Credly's Acclaim platform. You will receive an email notification from Acclaim with instructions for claiming the badge. Your personal information is used to issue your badge and for program reporting and operational purposes. It will be handled in a manner consistent with IBM privacy practices. The IBM Privacy Statement can be viewed here: [https://www.ibm.com/privacy/us/en/](https://www.ibm.com/privacy/us/en/). IBM employees can view the IBM Internal Privacy Statement here: [https://w3.ibm.com/w3publisher/w3-privacy-notice](https://w3.ibm.com/w3publisher/w3-privacy-notice).
-## Free t-shirt
-
-Submit your completed IBM Digital Badge application by July 30, 2019, and receive a free\* Carbon t-shirt.
-
-
-
-![](/images/carbon-tee.png)
-
-
-
## Application
-Complete the [application form](https://www.surveygizmo.com/s3/5075530/Dev-Essentials-Badge-Application) to request the digital badge and t-shirt. Once you submit the application, please allow 2-4 days for issuing the badge and 4-6 weeks to receive the t-shirt. Once the badge is issued, you will be notified and must accept the badge via Acclaim.
-
-_\* Shirts are available for a limited time while supplies last to U.S. shipping addresses and outside the U.S. to participating FED@IBM branches._
+Complete the [application form](https://www.surveygizmo.com/s3/5163103/IBM-Carbon-Design-System-Developer-Essentials-React-v2) to request the digital badge. Once you submit the application, please allow 2-4 days for issuing the badge. Once the badge is issued, you will be notified and must accept the badge via Acclaim.
diff --git a/src/content/tutorial/react-step-2/images/landing-layout.png b/src/content/tutorial/shared/step-2/images/landing-layout.png
similarity index 100%
rename from src/content/tutorial/react-step-2/images/landing-layout.png
rename to src/content/tutorial/shared/step-2/images/landing-layout.png
diff --git a/src/content/tutorial/react-step-2/images/landing-r1-spacing.png b/src/content/tutorial/shared/step-2/images/landing-r1-spacing.png
similarity index 100%
rename from src/content/tutorial/react-step-2/images/landing-r1-spacing.png
rename to src/content/tutorial/shared/step-2/images/landing-r1-spacing.png
diff --git a/src/content/tutorial/react-step-2/images/landing-r1-type.png b/src/content/tutorial/shared/step-2/images/landing-r1-type.png
similarity index 100%
rename from src/content/tutorial/react-step-2/images/landing-r1-type.png
rename to src/content/tutorial/shared/step-2/images/landing-r1-type.png
diff --git a/src/content/tutorial/react-step-2/images/landing-r2-spacing.png b/src/content/tutorial/shared/step-2/images/landing-r2-spacing.png
similarity index 100%
rename from src/content/tutorial/react-step-2/images/landing-r2-spacing.png
rename to src/content/tutorial/shared/step-2/images/landing-r2-spacing.png
diff --git a/src/content/tutorial/react-step-2/images/landing-r3-spacing.png b/src/content/tutorial/shared/step-2/images/landing-r3-spacing.png
similarity index 100%
rename from src/content/tutorial/react-step-2/images/landing-r3-spacing.png
rename to src/content/tutorial/shared/step-2/images/landing-r3-spacing.png
diff --git a/src/content/tutorial/react-step-4/images/DAP-violations.png b/src/content/tutorial/shared/step-4/images/DAP-violations.png
similarity index 100%
rename from src/content/tutorial/react-step-4/images/DAP-violations.png
rename to src/content/tutorial/shared/step-4/images/DAP-violations.png
diff --git a/src/content/tutorial/react-step-4/images/info-layout.png b/src/content/tutorial/shared/step-4/images/info-layout.png
similarity index 100%
rename from src/content/tutorial/react-step-4/images/info-layout.png
rename to src/content/tutorial/shared/step-4/images/info-layout.png
diff --git a/src/content/tutorial/react-step-4/images/info-spacing.png b/src/content/tutorial/shared/step-4/images/info-spacing.png
similarity index 100%
rename from src/content/tutorial/react-step-4/images/info-spacing.png
rename to src/content/tutorial/shared/step-4/images/info-spacing.png
diff --git a/src/content/tutorial/wrapping-up/images/carbon-tee.png b/src/content/tutorial/shared/wrapping-up/images/carbon-tee.png
similarity index 100%
rename from src/content/tutorial/wrapping-up/images/carbon-tee.png
rename to src/content/tutorial/shared/wrapping-up/images/carbon-tee.png
diff --git a/src/content/tutorial/vue/images/carbon-badge-vue.png b/src/content/tutorial/vue/images/carbon-badge-vue.png
new file mode 100644
index 0000000000..56b9dd7b94
Binary files /dev/null and b/src/content/tutorial/vue/images/carbon-badge-vue.png differ
diff --git a/src/content/tutorial/vue/overview.mdx b/src/content/tutorial/vue/overview.mdx
new file mode 100644
index 0000000000..b9574c335e
--- /dev/null
+++ b/src/content/tutorial/vue/overview.mdx
@@ -0,0 +1,68 @@
+---
+title: Tutorial overview
+internal: false
+tabs: ['Overview', 'Step 1', 'Step 2', 'Step 3', 'Step 4', 'Step 5', 'Wrapping up']
+---
+
+### Welcome to Carbon! This tutorial will guide you in creating a Vue app with the Carbon Design System. We'll teach you the ins and outs of using Carbon components, while introducing web development best practices along the way.
+
+
+
+- [Audience](#audience)
+- [Prerequisites](#prerequisites)
+- [Outline](#outline)
+
+
+
+Here's a [preview](https://vue-step-6--carbon-tutorial-vue.netlify.com) of what you will build:
+
+
+
+
+
+
+
+## Audience
+
+This tutorial is intended for people with all amounts of web development experience. If you want to jump straight to code, you may want to skip this tutorial and go to the [developers getting started](/getting-started/developers) page.
+
+## Prerequisites
+
+### Vue
+
+This is a web development tutorial that uses the Carbon Vue components. If you're just getting started with Vue and enjoy learning-by-doing, check out the official Vue [guide](https://vuejs.org/v2/guide/).
+
+### ES6/ES2015
+
+Vue apps often use the latest and greatest from JavaScript (ES6/ES2015). You'll want to be up to speed on the most commonly used features of the language. [Let's Learn ES6](https://www.youtube.com/playlist?list=PL57atfCFqj2h5fpdZD-doGEIs0NZxeJTX) covers those features in depth.
+
+### GitHub
+
+We'll be using GitHub to build an app together, so if you're new to GitHub, make sure you've [made an account](https://github.com/join). Their [getting started guide](https://guides.github.com/activities/hello-world) is a great way to learn GitHub.
+
+### Yarn
+
+This tutorial uses [Yarn](https://yarnpkg.com) for dependency management so we can take advantage of offline installs. Make sure that you have [Yarn installed](https://yarnpkg.com/en/docs/install) prior to starting the tutorial so you can follow along step-by-step.
+
+## Outline
+
+Each step in this tutorial illustrates a different aspect of developing web applications with Carbon. We recommend starting with step 1, but you can pick up any step and take it from there.
+
+1. [**Installing Carbon**](/tutorial/step-1/vue)
+ - Create a web app with the UI shell component.
+1. [**Building pages**](/tutorial/step-2/vue)
+ - Build out pages with the grid and various components.
+1. [**Using APIs**](/tutorial/step-3/vue)
+ - Populate the data table with an external data source.
+1. [**Creating components**](/tutorial/step-4/vue)
+ - Extend Carbon by creating your own components.
+1. [**Deploying to IBM Cloud**](/tutorial/step-5/vue)
+ - Build and host your app in a production environment.
diff --git a/src/content/tutorial/vue/step-1.mdx b/src/content/tutorial/vue/step-1.mdx
new file mode 100644
index 0000000000..2aff97b3ff
--- /dev/null
+++ b/src/content/tutorial/vue/step-1.mdx
@@ -0,0 +1,626 @@
+---
+title: 1. Installing Carbon
+internal: false
+tabs: ['Overview', 'Step 1', 'Step 2', 'Step 3', 'Step 4', 'Step 5', 'Wrapping up']
+---
+
+### Starting with our Vue CLI generated app, let's install Carbon and begin using Carbon components. By the end you will have a Vue app that uses the UI Shell to navigate between pages.
+
+
+
+- [Fork, clone and branch](#fork-clone-and-branch)
+- [Build and start](#build-and-start)
+- [Install Carbon](#install-carbon)
+- [Other dependencies](#other-dependencies)
+- [Add UI Shell](#add-ui-shell)
+- [Create pages](#create-pages)
+- [Add routing](#add-routing)
+- [Submit pull request](#submit-pull-request)
+
+
+
+## Preview
+
+A [preview](https://vue-step-2--carbon-tutorial-vue.netlify.com) of what you will build:
+
+
+
+
+
+
+
+## Fork, clone and branch
+
+This tutorial has an accompanying GitHub repository called [carbon-tutorial-vue](https://github.com/carbon-design-system/carbon-tutorial-vue) that we'll use as a starting point for each step.
+
+### Fork
+
+To begin, fork [carbon-tutorial-vue](https://github.com/carbon-design-system/carbon-tutorial-vue) using your GitHub account.
+
+### Clone
+
+Go to your forked repository, copy the SSH or HTTPS URL and in your terminal run the two commands to get the repository in your local file system and enter that directory.
+
+```bash
+$ git clone [your fork SSH/HTTPS]
+$ cd carbon-tutorial-vue
+```
+
+### Add upstream remote
+
+Add a remote called `upstream` so we can eventually submit a pull request once you have completed this tutorial step.
+
+```bash
+$ git remote add upstream git@github.com:carbon-design-system/carbon-tutorial-vue.git
+```
+
+Or, if you prefer to use HTTPS instead of SSH with your remotes:
+
+```bash
+$ git remote add upstream https://github.com/carbon-design-system/carbon-tutorial-vue.git
+```
+
+Verify that your forked repository remotes are correct:
+
+```bash
+$ git remote -v
+```
+
+Your terminal should output something like this:
+
+```bash
+origin [your forked repo] (fetch)
+origin [your forked repo] (push)
+upstream git@github.com:carbon-design-system/carbon-tutorial-vue.git (fetch)
+upstream git@github.com:carbon-design-system/carbon-tutorial-vue.git (push)
+```
+
+### Branch
+
+Now that we have our repository set up, let's check out the branch for this tutorial step's starting point. Run the two commands:
+
+```bash
+$ git fetch upstream
+$ git checkout -b vue-step-1 upstream/vue-step-1
+```
+
+## Build and start
+
+We have the repository forked to your GitHub account, cloned down to your machine, and the starting branch checked out. Next, install the Vue app's dependencies with:
+
+```bash
+$ yarn
+```
+
+After the dependencies are installed, you can start the app with:
+
+```bash
+$ yarn serve
+```
+
+Your default browser should open up with an empty page that says: `Hello Carbon! Well, not quite yet. This is the starting point for the Carbon tutorial.`
+
+OK. So we made a small change to the Vue CLI geneated app replacing the HelloWorld component and replaced it with our own message and swapped out the facicon.
+
+## Install Carbon
+
+Even though we installed existing dependencies, we've yet to install the Carbon packages.
+
+- `carbon-components` - component styles
+- `@carbon/vue` - Vue components
+- `@carbon/icons-vue` - Vue icons
+
+Stop your development server with `CTRL-C` and install Carbon dependencies with:
+
+```bash
+$ yarn add carbon-components @carbon/vue @carbon/icons-vue
+```
+
+## Other dependencies
+
+If you check out the file `package.json`, you'll notice a few dependencies beyond those listed above. These were installed as part of the project creation using the Vue CLI. These include:
+
+- vue-router: Used to make routing in Vue apps simpler
+- @vue/cli-plugin-babel: To ensure we produce well supported code.
+- @vue/cli-plugin-eslint: To allow us to catch potential errors.
+- @vue/cli-plugin-unit-jest: To allow us to unit test our code.
+- node-sass: To allow us to use the sass css precompiler.
+
+NOTE: We could have installed these seperately but using the CLI to set this up for us ensures a good base config for these dependencies.
+
+To avoid having to add the `~` prefix when importing SCSS files from `node_modules`, create a `.env` file at the project root that contains:
+
+##### .env
+
+```bash
+SASS_PATH="node_modules"
+```
+
+For the Windows operating system, use:
+
+##### .env
+
+```bash
+SASS_PATH=./node_modules
+```
+
+Then, start the app again. If your app's currently running, you'll need to restart it for the new environment variable to be used.
+
+```bash
+$ yarn serve
+```
+
+The app looks as it did before. Next, let's add Carbon styling.
+
+### Import carbon-component styles
+
+In the `src` directory, create a sub-directory `styles` and add a new file `_carbon.scss` to it. Then in `App.vue` edit the style tag to import it.
+
+#### src/App.vue
+
+
+```scss
+
+```
+
+
+In `styles/_carbon.scss`, import the Carbon styles by adding the following at the top of the file:
+
+##### src/styles/\_carbon.scss
+
+```scss
+@import 'carbon-components/scss/globals/scss/styles';
+```
+
+This will take a moment for the Sass to compile. Once compiled, you'll notice that the Carbon base styling is applied (IBM Plex Sans font family, font size, weight, colors, etc.)
+
+Because any change to `_carbon.scss` will re-compile all of the Carbon Sass, avoid making changes here unless instructed to do so. it is better to make them in the component files or a seperate file if needed.
+
+Next we'll create a Carbon `Button` to test that our dependencies are working properly.
+
+#### src/main.js
+
+After the other imports in main.js and before the Vue instance is created add the following.
+
+
+```javascript
+import CarbonComponentsVue from "@carbon/vue";
+Vue.use(CarbonComponentsVue);
+```
+
+
+This is a quick way to pull in all @carbon/vue components and register them for use in your project. Individual components can be imported to a project or component.
+
+e.g. Instead of modifying src/main.js we could have added the following to src/App.vue:
+
+##### src/App.vue
+
+```javascript
+
+```
+
+See the Carbon Vue Components [documentation](https://github.com/carbon-design-system/carbon-components-vue/blob/master/packages/core/README.md#using-the-components-directly-or-individually) for other ways to load components from @carbon/vue components.
+
+In this tutorial we will stick to importing all of the components at once so we can focus on our use of @carbon/vue.
+
+Now open the `App.vue` component and replace:
+
+##### src/App.vue
+
+
+```html
+ Hello Carbon! Well, not quite yet. This is the starting point for the Carbon tutorial.
+```
+
+
+with:
+
+##### src/App.vue
+
+
+```html
+Button
+```
+
+or
+
+```html
+Button
+```
+
+
+Congratulations, you've imported your first component! You should see a Carbon styled button on the page.
+
+NOTE: In this tutorial you can use either tag format. The [Vue style guide](https://vuejs.org/v2/style-guide/) recommend sticking to either Pascal or kebab case. The examples from here will use Pascal case for file and component names with kebab case in the HTML.
+
+## Add UI Shell
+
+Next we're going to create a Vue component called `TutorialHeader` to use with the UI Shell Carbon component. Create a new directory `src/components`. In the `src/components` directory, create `TutorialHeader` directory. Create the following files inside `src/components/TutorialHeader`:
+
+```bash
+src/components/TutorialHeader
+├──index.js
+└──TutorialHeader.vue
+```
+
+### Import and export the header
+
+In `src/components/TutorialHeader/index.js`, import and export our `TutorialHeader` component like so:
+
+##### src/components/TutorialHeader/index.js
+
+```javascript
+import TutorialHeader from './TutorialHeader';
+export default TutorialHeader;
+```
+
+_Note: This index.js files import/export is simply a convenience to shorten the path used to import the component and potentially import multiple components from one folder. The folder also provides us a handy location to add tests or documentation for the component._
+
+_Note: We could have simply created a file src/components/TutorialHeader.vue without the above benefits._
+
+#### Lazyness - VSCode users only
+
+If you are using VSCode then you might want to add the following snippet which will when you type 'index' generate an index file for you based on the folder name.
+
+##### javascript.json
+
+```json
+ "index-file": {
+ "prefix": "index",
+ "body": [
+ "import ${TM_DIRECTORY/.*[\\/]//gm} from './${TM_DIRECTORY/.*[\\/]//gm}';",
+ "export { ",
+ "\t${TM_DIRECTORY/.*[\\/]//gm},",
+ "};",
+ "export default ${TM_DIRECTORY/.*[\\/]//gm}",
+ ""
+ ],
+ "description": "Index file"
+ }
+```
+
+You can also use the following to create a skeleton component. To use this one, start typing the word template in your template file and it will generate a file, making assumptions based on the component file name.
+
+##### vue.json
+
+```json
+ "Vue_Component": {
+ "prefix": "template",
+ "body": [
+ "",
+ "\t$0",
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ],
+ "description": "Single file template"
+ }
+```
+
+OK, back to using Carbon components. Let's make use of our Carbon UI Shell components in `TutorialHeader.vue`. Set up the file like so:
+
+##### src/components/TutorialHeader/TutorialHeader.vue
+
+```html
+
+
+ Skip to content
+
+ Carbon Tutorial
+
+
+ Repositories
+
+
+
+
+
+```
+
+_Note: you can find a description of the different components used in UI Shell in our [carbon-componets-vue](http://vue.carbondesignsystem.com/?path=/story/components-cvuishell-header) package._
+
+_Note: When creating navigation headers, it's important to have a_ `Skip to content` _link so keyboard users can skip the navigation items and go straight to the main content._
+
+_Note: It's important that the_ `TutorialHeader` has the Carbon* `CvHeader` \_as it's containing element, as we'll later be rendering* `TutorialHeader` _in_ `App.vue` _as a preceeding sibling of_ `Content`_, another UI Shell component. Those components need to live one after another for the UI Shell to properly render._
+
+### Import icons
+
+Now let's import the icons from our `@carbon/icons-vue` elements package. After the closing template tag in the `TutorialHeader.vue` file, we need to import each individual icon we will use.
+
+##### src/components/TutorialHeader/TutorialHeader.vue
+
+
+```javascript
+
+```
+
+
+_Note: We've given our component a name here as part of the default export. This is optional in Vue but very useful in the [Vue developer tools](https://github.com/vuejs/vue-devtools)._
+
+Then we need to add content to the `header-global` slot where we will use our icons. These represent actions in the header a user can make. Replace:
+
+##### src/components/TutorialHeader/TutorialHeader.vue
+
+```html
+
+```
+
+With:
+
+##### src/components/TutorialHeader/TutorialHeader.vue
+
+```html
+
+
+
+
+
+
+
+
+
+
+
+```
+
+### Render the header
+
+Next we'll render our UI Shell by importing our `TutorialHeader` component and `CvContent` into `App.vue`. Add a script tag if you don't have one, then update it as follows:
+
+##### src/App.vue
+
+```javascript
+
+```
+
+In addition to importing the `TutorialHeader` component, we have also declared it for use in our template by adding it to the `components` property of our component.
+
+As our template currently just contains a `Button` it is still not rendering anything more interesting so let's update that to include our imported components. This should look like the following:
+
+##### src/App.vue
+
+```html
+
+
+
+
+ Button
+
+
+
+```
+
+You should now see a styled UI Shell header and a button below it.
+
+_Note: We've also sneaked in use of `CvContent` which needs to follow `CvHeader` to ensure the correct formatting. We could have included it as part of a shell component with TutorialHeader but have chosen not to in this case._
+
+## Create pages
+
+Next thing we need to do is create the files for our views.
+
+Since our app will have two pages, we'll create two folders in `src/views`. Clear out the files currently in the views folder and add the following folders.
+
+```bash
+src/views
+├── LandingPage
+└── RepoPage
+```
+
+Create the following files in the `LandingPage` folder:
+
+```bash
+src/view/LandingPage
+├── index.js
+└── LandingPage.vue
+```
+
+Create the following files in the `RepoPage` folder:
+
+```bash
+src/view/RepoPage
+├── index.js
+└── RepoPage.vue
+```
+
+### Import and export content pages
+
+Starting with `LandingPage`, just like with our header, we need to export the component in `src/view/LandingPage/index.js` by adding:
+
+##### src/view/LandingPage/index.js
+
+```javascript
+import LandingPage from './LandingPage';
+export default LandingPage;
+```
+
+Next in `LandingPage.vue` we'll create our component.
+
+##### src/view/LandingPage/LandingPage.vue
+
+```html
+
+
LANDING PAGE
+
+```
+
+We'll repeat this process with `RepoPage`.
+
+In `src/view/RepoPage/index.js`, import and export the `RepoPage` component like so:
+
+##### src/view/RepoPage/index.js
+
+```javascript
+import RepoPage from './RepoPage';
+export default RepoPage;
+```
+
+Then in `RepoPage.vue` create the component.
+
+##### src/view/RepoPage/RepoPage.vue
+
+```html
+
+
REPO PAGE
+
+```
+
+Awesome! We've just created our content pages. Next thing we need to do is render them with our router.
+
+## Add routing
+
+Lucky for you, as part of the Vue CLI project set up we added vue-router. This created the views folder and also added, `src/router.js` and imported that into `src/main.js` for us.
+
+#### src/router.js
+
+We need to adjust it by replacing the contents of `src/router.js` with:
+
+```javascript
+import Vue from 'vue';
+import Router from 'vue-router';
+import LandingPage from './views/LandingPage';
+
+Vue.use(Router);
+
+export default new Router({
+ routes: [
+ {
+ path: '/',
+ name: 'landing-page',
+ component: LandingPage,
+ },
+ {
+ path: '/repos',
+ name: 'repo-page',
+ // route level code-splitting
+ // this generates a separate chunk (repo-page.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () =>
+ import(/* webpackChunkName: "repo-page" */ './views/RepoPage'),
+ },
+ ],
+});
+```
+
+_Note: The landing page is loaded immediately, with the RepoPage loaded only once needed. This is one simple way to create webpackChunks and is the default suggestion from the CLI plugin for vue-router._
+
+If you click on `Repositories` and then on `IBM Carbon Tutorial` you'll notice a flicker as we hop from one page to another. We can fix this by using vue-router to manage our views.
+
+Next we need to update `src/App.vue` to render these views.
+
+In the template section remove the `` and replace it with `` as follows
+
+#### src/App.vue
+
+```html
+
+
+
+```
+
+After that we need to do a couple quick fixes to the UI Shell to have it work with the vue-router.
+
+##### src/components/TutorialHeader/TutorialHeader.vue
+
+In `src/components/TuturialHeader/TutorialHeader.vue` simply replace the `href` attributes used in the `cv-header-name` and `cv-header-menu-item` components with `to`. @carbon/vue will under the covers switch from use of an `a` tag to `router-link`.
+
+```html
+Carbon Tutorial
+```
+
+and
+
+```html
+Repositories
+```
+
+You should now have a working header that routes to different pages without full page reload!
+
+## Submit pull request
+
+We're going to submit a pull request to verify completion of this tutorial step and demonstrate a couple of related concepts.
+
+
+
+
+### Git commit and push
+
+Before we can create a pull request, stage and commit all of your changes:
+
+```bash
+$ git add --all && git commit -m "feat(tutorial): complete step 1"
+```
+
+
+
+
+Then, push to your repository:
+
+```bash
+$ git push origin vue-step-1
+```
+
+_Note: If your Git remote protocol is HTTPS instead of SSH, you may be prompted to authenticate with GitHub when you push changes. If your GitHub account has two-factor authentication enabled, we recommend that you follow these instructions to [create a personal access token for the command line](https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line). That lets you use your token instead of password when performing Git operations over HTTPS._
+
+_Note: If you receive a_ `non-fast-forward` _error, it's likely that your forked repository is behind the original repository and needs updated. This can happen if the tutorial was updated after you began working on it. To fix, run_ `git pull upstream vue-step-1` _to merge the changes into your branch, then you can try pushing again. Or, you can [manually merge](https://help.github.com/en/articles/syncing-a-fork) in the upstream changes._
+
+### Pull request (PR)
+
+Finally, visit [carbon-tutorial-vue](https://github.com/carbon-design-system/carbon-tutorial-vue) to "Compare & create pull request". In doing so, make sure that you are comparing your repository's `vue-step-1` branch into `base: vue-step-1`. Take notice of the [Netlify](https://www.netlify.com) bot that deploys a preview of your PR every time that you push new commits. These previews can be shared and viewed by anybody to assist the PR review process.
+
+_Note: Expect your tutorial step PRs to be reviewed by the Carbon team but not merged. We'll close your PR so we can keep the repository's remote branches pristine and ready for the next person!_
diff --git a/src/content/tutorial/vue/step-2.mdx b/src/content/tutorial/vue/step-2.mdx
new file mode 100644
index 0000000000..bfd77e6c98
--- /dev/null
+++ b/src/content/tutorial/vue/step-2.mdx
@@ -0,0 +1,809 @@
+---
+title: 2. Building pages
+internal: false
+tabs:
+ ['Overview', 'Step 1', 'Step 2', 'Step 3', 'Step 4', 'Step 5', 'Wrapping up']
+---
+
+### Now that we have a Vue app using the UI Shell, it's time to build a few static pages. In this step, we'll become comfortable with the Carbon grid and various Carbon components.
+
+
+
+- [Fork, clone and branch](#fork-clone-and-branch)
+- [Install grid](#install-grid)
+- [Add landing page grid](#add-landing-page-grid)
+- [Build landing page](#build-landing-page)
+- [Style landing page](#style-landing-page)
+- [Add repo page grid](#add-repo-page-grid)
+- [Build repo page](#build-repo-page)
+- [Style repo page](#style-repo-page)
+- [Submit pull request](#submit-pull-request)
+
+
+
+## Preview
+
+A [preview](https://vue-step-3--carbon-tutorial-vue.netlify.com) of what you'll build:
+
+
+
+
+
+
+
+## Fork, clone and branch
+
+This tutorial has an accompanying GitHub repository called [carbon-tutorial-vue](https://github.com/carbon-design-system/carbon-tutorial-vue) that we'll use as a starting point for each step. If you haven't forked and cloned that repository yet, and haven't added the upstream remote, go ahead and do so by following the [step 1 instructions](/tutorial/step-1/vue#fork-clone--branch).
+
+### Branch
+
+With your repository all set up, let's check out the branch for this tutorial step's starting point.
+
+```bash
+$ git fetch upstream
+$ git checkout -b vue-step-2 upstream/vue-step-2
+```
+
+_Note: This builds on top of step 1, but be sure to check out the upstream step 2 branch because it includes the static assets and fixes required to get through this step._
+
+### Build and start app
+
+Install the app's dependencies (in case you're starting fresh in your current directory and not continuing from the previous step):
+
+```bash
+$ yarn
+```
+
+Then, start the app:
+
+```bash
+$ yarn serve
+```
+
+You should see something similar to where the [previous step](/tutorial/step-1/vue) left off.
+
+## Install grid
+
+In our last step we added our styles, component and icon packages. Now that we're building the pages with grid, we need to install one more Carbon package. Stop your development environment (`CTRL-C`) and:
+
+```bash
+$ yarn add @carbon/grid
+```
+
+In `_carbon.scss`, we need to configure our grid to use 16 columns instead of the default 12 columns. We do this by adding `grid-columns-16: true` in our `$feature-flags`.
+
+##### src/styles/\_carbon.scss
+
+```css
+$feature-flags: (
+ grid-columns-16: true
+);
+```
+
+_Note: Like before, the feature flag still needs to come before the Carbon_ `styles.scss` _import._
+
+Run `yarn serve` so we can begin building.
+
+## Add landing page grid
+
+Let's add our grid elements to `LandingPage.vue`.
+
+In order to use the grid, we need to wrap everything in a `
`. We can continue to make rows by adding a `
` inside the grid, as well as make columns within those rows by adding `
`.
+
+Our column sizes are specified by the number of columns they'll be spanning. If we use `bx--col-lg-4`, it means it'll span 4 of the 16 columns. If we use `bx--col-lg-8` it means it'll span 8 of the 16 columns, and so on.
+
+We've included the designs for this tutorial app in the `design.sketch` file found as a top-level file in the `carbon-tutorial-vue` repository. But, if you don't have Sketch installed and available to inspect the design, we'll provide screenshots.
+
+
+
+![Landing page grid](../shared/step-2/images/landing-layout.png)
+
+
+
+_Pro tip:_ `CTRL-L` _toggles the layout in Sketch._
+
+We'll break this down into three rows. The first row with the gray background doesn't appear to need any columns. The second row with the white background looks like it has two columns of different widths. The third row with the gray background looks like it has four columns of equal width.
+
+We'll make rows like so:
+
+##### src/views/LandingPage/LandingPage.vue
+
+```html
+
+
+
+
1
+
+
+
7/16
+
8/16
+
+
+
1/4
+
1/4
+
1/4
+
1/4
+
+
+
+```
+
+We added a class of `bx--grid--full-width` to the grid container since our rows need to expand the whole page without any margins. We also added some custom classes like `landing-page`, `landing-page__banner`, `landing-page__r2`, etc., which we will use later.
+
+Also, take notice of the second row. The tab content only covers 7 columns at this large viewport to prevent overly-large line lengths, so we needed to add a 1 column offset `bx--offset-lg-1` to second column to fill the full 16 columns in the grid. Then, both of those columns have `bx--col-md-4` classes so they are of equal width at medium-sized viewports.
+
+## Build landing page
+
+We'll start adding HTML elements and components by row.
+
+### First row
+
+In our first row we'll use a `CvBreadcrumb` component.
+
+We can now add our component to the first row, along with a header, like so:
+
+##### src/views/LandingPage/LandingPage.vue
+
+```html
+
+
+
+
+ Getting started
+
+
+
Design & build with Carbon
+
+
+```
+
+You may notice that the styles look off. Don't worry, we'll fix these later.
+
+### Second row
+
+In our second row we'll use `CvTabs` and `CvButton` components.
+
+
+
+Modify the second row to use the `Tab` component.
+
+##### src/views/LandingPage/LandingPage.vue
+
+```html
+
+
+
+
+
+
+
7/16
+
+ 8/16
+
+
+
+
+
+
+
+
+ Rapidly build beautiful and accessible experiences. The Carbon kit
+ contains all resources you need to get started.
+
+
+
+
+
+
+
+
+ Carbon provides styles and components in Vanilla, Vue, Angular,
+ and Vue for anyone building on the web.
+
+
+
+
+
+
+
+```
+
+_Note: We're using the grid for the page layout, but we also need to apply the grid within the tab content. When doing so, make sure the nested grid has the expected_ `grid` _>_ `row` _>_ `col` _DOM structure._
+
+Hold up! If you were to run [DAP](https://www.ibm.com/able/dynamic-assessment-plug-in.html) to check for accessibility violations, you'd see `Multiple navigation landmarks must have unique labels specified with aria-label or aria-labelledby` because both the `CvBreadcrumb` and `CvTabs` components use `
+
+```html
+
+```
+
+
+We need to tell the loading skeleton how many rows to render, so let's use 10 skeleton rows to prepare for the next enhancement...
+
+## Add pagination
+
+Pagination! Instead of rendering every repository, let's add pagination to the data table to only render 10 at a time. Depending on your specific requirements, you may need to fetch new data each time that you interact with the pagination component, but for simplicity, we're going to make one request to fetch all data, and then paginate the in-memory row data.
+
+Let's start by adjusting our `PageTable' component template to add pagination. If you review the [storybook notes](http://vue.carbondesignsystem.com/?path=/info/components-cvdatatable--default) you'll see that pagination is added to the data table by supplying a pagination object and listening for pagination events as follows.
+
+##### src/views/RepoPage/RepoTable.vue
+
+
+```html
+
+```
+
+
+_Note: ':prop' is an abbreviation of 'v-bind:prop'_
+_Note: '@event' is an abbreviation of 'v-on:event'_
+
+In the pagination event we've used $emit and $event to re-raise the pagination event to our `RepoPage` component so that it can arrange to pass only the rows we want to see to the `RepoTable` component.
+
+We also need to add the `totalRows` property used in the data tables pagination property.
+
+##### src/views/RepoPage/RepoTable.vue
+
+```javascript
+totalRows: Number,
+```
+
+Next to our `RepoPage` component, let's first update our template by updating our `RepoTable` use with the following attributes.
+
+##### src/views/RepoPage/RepoPage.vue
+
+
+```html
+:rows="pagedRows"
+:totalRows="rows.length"
+@pagination="onPagination"
+```
+
+
+replacing
+
+##### src/views/RepoPage/RepoPage.vue
+
+```html
+:rows="rows"
+```
+
+Next in the data property of our component add values for pageSize, pageStart and page into the data method return to support our pagination.
+
+##### src/views/RepoPage/RepoPage.vue
+
+```javascript
+ data() {
+ return {
+ headers,
+ pageSize: 0,
+ pageStart: 0,
+ page: 0
+ };
+ },
+```
+
+_Note: We could have passed values for pageSize and page into our pagination component if we had a specific page or page size we wanted to start with. Instead we are relying on the pagination component to set some sensible defaults and provide us with the details through an event._
+
+Then before we can see our paginated table we need to add: a pagedRows computed property to select the slice of input rows we are interested in, and a method to handle the pagination event.
+
+##### src/views/RepoPage/RepoPage.vue
+
+```javascript
+ computed: {
+ // other computed properties
+ // ...
+ pagedRows() {
+ return this.rows.slice(this.pageStart, this.pageStart + this.pageSize);
+ }
+ },
+ methods: {
+ onPagination(val) {
+ this.pageSize = val.length;
+ this.pageStart = val.start;
+ this.page = val.page;
+ }
+ }
+```
+
+_Note: Like the other Carbon Vue components,_ `Pagination` _component examples can be found in [Storybook](http://vue.carbondesignsystem.com/?path=/story/components-cvpagination--default) by browsing the story and knobs._
+
+That does it! Your data table should fetch GitHub data on first render. You can expand each row to see the repository's description. You can modify the pagination items per page and cycle through pages or jump to a specific page of repositories.
+
+## Mystery
+
+Hmmm, there is at least one more issue to resolve. If you expand a row or two to see the repository descriptions you will and then change page. What happens?
+
+Assuming you didn't catch this earlier you will find that the expanded rows, stay expanded after paging. That is if row two was expanded before pagination it is expanded after.
+
+This is becuase we chose a poor values to use as our row and cell keys as we iterated over them. The result is that Vue sees these items as having the same key and makes the assumption that content but not state has changed.
+
+To fix this add the following to the RepoPage component you should be able to find something better.
+
+```javascript
+ watch: {
+ rows() {
+ if (this.organization) {
+ console.dir(this.organization.repositories.nodes);
+ }
+ }
+ },
+```
+
+\_Hint: id and url are likely unique properties, you could use either of these to update the prototype. In fact we already pass the id value to RepoTable.\_
+
+Can you fix it?
+
+## Submit pull request
+
+We're going to submit a pull request to verify completion of this tutorial step.
+
+### Continuous integration (CI) check
+
+Run the CI check to make sure we're all set to submit a pull request.
+
+```bash
+$ yarn ci-check
+```
+
+_Note: Having issues running the CI check? [Step 1]() has troubleshooting notes that may help._
+
+### Git commit and push
+
+Before we can create a pull request, stage and commit all of your changes:
+
+```bash
+$ git add --all && git commit -m "feat(tutorial): complete step 3"
+```
+
+Then, push to your repository:
+
+```bash
+$ git push origin vue-step-3
+```
+
+_Note: Having issues pushing your changes? [Step 1](/tutorial/step-1/vue#git-commit-and-push) has troubleshooting notes that may help._
+
+### Pull request (PR)
+
+Finally, visit [carbon-tutorial-vue](https://github.com/carbon-design-system/carbon-tutorial-vue) to "Compare & pull request". In doing so, make sure that you are comparing to `vue-step-3` into `base: vue-step-3`.
+
+_Note: Expect your tutorial step PRs to be reviewed by the Carbon team but not merged. We'll close your PR so we can keep the repository's remote branches pristine and ready for the next person!_
diff --git a/src/content/tutorial/vue/step-4.mdx b/src/content/tutorial/vue/step-4.mdx
new file mode 100644
index 0000000000..67e48bdc0c
--- /dev/null
+++ b/src/content/tutorial/vue/step-4.mdx
@@ -0,0 +1,505 @@
+---
+title: 4. Creating components
+internal: false
+tabs: ['Overview', 'Step 1', 'Step 2', 'Step 3', 'Step 4', 'Step 5', 'Wrapping up']
+---
+
+### With two pages comprised entirely of Carbon components, let's revisit the landing page and build a couple components of our own by using Carbon icons and tokens.
+
+
+
+- [Fork, clone and branch](#fork-clone-and-branch)
+- [Review design](#review-design)
+- [Create components](#create-components)
+- [Use components](#use-components)
+- [Add styling](#add-styling)
+- [Check accessibility](#check-accessibility)
+- [Submit pull request](#submit-pull-request)
+
+
+
+## Preview
+
+Carbon provides a solid foundation for building web applications through its color palette, layout, spacing, type, as well as common building blocks in the form of components. So far, we've only used Carbon components to build out two pages.
+
+Next, we're going to use Carbon assets to build application-specific components. We'll do so by including accessibility and responsive considerations all throughout.
+
+A [preview](https://vue-step-5--carbon-tutorial-vue.netlify.com) of what you'll build (see bottom of page):
+
+
+
+
+
+
+
+## Fork, clone and branch
+
+This tutorial has an accompanying GitHub repository called [carbon-tutorial](https://github.com/carbon-design-system/carbon-tutorial-vue) that we'll use as a starting point for each step. If you haven't forked and cloned that repository yet, and haven't added the upstream remote, go ahead and do so by following the [step 1 instructions](/tutorial/step-1/vue#fork-clone--branch).
+
+### Branch
+
+With your repository all set up, let's check out the branch for this tutorial step's starting point.
+
+```bash
+$ git fetch upstream
+$ git checkout -b vue-step-4 upstream/vue-step-4
+```
+
+_Note: This builds on top of step 3, but be sure to check out the upstream step 4 branch because it includes the static assets required to get through this step._
+
+### Build and start app
+
+Install the app's dependencies (in case you're starting fresh in your current directory and not continuing from the previous step):
+
+```bash
+$ yarn
+```
+
+Then, start the app:
+
+```bash
+$ yarn serve
+```
+
+You should see something similar to where the [previous step](/tutorial/step-3/vue) left off.
+
+## Review design
+
+Here's what we're building – an informational section that has a heading and three subheadings. Each subheading has accompanying copy and a pictogram. We'll assume that this informational section is used elsewhere on the site, meaning it's a great opportunity to build it as a resusable component. As for naming, we'll call it an `InfoSection` with three `InfoCard`s as children.
+
+
+
+![Info section layout](../shared/step-4/images/info-layout.png)
+
+
+
+## Create components
+
+First we need files for the components, so create an `InfoSection` folder in `src/components`. Even though we're building multiple components, their names all start with `InfoSection`, so it makes sense to have them share one folder in components. Create these files:
+
+### Add files
+
+```bash
+src/components/InfoSection
+├──index.js
+└──InfoCard.vue
+└──InfoSection.vue
+```
+
+Like our other components, `index.js` will serve as an entrypoint.
+
+_Note: To adhere to the [Vue style guide](https://vuejs.org/v2/style-guide/) we have used multi word component names. This style guide stipulation is why all `@carbon/vue` components have a `cv` prefix._
+
+##### src/components/InfoSection/index.js
+
+```javascript
+import InfoSection from './InfoSection';
+import InfoCard from './InfoCard';
+
+export { InfoSection, InfoCard };
+```
+
+### InfoSection component
+
+Let's create the parent component that includes the "The Principles" heading. That markup currently looks like this in `LandingPage.vue`:
+
+##### src/views/LandingPage/LandingPage.vue
+
+```html
+
+
+
The Principles
+
+
Carbon is Open
+
Carbon is Modular
+
Carbon is Consistent
+
+```
+
+We want to do a few things when abstracting it to a component. First, we only want Carbon (`bx--`) and this component's class names; we don't want to include `landing-page__r3` as that's specific to the landing page. That will be passed in as a property to the component.
+
+We'll also:
+
+- Add component class names like `info-section` and `info-section__heading`
+- Semantically use `` instead of `
`
+- Update the grid columns to match the design
+- Replace `The Principles` with `{{heading}}`
+- Replace columns 2 - 4 with a slot.
+
+Using `props` we can render any heading and any number of children components (`InfoCard` that we'll build soon.)
+
+##### src/components/InfoSection/InfoSection.vue
+
+```html
+
+
+
+
{{ heading }}
+
+
+
+
+```
+
+Then name our component and add a property to the script section.
+
+##### src/components/InfoSection/InfoSection.vue
+
+```javascript
+
+```
+
+At this point let's add styling for the new class names that we just added.
+
+##### src/components/InfoSection/InfoSection.vue
+
+```scss
+
+```
+
+### InfoCard component
+
+Next up we're going to build a component for columns 2 - 4, which currently looks like `
Carbon is Open
`. Create a new file InfoCard.vue, add:
+
+##### src/components/InfoSection/InfoCard.vue
+
+```html
+
+
+
{{ heading }}
+
{{ body }}
+
+
+
+```
+
+Give it a name and add props
+
+```javascript
+
+```
+
+_Note: Make sure to export the two components from index.js!_
+
+In doing so, we:
+
+- Used the semantic `` instead of `
`
+- Added `info-card` classes
+- Used `props` to render the heading, body copy, and icon
+- Set columns to match the grid
+
+_Note: At extra large viewports, we are using _`bx--col-xlg-3 bx--offset-xlg-1`_ so each column takes up 3 of the 16 grid columns, with a 1 column offset._
+
+## Use components
+
+Our styling is not complete yet, but with our components built let's put them to use. In `LandingPage.vue`, import the components towards the top of the script section. If you havent added a script section, do so now.
+
+##### src/views/LandingPage/LandingPage.vue
+
+```javascript
+
+```
+
+While we're here next to the component imports, let's import the icons that we'll need as well.
+
+##### src/views/LandingPage/LandingPage.vue
+
+```javascript
+import Globe32 from '@carbon/icons-vue/lib/globe/32';
+import PersonFavorite32 from '@carbon/icons-vue/lib/person--favorite/32';
+import Application32 from '@carbon/icons-vue/lib/application/32';
+```
+
+_Note: You'll notice that these 32px icons aren't the pictograms as designed. The Carbon team is currently working on adding pictograms to the icons packages. Until then, we'll use the biggest SVGs._
+
+Don't forget to add the icons to the list of components used in our template. Wait a minute, are they being used by our template? Well yes and no. The components are going to be passed as an attribute rather than being used as a dom element. Vue treats this use case differently and instead of adding to the components property we need to assign the icons directly to the 'this' object. We can achieve this in a number of different ways, for example as data or computed propeties. The following is my preferred method when reactivity is not needed.
+
+In the script section of the component add the lifecycle method `created()` to add the icons to the component.
+
+##### src/views/LandingPage/LandingPage.vue
+
+```javascript
+ created() {
+ // Add icons to this
+ Object.assign(this, {
+ Globe32,
+ PersonFavorite32,
+ Application32
+ });
+ }
+```
+
+With everything imported, replace the current template content:
+
+##### src/views/LandingPage/LandingPage.vue
+
+```html
+
+
+
The Principles
+
+
Carbon is Open
+
Carbon is Modular
+
Carbon is Consistent
+
+```
+
+With the new components:
+
+##### src/views/LandingPage/LandingPage.vue
+
+
+```html
+
+
+```
+
+
+Then slot the `InfoCard` content inside the `InfoSection` tag to give.
+
+##### src/views/LandingPage/LandingPage.vue
+
+
+```html
+
+
+
+
+
+```
+
+
+_Note: Now is a good time to resize your browser from phone to extra large viewport widths to see how the responsive grid is working before we add further styling._
+
+## Add styling
+
+Here's our design showing the spacing tokens that we need to add. We also need to set type style and borders.
+
+
+
+![Info section spacing](../shared/step-4/images/info-spacing.png)
+
+
+
+### Layout
+
+Starting with layout, add the style section to `src/components/InfoSection/InfoCard.vue`.
+
+##### src/components/InfoSection/InfoCard.vue
+
+```scss
+
+```
+
+Once you save, go ahead and resize your browser to see the responsive layout at the different breakpoints. Make sure to review these color and spacing tokens. There are also a few breakpoint mixins that may be new to you. The `@carbon/layout` [SassDoc](https://github.com/carbon-design-system/carbon/blob/master/packages/layout/docs/sass.md) is a great reference to see what all is available.
+
+### Type
+
+Our `InfoCard` headings look to be too small. We need to increase their font sizes according to the design spec with:
+
+##### src/components/InfoSection/InfoCard.vue
+
+```scss
+.info-card__heading {
+ @include carbon--type-style('productive-heading-03');
+}
+```
+
+Also, the design has the last word in each subheading as bold. To accomplish that, add this computed property to `InfoCard.vue`.
+
+##### src/components/InfoSection/InfoCard.vue
+
+```javascript
+computed: {
+// Take in a phrase and separate the third word in an array
+ splitHeading() {
+ const splitHeading = this.heading.split(" ");
+ const finalWord = splitHeading.pop();
+ return [splitHeading.join(" "), finalWord];
+ }
+}
+```
+
+Then, update `InfoCard.vue` to use `splitHeading`.
+
+##### src/components/InfoSection/InfoCard.vue
+
+Replacing
+
+```html
+
+```
+
+Finally, add the following declaration block in the style section of `InfoCard.vue` to set body copy styles and to bottom-align the icons.
+
+##### src/components/InfoSection/InfoCard.vue
+
+```scss
+.info-card__body {
+ margin-top: $spacing-06;
+ flex-grow: 1; // fill space so icons are bottom aligned
+ @include type-style('body-long-01');
+
+ // prevent large line lengths between small and medium viewports
+ @include carbon--breakpoint-between(321px, md) {
+ max-width: 75%;
+ }
+}
+```
+
+## Check accessibility
+
+We've added new markup and styles, so it's a good practice to check [DAP](https://www.ibm.com/able/dynamic-assessment-plug-in.html) and make sure our rendered markup is on the right track for accessibility.
+
+With the browser extension installed, Chrome in this example, open Dev Tools and run DAP.
+
+
+
+![DAP violations](../shared/step-4/images/DAP-violations.png)
+
+
+
+That first violation is for the off-screen "skip to content" link. This link isn't shown and is used to assist screen reading, so the color contrast violation can be ignored.
+
+But, those three other violations came from the `` element used in new `InfoCard`. Since the `` element requires a label, it seems like we may be using the wrong semantic element. A humble `
` will suffice.
+
+In `InfoCard.vue`, replace the `` opening and closing tags with `
` tags.
+
+Also it's time to fix it if you didn't but I'm sure you can manage that by yourself.
+
+## Submit pull request
+
+We're going to submit a pull request to verify completion of this tutorial step.
+
+### Continuous integration (CI) check
+
+Run the CI check to make sure we're all set to submit a pull request.
+
+```bash
+$ yarn ci-check
+```
+
+_Note: Having issues running the CI check? [Step 1]() has troubleshooting notes that may help._
+
+### Git commit and push
+
+Before we can create a pull request, stage and commit all of your changes:
+
+```bash
+$ git add --all && git commit -m "feat(tutorial): complete step 4"
+```
+
+Then, push to your repository:
+
+```bash
+$ git push origin vue-step-4
+```
+
+_Note: Having issues pushing your changes? [Step 1](/tutorial/step-1/vue#git-commit-and-push) has troubleshooting notes that may help._
+
+### Pull request (PR)
+
+Finally, visit [carbon-tutorial](https://github.com/carbon-design-system/carbon-tutorial) to "Compare & pull request". In doing so, make sure that you are comparing to `vue-step-4` into `base: vue-step-4`.
+
+_Note: Expect your tutorial step PRs to be reviewed by the Carbon team but not merged. We'll close your PR so we can keep the repository's remote branches pristine and ready for the next person!_
diff --git a/src/content/tutorial/vue/step-5.mdx b/src/content/tutorial/vue/step-5.mdx
new file mode 100644
index 0000000000..bfa65e2f51
--- /dev/null
+++ b/src/content/tutorial/vue/step-5.mdx
@@ -0,0 +1,228 @@
+---
+title: 5. Deploying to IBM Cloud
+internal: false
+tabs: ['Overview', 'Step 1', 'Step 2', 'Step 3', 'Step 4', 'Step 5', 'Wrapping up']
+---
+
+### This step takes what we've built so far and optimizes the app for a production environment. We'll be deploying the production build to IBM Cloud.
+
+
+
+- [Fork, clone and branch](#fork-clone-and-branch)
+- [Create IBM Cloud account](#create-ibm-cloud-account)
+- [Optimize Sass](#optimize-sass)
+- [Build for production](#build-for-production)
+- [Create manifest file](#create-manifest-file)
+- [Create static file](#create-static-file)
+- [Deploy app](#deploy-app)
+- [Submit pull request](#submit-pull-request)
+
+
+
+## Preview
+
+A [preview](https://vue-step-6--carbon-tutorial-vue.netlify.com) of what you'll build (visually no different, but built for production):
+
+
+
+
+
+
+
+## Fork, clone and branch
+
+This tutorial has an accompanying GitHub repository called [carbon-tutorial-vue](https://github.com/carbon-design-system/carbon-tutorial-vue) that we'll use as a starting point for each step. If you haven't forked and cloned that repository yet, and haven't added the upstream remote, go ahead and do so by following the [step 1 instructions](/tutorial-vue/step-1/vue#fork-clone--branch).
+
+### Branch
+
+With your repository all set up, let's check out the branch for this tutorial step's starting point.
+
+```bash
+$ git fetch upstream
+$ git checkout -b vue-step-5 upstream/vue-step-5
+```
+
+_Note: This builds on top of step 4, but be sure to check out the upstream step 5 branch because it includes the static assets required to get through this step._
+
+### Build and start app
+
+Install the app's dependencies (in case you're starting fresh in your current directory and not continuing from the previous step):
+
+```bash
+$ yarn
+```
+
+Then, start the app:
+
+```bash
+$ yarn serve
+```
+
+You should see something similar to where the [previous step](/tutorial/step-4/vue) left off.
+
+## Create IBM Cloud account
+
+Before we get started, [create an IBM Cloud account](https://cloud.ibm.com/registration) if you don't already have one, as we'll be deploying there in a bit.
+
+## Optimize Sass
+
+So far we've been developing in a, well, development environment where static asset optimization hasn't been a priority. If you reference `/src/styles/_carbon.scss`, you'll see one `@import` that is pulling in Carbon's full Sass build.
+
+##### src/styles/\_carbon.scss
+
+```scss
+$feature-flags: (
+ grid-columns-16: true,
+);
+
+@import 'carbon-components/scss/globals/scss/styles.scss';
+```
+
+To give you an idea of what's all included, open up `node_modules/carbon-components/scss/globals/scss/styles.scss`. You'll see imports for components like accordion, slider, tooltip, etc. Since we aren't using those components, let's exclude them from our built stylesheets. Keeping the `$feature-flags` Sass map, replace the `styles.scss` import only with:
+
+##### src/styles/\_carbon.scss
+
+```scss
+// Feature flags
+$css--font-face: true;
+$css--plex: true;
+
+// Global styles
+@import 'carbon-components/scss/globals/scss/css--font-face';
+@import 'carbon-components/scss/globals/grid/grid';
+
+// Carbon components
+@import 'carbon-components/scss/components/breadcrumb/breadcrumb';
+@import 'carbon-components/scss/components/button/button';
+@import 'carbon-components/scss/components/data-table/data-table';
+@import 'carbon-components/scss/components/link/link';
+@import 'carbon-components/scss/components/pagination/pagination';
+@import 'carbon-components/scss/components/tabs/tabs';
+@import 'carbon-components/scss/components/ui-shell/ui-shell';
+```
+
+In comparing to the included `styles.scss`, you may be asking what happened to importing `_vars.scss`, `_colors.scss`, `_theme.scss`, etc.? Many of those global Sass partials get imported through the components. For example, open `node_modules/carbon-components/scss/components/button/_button.scss` to see its dependencies. No harm in importing them as `styles.scss` does, but for simplicity here, we'll let the components pull them in.
+
+You can read more about optimizing Carbon's Sass in the [Carbon Design System publication](https://medium.com/carbondesign/minimal-css-with-carbon-b0c089ccfa71) on Medium.
+
+## Build for production
+
+Before we deploy our app, we need to create an optimized production build with this command. You may need to `CTRL-C` to stop the development environment first.
+
+```bash
+$ yarn build
+```
+
+Looking at `package.json`, you'll find `yarn build` to run `vue-cli-service build`. This builds the app for production to the `dist` folder. It bundles Vue in production mode and optimizes the build for the best performance. It even goes so far to minify files and include hashes in filenames for caching.
+
+As a lot of this may seem like magic since the build configuration came from the Vue CLI, go ahead and check out their [production build guidelines](https://cli.vuejs.org/guide/build-targets.html#app) for a full description of what's happening.
+
+## Create manifest file
+
+Now that we have a production build, let's get it on the cloud. We're going to use [staticfile-buildpack](https://github.com/cloudfoundry/staticfile-buildpack.git) to deploy our webapp. We'll be using the `ibmcloud` command line interface (CLI). If running `ibmcloud help` doesn't work for you, chances are you need to [install the CLI](https://cloud.ibm.com/docs/cli?topic=cloud-cli-install-ibmcloud-cli).
+
+_Note: If unfamiliar with buildpacks, the [staticfile buildpack docs](https://docs.cloudfoundry.org/buildpacks/staticfile/index.html) has good definitions and configuration documentation._
+
+With the IBM Cloud CLI installed, next, we need to create a `manifest.yml` file in the root of the project. To prevent multiple apps trying to use the `carbon-tutorial-vue` name, replace `USERNAME` with your GitHub username below to make sure our apps are uniquely named.
+
+##### manifest.yml
+
+```bash
+---
+applications:
+ - name: carbon-tutorial-vue-USERNAME
+ memory: 64M
+ buildpack: https://github.com/cloudfoundry/staticfile-buildpack.git
+```
+
+_Note: With this set-up we're still using a GitHub personal access token saved in _`.env.local`_. If you haven't created a GitHub access token yet, see [step 3](/tutorial/step-3/vue#create-access-token). You can put the environment variable in the manifest file, or manually add it in the IBM Cloud dashboard, but since we're building off previous tutorial steps nothing more is needed._
+
+## Create static file
+
+Create a new static file in the root of the project named `Staticfile`. This tells the app to deploy from the `dist` folder and not the root of the project.
+
+##### Staticfile
+
+```bash
+root: dist
+```
+
+### Cloud Foundry ignore
+
+After telling Cloud Foundry what to include, we can also specify what to ignore. Create a top-level `.cfignore` file. Cloud Foundry doesn't let you push read-only files (specifically, files with permissions <`400`), so to prevent issues with the deploy, add:
+
+##### .cfignore
+
+```bash
+node_modules/.cache
+```
+
+You can speed up deploys by decreasing the files uploaded through IBM Cloud. To accomplish this, ignore any folder not required by the production application on IBM Cloud. For example, in the case of serving static files, you can ignore `node_modules/` and `src/` because the only folder being served is `dist/`.
+
+## Deploy app
+
+Login to IBM Cloud.
+
+```bash
+$ cf login -sso
+```
+
+Deploy app using the `cf push` command. Since `manifest.yml` is in our root directory, we don't need to specify it in the push command. But, if you have multiple manifest files that target different environments, it's good practice to specify the file.
+
+```bash
+$ cf push -f manifest.yml
+```
+
+To make it easy on ourselves by not needing to remember that command, let's add a script in `package.json`. We can combine the build and deploy steps to make sure we only deploy immediately after running the build. In the `"scripts"` object in `package.json`, add:
+
+##### package.json
+
+```bash
+"deploy": "rm -rf ./dist && yarn build && cf push -f manifest.yml"
+```
+
+Next time you want to deploy, you can simply run `yarn deploy`.
+
+## Submit pull request
+
+That does it! We're going to submit a pull request to verify completion of this tutorial step. In doing so, **please include the mybluemix.net URL for your deployed app in your pull request description**.
+
+### Continuous integration (CI) check
+
+Run the CI check to make sure we're all set to submit a pull request.
+
+```bash
+$ yarn ci-check
+```
+
+_Note: Having issues running the CI check? [Step 1]() has troubleshooting notes that may help._
+
+### Git commit and push
+
+Before we can create a pull request, stage and commit all of your changes:
+
+```bash
+$ git add --all && git commit -m "feat(tutorial): complete step 5"
+```
+
+Then, push to your repository:
+
+```bash
+$ git push origin vue-step-5
+```
+
+_Note: Having issues pushing your changes? [Step 1](/tutorial/step-1/vue#git-commit-and-push) has troubleshooting notes that may help._
+
+### Pull request (PR)
+
+Finally, visit [carbon-tutorial](https://github.com/carbon-design-system/carbon-tutorial) to "Compare & pull request". In doing so, make sure that you are comparing to `vue-step-5` into `base: vue-step-5`.
+
+_Note: Expect your tutorial step PRs to be reviewed by the Carbon team but not merged. We'll close your PR so we can keep the repository's remote branches pristine and ready for the next person!_
diff --git a/src/content/tutorial/vue/wrapping-up.mdx b/src/content/tutorial/vue/wrapping-up.mdx
new file mode 100644
index 0000000000..a3c51cd7ab
--- /dev/null
+++ b/src/content/tutorial/vue/wrapping-up.mdx
@@ -0,0 +1,65 @@
+---
+title: Wrapping up
+tabs:
+ ['Overview', 'Step 1', 'Step 2', 'Step 3', 'Step 4', 'Step 5', 'Wrapping up']
+---
+
+### Thanks for completing our tutorial and helping us improve it along the way. As a way to say thanks, you can apply for an IBM Digital Badge and a free shirt!
+
+
+
+- [Badging](#badging)
+- [Free t-shirt\*](#free-t-shirt)
+- [Application](#application)
+
+
+
+## Badging
+
+Once you complete all five steps of the tutorial, you can apply for the IBM Digital Badge. These badges are available to anybody—not just IBM employees.
+
+
+
+![](/images/carbon-badge-vue.png)
+
+
+
+### IBM Design System Vue Components
+
+This badge demonstrates knowledge about Carbon's Vue components. To earn the badge:
+
+1. Complete steps 1 through 5 of the Vue Carbon tutorial
+ - Step 1. [Installing Carbon](/tutorial/step-1/vue)
+ - Step 2. [Building pages](/tutorial/step-2/vue)
+ - Step 3. [Using APIs](/tutorial/step-3/vue)
+ - Step 4. [Creating components](/tutorial/step-4/vue)
+ - Step 5. [Deploying to IBM Cloud](/tutorial/step-5/vue)
+2. Submit links to approved pull requests for steps 1 through 5 of the Vue Carbon tutorial in the [carbon-tutorial-vue repository](https://github.com/carbon-design-system/carbon-tutorial-vue).
+ - To quickly find your submitted PRs, you can [filter by author](https://github.com/carbon-design-system/carbon-tutorial-vue/pulls?utf8=%E2%9C%93&q=author%3Ausername) (e.g. `author:${username}`)
+3. Complete the [badge application](http://www.carbondesignsystem.com/tutorial/wrapping-up/vue#application)
+
+### FAQ and help
+
+Badge Issuer Contact: kellychurchill@us.ibm.com
+
+Acclaim Support: For questions related to your Acclaim badge earner account and profile, as well as issues related to claiming your badge after receiving a notification, go to [http://support.youracclaim.com](http://support.youracclaim.com) for account issues.
+
+### Privacy statement
+
+NOTICE: IBM leverages the services of Credly's Acclaim platform, a 3rd party data processor authorized by IBM and located in the United States, to assist in the administration of the IBM Digital Badge program. In order to issue you an IBM Digital Badge, your personal information (name, email address, and badge earned) will be shared with the Credly's Acclaim platform. You will receive an email notification from Acclaim with instructions for claiming the badge. Your personal information is used to issue your badge and for program reporting and operational purposes. It will be handled in a manner consistent with IBM privacy practices. The IBM Privacy Statement can be viewed here: [https://www.ibm.com/privacy/us/en/](https://www.ibm.com/privacy/us/en/). IBM employees can view the IBM Internal Privacy Statement here: [https://w3.ibm.com/w3publisher/w3-privacy-notice](https://w3.ibm.com/w3publisher/w3-privacy-notice).
+
+## Free t-shirt
+
+Submit your completed IBM Digital Badge application by September 15, 2019, and receive a free\* Carbon t-shirt.
+
+
+
+![](../shared/wrapping-up/images/carbon-tee.png)
+
+
+
+## Application
+
+Complete the [application form](https://www.surveygizmo.com/s3/5135615/IBM-Carbon-Design-System-Developer-Essentials-Vue) to request the digital badge and t-shirt. Once you submit the application, please allow 2-4 days for issuing the badge and 4-6 weeks to receive the t-shirt. Once the badge is issued, you will be notified and must accept the badge via Acclaim.
+
+_\* Shirts are available for a limited time while supplies last to U.S. shipping addresses and outside the U.S. to participating FED@IBM branches._
diff --git a/src/data/navigation/navigation.json b/src/data/navigation/navigation.json
index 8db17945c8..b3f2638e58 100644
--- a/src/data/navigation/navigation.json
+++ b/src/data/navigation/navigation.json
@@ -14,28 +14,13 @@
}
},
"tutorial": {
- "title": "Tutorial",
+ "title": "Tutorials",
"sub-nav": {
- "overview": {
- "title": "Overview"
- },
- "react-step-1": {
- "title": "1. Installing Carbon"
- },
- "react-step-2": {
- "title": "2. Building pages"
- },
- "react-step-3": {
- "title": "3. Using APIs"
- },
- "react-step-4": {
- "title": "4. Creating components"
- },
- "react-step-5": {
- "title": "5. Deploying to IBM Cloud"
+ "react": {
+ "title": "React"
},
- "wrapping-up": {
- "title": "Wrapping up"
+ "vue": {
+ "title": "Vue"
}
}
},