diff --git a/landing/app-landing.react.js b/landing/app-landing.react.js
index 1af6538f3..00f132c21 100644
--- a/landing/app-landing.react.js
+++ b/landing/app-landing.react.js
@@ -1,28 +1,36 @@
// @flow
import * as React from 'react';
import { imageAssetMetaData, assetMetaData } from './asset-meta-data.js';
import CompetitorComparison from './competitor-comparison.react.js';
+import DifferentiationInfo from './differentiation-info.react.js';
import Hero from './hero.react.js';
import InfoBlock from './info-block.react.js';
import RequestAccess from './request-access.react.js';
import usePreloadImageAssets from './use-pre-load-image-assets.react.js';
+const DISABLE_DIFFERENTIATION_INFO = true;
+
+const differentiationInfo = DISABLE_DIFFERENTIATION_INFO ? null : (
+
+);
+
function AppLanding(): React.Node {
usePreloadImageAssets(imageAssetMetaData);
const [hero] = imageAssetMetaData;
const [keyserver, team] = assetMetaData;
return (
+ {differentiationInfo}
);
}
export default AppLanding;
diff --git a/landing/competitor-comparison.css b/landing/competitor-comparison.css
index 1f587b980..2fa2c640d 100644
--- a/landing/competitor-comparison.css
+++ b/landing/competitor-comparison.css
@@ -1,77 +1,77 @@
.competitorComparisonSection {
display: flex;
flex-direction: column;
align-items: center;
padding: 48px 16px;
}
.headerText {
color: var(--white-80);
text-align: center;
margin-bottom: 72px;
}
.competitorsContainer {
overflow: hidden;
display: flex;
justify-content: space-between;
column-gap: 16px;
padding: 16px 32px;
background-color: var(--comparison-cards);
border-radius: 16px;
width: 560px;
max-width: 90vw;
+ margin-bottom: 48px;
}
.logoContainer {
display: flex;
flex-direction: column;
align-items: center;
position: relative;
}
.competitorLogo {
opacity: 0.35;
transition: opacity 150ms;
}
.competitorLogo:hover {
opacity: 1;
cursor: pointer;
}
.activeCompetitorLogo {
opacity: 1;
transform: translateY(-2px);
}
.bump {
width: 80%;
height: 4px;
border-top-left-radius: 16px;
border-top-right-radius: 16px;
background-color: var(--violet-dark-100);
position: absolute;
bottom: -16px;
}
.featureCardsContainer {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 40px;
- margin-top: 48px;
}
/* 2*16(padding) + 3*432(cards) + 2*40(gap) */
@media screen and (max-width: 1408px) {
.featureCardsContainer {
grid-template-columns: repeat(2, 1fr);
}
}
/* 2*16(padding) + 2*432(cards) + 40(gap) */
@media screen and (max-width: 936px) {
.featureCardsContainer {
grid-template-columns: repeat(1, 1fr);
}
}
diff --git a/landing/differentiation-info.react.js b/landing/differentiation-info.react.js
new file mode 100644
index 000000000..a749a1b0b
--- /dev/null
+++ b/landing/differentiation-info.react.js
@@ -0,0 +1,62 @@
+// @flow
+
+import classNames from 'classnames';
+import * as React from 'react';
+
+import { useModalContext } from 'lib/components/modal-provider.react.js';
+
+import css from './competitor-comparison.css';
+import {
+ competitors,
+ competitorData,
+ type FeatureComparison,
+} from './competitor-data.js';
+import CompetitorFeatureCard from './competitor-feature-card.react.js';
+import FeatureModal from './feature-modal.react.js';
+import typography from './typography.css';
+
+function DifferentiationInfo(): React.Node {
+ const { pushModal } = useModalContext();
+
+ const generalCompetitorData = competitorData[competitors.GENERAL];
+
+ const onFeatureCardClick = React.useCallback(
+ (feature: FeatureComparison) => {
+ pushModal(
+ ,
+ );
+ },
+ [pushModal, generalCompetitorData],
+ );
+
+ const featureCards = React.useMemo(
+ () =>
+ generalCompetitorData.featureComparison.map(feature => (
+ onFeatureCardClick(feature)}
+ />
+ )),
+ [
+ generalCompetitorData.featureComparison,
+ generalCompetitorData.id,
+ onFeatureCardClick,
+ ],
+ );
+
+ const headerClassName = classNames([typography.heading1, css.headerText]);
+
+ return (
+
+ What makes Comm unique
+ {featureCards}
+
+ );
+}
+
+export default DifferentiationInfo;