wave-kit

View source

Design system and UI kit developed for Jay Hack's personal projects. Emphasizes simplicity, legibility and performance for technical writing.

npx skills add jayhack/wave-kit --skill build-with-wave-kit -y

Inspiration

This design system is inspired by the work of Kazumasa Nagai, a Japanese graphic designer, and other poster art from the '60s onward. Clean, abstract forms reminiscent of HAL 9000, but in a benevolent manner.

Kazumasa Nagai, primary reference
Secondary reference for radial systems and optical depth
No More War, repeated form and concentrated color

Wave motif

Waves are the recurring generative gesture across jay.ai. A simple cellular field carries energy outward from a point, turning the same cool-to-warm palette into motion.

Color

The system has four color anchors, not fourteen independent colors. Signal blue, heat red, energy orange, and light yellow carry the identity. The other values are associated shades used to give waves depth and intensity. Product UI stays neutral and usually uses only one anchor at a time.

Signal blue

wave-blue-vivid

Depth, navigation, and cool wave polarity.

Heat red

wave-red-vivid

Heat, urgency, and warm wave polarity.

Energy orange

wave-orange

The transition from heat into light.

Light yellow

wave-amber

Peaks, highlights, and maximum energy.

Canvas

#000000

Reading text

neutral-300

Navigation

sky-300

Typography

The stack is native system sans for speed and familiarity, with the platform monospace stack for tokens and small technical labels. Tight headlines meet relaxed body copy.

Display / 48 / 800
Intelligence in motion.
Heading / 24 / 800
Build the sharpest version.
Body / 16.5 / 32

Software should feel immediate. Structure the page so the useful thing appears first, then let detail reward attention.

Subtle / 14 / 24

Supporting context stays present without competing with the work.

Code / 12.5 / 20
wave-orange  #f97316

Back controls preserve in-app history when it exists and fall back to a known route for direct visits. Primary tabs use a simple two-pixel underline without filled pills or heavy chrome.

Companies, products, and AI systems. The active state is precise and quiet.

Progressive image

Reserve the final aspect ratio up front, paint a tiny inline placeholder immediately, then fade in a responsive WebP. The full image is lazy-loaded and asynchronously decoded, so the reading experience never waits on it.

Placeholder → responsive source set → full-resolution lightbox

Diagrams

Treat diagrams as academic figures: use crisp SVG geometry, label every stage, axis, and series, and keep the composition minimal. Color must encode a stated meaning rather than act as decoration. Click either figure to inspect the original SVG.

Process diagram · signal blue encodes observed structure; heat red encodes the intervention.
Measurement chart · every axis, series, and annotation remains labeled without relying on color alone.

wave-paper Primary labels, titles, and high-contrast values.

wave-blue-vivid Observations, measured structure, and primary series.

wave-red-vivid Interventions, causal emphasis, and comparison series.

neutral-700 Axes, guides, borders, and secondary structure.

Dividers

Quiet rules divide long-form sections without turning every idea into a card.

Subtle
Strong

Style guide

Simplicity is an editing discipline. Every visual element should improve meaning, navigation, or reading rhythm.

Remove ornamental UI

Avoid AI slop such as eyebrows, sequence numbers, badges, and labels that only repeat nearby content. If an element adds no information or function, remove it.


Keep titles in proportion

Use the smallest title that establishes hierarchy. Avoid oversized hero text that pushes useful content below the fold or turns every page into a landing page.


Compose for vertical reading

Structure pages like blog posts when possible. Assume vertical scrolling, use semantic sections and paragraphs, and intersperse images or interactive assets with the text they support.

Code samples

Install the package, import the global stylesheet once, then compose the real components. These examples are complete enough for an agent to copy into a React or Next.js project and adapt without recreating the design system.

Global CSS
@import "tailwindcss";
@import "@jayhack/wave-kit/styles.css";
Wave field and page index
import { NavigationIndex, WaveField } from "@jayhack/wave-kit";

const sections = [
  ["overview", "Overview"],
  ["details", "Details"],
] as const;

export function ProjectPage() {
  return (
    <main className="min-h-screen bg-wave-ink text-neutral-300">
      <aside className="fixed left-8 top-12">
        <NavigationIndex items={sections} />
      </aside>
      <section id="overview">
        <div className="relative aspect-[16/7] overflow-hidden rounded-lg">
          <WaveField className="absolute inset-0 h-full w-full" />
        </div>
      </section>
    </main>
  );
}
Progressive image and lightbox
"use client";

import { useState } from "react";
import { Lightbox, ProgressiveImage } from "@jayhack/wave-kit";

const images = [
  { src: "/project-full.png", alt: "Project system diagram" },
];

export function ProjectImage() {
  const [open, setOpen] = useState(false);
  const [previewSrc, setPreviewSrc] = useState<string>();

  return (
    <>
      <button onClick={() => setOpen(true)} type="button">
        <ProgressiveImage
          alt={images[0].alt}
          height={900}
          onLoad={(event) => setPreviewSrc(event.currentTarget.currentSrc)}
          src="/project-1024.webp"
          srcSet="/project-672.webp 672w, /project-1024.webp 1024w"
          width={1024}
        />
      </button>
      {open ? (
        <Lightbox
          items={[{ ...images[0], previewSrc }]}
          onClose={() => setOpen(false)}
          startIndex={0}
        />
      ) : null}
    </>
  );
}
Named colors
<div className="border border-wave-blue-vivid bg-wave-ink text-wave-paper">
  <span className="text-wave-amber">High energy</span>
</div>
Highlighted code
import { CodeBlock } from "@jayhack/wave-kit";

<CodeBlock
  code={'const energy = "wave-orange";'}
  label="Theme token"
  language="tsx"
/>

Tech stack

Wave Kit is designed for a focused application stack: Next.js for the React framework, Vercel for deployment, Tailwind CSS for named design tokens and composition, and shadcn/ui for accessible primitives when a project needs controls beyond the core kit.

Next.jsApplication framework
VercelHosting and delivery
Tailwind CSSTokens and utility composition
shadcn/uiExtended interface primitives

Install

Install the public package from npm. Use the GitHub checkout when contributing to Wave Kit itself.

npm install @jayhack/wave-kit tailwindcss
git clone https://github.com/jayhack/wave-kit.git
npm install ./wave-kit/packages/wave-kit tailwindcss
@import "tailwindcss";
@import "@jayhack/wave-kit/styles.css";
Built from the components already used across jay.ai. This page is the source of truth for the portable kit.