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

@weksik/ui-lib

v0.7.0

Published

React component library with design tokens and a theme, built on Ark UI and plain CSS

Readme

@weksik/ui-lib

Библиотека токенов, темы и React-компонентов на чистом CSS (React 19, Ark UI, ESM-only, MIT).

React component library with design tokens and a theme, built on Ark UI and plain CSS.

  • Storybook: ссылка появится после развёртывания.
  • Репозиторий: https://github.com/w3k5/ui-lib

Установка

pnpm add @weksik/ui-lib react react-dom lucide-react

react, react-dom (19) и lucide-react — peer-зависимости, их ставит приложение.

Стили

Подключите стили один раз в точке входа приложения. Есть два варианта.

Всё сразу — styles.css: токены, базовые стили, общие примитивы и CSS всех компонентов.

import '@weksik/ui-lib/styles.css';

По компонентам — core.css (токены, reset, базовые стили, общие примитивы полей, списков и скримов) плюс CSS только тех компонентов, которые используются. Каждый компонент доступен отдельным подпутём — JS и CSS:

import '@weksik/ui-lib/core.css';
import '@weksik/ui-lib/button.css';
import '@weksik/ui-lib/dialog.css';

import { Button } from '@weksik/ui-lib/button';
import { Dialog } from '@weksik/ui-lib/dialog';

Имя подпути — kebab-case от имени компонента: IconButton → @weksik/ui-lib/icon-button и @weksik/ui-lib/icon-button.css. CSS компонента сам приносит стили компонентов, которые он рендерит (например, password-input.css — стили Input и IconButton), отдельно их подключать не нужно. Все компоненты также экспортируются из корня: import { Button } from '@weksik/ui-lib'.

Стили лежат в каскадных слоях @layer wk.reset, wk.tokens, wk.base, wk.components. Обычный (неслоёный) CSS приложения побеждает их без !important. Классы библиотеки начинаются с wk-.

Шрифты

import '@weksik/ui-lib/fonts.css';

IBM Plex Sans и IBM Plex Mono (латиница, кириллица, latin-ext) и фолбэк-гарнитуры с подогнанными метриками на время загрузки. Подключение необязательно: без него текст набирается системными шрифтами из стека токенов.

Тема

Светлая, тёмная и системная тема. Атрибут data-theme ставится на <html>, вместе с ним обновляется <meta name="theme-color">.

Чтобы тема применялась до загрузки бандла (без вспышки светлого фона), вставьте результат getThemeScript() инлайн-скриптом в <head> — при серверном рендере или при сборке HTML:

import { getThemeScript } from '@weksik/ui-lib';

<head>
  <script dangerouslySetInnerHTML={{ __html: getThemeScript() }} />
</head>;

В приложении — контроллер темы:

import { theme } from '@weksik/ui-lib';

theme.init(); // применяет сохранённый выбор и следит за системной темой
theme.set('dark'); // 'light' | 'dark' | 'system'
theme.get(); // текущий выбор

theme — контроллер по умолчанию (ключ localStorage — wk.theme). Свой ключ — createThemeController({ storageKey: 'app.theme' }); тот же ключ передайте в getThemeScript({ storageKey: 'app.theme' }). Готовый переключатель — компонент ThemeToggle.

Вложенный элемент с data-theme="dark" или data-theme="light" сам задаёт цвета и фон своей области.

Уведомления

Хранилище тостов создаётся один раз на уровне модуля, Toaster рендерится один раз в корне приложения:

// toaster.ts
import { createToaster } from '@weksik/ui-lib';

export const toaster = createToaster();
// App.tsx
import { Toaster } from '@weksik/ui-lib';
import { toaster } from './toaster';

export function App() {
  return (
    <>
      {/* … */}
      <Toaster toaster={toaster} aria-label="Уведомления" closeLabel="Закрыть" />
    </>
  );
}
toaster.create({ title: 'Сохранено', type: 'success' }); // 'info' | 'success' | 'error'

Поля формы

Field даёт полю подпись, подсказку и текст ошибки и связывает их с полем (id, aria-describedby). Поле внутри — Input, Textarea, NumberInput, PasswordInput, Select, MultiSelect, Combobox, Checkbox, Switch, DateRangeField, DatePicker, DateRangePicker — получает их из контекста:

import { Field, Input } from '@weksik/ui-lib';

<Field label="Название" hint="До 80 символов" error={error} required>
  <Input name="title" />
</Field>;

Непустой error делает поле недопустимым (aria-invalid); disabled, required и readOnly у Field приходят на поле.

Тексты в компонентах (подписи кнопок, сообщения) передаются только пропсами: встроенных строк нет, язык интерфейса выбирает приложение.

Для агентов (LLM)

В пакете лежат контракты для агентов, сгенерированные из исходников этой версии:

  • node_modules/@weksik/ui-lib/llms.txt — список компонентов с подпутями и подключение;
  • node_modules/@weksik/ui-lib/llms-full.txt — пропсы из TS-типов и JSDoc, примеры из stories, токены и правила дизайна.

Для Claude Code есть скилл с этими правилами:

claude plugin marketplace add w3k5/ui-lib
claude plugin install weksik-ui-lib@weksik-ui-lib

Сниппет для CLAUDE.md (или AGENTS.md) проекта:

## UI

- Интерфейс — на `@weksik/ui-lib`. Перед использованием компонента читай его раздел в
  `node_modules/@weksik/ui-lib/llms-full.txt` (пропсы, примеры); не пиши API по памяти.
- Только обычный CSS и токены `--wk-*`; Tailwind и CSS-in-JS не использовать. Классы `wk-*` не
  переопределять: неслоёный CSS приложения и так сильнее слоёв библиотеки.
- Строки интерфейса (подписи, `aria-label`) передаются пропсами; поля формы — внутри `Field`.

Версии

Пакет в версии 0.x: API ещё меняется. До 1.0 несовместимые изменения выходят в minor-версиях (0.2.0 → 0.3.0), patch-версии совместимы. Фиксируйте диапазон ~0.x.y или точную версию и читайте CHANGELOG перед обновлением minor.