A marketing landing page for Loopwork, a fictional B2B project & workflow
management SaaS. Built with Next.js (App Router), Tailwind CSS, and UI
components from @dub/ui (the design
system used by dub.co).
- Next.js 15 (App Router, React 19)
- Tailwind CSS 3 with the shared
@dub/tailwind-configpreset @dub/uiforButton,Badge,Accordion,Avatar,MaxWidthWrapper,Grid, and the icon set- lucide-react for the star-rating icon (the bundled
@dub/uiStaricon is stroke-only and doesn't support a filled variant)
npm install
npm run devOpen http://localhost:3000 to view the page.
app/ Next.js App Router entry (layout, globals.css, page)
components/ One component per landing page section (nav, hero, pricing, faq, footer, ...)
lib/content.ts All page copy/data in one place (features, pricing, testimonials, FAQ, etc.)
lib/utils.ts `cn()` class-merging helper (clsx + tailwind-merge)
public/images/ Brand assets (logo, wordmark, dashboard screenshot)
@dub/uiships as a single pre-bundled entry point, so installing it pulls in its full dependency tree (Radix, Tiptap, visx, react-table, etc.) even though this page only uses a handful of components.date-fnsand@tiptap/suggestionare pinned as explicit root dependencies because they're declared as peer dependencies deeper in that tree and aren't auto-installed underlegacy-peer-deps(see.npmrc).tailwind.config.tsis excluded fromtsconfig.json's program because@dub/tailwind-configships its config as raw.tssource (not a compiled.d.ts), which otherwise drags a third-party type error intonext build's type-checking step. Tailwind/PostCSS still load the file fine at build time.