Canvas card

An absolutely-positioned card you place on the canvas by x / y. It can render as a link by passing a router-agnostic linkComponent (e.g. next/link), and shows a selection ring when marquee-selected.

A plain card

Positioned at (60, 70). Drag on empty space to marquee-select it.

A link card

Pass linkComponent to make the whole card a router-aware link.

Installation

npx shadcn@latest add https://canvas.blode.co/r/canvas-card.json

Usage

import Link from "next/link";
import { CanvasCard } from "@/components/canvas/canvas-card";
 
// A plain card
<CanvasCard cardId="a" x={60} y={60}>
  <div className="p-5">A card</div>
</CanvasCard>
 
// A link card
<CanvasCard cardId="b" href="/lesson" linkComponent={Link} x={360} y={140}>
  <div className="p-5">Open lesson →</div>
</CanvasCard>

Props

PropTypeDefaultDescription
x*numberLeft position on the canvas, in px.
y*numberTop position on the canvas, in px.
children*ReactNodeCard content.
widthnumber280Card width, in px.
hrefstringWhen set, the card renders as a link.
linkComponentElementType"a"Component used for the link (e.g. `next/link`).
cardIdstringMarks the card selectable; reported by `onSelect`.
selectedbooleanDraws the selection ring.
classNamestringExtra classes for the card surface.