or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

compound-components.mdindex.mdmain-component.mdstore-management.mdutilities.md
tile.json

tessl/npm-mantine--spotlight

Command center components for react and Mantine

Workspace
tessl
Visibility
Public
Created
Last updated
Describes
npmpkg:npm/@mantine/spotlight@8.2.x

To install, run

npx @tessl/cli install tessl/npm-mantine--spotlight@8.2.0

index.mddocs/

Mantine Spotlight

Mantine Spotlight provides command center components for React applications built with the Mantine design system. It enables developers to create keyboard-accessible search overlays that can be triggered with shortcuts (like Ctrl+K), allowing users to quickly find and execute actions within an application.

Package Information

  • Package Name: @mantine/spotlight
  • Package Type: npm
  • Language: TypeScript
  • Installation: npm install @mantine/spotlight @mantine/core @mantine/hooks

Core Imports

import { Spotlight, spotlight } from "@mantine/spotlight";

For individual components:

import { 
  SpotlightRoot, 
  SpotlightSearch, 
  SpotlightActionsList,
  SpotlightAction,
  createSpotlight
} from "@mantine/spotlight";

CSS imports (required):

/* Standard styles */
@import "@mantine/spotlight/styles.css";

/* Layer styles (alternative) */
@import "@mantine/spotlight/styles.layer.css";

Basic Usage

import { Spotlight } from "@mantine/spotlight";

function App() {
  const actions = [
    {
      id: "home",
      label: "Home",
      description: "Get to home page",
      onClick: () => navigate("/"),
    },
    {
      id: "dashboard", 
      label: "Dashboard",
      description: "Get full information about current system status",
      onClick: () => navigate("/dashboard"),
    },
  ];

  return (
    <div>
      <Spotlight
        actions={actions}
        nothingFound="Nothing found..."
        highlightQuery
        searchProps={{
          placeholder: "Search...",
          leftSection: <IconSearch size={16} />,
        }}
      />
    </div>
  );
}

Architecture

Mantine Spotlight is built around several key components:

  • Main Component: Spotlight provides a complete command center with search and actions
  • Compound Components: Granular components for custom implementations (SpotlightRoot, SpotlightSearch, etc.)
  • Store Management: Global and instance-based stores for state management
  • Action System: Support for individual actions and grouped actions with filtering
  • Keyboard Navigation: Built-in arrow key navigation and configurable shortcuts

Capabilities

Main Spotlight Component

Complete spotlight interface with built-in search, action filtering, and keyboard navigation. Perfect for quick implementation of command centers.

function Spotlight(props: SpotlightProps): JSX.Element;

interface SpotlightProps extends SpotlightRootProps {
  /** Props passed down to the Spotlight.Search */
  searchProps?: SpotlightSearchProps;
  /** Actions data, passed down to Spotlight.Action component */
  actions: SpotlightActions[];
  /** Function to filter actions data based on search query */
  filter?: SpotlightFilterFunction;
  /** Message displayed when none of the actions match given filter */
  nothingFound?: React.ReactNode;
  /** Determines whether search query should be highlighted in action label */
  highlightQuery?: boolean;
  /** Maximum number of actions displayed at a time */
  limit?: number;
}

type SpotlightActions = SpotlightActionData | SpotlightActionGroupData;

interface SpotlightActionData extends SpotlightActionProps {
  id: string;
  group?: string;
}

interface SpotlightActionGroupData {
  group: string;
  actions: SpotlightActionData[];
}

Main Component

Compound Components

Individual components for building custom spotlight interfaces with full control over layout and behavior.

function SpotlightRoot(props: SpotlightRootProps): JSX.Element;
function SpotlightSearch(props: SpotlightSearchProps): JSX.Element;
function SpotlightActionsList(props: SpotlightActionsListProps): JSX.Element;
function SpotlightAction(props: SpotlightActionProps): JSX.Element;

Compound Components

Store Management

Store-based state management for controlling spotlight behavior programmatically, supporting both global and instance-based stores.

function createSpotlight(): readonly [SpotlightStore, SpotlightActions];
function createSpotlightStore(): SpotlightStore;
function useSpotlight(store: SpotlightStore): SpotlightState;

// Global instance
const spotlight: SpotlightActions;
function openSpotlight(): void;
function closeSpotlight(): void;
function toggleSpotlight(): void;

interface SpotlightState {
  opened: boolean;
  selected: number;
  listId: string;
  query: string;
  empty: boolean;
  registeredActions: Set<string>;
}

interface SpotlightActions {
  open(): void;
  close(): void;
  toggle(): void;
}

Store Management

Utility Functions

Helper functions for action filtering, grouping, and type checking.

function isActionsGroup(
  item: SpotlightActionData | SpotlightActionGroupData
): item is SpotlightActionGroupData;

type SpotlightFilterFunction = (
  query: string,
  actions: SpotlightActions[]
) => SpotlightActions[];

const defaultSpotlightFilter: SpotlightFilterFunction;

Utilities

Types

type SpotlightStore = MantineStore<SpotlightState>;

type SpotlightRootStylesNames =
  | ModalStylesNames
  | 'search'
  | 'actionsList'
  | 'action'
  | 'empty'
  | 'footer'
  | 'actionBody'
  | 'actionLabel'
  | 'actionDescription'
  | 'actionSection'
  | 'actionsGroup';

type SpotlightFactory = Factory<{
  props: SpotlightProps;
  ref: HTMLDivElement;
  stylesNames: SpotlightStylesNames;
  staticComponents: {
    Search: typeof SpotlightSearch;
    ActionsList: typeof SpotlightActionsList;
    Action: typeof SpotlightAction;
    Empty: typeof SpotlightEmpty;
    Footer: typeof SpotlightFooter;
    ActionsGroup: typeof SpotlightActionsGroup;
    Root: typeof SpotlightRoot;
    open: typeof spotlight.open;
    close: typeof spotlight.close;
    toggle: typeof spotlight.toggle;
  };
}>;

type SpotlightRootFactory = Factory<{
  props: SpotlightRootProps;
  ref: HTMLDivElement;
  stylesNames: SpotlightRootStylesNames;
  compound: true;
}>;

interface SpotlightActionProps extends BoxProps {
  /** Action label, pass string to use in default filter */
  label?: string;
  /** Action description, pass string to use in default filter */
  description?: string;
  /** Section displayed on the left side of the label, for example, icon */
  leftSection?: React.ReactNode;
  /** Section displayed on the right side of the label, for example, hotkey */
  rightSection?: React.ReactNode;
  /** Children override default action elements */
  children?: React.ReactNode;
  /** Determines whether left and right sections should have dimmed styles */
  dimmedSections?: boolean;
  /** Determines whether search query should be highlighted in action label */
  highlightQuery?: boolean;
  /** Key of theme.colors for highlighting search query */
  highlightColor?: MantineColor;
  /** Determines whether the spotlight should be closed when action is triggered */
  closeSpotlightOnTrigger?: boolean;
  /** Keywords that are used for default filtering */
  keywords?: string | string[];
}

interface SpotlightRootProps extends StylesApiProps<SpotlightRootFactory>, Omit<ModalProps, 'opened' | 'onClose' | 'withCloseButton'> {
  /** Spotlight store, can be used to create multiple instances */
  store?: SpotlightStore;
  /** Controlled Spotlight search query */
  query?: string;
  /** Called when query changes */
  onQueryChange?: (query: string) => void;
  /** Determines whether the search query should be cleared when the spotlight is closed */
  clearQueryOnClose?: boolean;
  /** Keyboard shortcut or list of shortcuts to trigger spotlight */
  shortcut?: string | string[] | null;
  /** List of tags which when focused will be ignored by shortcut */
  tagsToIgnore?: string[];
  /** Determines whether shortcut should trigger based in contentEditable */
  triggerOnContentEditable?: boolean;
  /** If set, spotlight will not be rendered */
  disabled?: boolean;
  /** Called when spotlight opens */
  onSpotlightOpen?: () => void;
  /** Called when spotlight closes */
  onSpotlightClose?: () => void;
  /** Forces opened state, useful for tests */
  forceOpened?: boolean;
  /** Determines whether spotlight should be closed when one of the actions is triggered */
  closeOnActionTrigger?: boolean;
  /** Spotlight content max-height. Ignored unless scrollable prop is set */
  maxHeight?: React.CSSProperties['maxHeight'];
  /** Determines whether the actions list should be scrollable */
  scrollable?: boolean;
}