Skip to content

Commit 528cca3

Browse files
authored
Merge pull request #2156 from mito-ds/prominent-social-proof
Prominent social proof
2 parents ee7a5f6 + 883d0d3 commit 528cca3

File tree

15 files changed

+286
-9
lines changed

15 files changed

+286
-9
lines changed

trymito.io/components/Buttons/TranslucentButton/TranslucentButton.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ const TranslucentButton = (props: {
3333
if (props.variant === 'downloads') {
3434
return (
3535
<Link href={href}>
36-
<a className={classNames(props.className, translucentButtonStyles.translucent_button)}>
36+
<a
37+
className={classNames(props.className, translucentButtonStyles.translucent_button)}
38+
onClick={props.onClick}
39+
>
3740
{props.children}
3841
</a>
3942
</Link>

trymito.io/components/Header/Header.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import TranslucentButton from "../Buttons/TranslucentButton/TranslucentButton"
1313
import { classNames } from "../../utils/classNames"
1414
import { PLAUSIBLE_INSTALL_DOCS_CTA_LOCATION_HEADER } from "../../utils/plausible"
1515
import GithubButton, { MITO_GITHUB_LINK } from "../Buttons/GithubButton/GithubButton"
16+
import { getABTestVariant } from "../../utils/abTestUtils"
1617

1718
export const MITO_INSTALLATION_DOCS_LINK = 'https://docs.trymito.io/getting-started/installing-mito'
1819
export const JOBS_BOARD_LINK = 'https://www.ycombinator.com/companies/mito/jobs'
@@ -71,6 +72,17 @@ const Header = (): JSX.Element => {
7172

7273
const [mobileMenuVisible, setMobileMenuVisible] = useState(false)
7374

75+
const handleDownloadCTAClick = () => {
76+
// Track Download CTA click with A/B test variant
77+
if (typeof window !== 'undefined' && window.analytics) {
78+
window.analytics.track('Download CTA Clicked', {
79+
location: 'header',
80+
abTestVariant: getABTestVariant(),
81+
timestamp: new Date().toISOString(),
82+
});
83+
}
84+
};
85+
7486
return (
7587
<header className={headerStyles.header}>
7688
<div className={headerStyles.navbar}>
@@ -175,6 +187,7 @@ const Header = (): JSX.Element => {
175187
<TranslucentButton
176188
className={PLAUSIBLE_INSTALL_DOCS_CTA_LOCATION_HEADER}
177189
variant='downloads'
190+
onClick={handleDownloadCTAClick}
178191
>
179192
<>
180193
Download
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
/*
2+
* Copyright (c) Saga Inc.
3+
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
4+
*/
5+
6+
.container {
7+
display: flex !important;
8+
flex-direction: row !important;
9+
align-items: center !important;
10+
width: 100%;
11+
max-width: 100%;
12+
margin-top: 4rem;
13+
padding-right: 2rem;
14+
position: relative;
15+
gap: 2rem;
16+
}
17+
18+
.tagline {
19+
font-size: 1rem;
20+
color: var(--color-text-secondary);
21+
opacity: 0.7;
22+
text-align: left;
23+
z-index: 2;
24+
position: relative;
25+
white-space: nowrap;
26+
flex-shrink: 0;
27+
margin: 0;
28+
}
29+
30+
.carouselWrapper {
31+
position: relative !important;
32+
flex: 1 !important;
33+
overflow: hidden !important;
34+
min-width: 0;
35+
width: 100%;
36+
max-width: none;
37+
}
38+
39+
/* Fade effect on the left side (where text is) - only fade when very close to text */
40+
.carouselWrapper::before {
41+
content: '';
42+
position: absolute;
43+
left: 0;
44+
top: 0;
45+
bottom: 0;
46+
width: 150px;
47+
background: linear-gradient(to right, var(--color-light-background) 0%, transparent 100%);
48+
z-index: 1;
49+
pointer-events: none;
50+
}
51+
52+
/* Style the marquee container and children */
53+
.carouselWrapper :global(.marquee_container) {
54+
align-items: center;
55+
}
56+
57+
.carouselWrapper :global(.marquee) {
58+
display: flex;
59+
align-items: center;
60+
padding: 1rem 0;
61+
}
62+
63+
.logoContainer {
64+
display: flex;
65+
align-items: center;
66+
justify-content: center;
67+
height: 28px;
68+
flex-shrink: 0;
69+
opacity: 0.6;
70+
transition: opacity 0.3s ease;
71+
margin: 0 1.5rem;
72+
}
73+
74+
.logoContainer:hover {
75+
opacity: 1;
76+
}
77+
78+
.logo {
79+
object-fit: contain;
80+
filter: grayscale(100%);
81+
opacity: 0.7;
82+
transition: opacity 0.3s ease;
83+
width: 56px;
84+
height: 28px;
85+
}
86+
87+
.logoContainer:hover .logo {
88+
opacity: 1;
89+
filter: grayscale(0%);
90+
}
91+
92+
/* Ensure logos are visible above the fade overlay */
93+
.carouselWrapper :global(.marquee) > * {
94+
position: relative;
95+
z-index: 2;
96+
}
97+
98+
@media only screen and (min-width: 75em) {
99+
.tagline {
100+
font-size: 1.1rem;
101+
}
102+
103+
.container {
104+
gap: 2.5rem;
105+
margin-left: 0;
106+
padding-right: 3rem;
107+
margin-top: 2rem;
108+
}
109+
110+
.carouselWrapper::before {
111+
width: 180px;
112+
}
113+
114+
.logoContainer {
115+
height: 40px;
116+
margin: 0 2.5rem;
117+
}
118+
119+
.logo {
120+
width: 80px;
121+
height: 40px;
122+
}
123+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*
2+
* Copyright (c) Saga Inc.
3+
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
4+
*/
5+
6+
import React, { useEffect, useState } from 'react';
7+
import Image from 'next/image';
8+
import Marquee from '../Marquee/Marquee';
9+
import styles from './SocialProofCarousel.module.css';
10+
11+
// Company logos
12+
const COMPANY_LOGOS = [
13+
{ src: '/customers/accenture.png', alt: 'Accenture' },
14+
{ src: '/customers/amazon.png', alt: 'Amazon' },
15+
{ src: '/customers/cisco.png', alt: 'Cisco' },
16+
{ src: '/customers/deloitte.png', alt: 'Deloitte' },
17+
{ src: '/customers/ericsson.png', alt: 'Ericsson' },
18+
{ src: '/customers/kpmg.png', alt: 'KPMG' },
19+
{ src: '/customers/pwc.png', alt: 'PWC' },
20+
{ src: '/customers/wayfair.png', alt: 'Wayfair' },
21+
{ src: '/customers/sap.png', alt: 'SAP' },
22+
{ src: '/customers/cytiva.png', alt: 'Cytiva' },
23+
{ src: '/customers/ibm.png', alt: 'IBM' },
24+
{ src: '/customers/wells-fargo-bank.png', alt: 'Wells Fargo' },
25+
];
26+
27+
const SocialProofCarousel = (): JSX.Element => {
28+
return (
29+
<div className={styles.container}>
30+
<p className={styles.tagline}>Trusted by Fortune 500 companies</p>
31+
<div className={styles.carouselWrapper}>
32+
<Marquee direction="left" speed={30}>
33+
{COMPANY_LOGOS.map((logo, index) => (
34+
<div key={`${logo.alt}-${index}`} className={styles.logoContainer}>
35+
<Image
36+
src={logo.src}
37+
alt={logo.alt}
38+
width={56}
39+
height={28}
40+
className={styles.logo}
41+
unoptimized
42+
/>
43+
</div>
44+
))}
45+
</Marquee>
46+
</div>
47+
</div>
48+
);
49+
};
50+
51+
export default SocialProofCarousel;

trymito.io/components/WaitlistSignup/WaitlistSignup.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import { useState, FormEvent, KeyboardEvent } from 'react';
77
import waitlistStyles from './WaitlistSignup.module.css';
88
import { classNames } from '../../utils/classNames';
9+
import { getABTestVariant } from '../../utils/abTestUtils';
910

1011
declare global {
1112
interface Window {
@@ -50,6 +51,7 @@ const WaitlistSignup = (): JSX.Element => {
5051
location: 'homepage_hero',
5152
email: email,
5253
timestamp: new Date().toISOString(),
54+
abTestVariant: getABTestVariant(),
5355
});
5456
}
5557

@@ -94,6 +96,7 @@ const WaitlistSignup = (): JSX.Element => {
9496
lastName: lastName,
9597
company: company,
9698
timestamp: new Date().toISOString(),
99+
abTestVariant: getABTestVariant(),
97100
});
98101
}
99102

trymito.io/next-env.d.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
/*
2-
* Copyright (c) Saga Inc.
3-
* Distributed under the terms of the GNU Affero General Public License v3.0 License.
4-
*/
5-
61
/// <reference types="next" />
72
/// <reference types="next/image-types/global" />
83

trymito.io/pages/index.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,11 @@ import FeatureSquares from '../components/FeatureSquares/FeatureSquares';
2424
import MadeWithMito from '../components/MadeWithMito/MadeWithMito';
2525
import DemoVideo from '../components/DemoVideo/DemoVideo';
2626
import WaitlistSignup from '../components/WaitlistSignup/WaitlistSignup';
27+
import SocialProofCarousel from '../components/SocialProofCarousel/SocialProofCarousel';
28+
import { useABTest } from '../utils/useABTest';
2729

2830
const Home: NextPage = () => {
31+
const abTestVariant = useABTest();
2932

3033
useEffect(() => {
3134
Prism.highlightAll();
@@ -72,11 +75,12 @@ const Home: NextPage = () => {
7275
</div>
7376
</div>
7477

78+
{abTestVariant === 'carousel' && <SocialProofCarousel />}
79+
7580
{/* <AIInputField autoLaunchJupyterLab={true} /> */}
7681
</section>
7782

78-
<LogoSection></LogoSection>
79-
83+
{abTestVariant === 'logo' && <LogoSection />}
8084
<section>
8185
<MadeWithMito />
8286
</section>
8.59 KB
Loading
File renamed without changes.
6.92 KB
Loading

0 commit comments

Comments
 (0)