diff --git a/package.json b/package.json
index b7060ddc12b..8ef171ec3c5 100644
--- a/package.json
+++ b/package.json
@@ -23,6 +23,7 @@
"@emotion/react": "^11.1.5",
"@emotion/styled": "^11.3.0",
"@mdx-js/mdx": "^2.0.0",
+ "@octokit/rest": "^19.0.7",
"algoliasearch": "^4.12.1",
"array-flatten": "^3.0.0",
"aws-amplify": "^5.0.5",
@@ -40,6 +41,8 @@
"ramda": "^0.28.0",
"react": "^17.0.2",
"react-dom": "^17.0.2",
+ "react-icons": "^4.7.1",
+ "react-syntax-highlighter": "^15.5.0",
"rehype": "^11.0.0",
"remark": "^14.0.2",
"remark-mdx": "^2.0.0",
diff --git a/public/fonts/AmazonEmberDisplay_Bd.ttf b/public/fonts/AmazonEmberDisplay_Bd.ttf
new file mode 100644
index 00000000000..18d2fec4ee8
Binary files /dev/null and b/public/fonts/AmazonEmberDisplay_Bd.ttf differ
diff --git a/public/fonts/AmazonEmberDisplay_BdIt.ttf b/public/fonts/AmazonEmberDisplay_BdIt.ttf
new file mode 100644
index 00000000000..b9758e17a84
Binary files /dev/null and b/public/fonts/AmazonEmberDisplay_BdIt.ttf differ
diff --git a/public/fonts/AmazonEmberDisplay_Rg.ttf b/public/fonts/AmazonEmberDisplay_Rg.ttf
new file mode 100644
index 00000000000..b5b38fe0de9
Binary files /dev/null and b/public/fonts/AmazonEmberDisplay_Rg.ttf differ
diff --git a/public/fonts/AmazonEmberDisplay_RgIt.ttf b/public/fonts/AmazonEmberDisplay_RgIt.ttf
new file mode 100644
index 00000000000..0e01f86b7ea
Binary files /dev/null and b/public/fonts/AmazonEmberDisplay_RgIt.ttf differ
diff --git a/public/fonts/AmazonEmberMono_Bd.ttf b/public/fonts/AmazonEmberMono_Bd.ttf
new file mode 100644
index 00000000000..7a4c2742071
Binary files /dev/null and b/public/fonts/AmazonEmberMono_Bd.ttf differ
diff --git a/public/fonts/AmazonEmber_Bd.ttf b/public/fonts/AmazonEmber_Bd.ttf
new file mode 100644
index 00000000000..eb6eb4e30fa
Binary files /dev/null and b/public/fonts/AmazonEmber_Bd.ttf differ
diff --git a/public/images/contribute/contributor-bash-og-image.png b/public/images/contribute/contributor-bash-og-image.png
new file mode 100644
index 00000000000..aeba2e5b0af
Binary files /dev/null and b/public/images/contribute/contributor-bash-og-image.png differ
diff --git a/public/images/contribute/open-pr.png b/public/images/contribute/open-pr.png
new file mode 100644
index 00000000000..247ec5f1d94
Binary files /dev/null and b/public/images/contribute/open-pr.png differ
diff --git a/public/images/contribute/open-vs-code.png b/public/images/contribute/open-vs-code.png
new file mode 100644
index 00000000000..9692d69fcf1
Binary files /dev/null and b/public/images/contribute/open-vs-code.png differ
diff --git a/src/components/Footer/index.tsx b/src/components/Footer/index.tsx
index 59c6915c178..40e1cd09e61 100644
--- a/src/components/Footer/index.tsx
+++ b/src/components/Footer/index.tsx
@@ -1,3 +1,4 @@
+import Link from 'next/link';
import { Footer, RightFooter, LeftFooter, Social, Legal } from './styles';
import { Container } from '../Container';
import ExternalLink from '../ExternalLink';
@@ -12,8 +13,9 @@ export default function DocsFooter() {
Amplify
- Getting Started
+ Getting Started
Community Chat
+ Contribute
diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx
index 51e18b5c7d1..be9984265e1 100644
--- a/src/components/Layout/index.tsx
+++ b/src/components/Layout/index.tsx
@@ -42,6 +42,8 @@ export default function Layout({
.filter((s) => s !== '')
.join(' - ');
+ const current = meta.title.includes('Contribut') ? 'Contribute' : 'Docs';
+
return (
<>
{meta && (
@@ -83,7 +85,7 @@ export default function Layout({
leftLinks={LEFT_NAV_LINKS as NavMenuItem[]}
rightLinks={RIGHT_NAV_LINKS as NavMenuItem[]}
socialLinks={SOCIAL_LINKS as NavMenuItem[]}
- currentSite={'Docs'}
+ currentSite={current}
/>
diff --git a/src/components/contribute/CardIssues.tsx b/src/components/contribute/CardIssues.tsx
new file mode 100644
index 00000000000..895dcc42f83
--- /dev/null
+++ b/src/components/contribute/CardIssues.tsx
@@ -0,0 +1,73 @@
+import {
+ Flex,
+ Collection,
+ Divider,
+ Button,
+ Text,
+ Link,
+ Heading,
+ Badge,
+ View
+} from '@aws-amplify/ui-react';
+import { FiExternalLink, FiGitPullRequest } from 'react-icons/fi';
+import { VscIssues } from 'react-icons/vsc';
+import { PropsWithChildren } from 'react';
+
+export type IssuesProps = PropsWithChildren<{
+ title: string;
+ issues: any[];
+ repo: string;
+ description: string;
+}>;
+
+export default function Issues({ title, issues, repo, description }) {
+ return (
+
+
+
+ {' '}
+ {title}
+
+
+
+ {description}
+
+
+ {(item, index) => (
+
+
+
+
+
+
+ {item.title}
+
+
+ good first issue
+
+
+
+
+ )}
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/components/contribute/HowItWorks.tsx b/src/components/contribute/HowItWorks.tsx
new file mode 100644
index 00000000000..e91e00eb395
--- /dev/null
+++ b/src/components/contribute/HowItWorks.tsx
@@ -0,0 +1,169 @@
+import {
+ Divider,
+ Flex,
+ Heading,
+ Text,
+ Badge,
+ Card,
+ View,
+ Link
+} from '@aws-amplify/ui-react';
+import { MdOutlineBadge, MdLabelOutline, MdCelebration } from 'react-icons/md';
+import {
+ FiExternalLink,
+ FiGithub,
+ FiCheck,
+ FiGitPullRequest
+} from 'react-icons/fi';
+
+export default function HowItWorks() {
+ return (
+
+
+
+ Making a Contribution
+
+ How it works
+
+
+ The steps below outline how to participate. Right now, only accepted PRs
+ will be considered.
+
+
+
+
+
+
+ {' '}
+
+
+
+ Amplify Contributor Program is open to everyone in our Amplify
+ community!
+
+
+
+
+
+
+
+ {' '}
+
+
+
+ The Amplify team will label issues using{' '}
+ good first issue for contributors.
+
+
+
+
+
+
+
+ {' '}
+
+
+
+ The pull request must contain commits you made yourself.
+
+
+
+
+
+
+
+ {' '}
+
+
+ The Amplify team will review the submitted PRs.
+
+
+
+
+
+
+ {' '}
+
+
+ Pull requests must be approved by the Amplify Team.
+
+
+
+
+
+
+ {' '}
+
+
+
+ Receive a contributor role in the{' '}
+
+ Amplify Community Discord server
+
+ .
+
+
+
+
+
+ );
+}
diff --git a/src/components/contribute/Layout.tsx b/src/components/contribute/Layout.tsx
new file mode 100644
index 00000000000..c78f573331c
--- /dev/null
+++ b/src/components/contribute/Layout.tsx
@@ -0,0 +1,54 @@
+import Head from 'next/head'
+import { ThemeProvider } from '@aws-amplify/ui-react';
+import { default as BaseLayout } from '../Layout';
+import { theme } from './theme';
+import type { PropsWithChildren } from 'react';
+
+export type LayoutProps = PropsWithChildren<{
+ // @todo use types from Layout component
+ meta: {
+ title: string;
+ description: string;
+ };
+}>;
+
+export default function Layout({ children, meta }: LayoutProps) {
+ const creator = '@AWSAmplify';
+ const url = 'https://docs.amplify.aws/contribute';
+ return (
+ <>
+
+ AWS Amplify Contributor Program
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {children}
+
+
+ >
+ );
+}
diff --git a/src/components/contribute/QuickstartResources.tsx b/src/components/contribute/QuickstartResources.tsx
new file mode 100644
index 00000000000..32bec76a104
--- /dev/null
+++ b/src/components/contribute/QuickstartResources.tsx
@@ -0,0 +1,45 @@
+import { Heading, View, Text, Flex } from '@aws-amplify/ui-react';
+
+export default function QuickstartResources() {
+ return (
+
+
+ Quickstart videos
+
+ Get your local environment set up quickly by following along with the
+ below videos.
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/components/contribute/theme.ts b/src/components/contribute/theme.ts
new file mode 100644
index 00000000000..61a17dd2d87
--- /dev/null
+++ b/src/components/contribute/theme.ts
@@ -0,0 +1,20 @@
+import { defaultTheme } from '@aws-amplify/ui-react';
+
+export const theme = {
+ ...defaultTheme,
+ name: 'contributor',
+ tokens: {
+ colors: {
+ brand: {
+ squidInk: { value: '#232F3E' },
+ anchor: { value: '#003181' },
+ sky: { value: '#2074d5' },
+ rind: { value: '#fbd8bf' },
+ smile: { value: '#ff9900' },
+ darkSquidInk: { value: '#161E2D' },
+ stone: { value: '#d4dada ' },
+ paper: { value: 'f1f3f3' }
+ }
+ }
+ }
+};
diff --git a/src/constants/links.ts b/src/constants/links.ts
index af56f705ba6..dd10f457655 100644
--- a/src/constants/links.ts
+++ b/src/constants/links.ts
@@ -1,6 +1,6 @@
export const DISCORD = 'https://discord.gg/amplify';
export const LEARN = 'https://amplify.aws/learn';
-export const CONTRIBUTE = 'https://contributetoamplify.com/';
+export const CONTRIBUTE = 'https://docs.amplify.aws/contribute';
export const TWITTER = 'https://twitter.com/AWSAmplify';
export const GITHUB = 'https://github.com/aws-amplify';
export const TERMS = 'https://aws.amazon.com/terms/';
diff --git a/src/directory/directory.js b/src/directory/directory.js
index a4e41f99873..ee98bb2f56c 100644
--- a/src/directory/directory.js
+++ b/src/directory/directory.js
@@ -1,4 +1,11 @@
const directory = {
+ contribute: {
+ productRoot: {
+ title: 'Contribute',
+ route: '/contribute'
+ },
+ items: {}
+ },
lib: {
productRoot: {
title: 'Amplify Libraries',
@@ -790,7 +797,11 @@ const directory = {
route: '/lib/utilities/serviceworker',
filters: ['js']
},
- { title: 'Cache', route: '/lib/utilities/cache', filters: ['js', 'react-native'] },
+ {
+ title: 'Cache',
+ route: '/lib/utilities/cache',
+ filters: ['js', 'react-native']
+ },
{
title: 'Hub',
route: '/lib/utilities/hub',
diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx
index 48b7542d69a..f846a1671bc 100644
--- a/src/pages/_app.tsx
+++ b/src/pages/_app.tsx
@@ -1,5 +1,6 @@
import '@algolia/autocomplete-theme-classic';
import '../styles/styles.css';
+import '../styles/contribute-styles.css';
import Head from 'next/head';
function MyApp({ Component, pageProps }) {
diff --git a/src/pages/contribute/getting-started.tsx b/src/pages/contribute/getting-started.tsx
new file mode 100644
index 00000000000..505b5768d83
--- /dev/null
+++ b/src/pages/contribute/getting-started.tsx
@@ -0,0 +1,387 @@
+import {
+ Badge,
+ Heading,
+ Text,
+ Link,
+ Image,
+ View,
+ Flex,
+ Icon
+} from '@aws-amplify/ui-react';
+import { FiExternalLink } from 'react-icons/fi';
+import { MdCheckCircle, MdOutlineInfo } from 'react-icons/md';
+import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';
+import Layout from '../../components/contribute/Layout';
+
+const _4a = `
+git status
+
+On branch main
+Your branch is up to date with 'origin/main'.
+
+nothing to commit, working tree clean
+`.trim();
+
+const _6a = `
+git add .
+git commit -m "A commit message"
+git push -u origin
+`.trim();
+
+const _6b = `
+Enumerating objects: 5, done.
+Counting objects: 100% (5/5), done.
+Delta compression using up to 8 threads
+Compressing objects: 100% (3/3), done.
+Writing objects: 100% (3/3), 323 bytes | 323.00 KiB/s, done.
+Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
+remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
+remote:
+remote: Create a pull request for on GitHub by visiting:
+remote: https://github.com/offlineprogrammer/amplify-js/pull/new/feat/
+remote:
+To https://github.com/offlineprogrammer/amplify-js.git
+ * [new branch] feat/my-amazing-branche -> feat/
+Branch 'feat/' set up to track remote branch 'feat/' from 'origin'.
+`.trim();
+
+const _5a = `
+git checkout -b "//"
+# or
+git checkout -b "/"
+`.trim();
+
+const Code = ({ children, color }) => {
+ return (
+
+ {children}
+
+ );
+};
+
+export default function ContributeGettingStartedPage() {
+ const meta = {
+ title: 'AWS Amplify Contributor Program - Getting Started',
+ description:
+ 'The steps below will help you get set up to open a pull request in the Amplify JS project. The Amplify Contributor Program is an open invitation for you to participate in the Amplify open source development journey.'
+ };
+ return (
+
+
+
+
+ Getting Started
+
+ The steps below will help you get set up to open a pull request in
+ the Amplify JS project. Check out the CONTRIBUTING.md{' '}
+ in each project's repository for instructions on how to get
+ started with local environment set up.
+
+
+ The Amplify Contributor Program is an open invitation for you to
+ participate in the Amplify open source development journey. It is
+ a great way to learn more about the Amplify ecosystem and make
+ constructive, helpful pull requests. It builds your resume by
+ demonstrating that you can collaborate with others on code, and it
+ feels good to give back to a project you use! We're looking
+ forward to developing with you!
+
+
+
+ Prerequisites
+
+
+
+ A GitHub account. You can create one{' '}
+
+ here .
+
+
+
+
+ IDE (e.g. VS Code)
+
+
+
+ Amplify JS development environment. Follow the steps{' '}
+
+ here
+
+ {' '}
+ to get set up.
+
+
+
+ Set up the Amplify Docs{' '}
+
+ development environment
+
+ .Optional
+
+
+
+
+ Steps to take to make your contribution
+
+
+
+
+ Start on the{' '}
+
+ contributing page
+ {' '}
+ of the Amplify JS repo and find the right issue for you.
+
+
+
+ Open VS Code and clone your fork down to your machine so you
+ can begin making changes.{' '}
+
+
+
+
+
+
+
+ Run git status before you start coding to make
+ sure everything in the project files are updated with the{' '}
+ origin/main branch.
+
+ {_4a}
+
+
+
+ Use one of the commands below to create a new branch within
+ your fork.
+
+ {_5a}
+
+
+
+ {' '}
+
+ Use the group-token to
+ indicate the category you are working on. e.g.{' '}
+ amplify-datastore.
+
+
+
+ {' '}
+
+ The short-token can be one
+ of the following: feat, chore,
+ or bug.
+
+
+
+ {' '}
+
+ The branch-name should be
+ representative of the feature or fix.
+
+
+
+
+ Make your contribution and then run git add,{' '}
+ git commit and push your branch.
+
+ {_6a}
+
+
+ GitHub will process the push command and display a link to
+ create a pull request.
+
+ {_6b}
+
+
+
+ Click on the link to create a new pull request using the
+ Amplify JS PR template.
+
+
+
+
+
+
+ That's it!
+
+ The Amplify team will review your PR and provide feedback if
+ needed. The review process might require API design & security
+ reviews. For such cases it might take up to 4 weeks to complete
+ the review. Make sure to address any automated check that fail
+ (such as linting, unit tests, etc. in the CI pipeline). Finally,
+ once your changes meet the requirements and checks, the team
+ will merge your changes into the Amplify JS repo.
+
+
+
+ Well done and congrats! We're very excited about your
+ contribution!
+
+
+
+
+ Resources
+
+ We've put together a few resources that can help you create
+ quality PRs.
+
+
+
+
+ Amplify JS Contributing Guidelines
+
+
+
+
+ Please read through these guidelines carefully before submitting
+ a PR.
+
+
+
+
+ Amplify Documentation
+
+
+
+
+ Learn more about AWS Amplify the the JS library.
+
+
+
+
+ Amplify Community Discord server
+
+
+
+
+ This is a great place to meet other developers using Amplify,
+ ask questions, and share what you're building with Amplify.
+
+
+
+
+ The contribute-to-javascript Discord channel
+
+
+
+
+ Meet other contributors and ask questions related to
+ contributing to Amplify JS.
+
+
+
+ Amplify Discord Office Hours
+
+
+
+
+
+ Join the weekly office hour in the Discord Voice channel where
+ you can ask questions, share what you're working on and get
+ feedback.
+
+
+
+
+
+
+ );
+}
diff --git a/src/pages/contribute/index.tsx b/src/pages/contribute/index.tsx
new file mode 100644
index 00000000000..46010fed43e
--- /dev/null
+++ b/src/pages/contribute/index.tsx
@@ -0,0 +1,175 @@
+import NextLink from 'next/link';
+import {
+ Button,
+ Flex,
+ View,
+ Heading,
+ Text,
+ Link,
+ Card
+} from '@aws-amplify/ui-react';
+import { FiExternalLink } from 'react-icons/fi';
+import Layout from '../../components/contribute/Layout';
+import Issues from '../../components/contribute/CardIssues';
+import HowItWorks from '../../components/contribute/HowItWorks';
+import QuickstartResources from '../../components/contribute/QuickstartResources';
+
+import { Octokit } from '@octokit/rest';
+import { Endpoints } from '@octokit/types';
+
+type listRepoIssuesResponse = Endpoints['GET /repos/{owner}/{repo}/issues']['response'];
+
+export async function getStaticProps() {
+ const octokit = new Octokit({});
+
+ const {
+ data: JsIssues
+ }: {
+ data: listRepoIssuesResponse['data'];
+ } = await octokit.rest.issues.listForRepo({
+ owner: 'aws-amplify',
+ repo: 'amplify-js',
+ state: 'open',
+ labels: 'good first issue',
+ // eslint-disable-next-line @typescript-eslint/camelcase
+ per_page: 6
+ });
+
+ const {
+ data: CLIissues
+ }: {
+ data: listRepoIssuesResponse['data'];
+ } = await octokit.rest.issues.listForRepo({
+ owner: 'aws-amplify',
+ repo: 'amplify-cli',
+ state: 'open',
+ labels: 'good first issue',
+ // eslint-disable-next-line @typescript-eslint/camelcase
+ per_page: 6
+ });
+
+ return {
+ props: { JsIssues, CLIissues },
+ revalidate: 60 * 60
+ };
+}
+
+export default function ContributorPage({ JsIssues, CLIissues }) {
+ const meta = {
+ title: 'AWS Amplify Contributor Program',
+ description:
+ 'The Amplify Contributor Program is an open invitation for you to participate in the Amplify open source development journey. Get involved with AWS Amplify by making open source contributions to the Amplify project!'
+ };
+ return (
+ <>
+
+ {/* Nav - need to put in matching nav */}
+ {/* */}
+
+
+
+
+ AWS Amplify
+
+
+ Contributor Program
+
+
+
+ Get involved with AWS Amplify by making open source
+ contributions to the project.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Start contributing!
+
+
+ Thank you for your interest in contributing! Whether it's a bug
+ report, new feature, correction, or additional documentation, we
+ greatly value feedback and contributions from our community.
+ Check out the issues and discussions in the Amplify projects
+ below to get started!
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* */}
+
+
+
+ >
+ );
+}
diff --git a/src/styles/contribute-styles.css b/src/styles/contribute-styles.css
new file mode 100644
index 00000000000..d64d2d1e03d
--- /dev/null
+++ b/src/styles/contribute-styles.css
@@ -0,0 +1,116 @@
+@font-face {
+ font-family: 'AmazonEmberReg';
+ src: url('/fonts/AmazonEmberDisplay_Rg.ttf') format('truetype');
+ font-style: normal;
+ font-display: swap;
+}
+@font-face {
+ font-family: 'AmazonEmberRegIt';
+ src: url('/fonts/AmazonEmberDisplay_RgIt.ttf') format('truetype');
+ font-style: italic;
+ font-display: swap;
+}
+@font-face {
+ font-family: 'AmazonEmberBd';
+ src: url('/fonts/AmazonEmberDisplay_Bd.ttf') format('truetype');
+ font-style: normal;
+ font-display: swap;
+}
+@font-face {
+ font-family: 'AmazonEmberBdIt';
+ src: url('/fonts/AmazonEmberDisplay_BdIt.ttf') format('truetype');
+ font-style: italic;
+ font-display: swap;
+}
+@font-face {
+ font-family: 'AmazonEmberMono';
+ src: url('/fonts/AmazonEmberMono_Bd.ttf');
+ font-style: normal;
+ font-display: swap;
+}
+
+#contributor-page * {
+ font-family: AmazonEmberReg, sans-serif;
+}
+
+#contributor-page .amplify-button {
+ box-shadow: rgb(0 0 0 / 25%) 0px 0.125rem 0.25rem;
+}
+#contributor-page .amplify-button:hover {
+ box-shadow: rgb(0 0 0 / 50%) 0px 0.125rem 0.25rem;
+ background-color: inherit;
+ border-color: var(--amplify-components-button-border-color);
+ border-radius: var(--amplify-components-button-border-radius);
+ border-style: var(--amplify-components-button-border-style);
+ border-width: var(--amplify-components-button-border-width);
+}
+#contributor-page .amplify-button--primary {
+ background-color: #ff9900;
+ color: #232f3e;
+}
+#contributor-page .amplify-button--primary:hover {
+ background-color: #ff9900;
+ color: #232f3e;
+}
+#contributor-page .amplify-badge--info {
+ background-color: #2074d5;
+ color: white;
+}
+#contributor-page .amplify-link {
+ color: #ff9900;
+}
+#contributor-page .amplify-link:visited {
+ color: #ff9900;
+}
+#contributor-page .amplify-heading--1,
+#contributor-page .amplify-heading--2 {
+ font-family: AmazonEmberBd;
+}
+#contributor-page .code-snippet {
+ border: 1px solid var(--amplify-colors-neutral-40);
+ border-radius: var(--amplify-radii-xs);
+ padding: 2px 5px;
+ font-family: AmazonEmberMono;
+ width: fit-content;
+ display: inline;
+ font-size: 0.8125em;
+}
+#contributor-page li {
+ margin: 1em 0;
+}
+#contributor-page pre code,
+#contributor-page pre code span {
+ font-size: 1rem !important;
+ text-shadow: none !important;
+}
+
+#contributor-page pre {
+ border-style: solid;
+ border-radius: 0.5rem;
+ border-width: 1px;
+ color: black;
+ background: #fff !important;
+ border-color: rgba(0, 0, 0, 0.3);
+ text-shadow: none important!;
+ font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+ font-size: 1rem !important;
+ text-align: left;
+ white-space: pre;
+ word-spacing: normal;
+ word-break: normal;
+ word-wrap: normal;
+ line-height: 1.5;
+ -moz-tab-size: 4;
+ -o-tab-size: 4;
+ tab-size: 4;
+ -webkit-hyphens: none;
+ -moz-hyphens: none;
+ -ms-hyphens: none;
+ hyphens: none;
+ padding-left: 1rem !important;
+ padding-right: 1rem !important;
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ margin: 0.5 em 0;
+ overflow: auto;
+}
diff --git a/src/utils/globalnav.ts b/src/utils/globalnav.ts
index 912565a9ad4..98b531a362a 100644
--- a/src/utils/globalnav.ts
+++ b/src/utils/globalnav.ts
@@ -31,6 +31,12 @@ export const LEFT_NAV_LINKS = [
label: 'UI Library',
url: 'https://ui.docs.amplify.aws/',
order: 3
+ },
+ {
+ type: 'DEFAULT',
+ label: 'Contribute',
+ url: '/contribute/',
+ order: 4
}
];
diff --git a/yarn.lock b/yarn.lock
index 4f6f43b73f5..d6a51352360 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2728,6 +2728,13 @@
dependencies:
regenerator-runtime "^0.13.11"
+"@babel/runtime@^7.3.1":
+ version "7.21.0"
+ resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673"
+ integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==
+ dependencies:
+ regenerator-runtime "^0.13.11"
+
"@babel/template@^7.12.7", "@babel/template@^7.14.5", "@babel/template@^7.3.3":
version "7.16.7"
resolved "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz"
@@ -3816,6 +3823,107 @@
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.4.tgz#a72ed44c9b1f850986a30fe36c59e01f8a79b5f3"
integrity sha512-JtYuWzKXKLDMgE/xTcFtCm1MiCIRaAc5XYZfYX3n/ZWSI1SJS/GMm+Su0SAHJgRFavJh6U/p998YwO/iGTIgqQ==
+"@octokit/auth-token@^3.0.0":
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-3.0.3.tgz#ce7e48a3166731f26068d7a7a7996b5da58cbe0c"
+ integrity sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==
+ dependencies:
+ "@octokit/types" "^9.0.0"
+
+"@octokit/core@^4.1.0":
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/@octokit/core/-/core-4.2.0.tgz#8c253ba9605aca605bc46187c34fcccae6a96648"
+ integrity sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==
+ dependencies:
+ "@octokit/auth-token" "^3.0.0"
+ "@octokit/graphql" "^5.0.0"
+ "@octokit/request" "^6.0.0"
+ "@octokit/request-error" "^3.0.0"
+ "@octokit/types" "^9.0.0"
+ before-after-hook "^2.2.0"
+ universal-user-agent "^6.0.0"
+
+"@octokit/endpoint@^7.0.0":
+ version "7.0.5"
+ resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-7.0.5.tgz#2bb2a911c12c50f10014183f5d596ce30ac67dd1"
+ integrity sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==
+ dependencies:
+ "@octokit/types" "^9.0.0"
+ is-plain-object "^5.0.0"
+ universal-user-agent "^6.0.0"
+
+"@octokit/graphql@^5.0.0":
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-5.0.5.tgz#a4cb3ea73f83b861893a6370ee82abb36e81afd2"
+ integrity sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==
+ dependencies:
+ "@octokit/request" "^6.0.0"
+ "@octokit/types" "^9.0.0"
+ universal-user-agent "^6.0.0"
+
+"@octokit/openapi-types@^16.0.0":
+ version "16.0.0"
+ resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-16.0.0.tgz#d92838a6cd9fb4639ca875ddb3437f1045cc625e"
+ integrity sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA==
+
+"@octokit/plugin-paginate-rest@^6.0.0":
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.0.0.tgz#f34b5a7d9416019126042cd7d7b811e006c0d561"
+ integrity sha512-Sq5VU1PfT6/JyuXPyt04KZNVsFOSBaYOAq2QRZUwzVlI10KFvcbUo8lR258AAQL1Et60b0WuVik+zOWKLuDZxw==
+ dependencies:
+ "@octokit/types" "^9.0.0"
+
+"@octokit/plugin-request-log@^1.0.4":
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85"
+ integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==
+
+"@octokit/plugin-rest-endpoint-methods@^7.0.0":
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.0.1.tgz#f7ebe18144fd89460f98f35a587b056646e84502"
+ integrity sha512-pnCaLwZBudK5xCdrR823xHGNgqOzRnJ/mpC/76YPpNP7DybdsJtP7mdOwh+wYZxK5jqeQuhu59ogMI4NRlBUvA==
+ dependencies:
+ "@octokit/types" "^9.0.0"
+ deprecation "^2.3.1"
+
+"@octokit/request-error@^3.0.0":
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-3.0.3.tgz#ef3dd08b8e964e53e55d471acfe00baa892b9c69"
+ integrity sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==
+ dependencies:
+ "@octokit/types" "^9.0.0"
+ deprecation "^2.0.0"
+ once "^1.4.0"
+
+"@octokit/request@^6.0.0":
+ version "6.2.3"
+ resolved "https://registry.yarnpkg.com/@octokit/request/-/request-6.2.3.tgz#76d5d6d44da5c8d406620a4c285d280ae310bdb4"
+ integrity sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA==
+ dependencies:
+ "@octokit/endpoint" "^7.0.0"
+ "@octokit/request-error" "^3.0.0"
+ "@octokit/types" "^9.0.0"
+ is-plain-object "^5.0.0"
+ node-fetch "^2.6.7"
+ universal-user-agent "^6.0.0"
+
+"@octokit/rest@^19.0.7":
+ version "19.0.7"
+ resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-19.0.7.tgz#d2e21b4995ab96ae5bfae50b4969da7e04e0bb70"
+ integrity sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==
+ dependencies:
+ "@octokit/core" "^4.1.0"
+ "@octokit/plugin-paginate-rest" "^6.0.0"
+ "@octokit/plugin-request-log" "^1.0.4"
+ "@octokit/plugin-rest-endpoint-methods" "^7.0.0"
+
+"@octokit/types@^9.0.0":
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/@octokit/types/-/types-9.0.0.tgz#6050db04ddf4188ec92d60e4da1a2ce0633ff635"
+ integrity sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw==
+ dependencies:
+ "@octokit/openapi-types" "^16.0.0"
+
"@radix-ui/number@1.0.0":
version "1.0.0"
resolved "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.0.tgz"
@@ -5396,6 +5504,11 @@ base@^0.11.1:
mixin-deep "^1.2.0"
pascalcase "^0.1.1"
+before-after-hook@^2.2.0:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c"
+ integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==
+
big.js@^5.2.2:
version "5.2.2"
resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz"
@@ -6239,6 +6352,11 @@ delayed-stream@~1.0.0:
resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
integrity "sha1-3zrhmayt+31ECqrgsp4icrJOxhk= sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
+deprecation@^2.0.0, deprecation@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919"
+ integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==
+
dequal@^2.0.0:
version "2.0.2"
resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz"
@@ -6946,6 +7064,13 @@ fast-xml-parser@^3.16.0:
dependencies:
strnum "^1.0.4"
+fault@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13"
+ integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==
+ dependencies:
+ format "^0.2.0"
+
fb-watchman@^2.0.0:
version "2.0.1"
resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz"
@@ -7077,6 +7202,11 @@ form-data@^3.0.0:
combined-stream "^1.0.8"
mime-types "^2.1.12"
+format@^0.2.0:
+ version "0.2.2"
+ resolved "https://registry.npmjs.org/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b"
+ integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==
+
fragment-cache@^0.2.1:
version "0.2.1"
resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz"
@@ -7615,6 +7745,11 @@ header-case@^2.0.4:
capital-case "^1.0.4"
tslib "^2.0.3"
+highlight.js@^10.4.1, highlight.js@~10.7.0:
+ version "10.7.3"
+ resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531"
+ integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==
+
hogan.js@^3.0.2:
version "3.0.2"
resolved "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz"
@@ -8102,6 +8237,11 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4:
dependencies:
isobject "^3.0.1"
+is-plain-object@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344"
+ integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==
+
is-potential-custom-element-name@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz"
@@ -8909,6 +9049,14 @@ lower-case@^2.0.2:
dependencies:
tslib "^2.0.3"
+lowlight@^1.17.0:
+ version "1.20.0"
+ resolved "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888"
+ integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==
+ dependencies:
+ fault "^1.0.0"
+ highlight.js "~10.7.0"
+
lru-cache@^6.0.0:
version "6.0.0"
resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz"
@@ -9689,7 +9837,7 @@ node-fetch@^2.6.1:
dependencies:
whatwg-url "^5.0.0"
-node-fetch@^2.6.9:
+node-fetch@^2.6.7, node-fetch@^2.6.9:
version "2.6.9"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6"
integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==
@@ -10202,11 +10350,16 @@ pretty-format@^27.0.2:
ansi-styles "^5.0.0"
react-is "^17.0.1"
-prismjs@^1.21.0:
+prismjs@^1.21.0, prismjs@~1.27.0:
version "1.27.0"
resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz"
integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==
+prismjs@^1.27.0:
+ version "1.29.0"
+ resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12"
+ integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==
+
process-nextick-args@~2.0.0:
version "2.0.1"
resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz"
@@ -10359,6 +10512,11 @@ react-generate-context@1.0.1:
resolved "https://registry.npmjs.org/react-generate-context/-/react-generate-context-1.0.1.tgz"
integrity sha512-rOFGh3KgC2Ot66DmVCcT1p8lVJCmmCjzGE5WK/KsyDFi43wpIbW1PYcr04cQ3mbF4LaIkY6SpK7k1DOgwtpUXA==
+react-icons@^4.7.1:
+ version "4.7.1"
+ resolved "https://registry.npmjs.org/react-icons/-/react-icons-4.7.1.tgz#0f4b25a5694e6972677cb189d2a72eabea7a8345"
+ integrity sha512-yHd3oKGMgm7zxo3EA7H2n7vxSoiGmHk5t6Ou4bXsfcgWyhfDKMpyKfhHR6Bjnn63c+YXBLBPUql9H4wPJM6sXw==
+
react-is@^16.13.1, react-is@^16.7.0:
version "16.13.1"
resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
@@ -10411,6 +10569,17 @@ react-style-singleton@^2.2.1:
invariant "^2.2.4"
tslib "^2.0.0"
+react-syntax-highlighter@^15.5.0:
+ version "15.5.0"
+ resolved "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz#4b3eccc2325fa2ec8eff1e2d6c18fa4a9e07ab20"
+ integrity sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==
+ dependencies:
+ "@babel/runtime" "^7.3.1"
+ highlight.js "^10.4.1"
+ lowlight "^1.17.0"
+ prismjs "^1.27.0"
+ refractor "^3.6.0"
+
react@^17.0.2:
version "17.0.2"
resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz"
@@ -10466,6 +10635,15 @@ redent@^3.0.0:
indent-string "^4.0.0"
strip-indent "^3.0.0"
+refractor@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz#ac318f5a0715ead790fcfb0c71f4dd83d977935a"
+ integrity sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==
+ dependencies:
+ hastscript "^6.0.0"
+ parse-entities "^2.0.0"
+ prismjs "~1.27.0"
+
regenerator-runtime@^0.11.0:
version "0.11.1"
resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz"
@@ -11927,6 +12105,11 @@ universal-cookie@^4.0.4:
"@types/cookie" "^0.3.3"
cookie "^0.4.0"
+universal-user-agent@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee"
+ integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==
+
universalify@^0.1.0, universalify@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"