2026-07-16 00:36:53 -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](https://impeccable.style) so nothing ships looking like a
|
|
|
|
|
generic AI-generated template.
|
|
|
|
|
|
|
|
|
|
## What's inside
|
|
|
|
|
|
2026-07-23 04:23:19 -05:00
|
|
|
- **Generated design tokens + Tailwind preset** — accessible dark/light palettes, semantic foregrounds, radius/shadow/motion scales, and a parity check that prevents CSS/TypeScript drift.
|
|
|
|
|
- **Theme runtime + optional self-hosted fonts** — persisted dark/light/system mode, a no-flash script, and Latin variable-font delivery.
|
2026-07-16 00:36:53 -05:00
|
|
|
- **`cn()`** helper (clsx + tailwind-merge) — the standard everywhere.
|
2026-07-23 04:23:19 -05:00
|
|
|
- **Primitives** — Button, Card, FormField, Input, Select, Checkbox, Switch, Tabs, Tooltip, Badge, Dialog, DropdownMenu, Table, Pagination, Skeleton, and Toaster. Radix-backed, accessible, pre-themed.
|
2026-07-16 00:36:53 -05:00
|
|
|
- **Motion** — `FadeIn`, `Stagger` (framer/`motion`, reduced-motion aware).
|
|
|
|
|
- **Animated** — `AnimatedNumber` (count-up stats), `SpotlightCard` (cursor glow).
|
2026-07-23 04:23:19 -05:00
|
|
|
- **Blocks** — responsive `AppShell` (desktop sidebar + mobile drawer), `CommandPalette` (⌘K), `Hero`, `FeatureGrid`, `Pricing`.
|
|
|
|
|
- **Living showcase** — executable coverage of themes, states, product UI, and marketing blocks.
|
2026-07-16 00:36:53 -05:00
|
|
|
- **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:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
npm install @jason/ui-kit
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Wire up Tailwind
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
// 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
|
|
|
|
|
],
|
|
|
|
|
};
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```ts
|
|
|
|
|
// app entry (main.tsx)
|
|
|
|
|
import "@jason/ui-kit/styles.css";
|
|
|
|
|
```
|
|
|
|
|
|
2026-07-23 04:23:19 -05:00
|
|
|
Load the branded variable fonts as an opt-in asset:
|
|
|
|
|
|
|
|
|
|
```ts
|
|
|
|
|
import "@jason/ui-kit/fonts.css";
|
|
|
|
|
import "@jason/ui-kit/styles.css";
|
|
|
|
|
```
|
|
|
|
|
|
2026-07-16 00:36:53 -05:00
|
|
|
### Use it
|
|
|
|
|
|
|
|
|
|
```tsx
|
2026-07-23 04:23:19 -05:00
|
|
|
import {
|
|
|
|
|
Button, FormField, Input, ThemeProvider, ThemeScript, Toaster
|
|
|
|
|
} from "@jason/ui-kit";
|
|
|
|
|
|
|
|
|
|
<ThemeScript />
|
|
|
|
|
<ThemeProvider>
|
|
|
|
|
<FormField label="Workspace name" description="Shown in navigation.">
|
|
|
|
|
<Input />
|
|
|
|
|
</FormField>
|
|
|
|
|
<Button>Save</Button>
|
|
|
|
|
<Toaster />
|
|
|
|
|
</ThemeProvider>
|
2026-07-16 00:36:53 -05:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Develop
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-07-23 04:23:19 -05:00
|
|
|
npm ci
|
2026-07-16 00:36:53 -05:00
|
|
|
npm run dev # tsup watch build
|
2026-07-23 04:23:19 -05:00
|
|
|
npm run demo # root demo.html using the real kit components
|
|
|
|
|
npm run showcase # living component review surface
|
|
|
|
|
npm run check # tokens, types, tests, builds, and design detector
|
2026-07-16 00:36:53 -05:00
|
|
|
```
|
|
|
|
|
|
2026-07-23 04:23:19 -05:00
|
|
|
The portable project entry is [`demo.html`](./demo.html). Open
|
|
|
|
|
`http://localhost:5173/demo.html` after running `npm run demo`.
|
|
|
|
|
|
2026-07-16 00:36:53 -05:00
|
|
|
## Publish a new version
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
npm version patch # or minor / major
|
2026-07-23 04:23:19 -05:00
|
|
|
npm publish # builds via prepare, pushes to Gitea registry
|
2026-07-16 00:36:53 -05:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Extending with 21st.dev
|
|
|
|
|
|
|
|
|
|
This kit is the base layer. For richer one-off blocks, pull
|
|
|
|
|
[21st.dev](https://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.
|