website: remove source code (#12733)
This commit is contained in:
parent
3d68e16f1b
commit
685f9d527b
@ -1,55 +0,0 @@
|
||||
version: 2
|
||||
|
||||
jobs:
|
||||
build-website-docker-image:
|
||||
docker:
|
||||
- image: docker.mirror.hashicorp.services/circleci/buildpack-deps
|
||||
shell: /usr/bin/env bash -euo pipefail -c
|
||||
steps:
|
||||
- checkout
|
||||
- setup_remote_docker
|
||||
- run:
|
||||
name: Build Docker Image if Necessary
|
||||
command: |
|
||||
IMAGE_TAG=$(cat website/Dockerfile website/package-lock.json | sha256sum | awk '{print $1;}')
|
||||
echo "Using $IMAGE_TAG"
|
||||
if curl https://hub.docker.com/v2/repositories/hashicorp/vagrant-website/tags/$IMAGE_TAG -fsL > /dev/null; then
|
||||
echo "Dependencies have not changed, not building a new website docker image."
|
||||
else
|
||||
cd website/
|
||||
docker build -t hashicorp/vagrant-website:$IMAGE_TAG .
|
||||
docker tag hashicorp/vagrant-website:$IMAGE_TAG hashicorp/vagrant-website:latest
|
||||
docker login -u $WEBSITE_DOCKER_USER -p $WEBSITE_DOCKER_PASS
|
||||
docker push hashicorp/vagrant-website
|
||||
fi
|
||||
algolia-index:
|
||||
docker:
|
||||
- image: node:14
|
||||
steps:
|
||||
- checkout
|
||||
- run:
|
||||
name: Push content to Algolia Index
|
||||
command: |
|
||||
if [ "$CIRCLE_REPOSITORY_URL" != "git@github.com:hashicorp/vagrant.git" ]; then
|
||||
echo "Not Vagrant OSS Repo, not indexing Algolia"
|
||||
exit 0
|
||||
fi
|
||||
cd website/
|
||||
npm install
|
||||
node scripts/index_search_content.js
|
||||
workflows:
|
||||
version: 2
|
||||
build_website_docker_image:
|
||||
jobs:
|
||||
- build-website-docker-image:
|
||||
filters:
|
||||
branches:
|
||||
only:
|
||||
- main
|
||||
algolia_index:
|
||||
jobs:
|
||||
- algolia-index:
|
||||
filters:
|
||||
branches:
|
||||
only:
|
||||
- stable-website
|
||||
2
website/.gitignore
vendored
2
website/.gitignore
vendored
@ -7,3 +7,5 @@ out
|
||||
# As per Next.js conventions (https://nextjs.org/docs/basic-features/environment-variables#default-environment-variables)
|
||||
!.env
|
||||
.env*.local
|
||||
|
||||
website-preview
|
||||
|
||||
@ -1,8 +0,0 @@
|
||||
FROM docker.mirror.hashicorp.services/node:14.17.0-alpine
|
||||
RUN apk add --update --no-cache git make g++ automake autoconf libtool nasm libpng-dev
|
||||
|
||||
COPY ./package.json /website/package.json
|
||||
COPY ./package-lock.json /website/package-lock.json
|
||||
WORKDIR /website
|
||||
RUN npm install -g npm@latest
|
||||
RUN npm install
|
||||
@ -1,54 +1,34 @@
|
||||
# Default: run this if working on the website locally to run in watch mode.
|
||||
.DEFAULT_GOAL := website
|
||||
|
||||
PWD=$$(pwd)
|
||||
DOCKER_IMAGE="hashicorp/dev-portal"
|
||||
DOCKER_IMAGE_LOCAL="dev-portal-local"
|
||||
DOCKER_RUN_FLAGS=-it \
|
||||
--publish "3000:3000" \
|
||||
--rm \
|
||||
--tty \
|
||||
--volume "$(PWD)/content:/app/content" \
|
||||
--volume "$(PWD)/public:/app/public" \
|
||||
--volume "$(PWD)/data:/app/data" \
|
||||
--volume "$(PWD)/redirects.js:/app/redirects.js" \
|
||||
--volume "next-dir:/app/website-preview/.next" \
|
||||
--volume "$(PWD)/.env:/app/.env" \
|
||||
-e "REPO=vagrant"
|
||||
|
||||
.PHONY: website
|
||||
website:
|
||||
@echo "==> Downloading latest Docker image..."
|
||||
@docker pull docker.mirror.hashicorp.services/hashicorp/vagrant-website
|
||||
@echo "==> Starting website in Docker..."
|
||||
@docker run \
|
||||
--interactive \
|
||||
--rm \
|
||||
--tty \
|
||||
--workdir "/website" \
|
||||
--volume "$(shell pwd):/website" \
|
||||
--volume "/website/node_modules" \
|
||||
--publish "3000:3000" \
|
||||
docker.mirror.hashicorp.services/hashicorp/vagrant-website \
|
||||
npm start
|
||||
@docker pull $(DOCKER_IMAGE)
|
||||
@echo "==> Starting website..."
|
||||
@docker run $(DOCKER_RUN_FLAGS) $(DOCKER_IMAGE)
|
||||
|
||||
# This command will generate a static version of the website to the "out" folder.
|
||||
build:
|
||||
@echo "==> Downloading latest Docker image..."
|
||||
@docker pull docker.mirror.hashicorp.services/hashicorp/vagrant-website
|
||||
@echo "==> Starting build in Docker..."
|
||||
@docker run \
|
||||
--interactive \
|
||||
--rm \
|
||||
--tty \
|
||||
--workdir "/website" \
|
||||
--volume "$(shell pwd):/website" \
|
||||
--volume "/website/node_modules" \
|
||||
docker.mirror.hashicorp.services/hashicorp/vagrant-website \
|
||||
npm run static
|
||||
.PHONY: website/local
|
||||
website/local:
|
||||
@echo "==> Starting website from local image..."
|
||||
@docker run $(DOCKER_RUN_FLAGS) $(DOCKER_IMAGE_LOCAL)
|
||||
|
||||
# If you are changing node dependencies locally, run this to generate a new
|
||||
# local Docker image with the dependency changes included.
|
||||
build-image:
|
||||
@echo "==> Building Docker image..."
|
||||
@docker build -t hashicorp-vagrant-website-local .
|
||||
|
||||
# Use this if you have run `build-image` to use the locally built image
|
||||
# rather than our CI-generated image to test dependency changes.
|
||||
website-local:
|
||||
@echo "==> Starting website in Docker..."
|
||||
@docker run \
|
||||
--interactive \
|
||||
--rm \
|
||||
--tty \
|
||||
--workdir "/website" \
|
||||
--volume "$(shell pwd):/website" \
|
||||
--volume "/website/node_modules" \
|
||||
--publish "3000:3000" \
|
||||
hashicorp-vagrant-website-local \
|
||||
npm start
|
||||
|
||||
.DEFAULT_GOAL := website
|
||||
.PHONY: build build-image website website-local
|
||||
.PHONY: website/build-local
|
||||
website/build-local:
|
||||
@echo "==> Building local Docker image"
|
||||
@docker build https://github.com/hashicorp/dev-portal.git\#main \
|
||||
-t $(DOCKER_IMAGE_LOCAL)
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# Vagrant Website
|
||||
|
||||
This subdirectory contains the entire source for the [Vagrant Website](https://vagrantup.com/). This is a [NextJS](https://nextjs.org/) project, which builds a static site from these source files.
|
||||
This subdirectory contains the content for the [Vagrant Website](https://vagrantup.com/).
|
||||
|
||||
<!--
|
||||
This readme file contains several blocks of generated text, to make it easier to share common information
|
||||
|
||||
@ -1,31 +0,0 @@
|
||||
import s from './style.module.css'
|
||||
import Link from 'next/link'
|
||||
|
||||
export default function Footer({ openConsentManager }) {
|
||||
return (
|
||||
<footer className={s.root}>
|
||||
<div className="g-grid-container">
|
||||
<Link href="/intro">
|
||||
<a>Intro</a>
|
||||
</Link>
|
||||
<Link href="/docs">
|
||||
<a>Docs</a>
|
||||
</Link>
|
||||
<a href="https://www.amazon.com/gp/product/1449335837/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1449335837&linkCode=as2&tag=vagrant-20">
|
||||
Book
|
||||
</a>
|
||||
<Link href="/vmware">
|
||||
<a>VMware</a>
|
||||
</Link>
|
||||
<a href="https://hashicorp.com/privacy">Privacy</a>
|
||||
<Link href="/security">
|
||||
<a>Security</a>
|
||||
</Link>
|
||||
<Link href="/files/press-kit.zip">
|
||||
<a>Press Kit</a>
|
||||
</Link>
|
||||
<a onClick={openConsentManager}>Consent Manager</a>
|
||||
</div>
|
||||
</footer>
|
||||
)
|
||||
}
|
||||
@ -1,28 +0,0 @@
|
||||
.root {
|
||||
padding: 25px 0 17px 0;
|
||||
flex-shrink: 0;
|
||||
display: flex;
|
||||
|
||||
& :global(.g-grid-container) {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
& a {
|
||||
color: black;
|
||||
opacity: 0.5;
|
||||
transition: opacity 0.25s ease;
|
||||
cursor: pointer;
|
||||
display: inline-block;
|
||||
margin-right: 20px;
|
||||
margin-bottom: 8px;
|
||||
|
||||
&:last-child {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,24 +0,0 @@
|
||||
import Subnav from '@hashicorp/react-subnav'
|
||||
import subnavItems from '../../data/subnav'
|
||||
import { useRouter } from 'next/router'
|
||||
|
||||
export default function VagrantSubnav() {
|
||||
const router = useRouter()
|
||||
return (
|
||||
<Subnav
|
||||
titleLink={{
|
||||
text: 'vagrant',
|
||||
url: '/',
|
||||
}}
|
||||
ctaLinks={[
|
||||
{ text: 'GitHub', url: 'https://www.github.com/hashicorp/vagrant' },
|
||||
{ text: 'Download', url: '/downloads' },
|
||||
]}
|
||||
currentPath={router.pathname}
|
||||
menuItemsAlign="right"
|
||||
menuItems={subnavItems}
|
||||
constrainWidth
|
||||
matchOnBasePath
|
||||
/>
|
||||
)
|
||||
}
|
||||
@ -1,14 +0,0 @@
|
||||
import styles from './style.module.css'
|
||||
|
||||
export default function TextSplit({ text, reverse, children }) {
|
||||
return (
|
||||
<div className={`${styles.root} ${reverse ? styles.reverse : ''}`}>
|
||||
<div className={styles.text}>
|
||||
<div className={styles.tag}>{text.tag}</div>
|
||||
<h2 className={styles.headline}>{text.headline}</h2>
|
||||
<p className="g-type-body">{text.text}</p>
|
||||
</div>
|
||||
<div className={styles.content}>{children}</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@ -1,50 +0,0 @@
|
||||
.root {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
|
||||
@media (max-width: 1000px) {
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
|
||||
.reverse {
|
||||
flex-direction: row-reverse;
|
||||
|
||||
@media (max-width: 1000px) {
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
|
||||
.tag {
|
||||
composes: g-type-label from global;
|
||||
display: inline-block;
|
||||
background: black;
|
||||
color: white;
|
||||
padding: 6px 8px;
|
||||
}
|
||||
|
||||
.headline {
|
||||
composes: g-type-display-2 from global;
|
||||
margin: 20px 0 10px 0;
|
||||
}
|
||||
|
||||
.text {
|
||||
width: 50%;
|
||||
|
||||
@media (max-width: 1000px) {
|
||||
width: 100%;
|
||||
margin-bottom: 50px;
|
||||
}
|
||||
}
|
||||
|
||||
.content {
|
||||
width: 46%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
@media (max-width: 1000px) {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
@ -1,30 +0,0 @@
|
||||
import s from './style.module.css'
|
||||
import { useState } from 'react'
|
||||
|
||||
export default function VMWarePurchaseForm({ productId }) {
|
||||
const [seats, setSeats] = useState(1)
|
||||
const submit = (e) => {
|
||||
e.preventDefault()
|
||||
|
||||
const seatsInt = parseInt(seats, 10)
|
||||
if (isNaN(seatsInt)) {
|
||||
return alert('The number of seats you want to purchase must be a number.')
|
||||
}
|
||||
if (seatsInt <= 0) {
|
||||
return alert('The number of seats you want must be greater than zero.')
|
||||
}
|
||||
|
||||
window.location.href = `http://shopify.hashicorp.com/cart/${productId}:${seats}`
|
||||
}
|
||||
|
||||
return (
|
||||
<form className={s.root} onSubmit={submit}>
|
||||
<input
|
||||
type="number"
|
||||
value={seats}
|
||||
onChange={(e) => setSeats(e.target.value)}
|
||||
></input>
|
||||
<button>Buy Now</button>
|
||||
</form>
|
||||
)
|
||||
}
|
||||
@ -1,32 +0,0 @@
|
||||
.root {
|
||||
& input {
|
||||
border: none;
|
||||
box-shadow: 3px 4px 0 rgba(0, 0, 0, 0.1);
|
||||
font-size: 18px;
|
||||
height: 50px;
|
||||
line-height: 50px;
|
||||
padding: 0 15px;
|
||||
text-align: center;
|
||||
width: 60px;
|
||||
}
|
||||
|
||||
& button {
|
||||
background: var(--brand, #2e71e5);
|
||||
border: none;
|
||||
border-radius: 0;
|
||||
box-shadow: 3px 4px 0 rgba(0, 0, 0, 0.1);
|
||||
color: #fff;
|
||||
font-family: 'gilmer-web', 'Gilmer', Geneva, Tahoma, Helvetica, Verdana,
|
||||
sans-serif;
|
||||
font-size: 18px;
|
||||
height: 50px;
|
||||
line-height: 50px;
|
||||
padding: 0 15px;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.25s ease;
|
||||
|
||||
&:hover {
|
||||
background: #3176ff;
|
||||
}
|
||||
}
|
||||
}
|
||||
1
website/global.d.ts
vendored
1
website/global.d.ts
vendored
@ -1 +0,0 @@
|
||||
/// <reference types="@hashicorp/platform-types" />
|
||||
@ -1,15 +0,0 @@
|
||||
import { ConsentManagerService } from '@hashicorp/react-consent-manager/types'
|
||||
|
||||
const localConsentManagerServices: ConsentManagerService[] = [
|
||||
{
|
||||
name: 'Demandbase Tag',
|
||||
description:
|
||||
'The Demandbase tag is a tracking service to identify website visitors and measure interest on our website.',
|
||||
category: 'Analytics',
|
||||
url: 'https://tag.demandbase.com/960ab0a0f20fb102.min.js',
|
||||
async: true,
|
||||
},
|
||||
]
|
||||
|
||||
export default localConsentManagerServices
|
||||
|
||||
5
website/next-env.d.ts
vendored
5
website/next-env.d.ts
vendored
@ -1,5 +0,0 @@
|
||||
/// <reference types="next" />
|
||||
/// <reference types="next/types/global" />
|
||||
|
||||
// NOTE: This file should not be edited
|
||||
// see https://nextjs.org/docs/basic-features/typescript for more information.
|
||||
@ -1,24 +0,0 @@
|
||||
const withHashicorp = require('@hashicorp/platform-nextjs-plugin')
|
||||
const redirects = require('./redirects.next')
|
||||
|
||||
// log out our primary environment variables for clarity in build logs
|
||||
console.log(`HASHI_ENV: ${process.env.HASHI_ENV}`)
|
||||
console.log(`NODE_ENV: ${process.env.NODE_ENV}`)
|
||||
console.log(`VERCEL_ENV: ${process.env.VERCEL_ENV}`)
|
||||
console.log(`MKTG_CONTENT_API: ${process.env.MKTG_CONTENT_API}`)
|
||||
console.log(`ENABLE_VERSIONED_DOCS: ${process.env.ENABLE_VERSIONED_DOCS}`)
|
||||
|
||||
module.exports = withHashicorp({
|
||||
defaultLayout: true,
|
||||
nextOptimizedImages: true,
|
||||
})({
|
||||
svgo: { plugins: [{ removeViewBox: false }] },
|
||||
redirects: () => redirects,
|
||||
env: {
|
||||
HASHI_ENV: process.env.HASHI_ENV || 'development',
|
||||
SEGMENT_WRITE_KEY: 'wFMyBE4PJCZttWfu0pNhYdWr7ygW0io4',
|
||||
BUGSNAG_CLIENT_KEY: '87a42e709789c35676b06b0d29a9075d',
|
||||
BUGSNAG_SERVER_KEY: '4acc6140aaebfab35f535a3666674a07',
|
||||
ENABLE_VERSIONED_DOCS: process.env.ENABLE_VERSIONED_DOCS || false,
|
||||
},
|
||||
})
|
||||
24610
website/package-lock.json
generated
24610
website/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -3,43 +3,11 @@
|
||||
"description": "Documentation website for HashiCorp Vagrant",
|
||||
"version": "1.0.0",
|
||||
"author": "HashiCorp",
|
||||
"dependencies": {
|
||||
"@hashicorp/mktg-global-styles": "^4.0.0",
|
||||
"@hashicorp/platform-analytics": "^0.2.0",
|
||||
"@hashicorp/platform-code-highlighting": "^0.1.2",
|
||||
"@hashicorp/platform-runtime-error-monitoring": "^0.1.0",
|
||||
"@hashicorp/platform-util": "^0.1.0",
|
||||
"@hashicorp/react-alert-banner": "^7.0.1",
|
||||
"@hashicorp/react-button": "^6.0.1",
|
||||
"@hashicorp/react-code-block": "^4.1.5",
|
||||
"@hashicorp/react-consent-manager": "^7.1.0",
|
||||
"@hashicorp/react-docs-page": "^14.12.0",
|
||||
"@hashicorp/react-hashi-stack-menu": "^2.1.2",
|
||||
"@hashicorp/react-head": "^3.1.2",
|
||||
"@hashicorp/react-inline-svg": "^6.0.3",
|
||||
"@hashicorp/react-min-100-layout": "^2.0.1",
|
||||
"@hashicorp/react-product-downloader": "^8.0.0",
|
||||
"@hashicorp/react-product-downloads-page": "^2.5.3",
|
||||
"@hashicorp/react-search": "^6.1.1",
|
||||
"@hashicorp/react-section-header": "^5.0.4",
|
||||
"@hashicorp/react-subnav": "^9.3.2",
|
||||
"@hashicorp/react-tabs": "^7.0.1",
|
||||
"@hashicorp/react-vertical-text-block-list": "^7.0.0",
|
||||
"next": "^11.1.2",
|
||||
"next-mdx-remote": "3.0.1",
|
||||
"next-remote-watch": "^1.0.0",
|
||||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2"
|
||||
},
|
||||
"dependencies": {},
|
||||
"devDependencies": {
|
||||
"@hashicorp/platform-cli": "^1.2.0",
|
||||
"@hashicorp/platform-nextjs-plugin": "^1.0.1",
|
||||
"@hashicorp/platform-types": "^0.1.1",
|
||||
"@types/react": "^17.0.3",
|
||||
"dart-linkcheck": "2.0.15",
|
||||
"husky": "4.3.6",
|
||||
"prettier": "2.2.1",
|
||||
"typescript": "^4.3.5"
|
||||
"husky": "4.3.8",
|
||||
"prettier": "2.2.1"
|
||||
},
|
||||
"husky": {
|
||||
"hooks": {
|
||||
@ -47,15 +15,12 @@
|
||||
}
|
||||
},
|
||||
"scripts": {
|
||||
"build": "node --max-old-space-size=2048 ./node_modules/.bin/next build",
|
||||
"export": "node --max-old-space-size=2048 ./node_modules/.bin/next export",
|
||||
"build": "./scripts/website-build.sh",
|
||||
"format": "next-hashicorp format",
|
||||
"generate:component": "next-hashicorp generate component",
|
||||
"generate:readme": "next-hashicorp markdown-blocks README.md",
|
||||
"lint": "next-hashicorp lint",
|
||||
"start": "next-remote-watch './content/**/*.mdx'",
|
||||
"static": "npm run build && npm run export && cp _redirects out/.",
|
||||
"linkcheck": "linkcheck https://vagrantup.com"
|
||||
"linkcheck": "linkcheck https://vagrantup.com",
|
||||
"start": "./scripts/website-start.sh"
|
||||
},
|
||||
"engines": {
|
||||
"npm": ">=7.0.0"
|
||||
|
||||
@ -1,33 +0,0 @@
|
||||
import s from './404.module.css'
|
||||
import Link from 'next/link'
|
||||
import { useEffect } from 'react'
|
||||
|
||||
export default function NotFound() {
|
||||
useEffect(() => {
|
||||
if (
|
||||
typeof window !== 'undefined' &&
|
||||
typeof window?.analytics?.track === 'function' &&
|
||||
typeof window?.document?.referrer === 'string' &&
|
||||
typeof window?.location?.href === 'string'
|
||||
)
|
||||
window.analytics.track(window.location.href, {
|
||||
category: '404 Response',
|
||||
label: window.document.referrer || 'No Referrer',
|
||||
})
|
||||
}, [])
|
||||
|
||||
return (
|
||||
<div className={s.root}>
|
||||
<h1 className={s.heading}>Page Not Found</h1>
|
||||
<p>
|
||||
We‘re sorry but we can‘t find the page you‘re looking
|
||||
for.
|
||||
</p>
|
||||
<p>
|
||||
<Link href="/">
|
||||
<a>Back to Home</a>
|
||||
</Link>
|
||||
</p>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@ -1,23 +0,0 @@
|
||||
.root {
|
||||
composes: .g-grid-container from global;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
margin: 64px auto; /* this is being overridden at the request of the learn team */
|
||||
max-width: 784px;
|
||||
min-height: 50vh;
|
||||
padding-inline: 32px;
|
||||
text-align: center;
|
||||
|
||||
@media (--large) {
|
||||
padding-inline: 24px;
|
||||
}
|
||||
|
||||
& a {
|
||||
color: var(--highlight-color);
|
||||
}
|
||||
}
|
||||
|
||||
.heading {
|
||||
composes: g-type-display-3 from global;
|
||||
}
|
||||
@ -1,55 +0,0 @@
|
||||
import './style.css'
|
||||
import '@hashicorp/platform-util/nprogress/style.css'
|
||||
|
||||
import Min100Layout from '@hashicorp/react-min-100-layout'
|
||||
import NProgress from '@hashicorp/platform-util/nprogress'
|
||||
import usePageviewAnalytics from '@hashicorp/platform-analytics'
|
||||
import createConsentManager from '@hashicorp/react-consent-manager/loader'
|
||||
import localConsentManagerServices from 'lib/consent-manager-services'
|
||||
import useAnchorLinkAnalytics from '@hashicorp/platform-util/anchor-link-analytics'
|
||||
import Router from 'next/router'
|
||||
import HashiHead from '@hashicorp/react-head'
|
||||
import Head from 'next/head'
|
||||
import { ErrorBoundary } from '@hashicorp/platform-runtime-error-monitoring'
|
||||
import HashiStackMenu from '@hashicorp/react-hashi-stack-menu'
|
||||
import ProductSubnav from '../components/subnav'
|
||||
import Footer from '../components/footer'
|
||||
import Error from './_error'
|
||||
import AlertBanner from '@hashicorp/react-alert-banner'
|
||||
import alertBannerData, { ALERT_BANNER_ACTIVE } from 'data/alert-banner'
|
||||
|
||||
NProgress({ Router })
|
||||
const { ConsentManager, openConsentManager } = createConsentManager({
|
||||
preset: 'oss',
|
||||
otherServices: [...localConsentManagerServices],
|
||||
})
|
||||
|
||||
export default function App({ Component, pageProps }) {
|
||||
useAnchorLinkAnalytics()
|
||||
usePageviewAnalytics()
|
||||
|
||||
return (
|
||||
<ErrorBoundary FallbackComponent={Error}>
|
||||
<HashiHead
|
||||
is={Head}
|
||||
title="Vagrant by HashiCorp"
|
||||
siteName="Vagrant by HashiCorp"
|
||||
description="Vagrant enables users to create and configure lightweight, reproducible, and
|
||||
portable development environments."
|
||||
image="https://www.vagrantup.com/img/og-image.png"
|
||||
icon={[{ href: '/favicon.ico' }]}
|
||||
/>
|
||||
<Min100Layout footer={<Footer openConsentManager={openConsentManager} />}>
|
||||
{ALERT_BANNER_ACTIVE && (
|
||||
<AlertBanner {...alertBannerData} product="vagrant" hideOnMobile />
|
||||
)}
|
||||
<HashiStackMenu />
|
||||
<ProductSubnav />
|
||||
<div className="content">
|
||||
<Component {...pageProps} />
|
||||
</div>
|
||||
</Min100Layout>
|
||||
<ConsentManager />
|
||||
</ErrorBoundary>
|
||||
)
|
||||
}
|
||||
@ -1,29 +0,0 @@
|
||||
import Document, { Html, Head, Main, NextScript } from 'next/document'
|
||||
import HashiHead from '@hashicorp/react-head'
|
||||
|
||||
export default class MyDocument extends Document {
|
||||
static async getInitialProps(ctx) {
|
||||
const initialProps = await Document.getInitialProps(ctx)
|
||||
return { ...initialProps }
|
||||
}
|
||||
|
||||
render() {
|
||||
return (
|
||||
<Html>
|
||||
<Head>
|
||||
<HashiHead />
|
||||
</Head>
|
||||
<body>
|
||||
<Main />
|
||||
<NextScript />
|
||||
<script
|
||||
noModule
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: `window.MSInputMethodContext && document.documentMode && document.write('<script src="/ie-warning.js"><\\x2fscript>');`,
|
||||
}}
|
||||
/>
|
||||
</body>
|
||||
</Html>
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -1,14 +0,0 @@
|
||||
import NotFound from './404'
|
||||
import Bugsnag from '@hashicorp/platform-runtime-error-monitoring'
|
||||
|
||||
function Error({ statusCode }) {
|
||||
return <NotFound statusCode={statusCode} />
|
||||
}
|
||||
|
||||
Error.getInitialProps = ({ res, err }) => {
|
||||
if (err) Bugsnag.notify(err)
|
||||
const statusCode = res ? res.statusCode : err ? err.statusCode : 404
|
||||
return { statusCode }
|
||||
}
|
||||
|
||||
export default Error
|
||||
@ -1,48 +0,0 @@
|
||||
import s from './style.module.css'
|
||||
import VerticalTextBlockList from '@hashicorp/react-vertical-text-block-list'
|
||||
import SectionHeader from '@hashicorp/react-section-header'
|
||||
import Head from 'next/head'
|
||||
|
||||
export default function CommunityPage() {
|
||||
return (
|
||||
<div className={s.root}>
|
||||
<Head>
|
||||
<title key="title">Community | Vagrant by HashiCorp</title>
|
||||
</Head>
|
||||
<SectionHeader
|
||||
headline="Community"
|
||||
description="Vagrant is an open source project with a growing community. There are active, dedicated users willing to help you through various mediums."
|
||||
use_h1={true}
|
||||
/>
|
||||
<VerticalTextBlockList
|
||||
data={[
|
||||
{
|
||||
header: 'Community Forum',
|
||||
body:
|
||||
'<a href="https://discuss.hashicorp.com/c/vagrant/24">Vagrant Community Forum</a>',
|
||||
},
|
||||
{
|
||||
header: 'Announcement List',
|
||||
body:
|
||||
'<a href="https://groups.google.com/group/hashicorp-announce">HashiCorp Announcement Google Group</a>',
|
||||
},
|
||||
{
|
||||
header: 'Discussion List',
|
||||
body:
|
||||
'<a href="https://groups.google.com/forum/#!forum/vagrant-up">Vagrant Google Group</a>',
|
||||
},
|
||||
{
|
||||
header: 'Bug Tracker',
|
||||
body:
|
||||
'<a href="https://github.com/hashicorp/vagrant/issues">Issue tracker on GitHub</a>. Please only use this for reporting bugs. Do not ask for general help here. Use IRC or the mailing list for that.',
|
||||
},
|
||||
{
|
||||
header: 'Training',
|
||||
body:
|
||||
'Paid <a href="https://www.hashicorp.com/training">HashiCorp training courses</a> are also available in a city near you. Private training courses are also available.',
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@ -1,9 +0,0 @@
|
||||
.root {
|
||||
composes: g-grid-container from global;
|
||||
margin-top: 72px;
|
||||
margin-bottom: 72px;
|
||||
|
||||
& :global(.g-section-header) {
|
||||
margin-bottom: 100px;
|
||||
}
|
||||
}
|
||||
@ -1,42 +0,0 @@
|
||||
import { productName, productSlug } from 'data/metadata'
|
||||
import DocsPage from '@hashicorp/react-docs-page'
|
||||
import { getStaticGenerationFunctions } from '@hashicorp/react-docs-page/server'
|
||||
import versions from 'data/version.json'
|
||||
import Button from '@hashicorp/react-button'
|
||||
|
||||
const NAV_DATA_FILE = 'data/docs-nav-data.json'
|
||||
const CONTENT_DIR = 'content/docs'
|
||||
const basePath = 'docs'
|
||||
const additionalComponents = { Button }
|
||||
|
||||
export default function DocsLayout(props) {
|
||||
return (
|
||||
<DocsPage
|
||||
product={{ name: productName, slug: productSlug }}
|
||||
baseRoute={basePath}
|
||||
staticProps={props}
|
||||
additionalComponents={additionalComponents}
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
||||
const { getStaticPaths, getStaticProps } = getStaticGenerationFunctions(
|
||||
process.env.ENABLE_VERSIONED_DOCS === 'true'
|
||||
? {
|
||||
strategy: 'remote',
|
||||
basePath: basePath,
|
||||
fallback: 'blocking',
|
||||
revalidate: 360, // 1 hour
|
||||
product: productSlug,
|
||||
scope: { VMWARE_UTILITY_VERSION: versions.VMWARE_UTILITY_VERSION },
|
||||
}
|
||||
: {
|
||||
strategy: 'fs',
|
||||
localContentDir: CONTENT_DIR,
|
||||
navDataFile: NAV_DATA_FILE,
|
||||
product: productSlug,
|
||||
scope: { VMWARE_UTILITY_VERSION: versions.VMWARE_UTILITY_VERSION },
|
||||
}
|
||||
)
|
||||
|
||||
export { getStaticPaths, getStaticProps }
|
||||
@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="178" height="48" viewBox="0 0 178 48" fill="none" role="img"><path d="M79.91 11.272h5.024l-7.637 25.6h-7.134l-7.637-25.6h5.025L73.726 32.6l6.183-21.328zM98.906 36.872h-3.835l-.343-1.272a10.213 10.213 0 01-5.592 1.656c-3.419 0-4.873-2.344-4.873-5.6 0-3.808 1.654-5.264 5.448-5.264h4.49v-1.936c0-2.072-.575-2.808-3.571-2.808-1.743.018-3.48.211-5.184.576l-.576-3.576a24.358 24.358 0 016.391-.888c5.871 0 7.597 2.072 7.597 6.768l.048 12.344zM94.225 29.8h-3.451c-1.534 0-1.957.424-1.957 1.848 0 1.424.423 1.88 1.877 1.88a7.364 7.364 0 003.53-.96V29.8zM107.845 31.832a2.02 2.02 0 00-1.111 1.496c0 .496.304.728 1.039.8 2.069.232 3.195.344 5.408.576 3.036.344 3.994 1.848 3.994 4.536 0 4-1.462 5.6-8.443 5.6a27.17 27.17 0 01-7.19-.96l.575-3.496a25.92 25.92 0 006.295.8c3.723 0 4.45-.272 4.45-1.496s-.344-1.344-1.766-1.496c-2.149-.232-3.035-.344-5.408-.616-2.644-.304-3.683-1.192-3.683-3.576a4.007 4.007 0 011.958-3.2c-1.726-1.04-2.533-2.768-2.533-5.032v-1.776c.08-3.88 2.109-6.224 7.525-6.224 1.077-.008 2.151.12 3.196.384h5.759v2.344c-.655.192-1.422.384-2.069.576.446.908.67 1.908.655 2.92v1.768c0 3.808-2.3 6.112-7.525 6.112a9.682 9.682 0 01-1.126-.04zm1.07-10.304c-2.3 0-3.107.848-3.107 2.616v1.448c0 1.848.918 2.536 3.107 2.536s3.148-.728 3.148-2.536v-1.448c.008-1.752-.799-2.608-3.14-2.608l-.008-.008zM129.605 22.072a36.678 36.678 0 00-4.945 2.72v12.08h-4.713v-18.72h3.994l.304 2.072a20.943 20.943 0 014.913-2.456l.447 4.304zM145.262 36.872h-3.834l-.344-1.272a10.208 10.208 0 01-5.591 1.656c-3.419 0-4.873-2.344-4.873-5.6 0-3.808 1.653-5.264 5.448-5.264h4.489v-1.936c0-2.072-.575-2.808-3.571-2.808a26.081 26.081 0 00-5.184.576l-.575-3.576a24.35 24.35 0 016.39-.888c5.872 0 7.597 2.072 7.597 6.768l.048 12.344zm-4.681-7.072h-3.451c-1.534 0-1.957.424-1.957 1.848 0 1.424.423 1.88 1.877 1.88a7.365 7.365 0 003.531-.96V29.8zM159.194 36.872V23.8c0-1-.423-1.496-1.493-1.496a12.895 12.895 0 00-4.873 1.6v12.968h-4.682v-18.72h3.571l.464 1.6a18.692 18.692 0 017.485-1.96c3.107 0 4.218 2.192 4.218 5.536v13.6l-4.69-.056zM177.656 36.52a12.97 12.97 0 01-4.106.728c-3.419 0-5.145-1.6-5.145-4.96v-10.4h-2.804v-3.736h2.804v-4.648l4.681-.656v5.304h4.793l-.303 3.728h-4.49v9.8a1.488 1.488 0 00.431 1.249 1.47 1.47 0 001.255.407 8.983 8.983 0 002.34-.384l.544 3.568z" fill="#000"></path><path d="M46.478 8.088V3.696L35.94 9.832v3.712l-8.428 18.208-4.218 2.912V48l9.035-5.216L46.478 8.088zM23.295 25.168l-6.318-14.776V6.216l-.04-.016-6.28 3.632v3.712l8.428 19.008 4.21-2.088v-5.296z" fill="#1159CC"></path><path d="M40.159 0L29.63 6.176h-.008v4.216l-6.326 14.776v4.936l-4.21 2.448-8.428-19.008v-3.72l6.327-3.64L6.44 0 .12 3.696v4.528l14.227 34.6L23.295 48V35l4.218-2.448-.056-.032 8.484-18.976v-3.72l10.537-6.128L40.159 0z" fill="#127EFF"></path></svg>
|
||||
|
Before Width: | Height: | Size: 2.7 KiB |
@ -1,71 +0,0 @@
|
||||
import { VERSION } from 'data/version'
|
||||
import { productSlug } from 'data/metadata'
|
||||
import ProductDownloadsPage from '@hashicorp/react-product-downloads-page'
|
||||
import { generateStaticProps } from '@hashicorp/react-product-downloads-page/server'
|
||||
import Link from 'next/link'
|
||||
import s from './style.module.css'
|
||||
|
||||
export default function DownloadsPage(staticProps) {
|
||||
return (
|
||||
<ProductDownloadsPage
|
||||
getStartedDescription="Follow step-by-step tutorials on the essentials of Vagrant."
|
||||
getStartedLinks={[
|
||||
{
|
||||
label: 'Quick Start',
|
||||
href:
|
||||
'https://learn.hashicorp.com/tutorials/vagrant/getting-started-index',
|
||||
},
|
||||
{
|
||||
label: 'Install and Specify a Box',
|
||||
href:
|
||||
'https://learn.hashicorp.com/tutorials/vagrant/getting-started-boxes',
|
||||
},
|
||||
{
|
||||
label: 'Configure the Network',
|
||||
href:
|
||||
'https://learn.hashicorp.com/tutorials/vagrant/getting-started-networking',
|
||||
},
|
||||
{
|
||||
label: 'View all Vagrant tutorials',
|
||||
href: 'https://learn.hashicorp.com/vagrant',
|
||||
},
|
||||
]}
|
||||
logo={
|
||||
<img
|
||||
className={s.logo}
|
||||
alt="Vagrant"
|
||||
src={require('./img/vagrant-logo.svg')}
|
||||
/>
|
||||
}
|
||||
tutorialLink={{
|
||||
href: 'https://learn.hashicorp.com/vagrant',
|
||||
label: 'View Tutorials at HashiCorp Learn',
|
||||
}}
|
||||
merchandisingSlot={
|
||||
<Link href="/vmware/downloads">
|
||||
<a>» Download VMware Utility</a>
|
||||
</Link>
|
||||
}
|
||||
packageManagerOverrides={[
|
||||
{
|
||||
label: 'Homebrew',
|
||||
commands: [`brew install ${productSlug}`],
|
||||
os: 'darwin',
|
||||
},
|
||||
{
|
||||
label: 'Homebrew',
|
||||
commands: [`brew install ${productSlug}`],
|
||||
os: 'linux',
|
||||
},
|
||||
]}
|
||||
{...staticProps}
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
||||
export async function getStaticProps() {
|
||||
return generateStaticProps({
|
||||
product: productSlug,
|
||||
latestVersion: VERSION,
|
||||
})
|
||||
}
|
||||
@ -1,3 +0,0 @@
|
||||
.logo {
|
||||
width: 105px;
|
||||
}
|
||||
@ -1,115 +0,0 @@
|
||||
import s from './style.module.css'
|
||||
import Button from '@hashicorp/react-button'
|
||||
import TextSplit from 'components/temporary_text-split'
|
||||
import CodeBlock from '@hashicorp/react-code-block'
|
||||
import versions from 'data/version.json'
|
||||
|
||||
export default function HomePage() {
|
||||
return (
|
||||
<div>
|
||||
<section className={s.hero}>
|
||||
<div className="g-grid-container">
|
||||
<img src="/img/logo-hashicorp.svg" alt="Vagrant Logo" />
|
||||
<h1 className="g-type-display-3">
|
||||
Development Environments Made Easy
|
||||
</h1>
|
||||
<div className={s.buttons}>
|
||||
<Button title="Get Started" url="/intro/index" />
|
||||
<Button
|
||||
title={`Download ${versions.VERSION}`}
|
||||
theme={{ variant: 'secondary' }}
|
||||
url="/downloads"
|
||||
/>
|
||||
<Button
|
||||
title="Find Boxes"
|
||||
theme={{ variant: 'secondary' }}
|
||||
url="https://app.vagrantup.com/boxes/search"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className={s.unifiedWorkflow}>
|
||||
<div className="g-grid-container">
|
||||
<TextSplit
|
||||
text={{
|
||||
tag: 'Unified Workflow',
|
||||
headline: 'Simple and Powerful',
|
||||
text:
|
||||
'HashiCorp Vagrant provides the same, easy workflow regardless of your role as a developer, operator, or designer. It leverages a declarative configuration file which describes all your software requirements, packages, operating system configuration, users, and more.',
|
||||
}}
|
||||
>
|
||||
<CodeBlock
|
||||
code={`$ vagrant init hashicorp/bionic64
|
||||
$ vagrant up
|
||||
Bringing machine 'default' up with 'virtualbox' provider...
|
||||
==> default: Importing base box 'hashicorp/bionic64'...
|
||||
==> default: Forwarding ports...
|
||||
default: 22 (guest)
|
||||
=> 2222 (host) (adapter 1)
|
||||
==> default: Waiting for machine to boot...
|
||||
|
||||
$ vagrant ssh
|
||||
vagrant@bionic64:~$ _`}
|
||||
/>
|
||||
</TextSplit>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className={s.enforceConsistency}>
|
||||
<div className="g-grid-container">
|
||||
<TextSplit
|
||||
text={{
|
||||
tag: 'Enforce Consistency',
|
||||
headline: 'Production Parity',
|
||||
text:
|
||||
'The cost of fixing a bug exponentially increases the closer it gets to production. Vagrant aims to mirror production environments by providing the same operating system, packages, users, and configurations, all while giving users the flexibility to use their favorite editor, IDE, and browser. Vagrant also integrates with your existing configuration management tooling like Ansible, Chef, Docker, Puppet or Salt, so you can use the same scripts to configure Vagrant as production.',
|
||||
}}
|
||||
reverse={true}
|
||||
>
|
||||
<img src="/img/vagrant_parity.svg" alt="Server Parity Diagram" />
|
||||
</TextSplit>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className={s.crossPlatform}>
|
||||
<div className="g-grid-container">
|
||||
<TextSplit
|
||||
text={{
|
||||
tag: 'Cross-Platform',
|
||||
headline: 'Works where you work',
|
||||
text:
|
||||
"Vagrant works on Mac, Linux, Windows, and more. Remote development environments force users to give up their favorite editors and programs. Vagrant works on your local system with the tools you're already familiar with. Easily code in your favorite text editor, edit images in your favorite manipulation program, and debug using your favorite tools, all from the comfort of your local laptop.",
|
||||
}}
|
||||
>
|
||||
{['apple', 'linux', 'windows'].map((platform) => (
|
||||
<img
|
||||
key={platform}
|
||||
src={`/img/systems/${platform}.svg`}
|
||||
alt={`${platform} logo`}
|
||||
/>
|
||||
))}
|
||||
</TextSplit>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className={s.trustedAtScale}>
|
||||
<div className="g-grid-container">
|
||||
<div className={s.tag}>Trusted at Scale</div>
|
||||
<h2 className={s.h2}>Trusted By</h2>
|
||||
<p className="g-type-body">
|
||||
Vagrant is trusted by thousands of developers, operators, and
|
||||
designers everyday. Here are just a few of the organizations that
|
||||
choose Vagrant to automate their development environments, in
|
||||
lightweight and reproducible ways.
|
||||
</p>
|
||||
<img
|
||||
className={s.customerImg}
|
||||
src="/img/vagrant-trusted-by-logos.png"
|
||||
alt="Logos of Vagrant customers"
|
||||
/>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@ -1,91 +0,0 @@
|
||||
.block {
|
||||
padding: 100px 0;
|
||||
|
||||
/** DEBT: remove when text split body copy color is updated */
|
||||
& :global(.g-type-body) {
|
||||
color: var(--gray-2);
|
||||
}
|
||||
}
|
||||
|
||||
.hero {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
margin: 150px 0;
|
||||
|
||||
& img {
|
||||
max-width: 445px;
|
||||
}
|
||||
|
||||
& .buttons > * {
|
||||
margin-right: 15px;
|
||||
margin-top: 25px;
|
||||
|
||||
& > *:last-child {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
@media (max-width: 500px) {
|
||||
width: 100%;
|
||||
margin-top: 20px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.unifiedWorkflow {
|
||||
composes: block;
|
||||
}
|
||||
|
||||
/* enforce consistency section */
|
||||
|
||||
.enforceConsistency {
|
||||
composes: block;
|
||||
|
||||
& img {
|
||||
max-width: 70%;
|
||||
}
|
||||
}
|
||||
|
||||
/* cross-platform section */
|
||||
|
||||
.crossPlatform {
|
||||
composes: block;
|
||||
|
||||
& img {
|
||||
max-width: 130px;
|
||||
min-width: 20px;
|
||||
height: auto;
|
||||
fill: black;
|
||||
padding: 0 20px;
|
||||
}
|
||||
}
|
||||
|
||||
/* trusted at scale section */
|
||||
|
||||
.trustedAtScale {
|
||||
composes: block;
|
||||
background: var(--vagrant-secondary);
|
||||
|
||||
& .customerImg {
|
||||
max-width: 80%;
|
||||
margin: 50px auto 0 auto;
|
||||
display: block;
|
||||
|
||||
@media (max-width: 800px) {
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.tag {
|
||||
composes: g-type-label from global;
|
||||
display: inline-block;
|
||||
background: black;
|
||||
color: white;
|
||||
padding: 6px 8px;
|
||||
}
|
||||
|
||||
.h2 {
|
||||
composes: g-type-display-2 from global;
|
||||
margin: 20px 0 10px 0;
|
||||
}
|
||||
@ -1,2 +0,0 @@
|
||||
import Homepage from './home'
|
||||
export default Homepage
|
||||
@ -1,36 +0,0 @@
|
||||
import { productName, productSlug } from 'data/metadata'
|
||||
import DocsPage from '@hashicorp/react-docs-page'
|
||||
import { getStaticGenerationFunctions } from '@hashicorp/react-docs-page/server'
|
||||
|
||||
const NAV_DATA_FILE = 'data/intro-nav-data.json'
|
||||
const CONTENT_DIR = 'content/intro'
|
||||
const basePath = 'intro'
|
||||
|
||||
export default function DocsLayout(props) {
|
||||
return (
|
||||
<DocsPage
|
||||
product={{ name: productName, slug: productSlug }}
|
||||
baseRoute={basePath}
|
||||
staticProps={props}
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
||||
const { getStaticPaths, getStaticProps } = getStaticGenerationFunctions(
|
||||
process.env.ENABLE_VERSIONED_DOCS === 'true'
|
||||
? {
|
||||
strategy: 'remote',
|
||||
basePath: basePath,
|
||||
fallback: 'blocking',
|
||||
revalidate: 360, // 1 hour
|
||||
product: productSlug,
|
||||
}
|
||||
: {
|
||||
strategy: 'fs',
|
||||
localContentDir: CONTENT_DIR,
|
||||
navDataFile: NAV_DATA_FILE,
|
||||
product: productSlug,
|
||||
}
|
||||
)
|
||||
|
||||
export { getStaticPaths, getStaticProps }
|
||||
@ -1,229 +0,0 @@
|
||||
/* Print Styles - Hide Elements */
|
||||
@media print {
|
||||
iframe,
|
||||
.g-footer,
|
||||
[class*='hashi-stack-menu'],
|
||||
[aria-hidden='true'],
|
||||
[id='__next-build-watcher'],
|
||||
[id='edit-this-page'],
|
||||
[id='jump-to-section'],
|
||||
[id='sidebar'] {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
/* Print Styles - Page Spacing */
|
||||
@media print {
|
||||
@page {
|
||||
margin: 2cm 0.5cm;
|
||||
}
|
||||
|
||||
@page :first {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
@page :last {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
break-inside: avoid;
|
||||
}
|
||||
|
||||
body {
|
||||
margin-bottom: 2cm;
|
||||
margin-top: 2cm;
|
||||
}
|
||||
|
||||
dl,
|
||||
ol,
|
||||
ul {
|
||||
break-before: avoid;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
break-after: avoid;
|
||||
break-inside: avoid;
|
||||
}
|
||||
|
||||
img {
|
||||
break-inside: avoid;
|
||||
break-after: avoid;
|
||||
}
|
||||
|
||||
pre,
|
||||
table {
|
||||
break-inside: avoid;
|
||||
}
|
||||
|
||||
pre {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
}
|
||||
|
||||
@media print {
|
||||
/* @todo: remove alongside @hashicorp/react-global-styles/_temporary-to-remove/layout.css */
|
||||
.g-grid-container {
|
||||
/*
|
||||
* A “measure” is the number of characters in a line of text.
|
||||
* Long lines fatique readers as they find the start of a new line of text.
|
||||
* It seems widely accepted that an ideal measure is 66 characters per line.
|
||||
* An average character takes up .5em, and so we define a measure of 33em.
|
||||
* See: https://webtypography.net/2.1.2
|
||||
*/
|
||||
max-width: 33em;
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
/* @todo: remove alongside @hashicorp/react-global-styles/_temporary-to-remove/tables.css */
|
||||
table {
|
||||
margin-bottom: 0;
|
||||
margin-top: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
/* @todo: move print styles to @hashicorp/react-global-styles/global.css */
|
||||
@media print {
|
||||
pre code,
|
||||
code,
|
||||
pre {
|
||||
font-weight: inherit;
|
||||
}
|
||||
|
||||
pre {
|
||||
background: transparent;
|
||||
box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.15);
|
||||
color: inherit;
|
||||
padding: 0.5em;
|
||||
|
||||
& > code {
|
||||
white-space: inherit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* @todo: move print styles to @hashicorp/react-content/dist/style.css */
|
||||
@media print {
|
||||
.g-content {
|
||||
& a {
|
||||
color: inherit;
|
||||
font-weight: 700;
|
||||
|
||||
&:not(.anchor) {
|
||||
&::after {
|
||||
background-color: transparent;
|
||||
position: static;
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
&[href^='http'] {
|
||||
&::after {
|
||||
content: ' <' attr(href) '>';
|
||||
font-size: 0.8em;
|
||||
font-style: italic;
|
||||
letter-spacing: -0.01875em;
|
||||
vertical-align: top;
|
||||
}
|
||||
}
|
||||
|
||||
&:not([href^='http']) {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
& > code {
|
||||
color: inherit;
|
||||
font-weight: 700;
|
||||
|
||||
&::before,
|
||||
&::after {
|
||||
content: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
& h1,
|
||||
& h2,
|
||||
& h3,
|
||||
& h4,
|
||||
& h5,
|
||||
& h6 {
|
||||
& code {
|
||||
background: none;
|
||||
font-size: 1em;
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
|
||||
& h2 {
|
||||
margin: 1em 0 0;
|
||||
}
|
||||
|
||||
& h3 {
|
||||
margin: 1em 0 0;
|
||||
padding-bottom: 0.25em;
|
||||
}
|
||||
|
||||
& img {
|
||||
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.15);
|
||||
margin: 1em 0 0;
|
||||
}
|
||||
|
||||
& ol,
|
||||
& ul {
|
||||
margin: 1em 0 0;
|
||||
|
||||
& li {
|
||||
margin-bottom: 0;
|
||||
margin-top: 0.5em;
|
||||
|
||||
& p:first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
& p {
|
||||
margin: 1em 0 0;
|
||||
}
|
||||
|
||||
& pre {
|
||||
background-color: transparent;
|
||||
border-radius: 0;
|
||||
margin: 1.5em 0 0;
|
||||
|
||||
& code {
|
||||
background: transparent;
|
||||
color: inherit;
|
||||
}
|
||||
}
|
||||
|
||||
& dd,
|
||||
& dt,
|
||||
& li,
|
||||
& p,
|
||||
& td,
|
||||
& th {
|
||||
& > :not(pre) code,
|
||||
& > code {
|
||||
background: transparent;
|
||||
font-weight: 700;
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
|
||||
& .alert.alert-danger,
|
||||
& .alert.alert-info,
|
||||
& .alert.alert-success,
|
||||
& .alert.alert-warning {
|
||||
background-color: transparent;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,46 +0,0 @@
|
||||
import Head from 'next/head'
|
||||
import s from './style.module.css'
|
||||
|
||||
export default function SecurityPage() {
|
||||
return (
|
||||
<>
|
||||
<Head>
|
||||
<title>Security</title>
|
||||
<meta
|
||||
name="description"
|
||||
key="description"
|
||||
content="Vagrant takes security very seriously. Please responsibly disclose any
|
||||
security vulnerabilities found and we'll handle it quickly."
|
||||
/>
|
||||
</Head>
|
||||
<main className={s.root}>
|
||||
<h1 className="g-type-display-1">Security</h1>
|
||||
<p>
|
||||
We understand that many users place a high level of trust in HashiCorp
|
||||
and the tools we build. We apply best practices and focus on security
|
||||
to make sure we can maintain the trust of the community.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
We deeply appreciate any effort to disclose vulnerabilities
|
||||
responsibly.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
If you would like to report a vulnerability, please see the{' '}
|
||||
<a href="https://www.hashicorp.com/security">
|
||||
HashiCorp security page
|
||||
</a>
|
||||
, which has the proper email to communicate with as well as our PGP
|
||||
key.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
If you aren't reporting a security sensitive vulnerability,
|
||||
please open an issue on the standard{' '}
|
||||
<a href="https://github.com/hashicorp/vagrant">GitHub</a> repository.
|
||||
</p>
|
||||
</main>
|
||||
</>
|
||||
)
|
||||
}
|
||||
@ -1,5 +0,0 @@
|
||||
.root {
|
||||
composes: g-grid-container from global;
|
||||
max-width: 950px;
|
||||
margin-top: 90px;
|
||||
}
|
||||
@ -1,26 +0,0 @@
|
||||
/* Global Component Styles */
|
||||
@import '~@hashicorp/mktg-global-styles/style.css';
|
||||
|
||||
:root {
|
||||
--highlight-color: var(--vagrant);
|
||||
}
|
||||
|
||||
/* Print Styles */
|
||||
@import './print.css';
|
||||
|
||||
/*
|
||||
* About this selector:
|
||||
* `.g-subnav ~ *` finds all elements after the navigation.
|
||||
* `:target` finds the active permalink on the page.
|
||||
*
|
||||
* About this style:
|
||||
* `scroll-margin-top` adjusts the vertical scroll of a permalink.
|
||||
* `64px` adjusts the scroll to account for the navigation.
|
||||
* `0.5em` further adjusts the scroll to give the permalink breathing room.
|
||||
*
|
||||
* See: https://developer.mozilla.org/en-US/docs/Web/CSS/:target
|
||||
* See: https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-margin-top
|
||||
*/
|
||||
.g-subnav ~ * :target {
|
||||
scroll-margin-top: calc(64px + 0.5em);
|
||||
}
|
||||
@ -1,36 +0,0 @@
|
||||
import { productName, productSlug } from 'data/metadata'
|
||||
import DocsPage from '@hashicorp/react-docs-page'
|
||||
import { getStaticGenerationFunctions } from '@hashicorp/react-docs-page/server'
|
||||
|
||||
const NAV_DATA_FILE = 'data/vagrant-cloud-nav-data.json'
|
||||
const CONTENT_DIR = 'content/vagrant-cloud'
|
||||
const basePath = 'vagrant-cloud'
|
||||
|
||||
export default function DocsLayout(props) {
|
||||
return (
|
||||
<DocsPage
|
||||
product={{ name: productName, slug: productSlug }}
|
||||
baseRoute={basePath}
|
||||
staticProps={props}
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
||||
const { getStaticPaths, getStaticProps } = getStaticGenerationFunctions(
|
||||
process.env.ENABLE_VERSIONED_DOCS === 'true'
|
||||
? {
|
||||
strategy: 'remote',
|
||||
basePath: basePath,
|
||||
fallback: 'blocking',
|
||||
revalidate: 360, // 1 hour
|
||||
product: productSlug,
|
||||
}
|
||||
: {
|
||||
strategy: 'fs',
|
||||
localContentDir: CONTENT_DIR,
|
||||
navDataFile: NAV_DATA_FILE,
|
||||
product: productSlug,
|
||||
}
|
||||
)
|
||||
|
||||
export { getStaticPaths, getStaticProps }
|
||||
@ -1,36 +0,0 @@
|
||||
import { productName, productSlug } from 'data/metadata'
|
||||
import DocsPage from '@hashicorp/react-docs-page'
|
||||
import { getStaticGenerationFunctions } from '@hashicorp/react-docs-page/server'
|
||||
|
||||
const NAV_DATA_FILE = 'data/vmware-nav-data.json'
|
||||
const CONTENT_DIR = 'content/vmware'
|
||||
const basePath = 'vmware'
|
||||
|
||||
export default function DocsLayout(props) {
|
||||
return (
|
||||
<DocsPage
|
||||
product={{ name: productName, slug: productSlug }}
|
||||
baseRoute={basePath}
|
||||
staticProps={props}
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
||||
const { getStaticPaths, getStaticProps } = getStaticGenerationFunctions(
|
||||
process.env.ENABLE_VERSIONED_DOCS === 'true'
|
||||
? {
|
||||
strategy: 'remote',
|
||||
basePath: basePath,
|
||||
fallback: 'blocking',
|
||||
revalidate: 360, // 1 hour
|
||||
product: productSlug,
|
||||
}
|
||||
: {
|
||||
strategy: 'fs',
|
||||
localContentDir: CONTENT_DIR,
|
||||
navDataFile: NAV_DATA_FILE,
|
||||
product: productSlug,
|
||||
}
|
||||
)
|
||||
|
||||
export { getStaticPaths, getStaticProps }
|
||||
@ -1,51 +0,0 @@
|
||||
import s from './style.module.css'
|
||||
import { VMWARE_UTILITY_VERSION } from 'data/version'
|
||||
import ProductDownloadsPage from '@hashicorp/react-product-downloads-page'
|
||||
import { generateStaticProps } from '@hashicorp/react-product-downloads-page/server'
|
||||
import Head from 'next/head'
|
||||
import HashiHead from '@hashicorp/react-head'
|
||||
|
||||
export default function DownloadsPage(staticProps) {
|
||||
return (
|
||||
<>
|
||||
<ProductDownloadsPage
|
||||
pageTitle="Download Vagrant vmware Utility"
|
||||
getStartedDescription="Follow step-by-step tutorials on the essentials of Vagrant VMWare Utility."
|
||||
getStartedLinks={[
|
||||
{
|
||||
label: 'Installation Instructions',
|
||||
href:
|
||||
'https://www.vagrantup.com/docs/providers/vmware/installation',
|
||||
},
|
||||
{
|
||||
label: 'Community Resources',
|
||||
href: 'https://www.vagrantup.com/community',
|
||||
},
|
||||
{
|
||||
label: 'View all Vagrant tutorials',
|
||||
href: 'https://learn.hashicorp.com/vagrant',
|
||||
},
|
||||
]}
|
||||
logo={<p className={s.notALogo}>Vagrant vmware Utility</p>}
|
||||
tutorialLink={{
|
||||
href: 'https://learn.hashicorp.com/vagrant',
|
||||
label: 'View Tutorials at HashiCorp Learn',
|
||||
}}
|
||||
showPackageManagers={false}
|
||||
{...staticProps}
|
||||
/>
|
||||
{/* Override default ProductDownloader title */}
|
||||
<HashiHead
|
||||
is={Head}
|
||||
title="VMware Utility Downloads | Vagrant by HashiCorp"
|
||||
/>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
export async function getStaticProps() {
|
||||
return await generateStaticProps({
|
||||
product: 'vagrant-vmware-utility',
|
||||
latestVersion: VMWARE_UTILITY_VERSION,
|
||||
})
|
||||
}
|
||||
@ -1,4 +0,0 @@
|
||||
.notALogo {
|
||||
composes: g-type-body-x-strong from global;
|
||||
font-size: 1rem;
|
||||
}
|
||||
@ -1,170 +0,0 @@
|
||||
/* page level */
|
||||
|
||||
.block {
|
||||
padding: 100px 0;
|
||||
}
|
||||
|
||||
.tag {
|
||||
composes: g-type-label from global;
|
||||
display: inline-block;
|
||||
background: black;
|
||||
color: white;
|
||||
padding: 6px 8px;
|
||||
}
|
||||
|
||||
.h2 {
|
||||
composes: g-type-display-2 from global;
|
||||
margin: 20px 0 20px 0;
|
||||
}
|
||||
|
||||
/* header section */
|
||||
|
||||
.header {
|
||||
text-align: center;
|
||||
margin: 140px 0 160px 0;
|
||||
}
|
||||
|
||||
.logos {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
margin: 0 auto;
|
||||
|
||||
& span {
|
||||
font-size: 2.5em;
|
||||
font-weight: bold;
|
||||
margin-left: 30px;
|
||||
margin-right: 30px;
|
||||
padding-bottom: 8px;
|
||||
|
||||
@media (max-width: 550px) {
|
||||
margin-left: 15px;
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
@media (max-width: 350px) {
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
font-size: 1.8em;
|
||||
}
|
||||
}
|
||||
|
||||
& img:first-child {
|
||||
height: 60px;
|
||||
|
||||
@media (max-width: 550px) {
|
||||
height: 45px;
|
||||
}
|
||||
|
||||
@media (max-width: 420px) {
|
||||
height: 35px;
|
||||
}
|
||||
}
|
||||
|
||||
& img:last-child {
|
||||
height: 30px;
|
||||
|
||||
@media (max-width: 550px) {
|
||||
height: 25px;
|
||||
}
|
||||
|
||||
@media (max-width: 420px) {
|
||||
height: 20px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.buttons > *:not(:last-child) {
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
.mainHeadline {
|
||||
composes: g-type-display-3 from global;
|
||||
}
|
||||
|
||||
.mainSubhead {
|
||||
composes: g-type-body-large from global;
|
||||
}
|
||||
|
||||
/* benefits section */
|
||||
|
||||
.benefits {
|
||||
composes: block;
|
||||
background: var(--vagrant-secondary);
|
||||
color: var(--black);
|
||||
|
||||
& h4 {
|
||||
margin-top: 20px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
& ul {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
columns: 2;
|
||||
|
||||
@media (max-width: 900px) {
|
||||
columns: 1;
|
||||
}
|
||||
|
||||
& li {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
& p {
|
||||
margin: 0 0 10px;
|
||||
}
|
||||
}
|
||||
|
||||
& small {
|
||||
margin-top: 50px;
|
||||
display: block;
|
||||
|
||||
& a {
|
||||
color: var(--black);
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.buyNow {
|
||||
background: var(--vagrant-secondary);
|
||||
color: var(--black);
|
||||
composes: block;
|
||||
|
||||
& small a {
|
||||
color: var(--black);
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
& .purchaseForm {
|
||||
margin: 50px 0;
|
||||
}
|
||||
}
|
||||
|
||||
.faq {
|
||||
composes: block;
|
||||
|
||||
& h4 {
|
||||
margin-top: 20px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
& > div > ul {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
||||
& > li:not(:last-child) {
|
||||
margin-bottom: 30px;
|
||||
|
||||
& > p > ul {
|
||||
margin: 20px 0;
|
||||
|
||||
& li {
|
||||
margin: 8px 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,3 +0,0 @@
|
||||
const { indexDocsContent } = require('@hashicorp/react-search/tools')
|
||||
|
||||
indexDocsContent()
|
||||
31
website/scripts/website-build.sh
Executable file
31
website/scripts/website-build.sh
Executable file
@ -0,0 +1,31 @@
|
||||
# Repo which we are cloning and executing npm run build:deploy-preview within
|
||||
REPO_TO_CLONE=dev-portal
|
||||
# Set the subdirectory name for the base project
|
||||
PREVIEW_DIR=website-preview
|
||||
# The directory we want to clone the project into
|
||||
CLONE_DIR=website-preview
|
||||
# The product for which we are building the deploy preview
|
||||
PRODUCT=vagrant
|
||||
|
||||
from_cache=false
|
||||
|
||||
if [ -d "$PREVIEW_DIR" ]; then
|
||||
echo "$PREVIEW_DIR found"
|
||||
CLONE_DIR="$PREVIEW_DIR-tmp"
|
||||
from_cache=true
|
||||
fi
|
||||
|
||||
# Clone the base project, if needed
|
||||
echo "⏳ Cloning the $REPO_TO_CLONE repo, this might take a while..."
|
||||
git clone --depth=1 "https://github.com/hashicorp/$REPO_TO_CLONE.git" "$CLONE_DIR"
|
||||
|
||||
if [ "$from_cache" = true ]; then
|
||||
echo "Setting up $PREVIEW_DIR"
|
||||
cp -R "./$CLONE_DIR/." "./$PREVIEW_DIR"
|
||||
fi
|
||||
|
||||
# cd into the preview directory project
|
||||
cd "$PREVIEW_DIR"
|
||||
|
||||
# Run the build:deploy-preview start script
|
||||
REPO=$PRODUCT DEV_IO=$PRODUCT IS_CONTENT_PREVIEW=true HASHI_ENV=project-preview npm run build:deploy-preview
|
||||
25
website/scripts/website-start.sh
Executable file
25
website/scripts/website-start.sh
Executable file
@ -0,0 +1,25 @@
|
||||
# Repo which we are cloning and executing npm run build:deploy-preview within
|
||||
REPO_TO_CLONE=dev-portal
|
||||
# Set the subdirectory name for the dev-portal app
|
||||
PREVIEW_DIR=website-preview
|
||||
# The product for which we are building the deploy preview
|
||||
PRODUCT=vagrant
|
||||
|
||||
should_pull=true
|
||||
|
||||
# Clone the dev-portal project, if needed
|
||||
if [ ! -d "$PREVIEW_DIR" ]; then
|
||||
echo "⏳ Cloning the $REPO_TO_CLONE repo, this might take a while..."
|
||||
git clone --depth=1 https://github.com/hashicorp/$REPO_TO_CLONE.git "$PREVIEW_DIR"
|
||||
should_pull=false
|
||||
fi
|
||||
|
||||
cd "$PREVIEW_DIR"
|
||||
|
||||
# If the directory already existed, pull to ensure the clone is fresh
|
||||
if [ "$should_pull" = true ]; then
|
||||
git pull origin main
|
||||
fi
|
||||
|
||||
# Run the dev-portal content-repo start script
|
||||
REPO=$PRODUCT PREVIEW_DIR="$PREVIEW_DIR" npm run start:local-preview
|
||||
@ -1,20 +0,0 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"allowJs": true,
|
||||
"baseUrl": ".",
|
||||
"esModuleInterop": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"isolatedModules": true,
|
||||
"jsx": "preserve",
|
||||
"lib": ["dom", "dom.iterable", "esnext"],
|
||||
"module": "esnext",
|
||||
"moduleResolution": "node",
|
||||
"noEmit": true,
|
||||
"resolveJsonModule": true,
|
||||
"skipLibCheck": true,
|
||||
"strict": false,
|
||||
"target": "es5"
|
||||
},
|
||||
"exclude": ["node_modules"],
|
||||
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"]
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user