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

@indirecttek/essentials-engine

v1.4.0

Published

A **white-label, config-driven Astro component library** for rapidly building beautiful marketing websites for small businesses. Define your content and branding in a single configuration file, and Essentials Engine handles the rest.

Readme

@indirecttek/essentials-engine

A white-label, config-driven Astro component library for rapidly building beautiful marketing websites for small businesses. Define your content and branding in a single configuration file, and Essentials Engine handles the rest.

npm version License: MIT


✨ Features

  • Config-Driven Architecture – One configuration file powers your entire site
  • Zero Client-Side JavaScript – 100% static output for blazing-fast performance
  • CSS Variable Theming – Full control over colors with automatic propagation
  • Responsive by Default – Mobile-first design that looks great on all devices
  • Modern Aesthetics – Polished shadows, hover effects, and smooth transitions
  • Flexible Layouts – Multiple hero styles, sticky navigation, and more

📦 Installation

npm install @indirecttek/essentials-engine

Peer Dependencies

Ensure your project has Astro and Tailwind CSS installed:

npm install astro tailwindcss

Compatibility:

  • Astro 4.x or 5.x
  • Tailwind CSS 3.x or 4.x

🚀 Quick Start

1. Create Your Site Configuration

Create a configuration file (e.g., src/config/siteConfig.ts):

import type { SiteConfig } from '@indirecttek/essentials-engine';

export const siteConfig: SiteConfig = {
  businessName: "Raleigh Pro Landscaping",
  
  theme: {
    primary: "#2d5a27",      // Forest green
    secondary: "#e8f5e3",    // Light sage
    accent: "#f4a460",       // Sandy brown
    background: "#ffffff",
    foreground: "#1a1a1a",
  },
  
  contactInfo: {
    phone: "(919) 555-0123",
    email: "[email protected]",
    address: "123 Oak Street, Raleigh, NC 27601",
  },
  
  heroSection: {
    headline: "Transform Your Outdoor Space",
    subheadline: "Professional landscaping services for homes and businesses in the Triangle area.",
    // Supports both local paths (/images/hero.jpg) and external URLs
    imageUrl: "https://images.unsplash.com/photo-1558904541-efa843a96f01?w=1200&h=800&fit=crop",
    imageAlt: "Beautiful landscaped garden with flowers",
    callToActionLabel: "Get a Free Quote",
  },
  
  services: [
    { name: "Lawn Care", description: "Weekly mowing, edging, and seasonal treatments to keep your lawn lush and healthy." },
    { name: "Garden Design", description: "Custom garden layouts with native plants, flowers, and decorative elements." },
    { name: "Hardscaping", description: "Patios, walkways, retaining walls, and outdoor living spaces." },
  ],
  
  seo: {
    title: "Raleigh Pro Landscaping | Professional Lawn & Garden Services",
    description: "Transform your outdoor space with Raleigh's most trusted landscaping company. Lawn care, garden design, and hardscaping.",
  },
  
  analytics: {
    enableTracking: false,
  },
  
  // Optional features
  socialLinks: {
    facebook: "https://facebook.com/raleighprolandscaping",
    instagram: "https://instagram.com/raleighprolandscaping",
  },
  
  layoutOptions: {
    heroLayout: "image-right",  // "image-left" | "image-right" | "full-width"
    stickyNav: true,
  },
};

2. Use the Layout in Your Page

Create your homepage (src/pages/index.astro):

---
import { EssentialsLayout } from '@indirecttek/essentials-engine';
import { siteConfig } from '../config/siteConfig';
---

<EssentialsLayout config={siteConfig} />

That's it! You now have a complete, professional marketing website.


🧩 Components

Essentials Engine provides both a full-page layout and individual components for flexibility.

Full-Page Layout

---
import { EssentialsLayout } from '@indirecttek/essentials-engine';
---

<EssentialsLayout config={siteConfig} />

Renders a complete page with: NavbarHeroServicesGridContactFormFooter

Individual Components

Use components individually for custom page structures:

---
import { Navbar, Hero, ServicesGrid, ContactForm, Footer } from '@indirecttek/essentials-engine';
import { siteConfig } from '../config/siteConfig';
---

<html lang="en">
  <body>
    <Navbar config={siteConfig} />
    <Hero config={siteConfig} />
    
    <!-- Your custom content here -->
    <section class="py-16">
      <h2>Why Choose Us?</h2>
      <!-- ... -->
    </section>
    
    <ServicesGrid config={siteConfig} />
    <ContactForm config={siteConfig} />
    <Footer config={siteConfig} />
  </body>
</html>

Component Reference

| Component | Description | |-----------|-------------| | EssentialsLayout | Full-page wrapper with HTML head, all sections, and theme injection | | Navbar | Header with business name, click-to-call, and "Contact Us" CTA | | Hero | Above-the-fold section with headline, subheadline, image, and CTA | | ServicesGrid | Responsive grid of service cards with hover effects | | ContactForm | Lead capture form with name, email, phone, and message fields | | Footer | Site footer with contact info, social icons, and copyright |


🎨 Theming

Colors are defined in the theme object and automatically applied throughout the site using CSS variables.

theme: {
  primary: "#2d5a27",      // Brand color, used for headings, nav, buttons
  secondary: "#e8f5e3",    // Section backgrounds (e.g., services grid)
  accent: "#f4a460",       // CTA buttons, highlights
  background: "#ffffff",   // Page background
  foreground: "#1a1a1a",   // Body text
}

Using Theme Colors in Custom Components

The theme colors are available as CSS variables:

.my-custom-element {
  background-color: var(--color-primary);
  color: var(--color-background);
}

Or with Tailwind's arbitrary value syntax:

<div class="bg-[color:var(--color-accent)] text-[color:var(--color-foreground)]">
  Custom styled element
</div>

🖼️ Hero Layouts

The Hero component supports three layout modes:

Image Right (Default)

layoutOptions: {
  heroLayout: "image-right",
}

Text on the left, image on the right – great for text-focused messaging.

Image Left

layoutOptions: {
  heroLayout: "image-left",
}

Image on the left, text on the right – ideal for showcasing visuals.

Full Width

layoutOptions: {
  heroLayout: "full-width",
}

Full-bleed background image with centered text overlay – high-impact hero style.


📱 Responsive Design

All components are mobile-first and responsive:

  • Navbar: Stacks phone number, hides "Contact Us" button on mobile
  • Hero: Single column on mobile, side-by-side on desktop
  • ServicesGrid: 1 column → 2 columns → 3 columns as screen grows
  • ContactForm: Fields stack on mobile
  • Footer: 3-column layout collapses to single column on mobile

📋 Configuration Reference

SiteConfig Interface

interface SiteConfig {
  businessName: string;
  theme: Theme;
  contactInfo: ContactInfo;
  heroSection: HeroSection;
  services: Service[];
  analytics: AnalyticsConfig;
  seo: SEOConfig;
  imageSearchHints?: ImageSearchHints;  // Optional
  socialLinks?: SocialLinks;            // Optional
  layoutOptions?: LayoutOptions;        // Optional
}

Theme

| Property | Type | Description | |----------|------|-------------| | primary | string | Brand color for headings, nav, primary buttons | | secondary | string | Section backgrounds, subtle accents | | accent | string | CTA buttons, highlights | | background | string | Page background color | | foreground | string | Body text color |

ContactInfo

| Property | Type | Description | |----------|------|-------------| | phone | string | Phone number (auto-linked as tel:) | | email | string | Email address (auto-linked as mailto:) | | address | string | Physical address |

HeroSection

| Property | Type | Description | |----------|------|-------------| | headline | string | Main headline text | | subheadline | string | Supporting text below headline | | imageUrl | string | Local path (/images/hero.jpg) or external URL (https://...) | | imageAlt | string | Alt text for hero image | | callToActionLabel | string | Text for CTA button |

Image URL Examples

Local image (stored in your public/images/ folder):

imageUrl: "/images/hero.jpg"

External URL (recommended for quick setup):

imageUrl: "https://images.unsplash.com/photo-1558904541-efa843a96f01?w=1200&h=800&fit=crop"

💡 Tip: Use Unsplash's URL parameters (?w=1200&h=800&fit=crop) to optimize image size and aspect ratio.

Service

| Property | Type | Description | |----------|------|-------------| | name | string | Service name | | description | string | Service description |

SEOConfig

| Property | Type | Description | |----------|------|-------------| | title | string | Page title (appears in browser tab) | | description | string | Meta description for search engines |

AnalyticsConfig

| Property | Type | Description | |----------|------|-------------| | enableTracking | boolean | Enable/disable analytics | | mixpanelToken | string | Optional Mixpanel project token |

SocialLinks (Optional)

| Property | Type | Description | |----------|------|-------------| | facebook | string | Facebook page URL | | instagram | string | Instagram profile URL | | twitter | string | Twitter/X profile URL | | linkedin | string | LinkedIn page URL | | youtube | string | YouTube channel URL | | tiktok | string | TikTok profile URL |

LayoutOptions (Optional)

| Property | Type | Default | Description | |----------|------|---------|-------------| | heroLayout | "image-left" | "image-right" | "full-width" | "image-right" | Hero section layout style | | stickyNav | boolean | false | Make navbar stick to top on scroll |


📁 Project Structure

@indirecttek/essentials-engine/
├── dist/                    # Built package (published to npm)
│   ├── components/
│   │   ├── ContactForm.astro
│   │   ├── Footer.astro
│   │   ├── Hero.astro
│   │   ├── Navbar.astro
│   │   └── ServicesGrid.astro
│   ├── layouts/
│   │   └── EssentialsLayout.astro
│   ├── index.ts             # Main exports
│   └── types.ts             # TypeScript interfaces
├── src/                     # Source files
├── package.json
└── README.md

🔧 Development

Clone and install:

git clone https://github.com/indirecttek/essentials-engine.git
cd essentials-engine
npm install

Build the package:

npm run build

📄 License

MIT © IndirectTek


🤝 Contributing

Contributions are welcome! Please open an issue or submit a pull request.


💬 Support