Components / Text
Notepad
Free Text React component — NotepadCard. MIT licensed, copy-paste ready for Next.js and Tailwind CSS.
Sticky notepad with an italic quote, author line, and checkbox task list. Bookmark ribbon on top — good for editorial or productivity layouts.
Preview
Note to self
"Design is not just what it looks like and feels like. Design is how it works."
— S. Jobs
Setup
How to use
Free for personal and commercial use. No UI attribution required. Include the MIT copyright notice when copying component source into your project. Read the MIT license.
- 1
Run in your terminal:
$npm install clsx tailwind-merge lucide-react - 2
Copy
lib/cn.tsbelow. Skip if you already havecn(). - 3
Copy the code below and create
components/text/notepad-card.tsxin your project. - 4
Import and render:
Exampleimport { NotepadCard } from "@/components/text/notepad-card";
lib/cn.ts
import { type ClassValue, clsx } from "clsx";import { twMerge } from "tailwind-merge";export function cn(...inputs: ClassValue[]) {return twMerge(clsx(inputs));}
components/text/notepad-card.tsx
import {forwardRef,type ComponentPropsWithoutRef,type ReactNode,} from "react";import { cn } from "@/lib/cn";import { Bookmark } from "lucide-react";export type NotepadCardProps = Readonly<{title?: string;quote?: string;author?: string;checklist?: string[];bookmarkIcon?: ReactNode;} & ComponentPropsWithoutRef<"div">>;// Production-ready Notepad component — styled with Tailwind CSS.export const NotepadCard = forwardRef<HTMLDivElement, NotepadCardProps>(({className,title = "Note to self",quote = "Design is not just what it looks like and feels like. Design is how it works.",author = "S. Jobs",checklist = ["Ship the MVP", "Write tests", "Review PR #42"],bookmarkIcon,...props},ref,) => {return (<divref={ref}data-slot="notepad-card"className={cn("relative w-60 border border-[#e6e2bc] bg-[#fffdf0] p-5 font-sans shadow-[5px_5px_0px_#e6e2bc]",className,)}{...props}>{/* Bookmark */}<divdata-slot="notepad-card-bookmark"className="absolute top-3 right-3 text-[#a39e76]">{bookmarkIcon ?? <Bookmark size={16} />}</div>{/* Note title */}<h5data-slot="notepad-card-title"title={title}className="mb-3 border-b border-[#e6e2bc] pb-1 font-mono text-[10px] tracking-widest text-[#a39e76] uppercase">{title}</h5>{/* Quote content */}<pdata-slot="notepad-card-quote"className="font-serif text-sm leading-relaxed text-[#5c5a4a] italic">"{quote}"</p>{/* Quote author */}<pdata-slot="notepad-card-author"title={author}className="mt-4 text-right text-[10px] text-[#a39e76]">— {author}</p>{/* Checklist */}<div data-slot="notepad-card-checklist" className="mt-4 space-y-2">{checklist.map((item) => (<divkey={item}className="flex items-center gap-2 text-xs text-[#5c5a4a]"><div className="h-3 w-3 shrink-0 border border-[#c4bf98]" />{item}</div>))}</div></div>);},);NotepadCard.displayName = "NotepadCard";