diff --git a/website/_redirects b/website/_redirects index 10a84a8d4e..91d76cb71e 100644 --- a/website/_redirects +++ b/website/_redirects @@ -5,6 +5,8 @@ # Consul Redirects +/discovery.html /use-cases/service-discovery-and-health-checking 301! +/mesh.html /use-cases/multi-platform-service-mesh 301! /api.html /api-docs 301! /docs/agent/acl-rules.html /docs/acl/acl-rules 301! /docs/agent/acl-rules /docs/acl/acl-rules 301! diff --git a/website/components/basic-hero/index.jsx b/website/components/basic-hero/index.jsx new file mode 100644 index 0000000000..597c7be099 --- /dev/null +++ b/website/components/basic-hero/index.jsx @@ -0,0 +1,40 @@ +import Button from '@hashicorp/react-button' + +export default function BasicHero({ + heading, + content, + links, + brand, + backgroundImage, +}) { + return ( +
+
+

{heading}

+ {content &&

{content}

} + {links && links.length > 0 && ( +
+ {links.map((link, stableIdx) => { + const buttonVariant = stableIdx === 0 ? 'primary' : 'secondary' + const linkType = link.type || 'inbound' + return ( +
+ )} +
+
+ ) +} diff --git a/website/components/basic-hero/style.css b/website/components/basic-hero/style.css new file mode 100644 index 0000000000..312cf675fe --- /dev/null +++ b/website/components/basic-hero/style.css @@ -0,0 +1,63 @@ +.g-basic-hero { + padding: 88px 0; + + & .g-type-display-1 { + color: var(--gray-1); + text-align: center; + margin-left: auto; + margin-right: auto; + margin-top: 0; + max-width: 14em; + } + + & .g-type-body-large { + color: var(--gray-3); + margin: 0 auto 0 auto; + text-align: center; + max-width: 40em; + } + + & .links { + display: flex; + flex-wrap: wrap; + justify-content: center; + /* + * Margins here compensate for extra 8px margin on buttons + * which are needed to center and space properly regardless of whether + * buttons are wrapping to multiple lines or not. + */ + margin-top: calc(32px - 8px); + margin-bottom: -8px; + @media (--large) { + margin-top: calc(40px - 8px); + } + + & .g-btn { + /* + * This ensures 16px between buttons at all times, while maintaining proper centering + * when buttons wrap to multiple lines. + * There will be an extra 8px space on all sides of the button group. + * The top and bottom are accounted for by the -8px adjustment on `.action` margins. + * The left and right excess is left as is - it's needed for proper centering when wrapping. + */ + margin: 8px; + } + } + + &.has-background { + background-repeat: no-repeat; + background-color: var(--gray-7); + background-image: url(/img/hero/pattern-desktop.svg); + width: 100%; + background-size: cover; + background-position: center; + + @media (max-width: 800px) { + background-image: url(/img/hero/pattern-mobile.svg); + } + + & .g-btn { + background: var(--gray-7); + } + } +} diff --git a/website/components/before-after/index.jsx b/website/components/before-after/index.jsx deleted file mode 100644 index 3a009f5cbb..0000000000 --- a/website/components/before-after/index.jsx +++ /dev/null @@ -1,55 +0,0 @@ -function BeforeAfterDiagram({ - beforeHeading, - beforeSubTitle, - beforeImage, - beforeDescription, - afterHeading, - afterSubTitle, - afterImage, - afterDescription, -}) { - return ( -
-
- - - - - - - -

{beforeHeading}

- {beforeSubTitle} - {beforeSubTitle} - {beforeDescription &&

{beforeDescription}

} -
-
- -

{afterHeading}

- {afterSubTitle} -
- {afterSubTitle} -
- {afterDescription &&

{afterDescription}

} -
-
- ) -} - -export default BeforeAfterDiagram diff --git a/website/components/before-after/style.css b/website/components/before-after/style.css deleted file mode 100644 index 2401f39537..0000000000 --- a/website/components/before-after/style.css +++ /dev/null @@ -1,146 +0,0 @@ -.g-timeline { - align-content: space-between; - display: flex; - flex-direction: column; - justify-content: center; - margin: 0 -15px; - - @media (min-width: 768px) { - flex-direction: row; - text-align: center; - } - - &.no-intro { - margin-top: -30px; - - @media (min-width: 768px) { - margin-top: -90px; - } - - @media (min-width: 992px) { - margin-top: -116px; - } - } - - & > div { - margin-left: 18px; - padding: 40px 15px 0 42px; - position: relative; - - @media (min-width: 768px) { - margin-left: 0; - padding-left: 15px; - width: 50%; - } - - &:last-child { - & .dot { - border-color: #ca2171; - } - } - - & .line { - background-image: linear-gradient(180deg, #d2d4dc 50%, #c82070 100%); - height: calc(100% - 12px); - left: 8px; - position: absolute; - top: 45px; - width: 2px; - - @media (min-width: 768px) { - background-image: linear-gradient( - 90deg, - rgba(229, 230, 235, 0), - #d2d4dc 0%, - #c82070 100% - ); - height: 2px; - left: 50%; - top: 8px; - width: calc(100% - 34px); - } - - &:first-child { - background-image: linear-gradient( - 180deg, - rgba(229, 230, 235, 0) 5%, - #dadce3 70%, - #d2d4dc 100% - ); - bottom: calc(100% - 45px); - height: 60px; - top: auto; - - @media (min-width: 768px) { - background-image: linear-gradient( - 90deg, - rgba(229, 230, 235, 0) 5%, - #dadce3 26%, - #d2d4dc 100% - ); - height: 2px; - left: auto; - right: 50%; - top: 8px; - width: calc(50% + 120px); - } - } - - & svg { - position: absolute; - top: calc(100% - 8px); - transform: rotate(90deg); - left: -4px; - - @media (min-width: 768px) { - left: auto; - right: -10px; - top: -6px; - transform: none; - } - } - } - - & h2 { - margin: 0 0 8px; - } - - & .sub-heading { - display: block; - margin-bottom: 24px; - - @media (min-width: 992px) { - margin-bottom: 40px; - } - } - - & .dot { - background: #f7f8fa; - border: 2px solid #d2d4dc; - border-radius: 50%; - display: inline-block; - height: 18px; - left: 0; - position: absolute; - top: 45px; - width: 18px; - z-index: 1; - - @media (min-width: 768px) { - margin: 0 0 0 -9px; - left: 50%; - top: 0; - } - } - - & img { - display: block; - margin: 0 auto; - max-width: 100%; - } - - & p { - margin-top: 40px; - } - } -} diff --git a/website/components/case-study-carousel/case-study-slide.jsx b/website/components/case-study-carousel/case-study-slide.jsx new file mode 100644 index 0000000000..315a8504d8 --- /dev/null +++ b/website/components/case-study-carousel/case-study-slide.jsx @@ -0,0 +1,44 @@ +import InlineSvg from '@hashicorp/react-inline-svg' +import Image from '@hashicorp/react-image' +import Button from '@hashicorp/react-button' +import QuoteMarksIcon from './img/quote.svg?include' + +export default function CaseStudySlide({ + caseStudy: { person, quote, company, caseStudyURL }, +}) { + return ( +
+ +

{quote}

+
+
+ {`${person.firstName} +
+
+ {person.firstName} {person.lastName} +
+

+ {person.title}, {company.name} +

+
+
+ {company.name} +
+
+ ) +} diff --git a/website/components/case-study-carousel/img/active-control-dot.svg b/website/components/case-study-carousel/img/active-control-dot.svg new file mode 100644 index 0000000000..ee15572f4f --- /dev/null +++ b/website/components/case-study-carousel/img/active-control-dot.svg @@ -0,0 +1 @@ + diff --git a/website/components/case-study-carousel/img/inactive-control-dot.svg b/website/components/case-study-carousel/img/inactive-control-dot.svg new file mode 100644 index 0000000000..c28dc96807 --- /dev/null +++ b/website/components/case-study-carousel/img/inactive-control-dot.svg @@ -0,0 +1 @@ + diff --git a/website/components/case-study-carousel/img/left-arrow-control.svg b/website/components/case-study-carousel/img/left-arrow-control.svg new file mode 100644 index 0000000000..67809357d4 --- /dev/null +++ b/website/components/case-study-carousel/img/left-arrow-control.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/components/case-study-carousel/img/quote.svg b/website/components/case-study-carousel/img/quote.svg new file mode 100644 index 0000000000..9f5014b045 --- /dev/null +++ b/website/components/case-study-carousel/img/quote.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/website/components/case-study-carousel/img/right-arrow-control.svg b/website/components/case-study-carousel/img/right-arrow-control.svg new file mode 100644 index 0000000000..717c981260 --- /dev/null +++ b/website/components/case-study-carousel/img/right-arrow-control.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/components/case-study-carousel/index.jsx b/website/components/case-study-carousel/index.jsx new file mode 100644 index 0000000000..0d2a9358ae --- /dev/null +++ b/website/components/case-study-carousel/index.jsx @@ -0,0 +1,99 @@ +import { useState } from 'react' +import { isIE } from 'react-device-detect' + +import Carousel from 'nuka-carousel' +import CaseSlide from './case-study-slide' +import Image from '@hashicorp/react-image' +import InlineSvg from '@hashicorp/react-inline-svg' +import ActiveControlDot from './img/active-control-dot.svg?include' +import InactiveControlDot from './img/inactive-control-dot.svg?include' +import LeftArrow from './img/left-arrow-control.svg?include' +import RightArrow from './img/right-arrow-control.svg?include' + +export default function CaseStudyCarousel({ + caseStudies, + title, + logoSection = { grayBackground: false, featuredLogos: [] }, +}) { + const [slideIndex, setSlideIndex] = useState(0) + const { grayBackground, featuredLogos } = logoSection + + const caseStudySlides = caseStudies.map((caseStudy) => ( + + )) + const logoRows = featuredLogos && Math.ceil(featuredLogos.length / 3) + + function renderControls() { + return ( +
+ {caseStudies.map((caseStudy, stableIdx) => { + return ( + + ) + })} +
+ ) + } + + function sideControls(icon, direction) { + return ( + + ) + } + + return ( +
+

{title}

+ {!isIE ? ( + renderControls()} + renderCenterLeftControls={({ previousSlide }) => { + return sideControls(LeftArrow, previousSlide) + }} + renderCenterRightControls={({ nextSlide }) => { + return sideControls(RightArrow, nextSlide) + }} + afterSlide={(slideIndex) => setSlideIndex(slideIndex)} + > + {caseStudySlides} + + ) : null} +
+ {featuredLogos && featuredLogos.length > 0 && ( +
+ {featuredLogos.map((featuredLogo) => ( + {featuredLogo.companyName} + ))} +
+ )} +
+
+ ) +} diff --git a/website/components/case-study-carousel/style.css b/website/components/case-study-carousel/style.css new file mode 100644 index 0000000000..fbd4c32ec6 --- /dev/null +++ b/website/components/case-study-carousel/style.css @@ -0,0 +1,277 @@ +.g-case-carousel { + display: flex; + flex-direction: column; + align-items: center; + position: relative; + padding-top: 128px; + + & h2 { + margin-bottom: 30px; + max-width: 600px; + text-align: center; + white-space: pre-wrap; + + @media (max-width: 800px) { + margin-top: 64px; + white-space: initial; + margin-left: 24px; + margin-right: 24px; + } + } + + &::after { + content: ''; + width: 100%; + height: var(--background-height); + position: absolute; + bottom: 0px; + z-index: -1; + } + + &.has-background { + &::after { + content: ''; + background: var(--gray-7); + } + + & .background-section { + background: var(--gray-7); + } + } + + & .background-section { + width: 100%; + + & .mono-logos { + align-items: baseline; + display: flex; + justify-content: center; + max-width: 750px; + margin: 0 auto; + margin-top: 70px; + flex-wrap: wrap; + + & > img { + height: 100%; + max-height: 40px; + width: 33.33%; + padding: 0 30px; + margin: 24px 0px; + + @media (max-width: 800px) { + padding: 0 20px; + max-height: 28px; + } + } + + & > picture { + max-height: 40px; + width: 33.33%; + padding: 0 30px; + margin: 24px 0px; + + @media (max-width: 800px) { + padding: 0 20px; + max-height: 28px; + } + + & > img { + width: 100%; + height: auto; + display: flex; + } + } + } + } + + & .slider-control-bottomcenter { + bottom: -35px !important; + } + + /* Begin `nuka-carousel` styles */ + & .slider { + max-width: 1200px; + + &:focus { + outline: none !important; + } + + @media (max-width: 800px) { + width: calc(100% - 48px) !important; + } + + & .slider-list { + margin-bottom: 50px !important; + + @media (max-width: 800px) { + margin-bottom: 30px !important; + } + } + + & .slider-frame:focus { + outline: none !important; + } + + & .slider-slide:focus { + outline: none !important; + } + } + /* End `nuka-carousel` styles */ + + & .side-control { + border: none; + background: none; + margin: 20px; + + &:focus { + outline: none; + } + + &:hover:not([disabled]) { + cursor: pointer; + } + + @media (max-width: 991px) { + display: none; + } + + & svg path { + stroke: var(--gray-2); + } + + &:disabled svg path { + stroke: var(--gray-5); + } + } + + & .case-slide { + display: flex; + flex-wrap: wrap; + width: 100%; + background: var(--white); + padding: 64px; + box-shadow: 0px 8px 22px #dedede; + + @media (max-width: 800px) { + box-shadow: none; + border: 1px solid var(--gray-6); + padding: 48px; + } + + @media (--medium-up) { + max-width: 750px; + } + + & button { + margin-top: 24px; + } + + & .quotes { + display: flex; + margin-bottom: 24px; + } + + & h4 { + margin: 0; + + &.case { + min-height: 130px; + margin-bottom: 24px; + color: var(--gray-2); + + @media (max-width: 800px) { + min-height: 155px; + font-size: 22px; + } + + @media (max-width: 650px) { + min-height: 190px; + } + + @media (max-width: 550px) { + font-size: 20px; + } + + @media (max-width: 400px) { + font-size: 18px; + line-height: 28px; + } + } + } + + & p { + margin: 0; + } + + & a { + margin-top: 24px; + } + + & .case-content { + display: flex; + justify-content: space-between; + width: 100%; + align-items: center; + } + + & .person-container { + display: flex; + align-items: center; + + & picture { + display: flex; + } + + & .person-photo { + border-radius: 50%; + max-height: 72px; + margin-right: 24px; + } + + & .person-name { + & h5 { + margin: 0; + } + + @media (max-width: 400px) { + & h5 { + font-size: 16px; + } + & p { + font-size: 15px; + } + } + } + } + + & .company-logo { + max-height: 40px; + max-width: 180px; + + @media (max-width: 800px) { + display: none; + } + } + + & .case { + color: var(--gray-5); + font-size: 24px; + line-height: 31px; /* Called for within the design, no custom property seemed appropriate*/ + } + } + + & .carousel-controls { + width: 100%; + display: flex; + flex-wrap: nowrap; + justify-content: center; + + & .carousel-controls-button { + height: 20px; + background: transparent; + box-shadow: none; + cursor: pointer; + border: none; + } + } +} diff --git a/website/components/enterprise-comparison/consul/img/consul-enterprise.svg b/website/components/enterprise-comparison/consul/img/consul-enterprise.svg new file mode 100644 index 0000000000..0139d8d470 --- /dev/null +++ b/website/components/enterprise-comparison/consul/img/consul-enterprise.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/components/enterprise-comparison/consul/img/consul-oss.svg b/website/components/enterprise-comparison/consul/img/consul-oss.svg new file mode 100644 index 0000000000..8a05d36067 --- /dev/null +++ b/website/components/enterprise-comparison/consul/img/consul-oss.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/website/components/enterprise-comparison/consul/index.jsx b/website/components/enterprise-comparison/consul/index.jsx new file mode 100644 index 0000000000..dbd1c8ae83 --- /dev/null +++ b/website/components/enterprise-comparison/consul/index.jsx @@ -0,0 +1,34 @@ +import EnterpriseComparison from '../../enterprise-comparison' + +export default function ConsulEnterpriseComparison() { + return ( + + ) +} diff --git a/website/components/enterprise-comparison/img/arrow.svg b/website/components/enterprise-comparison/img/arrow.svg new file mode 100644 index 0000000000..2dcd4406c9 --- /dev/null +++ b/website/components/enterprise-comparison/img/arrow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/website/components/enterprise-comparison/img/complexity-advanced.png b/website/components/enterprise-comparison/img/complexity-advanced.png new file mode 100644 index 0000000000..eeac1f3b96 Binary files /dev/null and b/website/components/enterprise-comparison/img/complexity-advanced.png differ diff --git a/website/components/enterprise-comparison/img/complexity-basic.png b/website/components/enterprise-comparison/img/complexity-basic.png new file mode 100644 index 0000000000..9a35d60b14 Binary files /dev/null and b/website/components/enterprise-comparison/img/complexity-basic.png differ diff --git a/website/components/enterprise-comparison/index.jsx b/website/components/enterprise-comparison/index.jsx new file mode 100644 index 0000000000..d0b611e91d --- /dev/null +++ b/website/components/enterprise-comparison/index.jsx @@ -0,0 +1,52 @@ +import Image from '@hashicorp/react-image' +import Button from '@hashicorp/react-button' +import InlineSvg from '@hashicorp/react-inline-svg' +import ArrowIcon from './img/arrow.svg?include' + +export default function EnterpriseComparison({ + title, + itemOne, + itemTwo, + brand, +}) { + return ( +
+
+

{title}

+ +
+
+ +
{itemOne.label}
+

{itemOne.title}

+ +

{itemOne.description}

+
+
+
+ +
+
+ +
{itemTwo.label}
+

{itemTwo.title}

+ +

{itemTwo.description}

+
+
+
+
+ ) +} diff --git a/website/components/enterprise-comparison/style.css b/website/components/enterprise-comparison/style.css new file mode 100644 index 0000000000..1b4b72989d --- /dev/null +++ b/website/components/enterprise-comparison/style.css @@ -0,0 +1,92 @@ +.g-enterprise-comparison { + padding-top: 128px; + padding-bottom: 128px; + background: var(--gray-7); + + & h2 { + text-align: center; + } + + @media (max-width: 800px) { + padding-top: 64px; + padding-bottom: 64px; + } + + & .content-container { + display: flex; + justify-content: space-between; + margin: 0 auto 64px auto; + + @media (max-width: 800px) { + flex-wrap: wrap; + } + & .item { + flex-basis: 50%; + justify-content: center; + text-align: center; + margin-top: 64px; + + @media (max-width: 800px) { + margin-top: 64px; + flex-basis: 100%; + } + + & .g-type-label-strong { + margin-top: 64px; + + @media (max-width: 800px) { + margin-top: 32px; + } + } + + & h4 { + white-space: pre; + margin-top: 24px; + margin-bottom: 8px; + + @media (max-width: 800px) { + margin-top: 16px; + } + } + + & picture { + display: inline-block; + } + + & img { + max-width: 160px; + max-height: 98px; + } + & p { + margin-top: 0; + margin-bottom: 24px; + + @media (max-width: 800px) { + max-width: 600px; + margin-right: auto; + margin-left: auto; + } + } + } + + & .spacer { + & .vertical-spacer { + height: 93px; + } + + & .arrow { + display: flex; + align-items: center; + } + + @media (max-width: 800px) { + display: none; + } + } + } + + & .more-features-link { + display: flex; + justify-content: center; + } +} diff --git a/website/components/footer/style.css b/website/components/footer/style.css index bd11930e6c..7d72632890 100644 --- a/website/components/footer/style.css +++ b/website/components/footer/style.css @@ -2,6 +2,7 @@ padding: 25px 0 17px 0; flex-shrink: 0; display: flex; + border-top: 1px solid var(--gray-6); & .g-container { display: flex; diff --git a/website/components/learn-callout/index.jsx b/website/components/learn-callout/index.jsx new file mode 100644 index 0000000000..c76c61d47b --- /dev/null +++ b/website/components/learn-callout/index.jsx @@ -0,0 +1,57 @@ +import Button from '@hashicorp/react-button' + +export default function LearnNomad({ headline, brand, items }) { + return ( +
+
+
+ {/* need this wrapper to flex center the .column-content */} +
+
+

{headline}

+
+
+ {items.map((item) => { + return ( + +
+
+
{item.time}
+ {item.title} +
+
+
+ +

{item.title}

+
+
+
+
+ ) + })} +
+
+
+ ) +} diff --git a/website/components/learn-callout/style.css b/website/components/learn-callout/style.css new file mode 100644 index 0000000000..62be0028ce --- /dev/null +++ b/website/components/learn-callout/style.css @@ -0,0 +1,174 @@ +.g-learn-callout { + padding-top: 88px; + padding-bottom: 88px; + background-image: url(/img/nomad-panel-learn.svg); + background-size: contain; + background-position: bottom right; + background-repeat: no-repeat; + + @media (max-width: 768px) { + padding-top: 64px; + padding-bottom: 64px; + } + + & .learn-container { + @media (max-width: 1200px) { + display: flex; + flex-wrap: wrap; + justify-content: center; + } + & .mobile-button { + @media (min-width: 1201px) { + display: none; + } + } + } + + & .column-container { + display: flex; + justify-content: space-between; + margin: 0 36px; + + @media (max-width: 1200px) { + margin: 0 -16px; + flex-wrap: wrap; + } + + & .column-content { + & h2 { + @media (max-width: 1200px) { + margin: 0; + } + } + } + + & .desktop-button { + @media (max-width: 1200px) { + display: none; + } + } + + & > div { + display: flex; + flex-wrap: wrap; + align-items: center; + margin: 0 16px; + width: 33.333%; + overflow: auto; + + @media (max-width: 1200px) { + text-align: center; + display: block; + width: 100%; + margin: 0; + margin-bottom: 48px; + } + } + + & > a { + margin: 0 16px; + width: 33.333%; + transition: box-shadow 0.25s, transform 0.25s, -webkit-transform 0.25s; + + &:hover { + box-shadow: 0px 16px 28px rgba(37, 38, 45, 0.12); + transform: translateY(-4px); + } + + @media (max-width: 1200px) { + width: calc(50% - 32px); + margin-bottom: 48px; + } + + @media (max-width: 768px) { + width: 100%; + + &:last-child { + margin-bottom: 48px; + } + } + } + + & > a { + display: flex; + cursor: pointer; + } + + & > a .course { + border: 1px solid var(--gray-6); + display: flex; + flex-direction: column; + width: 100%; + + & > div { + min-height: 200px; + padding: 25px; + } + + & .image { + background: var(--gray-7); + position: relative; + display: flex; + justify-content: center; + align-items: center; + + & img { + max-width: 80px; + max-height: 80px; + } + } + + & h4 { + color: var(--gray-2); + } + + & .time { + color: var(--gray-4); + position: absolute; + top: 10px; + right: 10px; + } + + & .content { + text-align: center; + background: #fff; + @media (max-width: 768px) { + display: flex; + justify-content: center; + align-items: center; + } + + & h4 { + margin: 24px 0px; + } + } + } + } + + &.brand-consul { + & .content label { + color: var(--consul); + } + } + + /* Brand -- Nomad */ + &.brand-nomad { + & .content label { + color: var(--nomad); + } + } + + /* Brand -- Packer */ + &.brand-packer { + & .content label { + color: var(--packer); + } + } + + /* Brand -- Terraform */ + &.brand-terraform { + & .content label { + color: var(--terraform); + } + } +} diff --git a/website/components/prefooter-cta/index.jsx b/website/components/prefooter-cta/index.jsx new file mode 100644 index 0000000000..f8a5beadff --- /dev/null +++ b/website/components/prefooter-cta/index.jsx @@ -0,0 +1,25 @@ +import CallToAction from '@hashicorp/react-call-to-action' + +export default function PrefooterCTA() { + return ( + + ) +} diff --git a/website/data/subnav.js b/website/data/subnav.js index d9b0da0995..4bd3382093 100644 --- a/website/data/subnav.js +++ b/website/data/subnav.js @@ -1,16 +1,29 @@ export default [ + { text: 'Overview', url: '/', type: 'inbound' }, { text: 'Use Cases', submenu: [ - { text: 'Service Discovery', url: '/discovery' }, - { text: 'Service Mesh', url: '/mesh' }, + { + text: 'Service Discovery and Health Checking', + url: '/use-cases/service-discovery-and-health-checking', + }, + { + text: 'Network Middleware Automation', + url: '/use-cases/network-middleware-automation', + }, + { + text: 'Multi-Platform Service Mesh', + url: '/use-cases/multi-platform-service-mesh', + }, ], }, { - text: 'Intro', - url: '/intro', - type: 'inbound', + text: 'Enterprise', + url: + 'https://www.hashicorp.com/products/consul/?utm_source=oss&utm_medium=header-nav&utm_campaign=consul', + type: 'outbound', }, + 'divider', { text: 'Learn', url: 'https://learn.hashicorp.com/consul', @@ -31,10 +44,4 @@ export default [ url: '/community', type: 'inbound', }, - { - text: 'Enterprise', - url: - 'https://www.hashicorp.com/products/consul/?utm_source=oss&utm_medium=header-nav&utm_campaign=consul', - type: 'outbound', - }, ] diff --git a/website/layouts/use-cases/index.jsx b/website/layouts/use-cases/index.jsx new file mode 100644 index 0000000000..49e8042fa9 --- /dev/null +++ b/website/layouts/use-cases/index.jsx @@ -0,0 +1,42 @@ +import BasicHero from '../../components/basic-hero' +import PrefooterCTA from '../../components/prefooter-cta' +import ConsulEnterpriseComparison from '../../components/enterprise-comparison/consul' +import Head from 'next/head' +import HashiHead from '@hashicorp/react-head' + +export default function UseCaseLayout({ title, description, children }) { + const pageTitle = `Consul ${title}` + return ( + <> + + + + +
+ +
+

Features

+
+ {children} + + +
+ + ) +} diff --git a/website/layouts/use-cases/style.css b/website/layouts/use-cases/style.css new file mode 100644 index 0000000000..24beb9f366 --- /dev/null +++ b/website/layouts/use-cases/style.css @@ -0,0 +1,40 @@ +#p-use-case { + & .features-header { + text-align: center; + margin-bottom: 0px; + } + + /* Overriding the g-text-split component to have + * a header size closer to a h3 than a h2, as within + * the context of this page this text-split is more deeply + * nested within the page than we normally have it. + * */ + & .g-text-split { + & h2 { + font-size: 1.5rem; + letter-spacing: -0.004em; + line-height: 1.375em; + + @media (--medium-up) { + font-size: 1.75rem; + line-height: 1.321em; + } + + @media (--large) { + font-size: 2rem; + letter-spacing: -0.006em; + line-height: 1.313em; + } + } + } + + & .with-border { + & .g-text-split { + & .children { + border-width: 1px; + border-color: rgba(174, 176, 183, 0.45); + border-style: solid; + } + } + } +} diff --git a/website/package-lock.json b/website/package-lock.json index 95c4eb201a..de3e4cbb6f 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -1159,7 +1159,7 @@ "inquirer": "^7.1.0", "lint-staged": "^10.1.7", "next-mdx-enhanced": "^2.4.0", - "next-optimized-images": "github:hashicorp/next-optimized-images", + "next-optimized-images": "github:hashicorp/next-optimized-images#b32b280c862af79dcb917cc44e33fbb1357d5c59", "next-transpile-modules": "^3.2.0", "open": "^7.0.3", "postcss-flexbugs-fixes": "^4.2.0", @@ -1312,6 +1312,38 @@ "@hashicorp/js-utils": "^1.0.9-alpha.0" } }, + "@hashicorp/react-featured-slider": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@hashicorp/react-featured-slider/-/react-featured-slider-1.1.0.tgz", + "integrity": "sha512-TEZYQ9pqQvt/VyJzCZKLVIImfJkcKvMuMC7pCOZ/Wf0dblVqzTV0sAalXzv2ssj8wA3OaSw1WGg0Gum6/Fk43Q==", + "requires": { + "@hashicorp/react-button": "^2.2.0", + "@hashicorp/react-image": "^2.0.1", + "marked": "^1.0.0" + }, + "dependencies": { + "@hashicorp/react-button": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@hashicorp/react-button/-/react-button-2.2.0.tgz", + "integrity": "sha512-UUwn+yFWlTIGjWbPu2Z1griHPT0ywu/ECVAJ7OVqx9ZKXUxr0DOnwMGuqrkZS34hg/mmUAzYQhWqo8fycoQXig==", + "requires": { + "@hashicorp/react-global-styles": "^4.4.0", + "@hashicorp/react-inline-svg": "^1.0.0", + "slugify": "^1.3.6" + } + }, + "@hashicorp/react-global-styles": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@hashicorp/react-global-styles/-/react-global-styles-4.4.0.tgz", + "integrity": "sha512-lv6XR2plm2m3+qO6VE+RYquTzOODIt3mQ/1fBT1bn7wsR0qxFiuryW4JfsF94oCGk++LkDkRt/8V742HiT+fHw==" + }, + "marked": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-1.0.0.tgz", + "integrity": "sha512-Wo+L1pWTVibfrSr+TTtMuiMfNzmZWiOPeO7rZsQUY5bgsxpHesBEcIWJloWVTFnrMXnf/TL30eTFSGJddmQAng==" + } + } + }, "@hashicorp/react-footer": { "version": "3.1.14", "resolved": "https://registry.npmjs.org/@hashicorp/react-footer/-/react-footer-3.1.14.tgz", @@ -1418,6 +1450,14 @@ "@hashicorp/react-button": "^2.1.9" } }, + "@hashicorp/react-product-features-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@hashicorp/react-product-features-list/-/react-product-features-list-1.0.1.tgz", + "integrity": "sha512-kdDoWUZYB43jpy6TYzuksjUU8RTGrEIvQMKErfEkcXwSMTG5KG/og8UdJUnzjIPSW/gK73Djr+T2UzNmrnnMIw==", + "requires": { + "@hashicorp/react-image": "^2.0.1" + } + }, "@hashicorp/react-section-header": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@hashicorp/react-section-header/-/react-section-header-2.0.0.tgz", @@ -17273,8 +17313,7 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true, - "optional": true + "bundled": true }, "aproba": { "version": "1.2.0", @@ -17292,13 +17331,11 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true, - "optional": true + "bundled": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -17311,18 +17348,15 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true, - "optional": true + "bundled": true }, "concat-map": { "version": "0.0.1", - "bundled": true, - "optional": true + "bundled": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, - "optional": true + "bundled": true }, "core-util-is": { "version": "1.0.2", @@ -17425,8 +17459,7 @@ }, "inherits": { "version": "2.0.4", - "bundled": true, - "optional": true + "bundled": true }, "ini": { "version": "1.3.5", @@ -17436,7 +17469,6 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -17449,20 +17481,17 @@ "minimatch": { "version": "3.0.4", "bundled": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "1.2.5", - "bundled": true, - "optional": true + "bundled": true }, "minipass": { "version": "2.9.0", "bundled": true, - "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -17479,7 +17508,6 @@ "mkdirp": { "version": "0.5.3", "bundled": true, - "optional": true, "requires": { "minimist": "^1.2.5" } @@ -17535,8 +17563,7 @@ }, "npm-normalize-package-bin": { "version": "1.0.1", - "bundled": true, - "optional": true + "bundled": true }, "npm-packlist": { "version": "1.4.8", @@ -17561,8 +17588,7 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, - "optional": true + "bundled": true }, "object-assign": { "version": "4.1.1", @@ -17572,7 +17598,6 @@ "once": { "version": "1.4.0", "bundled": true, - "optional": true, "requires": { "wrappy": "1" } @@ -17641,8 +17666,7 @@ }, "safe-buffer": { "version": "5.1.2", - "bundled": true, - "optional": true + "bundled": true }, "safer-buffer": { "version": "2.1.2", @@ -17672,7 +17696,6 @@ "string-width": { "version": "1.0.2", "bundled": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -17690,7 +17713,6 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -17729,13 +17751,11 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, - "optional": true + "bundled": true }, "yallist": { "version": "3.1.1", - "bundled": true, - "optional": true + "bundled": true } } }, diff --git a/website/package.json b/website/package.json index 9a5ea1bdc4..a2af662a77 100644 --- a/website/package.json +++ b/website/package.json @@ -20,6 +20,7 @@ "@hashicorp/react-docs-sidenav": "^3.2.3", "@hashicorp/react-docs-sitemap": "^1.0.0", "@hashicorp/react-enterprise-alert": "^2.1.0", + "@hashicorp/react-featured-slider": "^1.1.0", "@hashicorp/react-footer": "^3.1.14", "@hashicorp/react-global-styles": "^4.2.0", "@hashicorp/react-head": "^0.1.1", @@ -29,6 +30,7 @@ "@hashicorp/react-logo-grid": "^2.0.11", "@hashicorp/react-mega-nav": "^4.0.1-2", "@hashicorp/react-product-downloader": "^3.1.2", + "@hashicorp/react-product-features-list": "^1.0.1", "@hashicorp/react-section-header": "^2.0.0", "@hashicorp/react-subnav": "^3.1.1", "@hashicorp/react-tabs": "^0.4.0", diff --git a/website/pages/_app.js b/website/pages/_app.js index 37ccf5e042..50ceb316a2 100644 --- a/website/pages/_app.js +++ b/website/pages/_app.js @@ -59,7 +59,7 @@ class NextApp extends App { is={Head} title="Consul by HashiCorp" siteName="Consul by HashiCorp" - description="Consul is a service networking solution to connect and secure services across any runtime platform and public or private cloud." + description="Consul is a service networking solution to automate network configurations, discover services, and enable secure connectivity across any cloud or runtime." image="https://www.consul.io/img/og-image.png" stylesheet={[ { href: '/css/nprogress.css' }, @@ -81,7 +81,13 @@ class NextApp extends App { { href: '/fonts/metro-sans/bold.woff2', as: 'font' }, { href: '/fonts/dejavu/mono.woff2', as: 'font' }, ]} - /> + > + + {ALERT_BANNER_ACTIVE && ( )} diff --git a/website/pages/discovery/index.jsx b/website/pages/discovery/index.jsx deleted file mode 100644 index c950825f5a..0000000000 --- a/website/pages/discovery/index.jsx +++ /dev/null @@ -1,499 +0,0 @@ -import CallToAction from '@hashicorp/react-call-to-action' -import CaseStudySlider from '@hashicorp/react-case-study-slider' -import CodeBlock from '@hashicorp/react-code-block' -import BeforeAfterDiagram from '../../components/before-after' - -export default function ServiceDiscovery() { - return ( - <> -
- -
-
- -
-
-
- -
-
-
-

Features

-
-
-
-
-

Service Registry

-

- Consul provides a registry of all the running nodes and - services, along with their current health status. This - allows operators to understand the environment, and - applications and automation tools to interact with dynamic - infrastructure using an HTTP API. -

-

- - Learn more - - - - - - - - - - - -

-
-
-
- - - - Service Registry - -
-
-
-
- -
-
-
-
-
-

DNS Query Interface

-

- Consul enables service discovery using a built-in DNS - server. This allows existing applications to easily - integrate, as almost all applications support using DNS to - resolve IP addresses. Using DNS instead of a static IP - address allows services to scale up/down and route around - failures easily. -

-

- - Learn more - - - - - - - - - - - -

-
-
-
-
- - > DiG 9.8.3-P1 <<>> web-frontend.service.consul. ANY -;; global options: +cmd -;; Got answer: -;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29981 -;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 - -;; QUESTION SECTION: -;web-frontend.service.consul. IN ANY - -;; ANSWER SECTION: -web-frontend.service.consul. 0 IN A 10.0.3.83 -web-frontend.service.consul. 0 IN A 10.0.1.109 - `} - /> -
-
-
-
-
- -
-
-
-
-
-

HTTP API with Edge Triggers

-

- Consul provides an HTTP API to query the service registry - for nodes, services, and health check information. The API - also supports blocking queries, or long-polling for any - changes. This allows automation tools to react to services - being registered or health status changes to change - configurations or traffic routing in real time. -

-

- - Learn more - - - - - - - - - - - -

-
-
-
-
- - "critical", - "ServiceID": "web", - "ServiceName": "web", - "CreateIndex": 10, - "ModifyIndex": 20 - ... - } - `} - /> -
-
-
-
-
- -
-
-
-
-
-

Multi Datacenter

-

- Consul supports multiple datacenters out of the box with no - complicated configuration. Look up services in other - datacenters or keep the request local. Advanced features - like Prepared Queries enable automatic failover to other - datacenters. -

-

- - Learn more - - - - - - - - - - - -

-
-
-
-
- -
- dc2", - "TaggedAddresses": { - "lan": "10.0.1.109", - "wan": "10.0.1.109" - }, - "CreateIndex": 112, - "ModifyIndex": 125 - }, -... - `} - /> -
-
-
-
-
-
- -
-
-
-
-
-

Health Checks

-

- Pairing service discovery with health checking prevents - routing requests to unhealthy hosts and enables services to - easily provide circuit breakers. -

-

- - Learn more - - - - - - - - - - - -

-
-
-
- - - - Health Checks - -
-
-
-
-
-
-
-

Use Cases

-
- -
-
- -
-
-

Ready to get started?

- - - - - Download - - - Explore docs - -
-
-
- - ) -} diff --git a/website/pages/discovery/style.css b/website/pages/discovery/style.css deleted file mode 100644 index 77b43ddb03..0000000000 --- a/website/pages/discovery/style.css +++ /dev/null @@ -1,51 +0,0 @@ -.intro { - text-align: center; - margin-bottom: 64px; -} - -.g-section.border-top { - border-top: 1px solid #e5e6eb; -} - -.g-cta-section.g-section { - align-items: center; - background: var(--consul); - display: flex; - justify-content: center; - padding-left: 15px; - padding-right: 15px; - position: relative; - text-align: center; - overflow: hidden; - - &:after { - content: ''; - background: url('/img/consul-connect/mesh.svg') top center; - background-size: cover; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - opacity: 0.2; - transform: scale(1.3, 1.3); - } - - & > div { - z-index: 1; - } - - & h2 { - color: var(--white); - margin-top: 0; - } - - & .button + .button { - margin-left: 18px; - } -} - -.bg-dark { - background: #252937 !important; - color: #fff; -} diff --git a/website/pages/home/img/learn/getting-started.svg b/website/pages/home/img/learn/getting-started.svg new file mode 100644 index 0000000000..4e22030c8b --- /dev/null +++ b/website/pages/home/img/learn/getting-started.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/website/pages/home/img/learn/kubernetes.svg b/website/pages/home/img/learn/kubernetes.svg new file mode 100644 index 0000000000..54fa552e97 --- /dev/null +++ b/website/pages/home/img/learn/kubernetes.svg @@ -0,0 +1,7 @@ + + + Kubernetes + + + + \ No newline at end of file diff --git a/website/pages/home/img/quotes/barclays-logo.svg b/website/pages/home/img/quotes/barclays-logo.svg new file mode 100644 index 0000000000..fc9cef53f7 --- /dev/null +++ b/website/pages/home/img/quotes/barclays-logo.svg @@ -0,0 +1,12 @@ + + + + barclays-logo-3e6a89496726d78f264a2cb5c31bc173 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/website/pages/home/img/quotes/citadel-logo.svg b/website/pages/home/img/quotes/citadel-logo.svg new file mode 100644 index 0000000000..7a058311e0 --- /dev/null +++ b/website/pages/home/img/quotes/citadel-logo.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/website/pages/home/img/quotes/criteo-logo.svg b/website/pages/home/img/quotes/criteo-logo.svg new file mode 100644 index 0000000000..1abd917007 --- /dev/null +++ b/website/pages/home/img/quotes/criteo-logo.svg @@ -0,0 +1 @@ +18_Criteo_Brand_Logo \ No newline at end of file diff --git a/website/pages/home/img/quotes/mercedes-logo.svg b/website/pages/home/img/quotes/mercedes-logo.svg new file mode 100644 index 0000000000..34c0e487bf --- /dev/null +++ b/website/pages/home/img/quotes/mercedes-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/pages/home/img/use-cases/multi-platform-service-mesh.svg b/website/pages/home/img/use-cases/multi-platform-service-mesh.svg new file mode 100644 index 0000000000..0f34cd62d5 --- /dev/null +++ b/website/pages/home/img/use-cases/multi-platform-service-mesh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/pages/home/img/use-cases/network-middleware-automation.svg b/website/pages/home/img/use-cases/network-middleware-automation.svg new file mode 100644 index 0000000000..c5e653f990 --- /dev/null +++ b/website/pages/home/img/use-cases/network-middleware-automation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/pages/home/img/use-cases/service-discovery-and-health-checking.svg b/website/pages/home/img/use-cases/service-discovery-and-health-checking.svg new file mode 100644 index 0000000000..529524bd07 --- /dev/null +++ b/website/pages/home/img/use-cases/service-discovery-and-health-checking.svg @@ -0,0 +1 @@ +DC1DC2DC3 \ No newline at end of file diff --git a/website/pages/home/img/why-consul/cloud.svg b/website/pages/home/img/why-consul/cloud.svg new file mode 100644 index 0000000000..081eae798c --- /dev/null +++ b/website/pages/home/img/why-consul/cloud.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/website/pages/home/img/why-consul/dynamic-load-balancing.svg b/website/pages/home/img/why-consul/dynamic-load-balancing.svg new file mode 100644 index 0000000000..a47c22231d --- /dev/null +++ b/website/pages/home/img/why-consul/dynamic-load-balancing.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/pages/home/img/why-consul/health.svg b/website/pages/home/img/why-consul/health.svg new file mode 100644 index 0000000000..5a7285df8e --- /dev/null +++ b/website/pages/home/img/why-consul/health.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/pages/home/img/why-consul/kubernetes.svg b/website/pages/home/img/why-consul/kubernetes.svg new file mode 100644 index 0000000000..6f8ebe5fd6 --- /dev/null +++ b/website/pages/home/img/why-consul/kubernetes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/pages/home/img/why-consul/service-mesh-runtime.svg b/website/pages/home/img/why-consul/service-mesh-runtime.svg new file mode 100644 index 0000000000..6baaf5b7fc --- /dev/null +++ b/website/pages/home/img/why-consul/service-mesh-runtime.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/pages/home/img/why-consul/world.svg b/website/pages/home/img/why-consul/world.svg new file mode 100644 index 0000000000..fcaffe6828 --- /dev/null +++ b/website/pages/home/img/why-consul/world.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/website/pages/home/index.jsx b/website/pages/home/index.jsx index e2599802f4..7158254c9b 100644 --- a/website/pages/home/index.jsx +++ b/website/pages/home/index.jsx @@ -1,309 +1,211 @@ -import Hero from '@hashicorp/react-hero' -import BeforeAfterDiagram from '../../components/before-after' -import SectionHeader from '@hashicorp/react-section-header' -import consulEnterpriseLogo from '../../public/img/consul-connect/logos/consul-enterprise-logo.svg?include' -import consulLogo from '../../public/img/consul-connect/logos/consul-logo.svg?include' +import UseCases from '@hashicorp/react-use-cases' +import BasicHero from '../../components/basic-hero' +import ConsulEnterpriseComparison from '../../components/enterprise-comparison/consul' +import PrefooterCTA from '../../components/prefooter-cta' +import LearnCallout from '../../components/learn-callout' +import CaseStudyCarousel from '../../components/case-study-carousel' +import ProductFeaturesList from '@hashicorp/react-product-features-list' export default function HomePage() { return ( - <> -
- {/* Hero */} -
- View demo of web UI', - videos: [ - { - name: 'UI', - playbackRate: 2, - src: [ - { - srcType: 'ogg', - }, - { - srcType: 'webm', - url: '', - }, - { - srcType: 'mp4', - url: - 'https://consul-static-asssets.global.ssl.fastly.net/videos/v1/connect-video-ui.mp4', - }, - ], - }, - { - name: 'CLI', - src: [ - { - srcType: 'mp4', - url: - 'https://consul-static-asssets.global.ssl.fastly.net/videos/v1/connect-video-cli.mp4', - }, - ], - }, - ], - }} - /> -
- {/* Use Cases */} -
-
- +
+ + + -
-
-
- Upgrade services -

Consul-Kubernetes Deployments

-

- Use Consul service discovery and service mesh features with - Kubernetes.{' '} -

-
- -
-
-
- Connect services -

Secure Service Communication

-

- Secure and observe communication between your services - without modifying their code. -

-
- -
-
-
- Load balance services -

Dynamic Load Balancing

-

- Automate load balancer configuration with Consul and - HAProxy, Nginx, or F5. -

-
- -
-
-
-
- {/* Static => Dynamic (Before & After) */} -
-
- - -
-
-
-
-
-
-
-

Extend and Integrate

-

- Provision clusters on any infrastructure, connect to - services over TLS via proxy integrations, and Serve TLS - certificates with pluggable Certificate Authorities. -

-
-
-
- - - - Extend and Integrate - -
-
-
-
+ - {/* Companies Using Consul Logos */} -
-
- -
-
- SAP Ariba -
-
- Citadel -
-
- Barclays -
-
- itv -
-
- Spaceflight Industries -
-
- MyLotto -
-
-
-
-
-
-
-
-

- Consul Open Source addresses the technical complexity of - connecting services across distributed infrastructure. -

- -
-
-
-
-
-

- Consul Enterprise addresses the organizational complexity of - large user bases and compliance requirements with collaboration - and governance features. -

- -
-
-
+
+

Use Cases

+
- + + + + +
) } diff --git a/website/pages/home/style.css b/website/pages/home/style.css index 3f807df920..21587c1919 100644 --- a/website/pages/home/style.css +++ b/website/pages/home/style.css @@ -1,449 +1,31 @@ -.large-padding { - padding: 120px 0; -} - -.small-padding { - padding: 56px; -} - -.bg-light { - background: #f7f8fa !important; -} - -#companies-using-consul h2 { - margin-bottom: 24px; -} - -#static-dynamic { - & .g-section-header { - margin-bottom: 64px; +.p-home { + & > section { + padding-top: 100px; + padding-bottom: 100px; } -} -.g-use-cases { - margin: 48px 0 8px; + & .use-cases { + padding-top: 128px; + padding-bottom: 64px; - @media (min-width: 768px) { - display: flex; - justify-content: center; - margin: 0 20px; - } - - & .button { - background: #ca2171; - border-radius: 1px; - box-sizing: border-box; - color: #ffffff; - display: inline-block; - font-family: 'gilmer-web', 'Gilmer', Geneva, Tahoma, Helvetica, Verdana, - sans-serif; - font-size: 0.938rem; - font-weight: 500; - line-height: 1.6em; - margin-bottom: 4px; - padding: 14px 20px; - text-decoration: none; - } - - & img { - width: 51%; - - @media (min-width: 768px) { - width: 80%; + @media (max-width: 800px) { + padding-top: 88px; } - } - - & h3 { - font-weight: 600; - margin: 40px 0 0; - - & span { - display: block; - font-weight: 300; - } - } - & p { - margin-top: 0.5em; - - @media (min-width: 768px) { - margin-top: 1em; - } - } - - & > div { - padding: 0 16px; - position: relative; - text-align: center; - - @media (min-width: 768px) { - padding: 0 20px; - width: 33.33333%; - } - - @media (min-width: 992px) { - display: flex; - flex-direction: column; - justify-content: space-between; - } - - & + div { - margin-top: 56px; - - @media (min-width: 768px) { - margin-top: 0; + & .g-use-cases { + & .icon { + min-height: 140px; + margin-bottom: 25px; } } - } - - & .button { - @media (min-width: 768px) { - margin-top: 22px; - } - } -} - -.g-logo-grid { - align-items: center; - display: flex; - flex-wrap: wrap; - margin: 0 auto; - max-width: 990px; - text-align: center; - - & > div { - width: 33%; - - & img { - width: 100%; - } - - @media (max-width: 768px) { - width: 50%; - } - } -} - -.g-text-asset { - text-align: center; - - @media (min-width: 768px) { - align-content: space-between; - display: flex; - justify-content: center; - margin: 0 -20px; - text-align: left; - } - - &.reverse { - flex-direction: row-reverse; - - & > div:first-child > div { - margin-left: auto; - - @media (min-width: 768px) { - padding: 0 24px 0 0; - } - - @media (min-width: 992px) { - padding-right: 32px; - } - } - } - - &.large { - margin-bottom: -56px; - - @media (min-width: 768px) { - margin-bottom: -96px; - } - - @media (min-width: 992px) { - margin-bottom: -120px; - } - - & > div:last-child { - justify-content: unset; - } - - & picture > img, - & img { - width: 145%; - vertical-align: middle; - } - } - - & > div { - @media (min-width: 768px) { - align-items: center; - margin: 0 auto; - display: flex; - padding: 0 20px; - width: 50%; - } - - &:first-child { - margin-bottom: 32px; - - @media (min-width: 768px) { - margin-bottom: 0; - } - - & > div { - @media (min-width: 768px) { - margin-left: 0; - max-width: 454px; - padding: 0 0 0 24px; - } - - @media (min-width: 992px) { - padding-left: 32px; - } - - & a { - color: #1563ff; - - &:focus, - &:hover { - color: #2c72fe; - - & path { - fill: #2c72fe; - } - } - & svg { - margin-left: 10px; - } - } - } - } - - &:last-child { - justify-content: center; - } - - & img, - & picture > img { - width: 100%; - - &.shadow { - box-shadow: 0 40px 48px -20px rgba(63, 68, 85, 0.4); - } - } - - & > svg { - max-width: 100%; - } - - &.code-sample > div { - box-shadow: 0 40px 48px -20px rgba(63, 68, 85, 0.4); - color: var(--white); + & h2 { margin: 0; - text-align: left; - width: 100%; - - & span { - background: #252937; - border-bottom: 1px solid rgba(255, 255, 255, 0.15); - display: block; - height: 32px; - - @media (min-width: 768px) { - height: 40px; - } - } - - & .code { - background: #1e212a; - overflow: auto; - padding: 16px 24px 32px; - width: 100%; - - & code { - background: #1e212a; - border-radius: 0; - color: var(--white); - white-space: pre; - - &.keyword { - color: #be5580; - } - } - } - } - - &.logos { - justify-content: center; - - & > div { - align-items: center; - display: flex; - flex-direction: column; - - & img, - picture { - margin: 30px 0; - - @media (max-width: 767px) { - margin: 15px 0; - max-width: 51%; - } - } - } - } - } - - & h3 { - margin: 0 0 16px 0; - - @media (min-width: 768px) { - margin-top: 16px; - } - } - - & i { - list-style-type: none; - margin: 16px; - text-align: left; - - @media (min-width: 768px) { - margin: 16px 0; - } - - &:before { - background-position: center; - background-repeat: no-repeat; - background-size: 100%; - background-image: url('data:image/svg+xml;utf8,'); - content: ''; - display: block; - float: left; - height: 24px; - margin: 4px 0 0 -40px; - width: 24px; - } - } -} - -#static-dynamic { - & .static-callout { - width: 85%; - } - - & #index-dynamic-animation { - width: 85%; - margin: 0 auto; - - & svg { - width: 100%; - height: auto !important; - } - } -} - -.home-cta-section { - color: var(--white); - - @media (min-width: 768px) { - display: flex; - } - - & > div { - display: flex; - justify-content: center; - padding: 64px 24px; - overflow: hidden; - - @media (min-width: 768px) { - padding-top: 80px; - padding-bottom: 80px; - width: 50%; - } - - @media (min-width: 992px) { - padding-top: 96px; - padding-bottom: 96px; - width: 50%; - } - - & > svg { - width: 135px; - } - - &:first-child { - background: var(--consul); - position: relative; - - &:after { - content: ''; - background: url('/img/consul-connect/mesh.svg') top center; - background-size: cover; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - opacity: 0.2; - transform: scale(1.3, 1.3); - } - } - - &:last-child { - background: var(--gray-1); - } - - & > div { - display: flex; - flex-direction: column; - max-width: 564px; text-align: center; - width: 100%; - z-index: 1; - - & div:first-child { - height: 50px; - width: auto; - } - - & p { - flex: 1 0 auto; - margin: 24px 0 32px; + margin-bottom: 64px; + @media (max-width: 800px) { + margin-bottom: 48px; } } } } - -.button { - background: #ca2171; - border-radius: 1px; - box-sizing: border-box; - color: #ffffff; - display: inline-block; - font-family: 'gilmer-web', 'Gilmer', Geneva, Tahoma, Helvetica, Verdana, - sans-serif; - font-size: 0.938rem; - font-weight: 500; - line-height: 1.6em; - margin-bottom: 4px; - padding: 14px 20px; - text-decoration: none; -} - -.button.white { - background: #ffffff; - color: #000000; -} - -.button.secondary.white { - border: 1px solid rgba(255, 255, 255, 0.24); - color: #ffffff; -} - -.button.secondary { - background: transparent; - border: 1px solid rgba(29, 30, 35, 0.2); - color: #000000; - padding: 13px 19px; -} -/* */ diff --git a/website/pages/index.jsx b/website/pages/index.jsx index 35cb5c8e66..83b8904b0c 100644 --- a/website/pages/index.jsx +++ b/website/pages/index.jsx @@ -1,2 +1,3 @@ import Homepage from './home' + export default Homepage diff --git a/website/pages/mesh/index.jsx b/website/pages/mesh/index.jsx deleted file mode 100644 index 10299ff934..0000000000 --- a/website/pages/mesh/index.jsx +++ /dev/null @@ -1,453 +0,0 @@ -import CallToAction from '@hashicorp/react-call-to-action' -import CodeBlock from '@hashicorp/react-code-block' -import BeforeAfterDiagram from '../../components/before-after' - -export default function ServiceMesh() { - return ( - <> -
- -
-
- -
-
- -
-
-
-

Features

-
-
-
-
-

Layer 7 Traffic Management

-

- Service-to-service communication policy at Layer 7 can be - managed centrally, enabling advanced traffic management - patterns such as service failover, path-based routing, and - traffic shifting that can be applied across public and - private clouds, platforms, and networks. -

-

- - Learn more - - - - - - - - - - - -

-
-
-
-
- - -
-
-
-
-
- -
-
-
-
-
-

Layer 7 Observability

-

- Centrally managed service observability at Layer 7 including - detailed metrics on all service-to-service communication - such as connections, bytes transferred, retries, timeouts, - open circuits, and request rates, response codes. -

-

- - Learn more - - - - - - - - - - - -

-
-
-
- - - Metrics dashboard - -
-
-
-
- -
-
-
-
-
-

- Secure services across any runtime platform -

-

- Secure communication between legacy and modern workloads. - Sidecar proxies allow applications to be integrated without - code changes and Layer 4 support provides nearly universal - protocol compatibility. -

-

- - Learn more - - - - - - - - - - - -

-
-
-
- - - - Secure services across any runtime platform - -
-
-
-
- -
-
-
-
-
-

- Certificate-Based Service Identity -

-

- TLS certificates are used to identify services and secure - communications. Certificates use the SPIFFE format for - interoperability with other platforms. Consul can be a - certificate authority to simplify deployment, or integrate - with external signing authorities like Vault. -

-

- - Learn more - - - - - - - - - - - -

-
-
-
-
- Vault - Spiffe -
-
-
-
-
- -
-
-
-
-
-

Encrypted communication

-

- All traffic between services is encrypted and authenticated - with mutual TLS. Using TLS provides a strong guarantee of - the identity of services communicating, and ensures all data - in transit is encrypted. -

-

- - Learn more - - - - - - - - - - - -

-
-
-
-
- - Consul Connect proxy starting... - Configuration mode: Flags - Service: web - Public listener: 10.0.1.109:7200 => 127.0.0.1:8000 -... -$ tshark -V \\ - -Y "ssl.handshake.certificate" \\ - -O "ssl" \\ - -f "dst port 7200" -Frame 39: 899 bytes on wire (7192 bits), 899 bytes captured (7192 bits) on interface 0 -Internet Protocol Version 4, Src: 10.0.1.110, Dst: 10.0.1.109 -Transmission Control Protocol, Src Port: 61918, Dst Port: 7200, Seq: 136, Ack: 916, Len: 843 -Secure Sockets Layer - TLSv1.2 Record Layer: Handshake Protocol: Certificate - Version: TLS 1.2 (0x0303) - Handshake Protocol: Certificate - RDNSequence item: 1 item (id-at-commonName=Consul CA 7) - RelativeDistinguishedName item (id-at-commonName=Consul CA 7) - Id: 2.5.4.3 (id-at-commonName) - DirectoryString: printableString (1) - printableString: Consul CA 7 - `} - /> -
-
-
-
-
- -
-
-
-
-
-

Mesh Gateway

-

- Connect between different cloud regions, VPCs and between - overlay and underlay networks without complex network - tunnels and NAT. Mesh Gateways solve routing at TLS layer - while preserving end-to-end encryption and limiting attack - surface area at the edge of each network. -

-

- - Learn more - - - - - - - - - - - -

-
-
-
- - Mesh gateway diagram - -
-
-
-
- -
-
-

Ready to get started?

- - - - - Download - - - Explore docs - -
-
-
- - ) -} diff --git a/website/pages/style.css b/website/pages/style.css index 277d5537c6..3ac9400306 100644 --- a/website/pages/style.css +++ b/website/pages/style.css @@ -18,6 +18,7 @@ @import '~@hashicorp/react-hero/dist/style.css'; @import '~@hashicorp/react-section-header/dist/style.css'; @import '~@hashicorp/react-logo-grid/dist/style.css'; +@import '~@hashicorp/react-product-features-list/dist/style.css'; @import '~@hashicorp/react-product-downloader/dist/style.css'; @import '~@hashicorp/react-vertical-text-block-list/dist/style.css'; @import '~@hashicorp/react-docs-sidenav/dist/style.css'; @@ -37,17 +38,24 @@ @import '~@hashicorp/react-tabs/dist/style.css'; @import '~@hashicorp/react-code-block/dist/style.css'; @import '~@hashicorp/react-alert-banner/dist/style.css'; +@import '~@hashicorp/react-use-cases/dist/style.css'; +@import '~@hashicorp/react-featured-slider/dist/style.css'; /* Local Components */ +@import '../components/basic-hero/style.css'; +@import '../components/enterprise-comparison/style.css'; @import '../components/footer/style.css'; -@import '../components/before-after/style.css'; @import '../components/tabs/style.css'; +@import '../components/learn-callout/style.css'; +@import '../components/case-study-carousel/style.css'; + +/* Layouts */ +@import '../layouts/use-cases/style.css'; /* Local Pages */ @import './downloads/style.css'; @import './community/style.css'; @import './home/style.css'; -@import './discovery/style.css'; /* Print Styles */ @import './print.css'; diff --git a/website/pages/use-cases/img/centralized-service-registry.png b/website/pages/use-cases/img/centralized-service-registry.png new file mode 100644 index 0000000000..34bafd634a Binary files /dev/null and b/website/pages/use-cases/img/centralized-service-registry.png differ diff --git a/website/pages/use-cases/img/connect-and-extend.svg b/website/pages/use-cases/img/connect-and-extend.svg new file mode 100644 index 0000000000..f3e0db4895 --- /dev/null +++ b/website/pages/use-cases/img/connect-and-extend.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/pages/use-cases/img/dynamic-load-balancing.svg b/website/pages/use-cases/img/dynamic-load-balancing.svg new file mode 100644 index 0000000000..aed0f07c21 --- /dev/null +++ b/website/pages/use-cases/img/dynamic-load-balancing.svg @@ -0,0 +1 @@ +CONSULAGENTAPPAPPAPPDYNAMIC UPDATES \ No newline at end of file diff --git a/website/pages/use-cases/img/ecosystem.svg b/website/pages/use-cases/img/ecosystem.svg new file mode 100644 index 0000000000..65b5afb9d2 --- /dev/null +++ b/website/pages/use-cases/img/ecosystem.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/pages/use-cases/img/extend-through-ecosystem.svg b/website/pages/use-cases/img/extend-through-ecosystem.svg new file mode 100644 index 0000000000..aeca4ba31a --- /dev/null +++ b/website/pages/use-cases/img/extend-through-ecosystem.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/pages/use-cases/img/flexible-architecture.png b/website/pages/use-cases/img/flexible-architecture.png new file mode 100644 index 0000000000..998aef9417 Binary files /dev/null and b/website/pages/use-cases/img/flexible-architecture.png differ diff --git a/website/pages/use-cases/img/health-monitoring.svg b/website/pages/use-cases/img/health-monitoring.svg new file mode 100644 index 0000000000..03fa7b291f --- /dev/null +++ b/website/pages/use-cases/img/health-monitoring.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/pages/use-cases/img/kubernetes.svg b/website/pages/use-cases/img/kubernetes.svg new file mode 100644 index 0000000000..3aaf41aa50 --- /dev/null +++ b/website/pages/use-cases/img/kubernetes.svg @@ -0,0 +1,33 @@ + + + + Group 2 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website/pages/use-cases/img/mercedes-logo.svg b/website/pages/use-cases/img/mercedes-logo.svg new file mode 100644 index 0000000000..04b170693f --- /dev/null +++ b/website/pages/use-cases/img/mercedes-logo.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/website/pages/use-cases/img/multi-dc-multi-region.svg b/website/pages/use-cases/img/multi-dc-multi-region.svg new file mode 100644 index 0000000000..cc5fe7443d --- /dev/null +++ b/website/pages/use-cases/img/multi-dc-multi-region.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/pages/use-cases/img/multi-region.svg b/website/pages/use-cases/img/multi-region.svg new file mode 100644 index 0000000000..9e11bf5910 --- /dev/null +++ b/website/pages/use-cases/img/multi-region.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/pages/use-cases/img/nodes-screenshot.png b/website/pages/use-cases/img/nodes-screenshot.png new file mode 100644 index 0000000000..66183dd029 Binary files /dev/null and b/website/pages/use-cases/img/nodes-screenshot.png differ diff --git a/website/pages/use-cases/img/observability.svg b/website/pages/use-cases/img/observability.svg new file mode 100644 index 0000000000..bf56198398 --- /dev/null +++ b/website/pages/use-cases/img/observability.svg @@ -0,0 +1,47 @@ + + + + Group 2 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website/pages/use-cases/img/robust-ecosystem.svg b/website/pages/use-cases/img/robust-ecosystem.svg new file mode 100644 index 0000000000..922afae5d8 --- /dev/null +++ b/website/pages/use-cases/img/robust-ecosystem.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/pages/use-cases/img/service-to-service.svg b/website/pages/use-cases/img/service-to-service.svg new file mode 100644 index 0000000000..fbffce1ec9 --- /dev/null +++ b/website/pages/use-cases/img/service-to-service.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/pages/use-cases/img/services-screenshot.png b/website/pages/use-cases/img/services-screenshot.png new file mode 100644 index 0000000000..4d84e0f733 Binary files /dev/null and b/website/pages/use-cases/img/services-screenshot.png differ diff --git a/website/pages/use-cases/multi-platform-service-mesh.jsx b/website/pages/use-cases/multi-platform-service-mesh.jsx new file mode 100644 index 0000000000..8fa092428a --- /dev/null +++ b/website/pages/use-cases/multi-platform-service-mesh.jsx @@ -0,0 +1,161 @@ +import UseCaseLayout from '../../layouts/use-cases' +import TextSplitWithImage from '@hashicorp/react-text-split-with-image' +import TextSplitWithCode from '@hashicorp/react-text-split-with-code' + +export default function MultiPlatformServiceMeshPage() { + return ( + + + + + + + + + + + + + + + +
+ +
+
+ ) +} diff --git a/website/pages/use-cases/network-middleware-automation.jsx b/website/pages/use-cases/network-middleware-automation.jsx new file mode 100644 index 0000000000..38e0b122e1 --- /dev/null +++ b/website/pages/use-cases/network-middleware-automation.jsx @@ -0,0 +1,92 @@ +import UseCaseLayout from '../../layouts/use-cases' +import TextSplitWithImage from '@hashicorp/react-text-split-with-image' + +export default function NetworkMiddlewareAutomationPage() { + return ( + + + + + + + +
+ +
+
+ ) +} diff --git a/website/pages/use-cases/service-discovery-and-health-checking.jsx b/website/pages/use-cases/service-discovery-and-health-checking.jsx new file mode 100644 index 0000000000..9735597331 --- /dev/null +++ b/website/pages/use-cases/service-discovery-and-health-checking.jsx @@ -0,0 +1,186 @@ +import UseCaseLayout from '../../layouts/use-cases' +import FeaturedSlider from '@hashicorp/react-featured-slider' +import TextSplitWithCode from '@hashicorp/react-text-split-with-code' +import TextSplitWithImage from '@hashicorp/react-text-split-with-image' + +export default function ServiceDiscoveryAndHealthCheckingPage() { + return ( + + + + + + + + > DiG 9.10.6 <<>> @127.0.0.1 -p 8600 web.service.consul SRV +; (1 server found) +;; global options: +cmd +;; Got answer: +;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56598 +;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 3 +;; WARNING: recursion requested but not available + +;; OPT PSEUDOSECTION: +; EDNS: version: 0, flags:; udp: 4096 +;; QUESTION SECTION: +;web.service.consul. IN SRV + +;; ANSWER SECTION: +web.service.consul. 0 IN SRV 1 1 80 Judiths-MBP.lan.node.dc1.consul. + +;; ADDITIONAL SECTION: +Judiths-MBP.lan.node.dc1.consul. 0 IN A 127.0.0.1 +Judiths-MBP.lan.node.dc1.consul. 0 IN TXT "consul-network-segment=" + +;; Query time: 2 msec +;; SERVER: 127.0.0.1#8600(127.0.0.1) +;; WHEN: Tue Jul 16 14:31:13 PDT 2019 +;; MSG SIZE rcvd: 150`, + }} + /> + + + +
+ +
+ + +
+ ) +} diff --git a/website/public/img/hero/pattern-desktop.svg b/website/public/img/hero/pattern-desktop.svg new file mode 100755 index 0000000000..78ebc209ef --- /dev/null +++ b/website/public/img/hero/pattern-desktop.svg @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/public/img/hero/pattern-mobile.svg b/website/public/img/hero/pattern-mobile.svg new file mode 100755 index 0000000000..35b092d77d --- /dev/null +++ b/website/public/img/hero/pattern-mobile.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/public/img/og-image.png b/website/public/img/og-image.png index 17ac1c61cf..7d49f7afdb 100644 Binary files a/website/public/img/og-image.png and b/website/public/img/og-image.png differ