ReviewCard
The layout of one review: avatar, byline, stars, text and actions.
import { ReviewCard, LikeButton } from '@iffday/web/src/review-card';
import { AuthorName } from '@iffday/web/src/components';Example
The layout of one review: a 34px avatar on the left; on the right the byline and time, then the film, the stars, the text and the actions. With poster a 72px poster column appears on the far right, 56px on phones. Reviews, articles and the community page all use this layout.
Walked along Haeundae for an hour after the screening. Almost no score for two and a half hours, and the silence in the last ten minutes says more than any line of dialogue.

import { useT } from '@iffday/i18n';
import { PosterImage } from '@iffday/web/src/kit';
import { ReviewCard } from '@iffday/web/src/review-card';
import { reviews, useSampleFilm } from '../../../samples';
export default function Example() {
const t = useT();
const film = useSampleFilm(0);
const review = reviews[0]!;
return (
<div style={{ width: '100%' }}>
<ReviewCard
author={review.authorName}
authorHandle={review.authorHandle}
authorSeed={review.authorId}
date={review.createdAt}
stars={9}
title={film.title}
titleTo={`https://iff.day${film.canonicalPath}`}
subtitle={film.director}
poster={<PosterImage entry={film} size="sm" />}
like={{
targetType: 'review',
targetId: review.id,
likeCount: review.likeCount,
likedByMe: review.likedByMe,
}}
byline={t('review.card.reviewBy')}
>
<p className="review-card-text">{review.body}</p>
</ReviewCard>
</div>
);
}Like
With like the card shows LikeButton. A click adds one to the count at once; when the API answers, its count wins, and on failure the count goes back and an error toast appears. Readers who are not signed in are taken to sign in. It also works on its own: reviews, articles and lists can all be liked.
Byline
byline replaces the default Review by; articles use Article by. AuthorName links the name to /@handle when there is a handle and shows the plain name otherwise.
Props
ReviewCard
apps/web/src/review-card.tsx:72record.club's review row: avatar, "Review by", stars, text, comment action.
| Prop | Type | Default |
|---|---|---|
author* | string | |
authorHandle | string | |
authorSeed | string | |
date | string | |
stars | number | null | |
title | ReactNode | |
titleTo | string | |
subtitle | ReactNode | |
poster | ReactNode | |
children* | ReactNode | |
actions | ReactNode | |
menu | ReactNode | |
likeShows record.club's Like control and count when the target supports likes. | LikeTarget | |
bylineByline prefix, e.g. 短评 · or 文章 ·; defaults to a short review. | string |
LikeButton
apps/web/src/review-card.tsx:21record.club's "♡ Like" with an optimistic count. Visitors are sent to sign in.
| Prop | Type | Default |
|---|---|---|
targetType* | 'review' | 'article' | 'list' | |
targetId* | string | |
likeCount | number | 0 |
likedByMe | boolean | false |
AuthorName
apps/web/src/components.tsx:51| Prop | Type | Default |
|---|---|---|
name* | string | |
handle | string |