Round-of-concepts review surface β version eyebrow, file carousel, header actions, and an optional comment thread with a POST-backed composer.
Summer at the Movies β Concepts
Title Card
Here's Round 2. We leaned into the 70s marquee reference, pushed the italic coral pop on "Summer", and softened the gradient behind it. Let me know where to tighten.
Looks great! Adding a couple pins.
Love the marquee β can we bump the coral one more notch so it pops on dark backgrounds?
Totally. I'll push it toward the brand coral and re-export the social tile too.
Stage graphic reads really well from the back of the room π
Agreed. One nit: tighten the leading on the subtitle so it sits closer to the headline.
Done β leading tightened and V2.1 is uploading now. Should land in a few minutes.
Nice. Once Sarah signs off I'll queue it for the Friday send.
npx shadcn@latest add https://sdk-components.thesqd.com/r/concept-approval.jsonimport { ConceptApproval } from "@/components/blocks/concept-approval";import { CheckIcon } from "lucide-react";
import { ConceptApproval } from "@/components/blocks/concept-approval";
export function ReviewPage() {
return (
<ConceptApproval
version={2}
versions={[1, 2]}
title="Summer at the Movies β Concepts"
files={[
{ id: "title", kind: "image", src: "/concepts/title.jpg", label: "Title Card" },
]}
actions={[
{ id: "approve", label: "Approve", icon: <CheckIcon />, onClick: () => {} },
]}
commentEndpoint="/api/concepts/round-2/comments"
/>
);
}ConceptApproval β review surface for a round of concepts
βββ header
β βββ version eyebrow β "Round 2 Β· posted 2h ago by Marisol"
β βββ title β heading next to the eyebrow
β βββ actions[] β Download / Revise / Approve buttons
βββ carousel β images or videos with arrows + dots
β βββ label β caption under the active file
βββ comments (commentsEnabled) β rendered with the Messaging <Chat> block
βββ thread β comments[] as ChatMessage (replies, reactions, attachments)
βββ composer β Chat composer; onSend POSTs to commentEndpointSummer at the Movies β Concepts
Title Card
Here's Round 2. We leaned into the 70s marquee reference, pushed the italic coral pop on "Summer", and softened the gradient behind it. Let me know where to tighten.
Looks great! Adding a couple pins.
Love the marquee β can we bump the coral one more notch so it pops on dark backgrounds?
Totally. I'll push it toward the brand coral and re-export the social tile too.
Stage graphic reads really well from the back of the room π
Agreed. One nit: tighten the leading on the subtitle so it sits closer to the headline.
Done β leading tightened and V2.1 is uploading now. Should land in a few minutes.
Nice. Once Sarah signs off I'll queue it for the Friday send.
Summer at the Movies β Concepts
Title Card
Logo lockup β first pass
Title Card
Here's Round 2. We leaned into the 70s marquee reference, pushed the italic coral pop on "Summer", and softened the gradient behind it. Let me know where to tighten.
ConceptApproval
| Prop | Type | Default | Description |
|---|---|---|---|
version | number | β | Current version number β rendered in the eyebrow badge as `V{n}`. |
versions | number[] | β | All available versions. When more than one, version-switching tabs render in the top-right of the header. |
onVersionChange | (version: number) => void | β | Called when the user picks a different version from the tabs. |
title | React.ReactNode | β | Heading next to the version chip. |
subtitle | React.ReactNode | β | Inline metadata after the version ("posted 2h ago by Marisol"). |
files | ConceptApprovalFile[] | β | Images / videos shown in the carousel. |
actions | ConceptApprovalAction[] | β | Buttons rendered in the header (Download / Revise / Approve). |
commentsEnabled | boolean | true | Show or hide the comment thread + composer. |
comments | ChatMessage[] | β | The feedback thread β the Messaging block's `ChatMessage[]` shape (inline attachments / reactions / replyTo). Rendered with `<Chat>`. |
commentEndpoint | string | β | POST URL for new comments. Receives `{ body, version, fileId }`. |
onSubmitComment | (c) => void | Promise<void> | β | Called after a successful submit, with `{ body, version }`. |
currentUserId | string | "you" | Id of the viewer β own messages align right; drives reaction state. |
currentUserName | string | "You" | Display name stamped on messages you send. |
placeholder | string | "Leave feedback for your Squadβ¦" | Composer placeholder. |
className | string | β | Extra classes merged onto the outer section. |
ConceptApprovalFile
| Prop | Type | Default | Description |
|---|---|---|---|
id | string | β | Stable id for keying and comment payloads. |
kind | "image" | "video" | "image" | Render an <img> or a controlled <video>. |
src | string | β | Asset URL. |
poster | string | β | Poster image for videos. |
label | string | β | Caption shown under the active file in the carousel. |
alt | string | β | Image alt text. Falls back to the label. |
ConceptApprovalComment
| Prop | Type | Default | Description |
|---|---|---|---|
id | string | β | Stable id. |
senderId | string | β | Matched against `currentUserId` β own messages align right. |
senderName | string | β | Author name β initials and avatar color are derived from this. |
senderAvatar | string | null | β | Optional photo URL (falls back to initials). |
text | string | β | Message body. |
timestamp | Date | string | number | β | When the message was posted β auto-formatted into a time. |
attachments | ChatAttachment[] | β | `{ id, name, url?, size?, type? }` β images preview inline. |
reactions | ChatReaction[] | β | `{ emoji, users: string[] }` β count = users.length. |
replyTo | ChatReplyRef | β | `{ id, senderName, text }` β quoted parent message. |
ConceptApprovalAction
| Prop | Type | Default | Description |
|---|---|---|---|
id | string | β | Stable key for the action. |
label | string | β | Button label. |
icon | React.ReactNode | β | Optional lucide icon. |
onClick | () => void | β | Click handler. |
variant | ButtonProps["variant"] | "outline" | Forwarded to the squad-ui Button. |
size | ButtonProps["size"] | "default" | Forwarded to the squad-ui Button. |