Files
wehub-resource-sync 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
chore: import upstream snapshot with attribution
2026-07-13 13:20:55 +08:00

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>
)
}