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

react-speakeazii

v1.0.10

Published

Speakeasy is a TypeScript package that provides everything you need for an interactive portfolio. Easily add blogs, reviews, messages, and more directly to your pages. The package offers ready-to-use React components and utility functions for seamless dis

Readme

SpeakEasy

SpeakEasy is a lightweight React package that helps you integrate visitor tracking, contact forms, and portfolio-enhancing features like blogs, reviews, and messaging into your projects.

Installation

npm i react-speakeazii

or

yarn add react-speakeazii

Usage

1. Visitor Tracker

The VisitorTracker component should be placed in your main entry file (e.g., App.js) to automatically track and record visits.

import React from "react";
import { VisitorTracker, ContactForm, Blogs, Products, Services, Testimonials,  } from "react-speakeazii";

function App() {
  return (
    <>
      <VisitorTracker apikey="YOUR_API_KEY" />

      <Blogs apikey="YOUR_API_KEY" />

      <Products apikey="YOUR_API_KEY" />

      <Services apikey="YOUR_API_KEY" />
      
      <Testimonials apikey="YOUR_API_KEY" />

      <ContactForm apikey="YOUR_API_KEY" />
      
      {/* Your other app components */}
    </>
  );
}

export default App;

3. Utility Functions

You can call utility functions directly by passing your API key:

Get Blogs

import { getBlogs } from "react-speakeazii";

async function fetchBlogs() {
  const blogs = await getBlogs("YOUR_API_KEY");
  console.log(blogs);
}

Get Reviews

import { getReviews } from "react-speakeazii";

async function fetchReviews() {
  const reviews = await getReviews("YOUR_API_KEY");
  console.log(reviews);
}

Get Products

import { getProducts } from "react-speakeazii";

async function fetchReviews() {
  const products = await getReviews("YOUR_API_KEY");
  console.log(products);
}

Get Services

import { getServices } from "react-speakeazii";

async function fetchReviews() {
  const services = await getReviews("YOUR_API_KEY");
  console.log(services);
}

Send Message

import { sendMessage } from "react-speakeazii";

async function contact() {
  const response = await sendMessage("YOUR_API_KEY", {
    name: "John Doe",
    email: "[email protected]",
    message: "Hello! I love this package 🚀",
  });
  console.log(response);
}

Props

VisitorTracker

| Prop | Type | Required | Description | | ------ | ------ | -------- | ------------------------------- | | apikey | string | ✅ | Your API key for authentication |

ContactForm

| Prop | Type | Required | Description | | -------------------- | ----------------------------------------------- | -------- | --------------------------------- | | apiKey | string | ✅ | Your API key for authentication | | showName | boolean | ❌ | Toggle name field visibility | | showPhone | boolean | ❌ | Toggle phone field visibility | | showSubject | boolean | ❌ | Toggle subject field visibility | | nameLabel | string | ❌ | Label for name field | | emailLabel | string | ❌ | Label for email field | | phoneLabel | string | ❌ | Label for phone field | | subjectLabel | string | ❌ | Label for subject field | | messageLabel | string | ❌ | Label for message field | | namePlaceholder | string | ❌ | Placeholder for name input | | emailPlaceholder | string | ❌ | Placeholder for email input | | phonePlaceholder | string | ❌ | Placeholder for phone input | | subjectPlaceholder | string | ❌ | Placeholder for subject input | | messagePlaceholder | string | ❌ | Placeholder for message textarea | | sectionTitle | string | ❌ | Form title text | | sectionSubtitle | string | ❌ | Form subtitle text | | sectionDescription | string | ❌ | Form description text | | submitButtonText | string | ❌ | Submit button text | | loadingText | string | ❌ | Text shown while submitting | | successMessage | string | ❌ | Message displayed on success | | errorMessage | string | ❌ | Message displayed on error | | onSubmit | (formData: FormData) => void \| Promise<void> | ❌ | Custom submit handler | | onSuccess | (response?: any) => void | ❌ | Callback on successful submission | | onError | (error: any) => void | ❌ | Callback on submission error | | className | string | ❌ | Root wrapper CSS class | | containerClassName | string | ❌ | Container wrapper CSS class | | formClassName | string | ❌ | Form element CSS class | | inputClassName | string | ❌ | Input fields CSS class | | textareaClassName | string | ❌ | Textarea CSS class | | buttonClassName | string | ❌ | Submit button CSS class | | labelClassName | string | ❌ | Label CSS class | | customValidation | (formData: FormData) => string \| null | ❌ | Custom validation function | | showSuccessMessage | boolean | ❌ | Toggle success message display | | showErrorMessage | boolean | ❌ | Toggle error message display |

Blogs

| Prop | Type | Required | Description | | ----------------------- | -------------------------------------------------------- | -------- | --------------------------------------- | | apiKey | string | ✅ | Your API key for authentication | | showHeader | boolean | ❌ | Toggle the header section visibility | | headerTitle | string | ❌ | Header title text | | headerSubtitle | string | ❌ | Header subtitle text | | headerBadgeText | string | ❌ | Text displayed inside the header badge | | showHeaderBadge | boolean | ❌ | Toggle header badge visibility | | columns | { mobile?: number; tablet?: number; desktop?: number } | ❌ | Number of grid columns per breakpoint | | showImage | boolean | ❌ | Toggle project card image | | imageHeight | string | ❌ | Height of the card image (e.g. 200px) | | showDate | boolean | ❌ | Toggle project date display | | showKeywords | boolean | ❌ | Toggle keywords display | | maxKeywordsDisplay | number | ❌ | Maximum number of keywords shown | | maxDescriptionLines | number | ❌ | Max description lines before truncation | | contentCharacterLimit | number | ❌ | Character limit for card content | | modalTitle | string | ❌ | Title shown in the project modal | | showModalImage | boolean | ❌ | Toggle modal image display | | modalSections | Array<keyof ResearchProject> | ❌ | Sections to display in modal | | containerClassName | string | ❌ | Wrapper container CSS class | | headerClassName | string | ❌ | Header wrapper CSS class | | gridClassName | string | ❌ | Grid layout CSS class | | cardClassName | string | ❌ | Individual card CSS class | | modalClassName | string | ❌ | Modal wrapper CSS class | | badgeClassName | string | ❌ | Header badge CSS class | | onProjectClick | (project: ResearchProject) => void | ❌ | Fired when a project card is clicked | | onError | (error: Error) => void | ❌ | Error callback | | onSuccess | (blog: ResearchProject[]) => void | ❌ | Fired when projects load successfully | | customCardRenderer | (project: ResearchProject) => React.ReactNode | ❌ | Custom project card renderer | | customModalRenderer | (project: ResearchProject) => React.ReactNode | ❌ | Custom modal renderer |

Products

| Prop | Type | Required | Description | | --------------------- | -------------------------------------------------------- | -------- | ---------------------------------- | | apiKey | string | ✅ | Your API key for authentication | | showHeader | boolean | ❌ | Show or hide the header section | | headerTitle | string | ❌ | Header title text | | headerSubtitle | string | ❌ | Header subtitle text | | headerBadgeText | string | ❌ | Text displayed in the header badge | | showHeaderBadge | boolean | ❌ | Toggle header badge visibility | | columns | { mobile?: number; tablet?: number; desktop?: number } | ❌ | Grid column count per breakpoint | | showImage | boolean | ❌ | Toggle image display on cards | | imageHeight | string | ❌ | Height of the card image | | showDate | boolean | ❌ | Toggle project date display | | maxDescriptionLines | number | ❌ | Maximum description lines shown | | showKeywords | boolean | ❌ | Toggle keyword display | | maxKeywordsDisplay | number | ❌ | Maximum keywords displayed | | containerClassName | string | ❌ | Container wrapper CSS class | | headerClassName | string | ❌ | Header container CSS class | | gridClassName | string | ❌ | Grid layout CSS class | | cardClassName | string | ❌ | Individual card CSS class | | badgeClassName | string | ❌ | Header badge CSS class | | onError | (error: Error) => void | ❌ | Callback fired on error | | onSuccess | (blog: ResearchProject[]) => void | ❌ | Callback fired on successful fetch | | customCardRenderer | (project: ResearchProject) => React.ReactNode | ❌ | Custom card renderer | | customModalRenderer | (project: ResearchProject) => React.ReactNode | ❌ | Custom modal renderer |

Services

| Prop | Type | Required | Description | | --------------------- | -------------------------------------------------------- | -------- | ---------------------------------- | | apiKey | string | ✅ | Your API key for authentication | | showHeader | boolean | ❌ | Show or hide the header section | | headerTitle | string | ❌ | Header title text | | headerSubtitle | string | ❌ | Header subtitle text | | headerBadgeText | string | ❌ | Text displayed in the header badge | | showHeaderBadge | boolean | ❌ | Toggle header badge visibility | | columns | { mobile?: number; tablet?: number; desktop?: number } | ❌ | Grid column count per breakpoint | | showImage | boolean | ❌ | Toggle image display on cards | | imageHeight | string | ❌ | Height of the card image | | showDate | boolean | ❌ | Toggle project date display | | maxDescriptionLines | number | ❌ | Maximum description lines shown | | containerClassName | string | ❌ | Container wrapper CSS class | | headerClassName | string | ❌ | Header container CSS class | | gridClassName | string | ❌ | Grid layout CSS class | | cardClassName | string | ❌ | Individual card CSS class | | badgeClassName | string | ❌ | Header badge CSS class | | onError | (error: Error) => void | ❌ | Callback fired on error | | onSuccess | (blog: ResearchProject[]) => void | ❌ | Callback fired on successful fetch | | customCardRenderer | (project: ResearchProject) => React.ReactNode | ❌ | Custom card renderer | | customModalRenderer | (project: ResearchProject) => React.ReactNode | ❌ | Custom modal renderer |

Testimonials

| Prop | Type | Required | Description | | -------------------- | --------------------------------------- | -------- | ------------------------------------ | | apiKey | string | ✅ | Your API key for authentication | | rows | number | ❌ | Number of testimonial rows displayed | | marqueeSpeed | number | ❌ | Scrolling speed of the marquee | | pauseOnHover | boolean | ❌ | Pause animation when hovered | | gradientOverlay | boolean | ❌ | Enable gradient overlay effect | | cardClassName | string | ❌ | CSS class for testimonial cards | | containerClassName | string | ❌ | CSS class for the container | | cardWidth | string | ❌ | Width of each testimonial card | | gap | string | ❌ | Gap between testimonial cards | | showRating | boolean | ❌ | Show star rating | | maxContentLines | number | ❌ | Maximum lines of testimonial content | | avatarSize | string | ❌ | Size of the avatar image | | direction | "left" \| "right" \| "alternate" | ❌ | Scroll direction of testimonials | | containerStyle | CSSProperties | ❌ | Inline styles for the container | | cardStyle | CSSProperties | ❌ | Inline styles for cards | | starColor | string | ❌ | Color of rating stars | | showStarFill | boolean | ❌ | Fill stars instead of outline | | loadingComponent | React.ReactNode | ❌ | Custom loading state component | | errorComponent | React.ReactNode | ❌ | Custom error state component | | onError | (error: Error) => void | ❌ | Callback fired on error | | onSuccess | (testimonials: Testimonial[]) => void | ❌ | Callback fired on successful fetch |


License

DOM © 2025 SpeakEazii