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

@thomasdavis/spectre-ui

v0.2.0

Published

React component for automatic image and video region detection with technical overlay visualization

Downloads

11

Readme

@thomasdavis/spectre-ui

A React component for automatic image region detection with technical overlay visualization. Analyzes images using edge detection algorithms and overlays them with customizable bounding boxes, keypoints, connection graphs, and HUD-style interfaces.

npm version license bundle size

Features

  • Automatic Region Detection: Edge-based detection using luminance gradients
  • Keypoint Generation: Automatically generates tracking points within detected regions
  • Connection Graphs: Visual links showing spatial relationships between regions
  • Real-time Canvas Rendering: Efficient HTML5 Canvas with customizable overlays
  • Multiple Image Formats: Supports URL, File, HTMLImageElement, and Base64 data URIs
  • Framework-Agnostic: Zero CSS dependencies, works with any React framework
  • TypeScript First: Full type definitions included
  • Advanced Callbacks: Expose region detection and rendering events
  • Highly Customizable: Control every aspect of the visualization

Installation

npm install @thomasdavis/spectre-ui
# or
pnpm add @thomasdavis/spectre-ui
# or
yarn add @thomasdavis/spectre-ui

Quick Start

import { Spectre } from '@thomasdavis/spectre-ui';

function App() {
  return <Spectre image="/path/to/image.jpg" />;
}

Usage

Basic Usage

import { Spectre } from '@thomasdavis/spectre-ui';

function ImageAnalyzer() {
  return (
    <div style={{ width: '800px', height: '600px' }}>
      <Spectre
        image="/path/to/image.jpg"
        color="#00ffff"
        opacity={0.8}
      />
    </div>
  );
}

Multiple Image Input Formats

import { Spectre } from '@thomasdavis/spectre-ui';
import { useState } from 'react';

function ImageUploadExample() {
  const [image, setImage] = useState(null);

  const handleFileUpload = (event) => {
    const file = event.target.files[0];
    setImage(file); // Pass File object directly
  };

  return (
    <>
      <input type="file" onChange={handleFileUpload} accept="image/*" />
      <Spectre image={image} />
    </>
  );
}

// Or with URL
<Spectre image="https://example.com/image.jpg" />

// Or with HTMLImageElement
const img = new Image();
img.src = '/image.jpg';
<Spectre image={img} />

// Or with Base64 data URI
<Spectre image="data:image/png;base64,iVBORw0KG..." />

With Event Callbacks

import { Spectre } from '@thomasdavis/spectre-ui';
import type { ProcessingStats, DetectedRegion } from '@thomasdavis/spectre-ui';

function InteractiveExample() {
  const handleRegionDetect = (regions: DetectedRegion[]) => {
    console.log(`Detected ${regions.length} regions:`, regions);
  };

  const handleProcessingComplete = (stats: ProcessingStats) => {
    console.log(`Processing completed in ${stats.processingTime}ms`);
    console.log(`Found ${stats.regionCount} regions with ${stats.pointCount} keypoints`);
  };

  const handleError = (error: Error) => {
    console.error('Failed to process image:', error);
  };

  return (
    <Spectre
      image="/image.jpg"
      onRegionDetect={handleRegionDetect}
      onProcessingComplete={handleProcessingComplete}
      onError={handleError}
    />
  );
}

Custom Styling & Configuration

import { Spectre } from '@thomasdavis/spectre-ui';

function CustomizedExample() {
  return (
    <Spectre
      image="/image.jpg"
      // Visual configuration
      enabled={true}
      opacity={0.7}
      color="#ff00ff"
      strokeWidth={2}

      // Feature toggles
      showBoxes={true}
      showConnections={true}
      showKeypoints={true}
      showHud={false}

      // Advanced controls
      connectionDensity={400}
      maxRegions={8}
      edgeThreshold={20}

      // Canvas styling
      style={{
        border: '2px solid cyan',
        borderRadius: '8px'
      }}
      className="my-custom-class"
    />
  );
}

Canvas Access via Ref

import { Spectre } from '@thomasdavis/spectre-ui';
import { useRef } from 'react';

function ExportExample() {
  const canvasRef = useRef<HTMLCanvasElement>(null);

  const exportImage = () => {
    if (canvasRef.current) {
      const dataUrl = canvasRef.current.toDataURL('image/png');
      const link = document.createElement('a');
      link.download = 'analysis.png';
      link.href = dataUrl;
      link.click();
    }
  };

  return (
    <>
      <Spectre
        image="/image.jpg"
        canvasRef={canvasRef}
      />
      <button onClick={exportImage}>Export Image</button>
    </>
  );
}

API Reference

SpectreProps

| Prop | Type | Default | Description | |------|------|---------|-------------| | image | string \| HTMLImageElement \| File \| null | Required | Image input (URL, File, HTMLImageElement, or Base64) | | enabled | boolean | true | Enable/disable overlay rendering | | opacity | number | 0.65 | Overlay opacity (0-1) | | color | string | "#ffffff" | Overlay color (hex format) | | strokeWidth | number | 1.5 | Line thickness (0.5-5) | | showBoxes | boolean | true | Show bounding boxes around regions | | showConnections | boolean | true | Show connection lines between regions | | showKeypoints | boolean | true | Show keypoint markers | | showHud | boolean | true | Show HUD overlay elements | | connectionDensity | number | 300 | Connection density (100-600) | | maxRegions | number | 6 | Maximum number of regions to detect (1-10) | | edgeThreshold | number | 15 | Edge detection threshold (0-100) | | regionDetectionScale | number | Auto | Image scale for detection (0-1) | | width | number \| "auto" | "auto" | Canvas width | | height | number \| "auto" | "auto" | Canvas height | | className | string | undefined | CSS class for canvas element | | style | CSSProperties | undefined | Inline styles for canvas | | onLoad | (stats: ProcessingStats) => void | undefined | Callback when image loads | | onError | (error: Error) => void | undefined | Callback on error | | onRegionDetect | (regions: DetectedRegion[]) => void | undefined | Callback when regions detected | | onRender | (canvas: HTMLCanvasElement) => void | undefined | Callback after rendering | | onProcessingStart | () => void | undefined | Callback when processing starts | | onProcessingComplete | (stats: ProcessingStats) => void | undefined | Callback when processing completes | | canvasRef | RefObject<HTMLCanvasElement> | undefined | External canvas ref |

ProcessingStats

interface ProcessingStats {
  pointCount: number;        // Total keypoints detected
  regionCount: number;        // Number of regions detected
  connectionCount: number;    // Number of connections generated
  processingTime: number;     // Processing time in milliseconds
  imageWidth: number;         // Image width in pixels
  imageHeight: number;        // Image height in pixels
  triangleCount: number;      // Reserved for future use
}

DetectedRegion

interface DetectedRegion {
  id: string;                 // Region identifier (e.g., "R00")
  x: number;                  // X coordinate
  y: number;                  // Y coordinate
  width: number;              // Region width
  height: number;             // Region height
  keypoints: Point[];         // Array of keypoints
  label: string;              // Region label (e.g., "OBJ_A")
  confidence: number;         // Detection confidence (0-1)
}

Point

interface Point {
  x: number;
  y: number;
}

Connection

interface Connection {
  from: Point;                // Start point
  to: Point;                  // End point
  fromRegion: string;         // Source region ID
  toRegion: string;           // Target region ID
}

Advanced Usage

Custom Region Detection

For advanced use cases, you can use the low-level APIs:

import {
  loadImage,
  detectRegions,
  generateConnections
} from '@thomasdavis/spectre-ui';

async function customAnalysis() {
  // Load image
  const img = await loadImage('/image.jpg');

  // Detect regions with custom options
  const regions = detectRegions(img, {
    scale: 0.5,
    maxRegions: 10,
    edgeThreshold: 20,
  });

  // Generate connections
  const connections = generateConnections(regions, 400);

  console.log('Analysis complete:', { regions, connections });
}

How It Works

Region Detection Algorithm

  1. Image Preprocessing: Images are scaled for optimal processing speed
  2. Luminance Calculation: Converts RGB to luminance (0.299R + 0.587G + 0.114B)
  3. Edge Detection: Calculates horizontal and vertical gradients
  4. Grid Analysis: Divides image into cells and calculates edge density
  5. Region Selection: Identifies top non-overlapping regions with highest edge density
  6. Keypoint Generation: Creates tracking points within each region
  7. Connection Graph: Links keypoints between regions based on density

Rendering Pipeline

  1. Draw original image to canvas
  2. Scale detected regions to full resolution
  3. Render connections (background layer)
  4. Render bounding boxes with technical styling
  5. Render keypoints with crosshairs
  6. Render HUD overlay elements
  7. Calculate and report processing statistics

Browser Support

Requires modern browsers with support for:

  • HTML5 Canvas API
  • ES2020 JavaScript features
  • CSS Grid and Flexbox (for demo)
  • File API (for File input support)

Performance Considerations

  • Images are downscaled for region detection (max 1500px dimension)
  • Processing is synchronous but typically completes in <100ms
  • Canvas rendering uses efficient 2D context operations
  • Grid size adapts to image dimensions for optimal performance

TypeScript Support

This package includes full TypeScript type definitions. All props and return types are fully typed.

import type {
  SpectreProps,
  ProcessingStats,
  DetectedRegion,
  Point,
  Connection,
  ImageInput,
} from '@thomasdavis/spectre-ui';

License

MIT

Contributing

Contributions are welcome! Please check the repository for contribution guidelines.

Repository

https://github.com/thomasdavis/spectre-ui

Support

For issues and questions, please use the GitHub issue tracker.