wip: thank you list

This commit is contained in:
Danny White committed 2025-08-22 12:47:05 +10:00
1 parent 735cc3b2e3
commit d821030164
3 files changed
+311 -3

No files matched your search

@@ -175,8 +175,8 @@ export function SurveyWordCloud({
</div>
</div>
)}
<span className="font-mono md:text-lg text-foreground tracking-wide">
{scramblingTexts[index].toUpperCase() || text.toUpperCase()}
<span className="font-mono md:text-lg text-foreground tracking-wide uppercase">
{scramblingTexts[index] || text}
</span>
</li>
))}
@@ -427,6 +427,261 @@ const stateOfStartupsData = {
],
},
],
participantsList: [
{
company: 'Wasp',
url: 'https://wasp.sh/',
},
{
company: 'Greptile',
url: 'https://www.greptile.com/',
},
{
company: 'Zaymo',
url: 'https://zaymo.com',
},
{
company: 'Jazzberry',
url: 'https://jazzberry.ai',
},
{
company: 'Shor',
url: 'https://tryshor.com',
},
{
company: 'Mono',
url: 'https://www.mono.la',
},
{
company: 'Affl.ai',
url: 'https://www.affil.ai',
},
{
company: 'Docsum',
url: 'https://www.docsum.ai/',
},
{
company: 'Hazel',
url: 'https://hazelai.com/',
},
{
company: 'Rivet',
url: 'https://rivet.gg/',
},
{
company: 'Trieve',
url: 'https://trieve.ai/',
},
{
company: 'Artificial Societies',
url: 'https://societies.io/',
},
{
company: 'Gauge',
url: 'https://withgauge.com/',
},
{
company: 'Stardex',
url: 'https://www.stardex.com/',
},
{
company: 'TrueClaim',
url: 'https://www.trytrueclaim.com/',
},
{
company: 'Autosana',
url: 'https://autosana.ai/',
},
{
company: 'Vespper',
url: 'https://vespper.com/',
},
{
company: 'Curo',
url: 'https://www.curocharging.com/',
},
{
company: 'Kombo',
url: 'https://kombo.dev/',
},
{
company: 'Candle',
url: 'https://www.trycandle.app/',
},
{
company: 'Trainloop',
url: 'http://trainloop.ai/',
},
{
company: 'Replit',
url: 'https://replit.com/',
},
{
company: 'Roe AI',
url: 'https://getroe.ai/',
},
{
company: 'Kestral',
url: 'https://kestral.team/',
},
{
company: 'Revyl',
url: 'https://www.revyl.ai/',
},
{
company: 'Arva AI',
url: 'https://www.arva.ai/',
},
{
company: 'Posthog',
url: 'https://www.posthog.com',
},
{
company: 'Rootly',
url: 'https://rootly.com/',
},
{
company: 'Throxy',
url: 'https://throxy.com/',
},
{
company: 'Zapi',
url: 'https://heyzapi.com/',
},
{
company: 'Leaping AI',
url: 'https://www.leapingai.com/',
},
{
company: 'WarpBuild',
url: 'https://www.warpbuild.com/',
},
{
company: 'Domu',
url: 'https://www.domu.ai/',
},
{
company: 'Bilanc',
url: 'https://www.bilanc.co/',
},
{
company: 'Miru',
url: 'https://www.miruml.com/',
},
{
company: 'Repaint',
url: 'https://repaint.com/',
},
{
company: 'Cubic',
url: 'https://cubic.dev/',
},
{
company: 'CTGT',
url: 'https://www.ctgt.ai/',
},
{
company: 'Integrated Reasoning',
url: 'https://integrated-reasoning.com/',
},
{
company: 'Datafruit',
url: 'https://datafruit.dev/',
},
{
company: 'mcp-use',
url: 'https://mcp-use.com/',
},
{
company: 'Weave',
url: 'http://getweave.com/',
},
{
company: 'Palmier',
url: 'https://www.palmier.io/',
},
{
company: 'Rainmaker',
url: 'http://www.rainmaker.nyc/',
},
{
company: 'Wasmer',
url: 'https://wasmer.io/',
},
{
company: 'Artie',
url: 'https://www.artie.com/',
},
{
company: 'Lumari',
url: 'https://www.lumari.io/',
},
{
company: 'Hitpay',
url: 'https://www.hitpayapp.com/',
},
{
company: 'Tempo',
url: 'https://www.tempo.new/',
},
{
company: 'SalesPatriot',
url: 'https://www.salespatriot.com/',
},
{
company: 'Surge',
url: 'https://surge.app/',
},
{
company: 'Linum',
url: 'https://www.linum.ai/',
},
{
company: 'Rebill',
url: 'https://www.rebill.com/',
},
{
company: 'Careswift',
url: 'https://www.careswift.com/',
},
{
company: 'Autumn',
url: 'https://useautumn.com/',
},
{
company: 'Rollstack',
url: 'https://www.rollstack.com/',
},
{
company: 'OpenNote',
url: 'https://opennote.com/',
},
{
company: 'Coverage Cat',
url: 'https://www.coveragecat.com/',
},
{
company: 'Flair Labs',
url: 'https://www.flairlabs.ai/',
},
{
company: 'Percival',
url: 'https://www.percivaltech.com/',
},
{
company: 'Morphik',
url: 'https://morphik.ai/',
},
{
company: 'DrDroid',
url: 'https://drdroid.io/',
},
{
company: 'Nautilus',
url: 'https://nautilus.co/',
},
],
}
export default stateOfStartupsData
+54 -1
View File
@@ -1,5 +1,6 @@
import { useEffect, useRef, useState, forwardRef } from 'react'
import { useRouter } from 'next/router'
import Link from 'next/link'
import { NextSeo } from 'next-seo'
@@ -165,6 +166,7 @@ function StateOfStartupsPage() {
>
<Link
href={`#chapter-${chapterIndex + 1}`}
target="_blank"
onClick={() => setIsTocOpen(false)}
className={cn(
'block px-6 py-2 text-xs transition-colors font-mono uppercase tracking-wider text-center text-foreground-light hover:text-brand-link hover:bg-brand-300/25',
@@ -293,6 +295,7 @@ function StateOfStartupsPage() {
</SurveyChapter>
))}
<CTABanner ref={ctaBannerRef} />
<ParticipantsList />
</DefaultLayout>
</>
)
@@ -300,12 +303,62 @@ function StateOfStartupsPage() {
export default StateOfStartupsPage
// Component for the participants list
const ParticipantsList = () => {
const [shuffledParticipants, setShuffledParticipants] = useState(pageData.participantsList)
const [isShuffled, setIsShuffled] = useState(false)
useEffect(() => {
// Shuffle the participants list after component mounts (client-side only)
const shuffled = [...pageData.participantsList]
// Fisher-Yates shuffle algorithm
for (let i = shuffled.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1))
;[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]
}
setShuffledParticipants(shuffled)
setIsShuffled(true)
}, [])
return (
<section className="flex flex-col items-center gap-16 md:gap-24 px-4 py-20 md:py-28 text-center border-b border-muted">
<div className="flex flex-col items-center gap-4 max-w-prose">
<h2 className="text-foreground text-3xl text-balance">Thank you</h2>
<p className="text-foreground-light text-lg text-balance max-w-prose">
A special thanks to the following companies for participating in this year’s survey.
</p>
</div>
<ul className="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 items-center gap-x-2 gap-y-4 md:gap-x-4 md:gap-y-8 w-full mx-auto px-6 lg:px-16 xl:px-20">
{shuffledParticipants.map((participant, index) => (
<li
key={participant.company} // Use company name as stable key
className="transition-opacity duration-500 ease-in-out"
style={{
opacity: isShuffled ? 1 : 0,
transitionDelay: `${index * 50}ms`, // Stagger the fade-in
}}
>
<Link
href={participant.url}
target="_blank"
rel="noopener noreferrer"
className="text-xs md:text-sm font-mono text-center tracking-widest uppercase text-foreground-lighter hover:text-brand-link transition-colors"
>
{participant.company}
</Link>
</li>
))}
</ul>
</section>
)
}
// Component for the 'Builders choose Supabase' CTA at the bottom of the page
const CTABanner = forwardRef<HTMLElement>((props, ref) => {
const sendTelemetryEvent = useSendTelemetryEvent()
return (
<section
className="flex flex-col items-center gap-4 py-32 text-center border-b border-muted"
className="flex flex-col items-center gap-4 px-4 py-32 text-center border-b border-muted"
style={{
background:
'radial-gradient(circle at center 280%, hsl(var(--brand-400)), transparent 70%)',