Skip to main content
Use Case

Create a Developer Portfolio with React and Tailwind CSS v4

Build a clean, fast developer portfolio with hero, projects grid, skills section, and contact form — all accessible and responsive with Ninna UI.

Why a component library for a portfolio

A portfolio is a small project, but it still benefits from accessible components and consistent theming. Ninna UI's primitives give you semantic HTML, accessible interactions, and oklch colors without the overhead of a full design system setup.

1. Hero with name and tagline

Use VStack for a clean, centered hero:

import { Heading, Text, Button, Badge } from "@ninna-ui/primitives";
import { VStack, Container } from "@ninna-ui/layout";

<Container className="py-24">
  <VStack gap="4" align="center">
    <Badge variant="soft" color="primary">Available for work</Badge>
    <Heading as="h1" size="5xl" weight="bold">Jane Developer</Heading>
    <Text size="xl" className="text-base-content/70">Full-stack engineer building accessible web apps with React.</Text>
  </VStack>
</Container>

2. Projects grid

Use SimpleGrid with Card for a responsive projects showcase:

import { SimpleGrid } from "@ninna-ui/layout";
import { Card } from "@ninna-ui/data-display";
import { Heading, Text, Badge } from "@ninna-ui/primitives";

<SimpleGrid columns={{ base: 1, sm: 2, lg: 3 }} gap="6">
  <Card>
    <img src="/project1.png" alt="Project screenshot" className="rounded-t-xl" />
    <div className="p-6">
      <Heading as="h3" size="lg">TaskFlow</Heading>
      <Text>Real-time task management app built with React and WebSocket.</Text>
      <div className="flex gap-2 mt-3">
        <Badge size="sm">React</Badge>
        <Badge size="sm">TypeScript</Badge>
      </div>
    </div>
  </Card>
</SimpleGrid>

3. Contact form

Use Field, Input, Textarea, and Button from the forms and primitives packages for an accessible contact form:

import { Field, Input, Textarea } from "@ninna-ui/forms";
import { Button } from "@ninna-ui/primitives";
import { VStack } from "@ninna-ui/layout";

<VStack gap="4" as="form">
  <Field label="Name"><Input placeholder="Your name" /></Field>
  <Field label="Email"><Input type="email" placeholder="you@example.com" /></Field>
  <Field label="Message"><Textarea placeholder="Tell me about your project" /></Field>
  <Button type="submit" color="primary">Send Message</Button>
</VStack>

Related Blocks

Component Docs

FAQ