Installation

There are three ways to use Harmo in a project. Choose one.

Install

@harmo-ui/react needs React 19.3 or later.

bun add @harmo-ui/css @harmo-ui/react

Use it

Load the CSS once, then use the components:

page.tsx
import "@harmo-ui/css";
import { Button, Field, Input, Link } from "@harmo-ui/react";

<Button type="submit">Save changes</Button>
<Button variant="secondary">Cancel</Button>

<Link href="/reports">View reports</Link>

<Field label="Email address" description="We'll send your receipt here.">
  <Input name="email" type="email" />
</Field>

Set your router's link component and your framework's image component once, at the root, and Link, Button, TabLink, and Avatar use them. In the Next.js App Router, do it in a Client Component, because a Server Component can't pass functions to one, and wrap your root layout's {children} in it:

app/providers.tsx
"use client";

import NextImage from "next/image";
import NextLink from "next/link";
import { HarmoProvider } from "@harmo-ui/react";

export default function Providers({ children }: { children: React.ReactNode }) {
  return (
    <HarmoProvider linkComponent={NextLink} imageComponent={NextImage}>
      {children}
    </HarmoProvider>
  );
}

Browser support

Harmo targets current versions of Chrome, Edge, Firefox, and Safari. It uses the popover attribute, CSS anchor positioning (in all major browsers since January 2026), field-sizing: content (since June 2026), @starting-style, and :has().