diff --git a/website/components/basic-hero/index.jsx b/website/components/basic-hero/index.jsx index 4c48ca19c..597c7be09 100644 --- a/website/components/basic-hero/index.jsx +++ b/website/components/basic-hero/index.jsx @@ -7,7 +7,6 @@ export default function BasicHero({ brand, backgroundImage, }) { - console.log('background?', backgroundImage) return (
diff --git a/website/components/before-after/index.jsx b/website/components/before-after/index.jsx deleted file mode 100644 index 3a009f5cb..000000000 --- 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 2401f3953..000000000 --- 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 000000000..6dd99a90c --- /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 000000000..ee15572f4 --- /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 000000000..c28dc9680 --- /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 000000000..67809357d --- /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 000000000..d47007ce7 --- /dev/null +++ b/website/components/case-study-carousel/img/quote.svg @@ -0,0 +1,3 @@ + + + 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 000000000..717c98126 --- /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 000000000..8ff81549d --- /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 ( + + ) + } + console.log('logo rows', logoRows) + 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 000000000..a9d31b4a5 --- /dev/null +++ b/website/components/case-study-carousel/style.css @@ -0,0 +1,257 @@ +.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 { + display: flex; + justify-content: center; + max-width: 750px; + margin: 0 auto; + margin-top: 70px; + flex-wrap: wrap; + + & img { + max-height: 40px; + width: 33.33%; + padding: 0 30px; + margin: 24px 0px; + + @media (max-width: 800px) { + padding: 0 20px; + max-height: 28px; + } + } + } + } + + & .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/pages/home/index.jsx b/website/pages/home/index.jsx index 06f453919..6a9e39cb5 100644 --- a/website/pages/home/index.jsx +++ b/website/pages/home/index.jsx @@ -3,6 +3,7 @@ import UseCases from '@hashicorp/react-use-cases' import BasicHero from '../../components/basic-hero' import ConsulEnterpriseComparison from '../../components/consul-enterprise-comparison' import LearnCallout from '../../components/learn-callout' +import CaseStudyCarousel from '../../components/case-study-carousel' export default function HomePage() { return ( @@ -25,6 +26,126 @@ export default function HomePage() { ]} backgroundImage /> +