mirror of
https://github.com/supabase/supabase.git
synced 2026-10-14 05:39:11 +03:00
wip: thank you list
This commit is contained in:
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
|
||||
@@ -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%)',
|
||||
|
||||
Reference in new issue
Block a user