npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@findagent/ui

v0.1.0

Published

FindAgent shared design system — the single source for UI primitives shared across the app and the landing.

Downloads

80

Readme

@findagent/ui — the FindAgent design system

The single source of truth for shared, presentational UI. Consumed by the app (apps/web, via workspace source → instant, no publish) and — once published to public npm — by the landing and the bot. Pairs with @findagent/tokens (the shared Tailwind theme / CSS variables) so a component renders identically in every consumer.

What belongs here vs what stays in the app

IN @findagent/ui (add new shared UI here):

  • Presentational + reusable primitives + building blocks: buttons, inputs, dialogs, badges, cards/shells, avatar, pagination, toast, brand marks/logos, thumbnails, generic banners (StatusBanner), skeletons, illustration cores, tokens.
  • Rule of thumb: no app business logic, no Supabase / server-only / route deps, no app-specific data types. Only pure utils + other primitives.

STAYS in apps/web/components (do NOT move here):

  • App-feature components with business logic / data fetching / Supabase / route behavior: install-modal, submission wizard, admin dashboards, KB/dept/account features, nav/footer/search, coming-soon pages, specialized illustrations, analytics-coupled wrappers.
  • These may (and should) compose @findagent/ui primitives — but they live in the app.

Adding / changing a component (the workflow every feature follows)

  1. Need a shared primitive? Check @findagent/ui first. If it exists, import it: import { Button, StatusBanner } from '@findagent/ui'.
  2. If it doesn't exist and it's shared/presentational → add it here (src/ui/<name>.tsx for shadcn-style, src/<name>.tsx otherwise), export it from src/index.ts, then use it. Don't create a second copy in the app.
  3. If it's app-feature-logic → build it in apps/web/components, composing @findagent/ui primitives.

The #419 boundary rule (load-bearing)

  • A server-safe primitive stays directive-free; an interactive one keeps 'use client' as its FIRST line. Never remove/add the directive when moving a component.
  • Never export a pure helper from a 'use client' module — a Server Component importing it gets a client-ref proxy and crashes (React #419). Pure helpers live in non-client modules (src/lib/*).

Structure

  • src/index.ts — the public barrel (the ONLY entry; main/types point here).
  • src/ui/* — shadcn-style primitives. src/* — logos, illustrations, cards, banners. src/lib/* — pure utils (cn, initials, avatar-host, tokens, …).
  • Deps: react/react-dom/next are peerDependencies (the consumer provides them); runtime libs (clsx, tailwind-merge, class-variance-authority, lucide-react, simple-icons, @radix-ui/*) are dependencies at the app's versions.

Wiring (already done for the app)

  • apps/web/next.config.mjstranspilePackages: ['@findagent/ui', …].
  • apps/web/tailwind.config.tscontent includes ../../packages/ui/src/**/*.{ts,tsx} (so classes aren't purged).
  • apps/web/package.json"@findagent/ui": "workspace:*".
  • A consumer's Tailwind theme must define the same tokens (fg-strong, fg-muted, …) → that's what @findagent/tokens single-sources.

One canonical import path

The migration is complete: the re-export shims are gone and every consumer imports shared UI from @findagent/ui directly — import { Button, StatusBanner } from '@findagent/ui'. There is no @/components/<x> alias for a moved primitive anymore. Add new shared UI here and import it by the package path.

Consuming from npm (landing / bot)

Once the owner has published @findagent/ui to public npm (pnpm --filter @findagent/ui publish), external consumers (landing, bot) install it with:

# Install both the design system and the tokens peer it depends on
npm install @findagent/ui @findagent/tokens

Next.js consumers (landing)

// next.config.mjs
export default {
  transpilePackages: ['@findagent/ui'],  // optional — the dist is pre-built ESM, but
                                          // adding it avoids a potential Next.js edge-runtime quirk
}
// tailwind.config.ts — add to content so classes aren't purged
content: [
  // ... your existing globs ...
  'node_modules/@findagent/ui/dist/**/*.js',
]
/* globals.css or equivalent — import the token variables */
@import '@findagent/tokens/tokens.css';
// tailwind.config.ts — extend with the shared theme preset
import tokensPreset from '@findagent/tokens/tailwind'

export default {
  presets: [tokensPreset],
  // ... rest of your config
}

Non-Next.js consumers (bot)

Same as above — import @findagent/tokens/tokens.css for the CSS variables, extend Tailwind with the @findagent/tokens/tailwind preset, and add the dist/**/*.js content glob. The pre-built ESM dist does NOT require transpilePackages.