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

@orama/ui

v1.5.4

Published

Orama UI is a composable, unstyled React component library designed to provide flexible building blocks for search and chat interfaces powered by [Orama](https://orama.com/). All components are unopinionated about styling, allowing you to fully control th

Readme

Orama UI

Orama UI is a composable, unstyled React component library designed to provide flexible building blocks for search and chat interfaces powered by Orama. All components are unopinionated about styling, allowing you to fully control the look and feel of your application.


Getting Started

Prerequisites: Orama UI is designed to work with Orama Cloud projects. You'll need an active account and project set up on the Orama Cloud platform before using these components.

  1. Create your Orama Cloud project:

    • Sign up or log in to app.orama.com
    • Create a new project and upload your data
    • Get your project configuration (project ID and API key)
  2. Install the required packages:

    npm install @orama/ui @orama/core
    # or
    pnpm install @orama/ui @orama/core
    # or
    yarn add @orama/ui @orama/core
  3. Set up your Orama client:

    Import the Orama JavaScript client and create your instance using your Cloud project configuration:

    import { OramaCloud } from "@orama/core";
    
    const orama = new OramaCloud({
      projectId: "your-project-id",
      apiKey: "your-api-key",
    });
  4. Import and use the components and the styles:

    import {
      SearchRoot,
      SearchInput,
      SearchResults,
    } from "@orama/ui/components";
    
    import "@orama/ui/styles.css";

    Wrap your application with the SearchRoot provider and compose your search interface:

    <SearchRoot client={orama}>
      <div className="search-container">
        <SearchInput.Input placeholder="Search for anything..." />
        <SearchResults.Wrapper>
          <SearchResults.List>
            {(result) => (
              <SearchResults.Item>
                <h3>{result.title}</h3>
                <p>{result.description}</p>
              </SearchResults.Item>
            )}
          </SearchResults.List>
        </SearchResults.Wrapper>
      </div>
    </SearchRoot>
  5. Style as you wish:
    All components are unstyled by default. Use your own CSS, Tailwind, styled-components, or any styling solution.


Philosophy

Orama UI follows these core principles:

  • 🧩 Composable: Components are designed to be combined and nested as building blocks. Mix and match to create your perfect interface.
  • 🎨 Unstyled: Zero default styles mean you have complete control over the visual design. No CSS conflicts or overrides needed.
  • ⚡ Flexible: Use only what you need. Each component works independently or as part of a larger system.
  • ♿ Accessible: Built with accessibility in mind, following ARIA best practices and keyboard navigation standards.
  • 🔧 Developer-friendly: TypeScript support, comprehensive documentation, and intuitive APIs.

Components

Core Components

  • SearchRoot - Root provider for search functionality and state management
  • ChatRoot - Root provider for chat/conversation interfaces
  • SearchResults - Displays search results with customizable rendering
  • ChatInteractions - Renders chat messages and user actions
  • Suggestions - Displays prompt suggestions
  • RecentSearches - Component for managing and displaying recent search history

Input Components

Navigation & Filtering

  • FacetTabs - Tab-based filtering for search facets
  • Tabs - Generic tab navigation component

Layout Components

  • Modal - Accessible modal dialog with focus management
  • SlidingPanel - Slide-in panel for sidebars and overlays

Hooks

Primary Hooks

  • useSearch - Access search state, query, results, and search functions
  • useChat - Manage chat conversations, messages, and AI interactions
  • useRecentSearches - Manage recent search history and state

Utility Hooks


Context

  • SearchContext - Provides search state and functionality to child components
  • ChatContext - Manages chat state, conversation history, and AI responses

TypeScript Support

All components and hooks are fully typed with TypeScript. Import types for better development experience.


Extending Components

// Create your own component using Orama UI hooks
function CustomSearchBox() {
  const [query, setQuery] = useState();
  const { search } = useSearch();

  const handleSearch = (event) => {
    search({
      term: query,
      limit: 10,
    });

    // other code here...
  };

  return (
    <div className="custom-search">
      <input
        type="text"
        value={query}
        onChange={(e) => setQuery(e.target.value)}
        onKeyDown={(e) => e.key === "Enter" && handleSearch()}
      />
      <button onClick={handleSearch}>Search</button>
    </div>
  );
}