Jason ea311c502a
ci / build-and-design (push) Failing after 1s
fix: themed Radix-based Select (dark/gold popover) replacing native <select> (v0.3.0)
Native <select> open menus are OS-drawn (grey/blue) and can't be themed.
Rebuilt Select on @radix-ui/react-select with a fully styled popover while
keeping the native drop-in API (value/onChange/<option> children). Empty-string
option values stay selectable via an internal sentinel.
2026-07-16 07:45:39 -05:00

@jason/ui-kit

Shared design foundation for all my apps. One brand system, reused everywhere — so new apps start polished and existing apps have a clear upgrade path.

Built on the stack I already use (React + Vite + Tailwind + TypeScript) and guarded by Impeccable so nothing ships looking like a generic AI-generated template.

What's inside

  • Design tokens + Tailwind preset — warm gold/dark brand, radius/shadow/motion scales, CSS-variable theming (dark default, .light opt-in), Montserrat / Open Sans / JetBrains Mono.
  • cn() helper (clsx + tailwind-merge) — the standard everywhere.
  • Primitives — Button, Card, Input, Badge, Dialog, DropdownMenu, Table, Toaster (sonner). Radix-backed, accessible, pre-themed.
  • MotionFadeIn, Stagger (framer/motion, reduced-motion aware).
  • AnimatedAnimatedNumber (count-up stats), SpotlightCard (cursor glow).
  • BlocksAppShell (sidebar + topbar), CommandPalette (⌘K), Hero, FeatureGrid, Pricing.
  • Impeccable wired in — DESIGN.md / PRODUCT.md design context, config, and a CI anti-slop detector.

Install (in a consuming app)

This package publishes to the Gitea npm registry. Add an .npmrc (see .npmrc.example):

@jason:registry=https://git.alwisp.com/api/packages/jason/npm/
//git.alwisp.com/api/packages/jason/npm/:_authToken=${GITEA_NPM_TOKEN}

Then:

npm install @jason/ui-kit

Wire up Tailwind

// tailwind.config.js
module.exports = {
  presets: [require("@jason/ui-kit/preset")],
  content: [
    "./index.html",
    "./src/**/*.{ts,tsx}",
    "./node_modules/@jason/ui-kit/dist/**/*.js", // so kit classes aren't purged
  ],
};
// app entry (main.tsx)
import "@jason/ui-kit/styles.css";

Use it

import { Button, Card, CardHeader, CardTitle, Hero, AnimatedNumber, Toaster, toast } from "@jason/ui-kit";

<Hero
  eyebrow="New"
  title="Ship tools that look designed"
  subtitle="One brand system across every app."
  primaryCta={{ label: "Get started", href: "/signup" }}
  secondaryCta={{ label: "Docs", href: "/docs" }}
/>

Develop

npm install
npm run dev          # tsup watch build
npm run typecheck
npm run design:detect   # run the Impeccable anti-slop detector on src/

Publish a new version

npm version patch      # or minor / major
npm publish            # builds via prepublishOnly, pushes to Gitea registry

Extending with 21st.dev

This kit is the base layer. For richer one-off blocks, pull 21st.dev components (shadcn-registry compatible) into an app, then re-theme them with these tokens and, if broadly useful, promote them into src/blocks/ here. Run /impeccable polish on anything new before it ships.

See DESIGN.md for the full system spec and MIGRATION.md for adopting the kit in apps that already exist.

S
Description
@alwisp/ui — shared design foundation: MPM-branded tokens, Tailwind preset, shadcn-style components, motion, app shell + marketing blocks. Guarded by Impeccable (anti-AI-slop). Baseline for all new apps + upgrade path for existing ones.
Readme 219 KiB
Languages
TypeScript 86.7%
JavaScript 6.9%
CSS 3.3%
HTML 3.1%