Luca Perullo
Components

Component

LiveNew

Bento Tile

Bento card a doppia identità. Con `preview` set: la preview riempie la tile, frozen (animation off), niente overlay — la preview È la tile. Senza preview: layout etichettato classico (icon top-left, kicker + name bottom). Due fit per la preview: scale (centrata) o cover (fill edge-to-edge).

BentoDecorativoServer
Open in ClaudeSorgente

Esempio01

bento-tile.tsx

Note Quando preview è settato il render path diventa solo-preview: niente icon, niente name, niente fog. Il subtree riceve [&_*]:!animate-none [&_*]:!transition-none [&_*]:!will-change-auto così 24+ tile nei gutter restano economiche. previewFit='cover' bypassa la scala e fa riempire alla preview tutta la tile (caso tipico: <img object-cover/>).

Prompt LLM02

Incolla in Claude o ChatGPT per generare la tua variante. Include il contesto del brand, i token e i vincoli del progetto.

Prompt · bento-tile
Open in Claude
Sei un senior frontend engineer. Stai lavorando su un sito Next.js 16 + React 19 + Tailwind v4 in italiano, look chanhdai-inspired: colonna stretta 672px, Geist Sans + Geist Mono, hairline 1px, divisori a stripe diagonale, palette zinc.

Token CSS disponibili: --bg, --bg-alt, --fg, --fg-muted, --fg-soft, --border, --border-strong, --accent. Usa SEMPRE queste variabili tramite le utility tailwind generate (bg-bg, text-fg-muted, border-border, ecc.). Helper "cn" da "@/lib/utils". Niente librerie UI extra: solo lucide-react e tailwind-merge.

Genera un componente <BentoTile>: card decorativa con due render path.
Props:
- icon?: ComponentType — lucide
- name: string
- group?: string — kicker mono uppercase
- variant?: "minimal" | "accent" | "mono" (default "minimal")
- size?: "sm" | "md" | "lg" (default "md") — heights 80/128/176px
- isNew?: boolean
- preview?: ReactNode — preview live, frozen
- previewFit?: "scale" | "cover" (default "scale")
- previewInnerWidth?: number (default 320) — width pre-scale del wrapper
- previewScale?: number (default 0.5)
- className?: string

Render path 1 — con preview:
- div rounded-md border, h size, overflow-hidden
- absolute inset-0 con [&_*]:!animate-none [&_*]:!transition-none [&_*]:!will-change-auto
- Se previewFit "cover": absolute inset-0 con il preview dentro
- Altrimenti: wrapper assoluto centrato (left-1/2 top-1/2, transform: translate(-50%,-50%) scale(N), width: previewInnerWidth) con il preview dentro
- Optional accent dot top-right per isNew (con ring)
- Niente icon, niente name, niente fog overlay

Render path 2 — senza preview:
- div rounded-md border + p-3 + h size, flex-col justify-between
- Top: icon chip 28x28 (border + bg) + accent dot top-right se isNew
- Bottom: kicker mono small + name 12.5px font-medium

Varianti:
- minimal: border-border bg-bg, label text-fg
- accent: border-accent/40 bg-accent/[0.04], kicker text-accent
- mono: border-fg bg-fg text-bg

Esporta bentoSizeForSlug(slug), bentoVariantForSlug(slug, isNew?) per pick deterministici da char-code-sum.

Constraints: server component, aria-hidden default.

Output: file completo .tsx.

Uso tipico03

tsx
// Preview path — preview fills the tile, no labels.
<BentoTile size="lg" isNew preview={<MyComponentPreview />} />

// Image-fill variant.
<BentoTile size="lg" previewFit="cover" preview={<img src={src} className="h-full w-full object-cover" />} />

// Label path — icon + kicker + name, no preview.
<BentoTile icon={Wind} name="Marquee" group="Motion" variant="accent" />

Dipendenze04

npm
  • tailwind-merge
  • clsx
Interno
  • @/lib/utils#cn

Ti è servito? Dimmelo, oppure proponi il prossimo componente.