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

@uzmaps/ui

v0.1.1

Published

UzMap React components — map view, search box, route panel and place card.

Readme

@uzmaps/ui

React components for UzMap — a map view, search box, route panel, place card and map controls, built on @uzmaps/engine.

npm install @uzmaps/ui @uzmaps/engine @uzmaps/api maplibre-gl react react-dom

The shape of this library

MapView owns the map instance. Everything else is presentational and controlled — the components render state and raise callbacks; they do not fetch. You keep the query, the results and the selection in your own state and pass them down.

That is deliberate. Search-as-you-type, debouncing, cancellation, caching and result ranking all belong to your application, and a component that quietly owned an API client would take those decisions away from you and be almost impossible to compose. Use @uzmaps/api for the calls.

Usage

import { useState } from 'react';
import { MapView, SearchBox, ResultList, MapControls, useUzMap } from '@uzmaps/ui';
import { UzMapClient } from '@uzmaps/api';
import '@uzmaps/ui/styles.css';

const api = new UzMapClient({ baseUrl: 'https://uzmaps.ndc.uz', apiKey: KEY, language: 'uz' });

function Search() {
  const map = useUzMap();                    // the UzMap instance, or null before mount
  const [q, setQ] = useState('');
  const [results, setResults] = useState([]);
  const [loading, setLoading] = useState(false);

  async function run() {
    setLoading(true);
    try {
      setResults((await api.search(q)).results);
    } finally {
      setLoading(false);
    }
  }

  return (
    <>
      <SearchBox value={q} onChange={setQ} onSubmit={run} loading={loading} language="uz" />
      <ResultList
        results={results}
        language="uz"
        onSelect={(r) => map?.selectPlace(r, { fly: true })}
      />
    </>
  );
}

function Controls({ theme, onTheme, language, onLanguage }) {
  const map = useUzMap();
  return (
    <MapControls
      theme={theme} onTheme={onTheme}
      language={language} onLanguage={onLanguage}
      onLocate={() => map?.userLocation.start()}
    />
  );
}

export default function App() {
  const [theme, setTheme] = useState('auto');
  const [language, setLanguage] = useState('uz');

  return (
    <MapView serverUrl="https://uzmaps.ndc.uz" apiKey={KEY} language={language} theme={theme} zoom={12}>
      <Search />
      <Controls theme={theme} onTheme={setTheme} language={language} onLanguage={setLanguage} />
    </MapView>
  );
}

Every sample here is compiled in CI (see examples/ in the repository), so it reflects the real API rather than a plausible-looking approximation of it.

MapView accepts every UzMap option except container, and provides the instance to descendants through context — useUzMap() reaches it without prop drilling.

Components

| | | |---|---| | MapView | Hosts the map. Provides it via context. | | useUzMap() | The UzMap instance, or null before mount. | | SearchBox | Controlled text input with the search affordances. | | ResultList | Renders results; onSelect per row. | | CategoryChips | Category filter row. | | PlaceCard | Place details, hours, photo. | | RoutePanel | Route summary, mode switch and options. | | MapControls | Zoom, compass, geolocate, 3D and terrain toggles. | | BottomSheet | Draggable sheet for mobile layouts. | | ScaleBar, PoiIcon, t / makeT | Scale bar, category icons, translation helpers. |

Styling

import '@uzmaps/ui/styles.css';

A separate export rather than injected at import time, so you can order it against your own CSS and your bundler can extract it.

Peers

React 18 or 19. TypeScript users should also install @types/react.

Licence

MIT. Map data © OpenStreetMap contributors (ODbL).