d25d482dc2
CI / Migrate Dev DB (push) Has been skipped
CI / Detect Version (push) Has been cancelled
CI / Migrate DB (push) Has been cancelled
CI / Build Dev ECR (./docker/app.Dockerfile, ECR_APP) (push) Has been cancelled
CI / Build Dev ECR (./docker/db.Dockerfile, ECR_MIGRATIONS) (push) Has been cancelled
CI / Build Dev ECR (./docker/pii.Dockerfile, ECR_PII) (push) Has been cancelled
CI / Build Dev ECR (./docker/realtime.Dockerfile, ECR_REALTIME) (push) Has been cancelled
CI / Deploy Trigger.dev (Dev) (push) Has been cancelled
CI / Build AMD64 (./docker/app.Dockerfile, ECR_APP, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build AMD64 (./docker/db.Dockerfile, ECR_MIGRATIONS, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build AMD64 (./docker/pii.Dockerfile, ECR_PII, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build AMD64 (./docker/realtime.Dockerfile, ECR_REALTIME, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/app.Dockerfile, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/db.Dockerfile, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/pii.Dockerfile, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/realtime.Dockerfile, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Check Docs Changes (push) Has been cancelled
CI / Process Docs (push) Has been cancelled
CI / Create GitHub Release (push) Has been cancelled
CI / Test and Build (push) Has been cancelled
Publish CLI Package / publish-npm (push) Has been cancelled
Publish Python SDK / publish-pypi (push) Has been cancelled
Publish TypeScript SDK / publish-npm (push) Has been cancelled
48 lines
1.8 KiB
TypeScript
48 lines
1.8 KiB
TypeScript
import type { FactSource } from '@/lib/compare/data'
|
|
import { SourceLink } from '@/app/(landing)/comparison/components/source-info'
|
|
|
|
interface ComparisonCardItem {
|
|
title: string
|
|
description: string
|
|
shortDescription?: string
|
|
source: FactSource
|
|
}
|
|
|
|
export interface ComparisonCardsProps {
|
|
items: ComparisonCardItem[]
|
|
}
|
|
|
|
/**
|
|
* A vertically stacked list of atomic, independently quotable fact cards,
|
|
* each self-contained title + a one-line `shortDescription` (falling back to
|
|
* `description` if a short version hasn't been authored yet). Used for both
|
|
* a competitor's standout features and its documented limitations.
|
|
*
|
|
* The full `description` is always present as `sr-only` text. Server
|
|
* rendered regardless of hover/JS state. So an LLM or crawler reading the
|
|
* page still gets the complete claim even though a human sees only the
|
|
* one-line summary. Hovering the title itself (`SourceLink`) shows a short
|
|
* "Source: X" tooltip and clicking it opens the source, rather than a
|
|
* separate info-icon affordance next to every card.
|
|
*/
|
|
export function ComparisonCards({ items }: ComparisonCardsProps) {
|
|
return (
|
|
<div className='flex flex-col'>
|
|
{items.map((item, index) => (
|
|
<div
|
|
key={item.title}
|
|
className={index > 0 ? 'border-[var(--border)] border-t px-6 py-4' : 'px-6 py-4'}
|
|
>
|
|
<h3 className='mb-1 text-[var(--text-primary)] text-base leading-snug tracking-[-0.01em]'>
|
|
<SourceLink source={item.source}>{item.title}</SourceLink>
|
|
</h3>
|
|
<p className='text-[var(--text-body)] text-small leading-[150%]'>
|
|
{item.shortDescription ?? item.description}
|
|
</p>
|
|
{item.shortDescription ? <span className='sr-only'>{item.description}</span> : null}
|
|
</div>
|
|
))}
|
|
</div>
|
|
)
|
|
}
|