Skip to content

Commit f14cc13

Browse files
authored
Add trusted-by logo bar with verified RORP clients (#98)
Adds a "Trusted in production by" section to the homepage, displaying 19 verified React on Rails Pro client logos sourced from the licensing repo's investigation docs. Uses per-logo theming flags (invertDark, darkenLight) for single-color assets and ThemedImage for multi-color logos (User Interviews, The Information) where a CSS filter would corrupt brand colors.
1 parent 774b368 commit f14cc13

23 files changed

Lines changed: 294 additions & 1 deletion

prototypes/docusaurus/src/pages/index.module.css

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,62 @@
44
background: var(--site-soft-surface);
55
}
66

7+
.trustedBy {
8+
padding: 3rem 0;
9+
border-bottom: 1px solid var(--site-border);
10+
text-align: center;
11+
}
12+
13+
.trustedByLabel {
14+
margin: 0 0 2rem;
15+
text-transform: uppercase;
16+
letter-spacing: 0.06rem;
17+
font-size: 0.75rem;
18+
font-weight: 700;
19+
color: var(--ifm-color-content-secondary);
20+
}
21+
22+
.logoBar {
23+
display: flex;
24+
flex-wrap: wrap;
25+
justify-content: center;
26+
align-items: center;
27+
gap: 1.5rem 2.5rem;
28+
}
29+
30+
.logoItem {
31+
display: inline-flex;
32+
align-items: center;
33+
justify-content: center;
34+
width: 8rem;
35+
height: 2.4rem;
36+
}
37+
38+
.logoItem img {
39+
max-width: 100%;
40+
max-height: 100%;
41+
width: auto;
42+
height: auto;
43+
object-fit: contain;
44+
transition: transform 0.2s;
45+
}
46+
47+
.logoItem:hover img {
48+
transform: scale(1.05);
49+
}
50+
51+
[data-theme='dark'] .invertDark img {
52+
filter: invert(1);
53+
}
54+
55+
.darkenLight img {
56+
filter: brightness(0.4) contrast(1.3) saturate(1.3);
57+
}
58+
59+
[data-theme='dark'] .darkenLight img {
60+
filter: none;
61+
}
62+
763
.heroLayout {
864
display: grid;
965
grid-template-columns: minmax(0, 1.4fr) minmax(22rem, 1fr);

prototypes/docusaurus/src/pages/index.tsx

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import {useEffect, useRef, useState, type KeyboardEvent, type ReactNode} from 'react';
22
import clsx from 'clsx';
33
import Link from '@docusaurus/Link';
4-
import useBaseUrl from '@docusaurus/useBaseUrl';
4+
import useBaseUrl, {useBaseUrlUtils} from '@docusaurus/useBaseUrl';
55
import Layout from '@theme/Layout';
6+
import ThemedImage from '@theme/ThemedImage';
67

78
import {docsRoutes} from '../constants/docsRoutes';
89
import styles from './index.module.css';
@@ -152,6 +153,70 @@ function ReactIcon({className}: {className?: string}) {
152153
);
153154
}
154155

156+
const trustedByCompanies = [
157+
{name: 'Academia.edu', logo: '/img/logos/academia_logo.svg', href: 'https://www.academia.edu', invertDark: true},
158+
{name: 'ACTIVE Network', logo: '/img/logos/active_network_logo.png', href: 'https://www.activenetwork.com'},
159+
{name: 'AirRobe', logo: '/img/logos/airrobe_logo.svg', href: 'https://www.airrobe.com', invertDark: true},
160+
{name: 'Airtasker', logo: '/img/logos/airtasker_logo.svg', href: 'https://www.airtasker.com'},
161+
{name: 'Attuned Education Partners', logo: '/img/logos/attuned_logo.png', href: 'https://attunedpartners.com', invertDark: true},
162+
{name: 'City Falcon', logo: '/img/logos/city_falcon_logo.svg', href: 'https://www.cityfalcon.com', invertDark: true},
163+
{name: 'ClientCircle', logo: '/img/logos/clientcircle_logo.svg', href: 'https://clientcircle.com'},
164+
{name: 'Curbside Provisions', logo: '/img/logos/curbside_logo.png', href: 'https://curbsideprovisions.com'},
165+
{name: 'Direct Dental', logo: '/img/logos/direct_dental_logo.png', href: 'https://directdental.com'},
166+
{name: 'Ejbla', logo: '/img/logos/ejbla_logo.png', href: 'https://ejbla.com', invertDark: true},
167+
{name: 'Estately', logo: '/img/logos/estately_logo.png', href: 'https://www.estately.com', invertDark: true},
168+
{name: 'Heal.me', logo: '/img/logos/healme_logo.png', href: 'https://heal.me'},
169+
{name: 'Jewlr', logo: '/img/logos/jewlr_logo.svg', href: 'https://www.jewlr.com', invertDark: true},
170+
{name: 'Popmenu', logo: '/img/logos/popmenu_logo.png', href: 'https://popmenu.com'},
171+
{name: 'Printivity', logo: '/img/logos/printivity_logo.png', href: 'https://www.printivity.com'},
172+
{name: 'Sample Focus', logo: '/img/logos/sample_focus_logo.png', href: 'https://samplefocus.com', darkenLight: true},
173+
{name: 'Simply Business', logo: '/img/logos/simply_business_logo.svg', href: 'https://www.simplybusiness.co.uk', invertDark: true},
174+
{name: 'The Information', logo: '/img/logos/the_information_logo.svg', darkLogo: '/img/logos/the_information_logo_dark.svg', href: 'https://www.theinformation.com'},
175+
{name: 'User Interviews', logo: '/img/logos/user_interviews_logo.svg', darkLogo: '/img/logos/user_interviews_logo_dark.svg', href: 'https://www.userinterviews.com'},
176+
];
177+
178+
function TrustedBySection() {
179+
const {withBaseUrl} = useBaseUrlUtils();
180+
return (
181+
<section className={styles.trustedBy}>
182+
<div className="container">
183+
<p className={styles.trustedByLabel}>Trusted in production by</p>
184+
<div className={styles.logoBar}>
185+
{trustedByCompanies.map((company) => (
186+
<a
187+
key={company.name}
188+
href={company.href}
189+
target="_blank"
190+
rel="noopener noreferrer"
191+
className={clsx(
192+
styles.logoItem,
193+
company.invertDark && styles.invertDark,
194+
company.darkenLight && styles.darkenLight,
195+
)}
196+
title={company.name}>
197+
{company.darkLogo ? (
198+
<ThemedImage
199+
sources={{
200+
light: withBaseUrl(company.logo),
201+
dark: withBaseUrl(company.darkLogo),
202+
}}
203+
alt={company.name}
204+
/>
205+
) : (
206+
<img
207+
src={withBaseUrl(company.logo)}
208+
alt={company.name}
209+
loading="lazy"
210+
/>
211+
)}
212+
</a>
213+
))}
214+
</div>
215+
</div>
216+
</section>
217+
);
218+
}
219+
155220
function HeroSection() {
156221
const [copyState, setCopyState] = useState<'idle' | 'copied' | 'error'>('idle');
157222
const [lang, setLang] = useState<Language>('ts');
@@ -504,6 +569,7 @@ export default function Home(): ReactNode {
504569
<Layout description="Official React on Rails documentation, examples, and React on Rails Pro details.">
505570
<HeroSection />
506571
<main>
572+
<TrustedBySection />
507573
<PersonaSection />
508574
<FlowSection />
509575
<UpgradeSection />
Lines changed: 32 additions & 0 deletions
Loading
40.9 KB
Loading
Lines changed: 11 additions & 0 deletions
Loading
Lines changed: 1 addition & 0 deletions
Loading
22.4 KB
Loading

0 commit comments

Comments
 (0)