
Company News
Socket Named Top Sales Organization by RepVue
Socket won two 2026 Reppy Awards from RepVue, ranking in the top 5% of all sales orgs. AE Alexandra Lister shares what it's like to grow a sales career here.
@ntv-scaffolding/component-pantry
Advanced tools
π¨ Modern Angular component library built with Tailwind CSS - featuring Button, Input, Card, Autocomplete, and Accordion components for scalable applications
π¨ A modern Angular component library built with Tailwind CSS and designed for scalable applications.
β¨ Angular 20+ Ready: This library fully supports standalone components and modern Angular features!
β οΈ Important: This library requires Tailwind CSS to be installed and configured in your project.
npm install @ntv-scaffolding/component-pantry
# Install Tailwind CSS
npm install -D tailwindcss postcss autoprefixer
# Initialize Tailwind configuration
npx tailwindcss init -p
Update your tailwind.config.js:
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
"./src/**/*.{html,ts}",
"./node_modules/@ntv-scaffolding/component-pantry/**/*.{js,ts,html}"
],
theme: {
extend: {},
},
plugins: [],
}
Add to your src/styles.css or main CSS file:
@tailwind base;
@tailwind components;
@tailwind utilities;
// app.component.ts or any standalone component
import { Component } from '@angular/core';
import {
Button,
Input,
Card
} from '@ntv-scaffolding/component-pantry';
@Component({
selector: 'app-root',
standalone: true,
imports: [
Button,
Input,
Card
],
template: `
<ntv-button>Click Me</ntv-button>
`
})
export class AppComponent { }
// For projects still using NgModule
import { NgModule } from '@angular/core';
import { ComponentPantryModule } from '@ntv-scaffolding/component-pantry';
@NgModule({
imports: [
ComponentPantryModule
]
})
export class AppModule { }
// modern-app.component.ts
import { Component, signal } from '@angular/core';
import { FormsModule } from '@angular/forms';
import {
Button,
Input,
Card
} from '@ntv-scaffolding/component-pantry';
@Component({
selector: 'app-modern',
standalone: true,
imports: [
FormsModule,
Button,
Input,
Card
],
template: `
<!-- Button with Angular 20 signals and dynamic theming -->
<ntv-button
[config]="{
variant: 'primary',
size: 'md',
color: 'custom',
customColor: '#3b82f6',
rounded: 'lg'
}"
(buttonClick)="handleClick()">
Clicked {{ clickCount() }} times
</ntv-button>
<!-- Input with enhanced features -->
<ntv-input
[config]="{
type: 'text',
size: 'lg',
variant: 'default',
placeholder: 'Enter your name',
clearable: true,
borderRadius: 'md'
}"
[(ngModel)]="name"
label="Full Name">
</ntv-input>
<!-- Card with dynamic theming -->
<ntv-card
[title]="'Hello ' + name()"
subtitle="Welcome to Angular 20!"
[config]="{
variant: 'elevated',
rounded: 'xl',
shadow: 'lg',
hoverEffect: true,
adaptToTheme: true
}">
<p>This component uses modern Angular features and dynamic theming!</p>
</ntv-card>
<!-- Autocomplete with signals -->
<ntv-autocomplete
[data]="autocompleteOptions()"
[config]="{
placeholder: 'Search items...',
multiple: true,
clearable: true,
searchable: true
}"
(selectionChange)="onSelectionChange($event)">
</ntv-autocomplete>
`
})
export class ModernAppComponent {
name = signal('');
clickCount = signal(0);
handleClick() {
this.clickCount.update(count => count + 1);
}
}
<!-- Button Component with Dynamic Theming -->
<ntv-button
variant="primary"
size="md"
color="blue"
(buttonClick)="handleClick($event)">
Click Me
</ntv-button>
<!-- Button with Custom Color -->
<ntv-button
variant="outline"
color="custom"
customColor="#8b5cf6"
rounded="full">
Custom Purple
</ntv-button>
<!-- Input Component with Enhanced Features -->
<ntv-input
type="email"
size="lg"
variant="default"
placeholder="Enter your email"
[(ngModel)]="email"
label="Email Address"
clearable="true"
info="We'll never share your email">
</ntv-input>
<!-- Card Component with Advanced Styling -->
<ntv-card
title="Dynamic Card"
subtitle="Adapts to your theme"
variant="elevated"
rounded="lg"
shadow="md"
hoverEffect="true">
<p>This card uses dynamic theming!</p>
</ntv-card>
<!-- Autocomplete with Configuration -->
<ntv-autocomplete
[data]="options"
placeholder="Search options..."
multiple="true"
clearable="true"
(selectionChange)="onSelectionChange($event)">
</ntv-autocomplete>
<!-- Accordion with Slot Content -->
<ntv-accordion variant="bordered" size="md" showIcons="true">
<div slot="header">Expandable Section</div>
<div slot="body">
<p>Content that can be collapsed and expanded</p>
</div>
</ntv-accordion>
ntv-button)Advanced button component with comprehensive styling and dynamic theming.
Properties:
variant: 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'outline' | 'accent' | 'description' | 'info'size: 'sm' | 'md' | 'lg' | 'xl'color: 'blue' | 'green' | 'red' | 'yellow' | 'purple' | 'gray' | 'indigo' | 'pink' | 'custom'customColor: string (hex color when color is 'custom')disabled: booleanloading: booleanfullWidth: booleanrounded: 'none' | 'sm' | 'md' | 'lg' | 'xl' | 'full'shadow: booleantype: 'button' | 'submit' | 'reset'config: ButtonConfig (DRY configuration object)Dynamic Theming: Supports custom colors, Tailwind color schemes, and adapts to your theme configuration.
ntv-input)Form input component with validation, styling, and dynamic theming.
Properties:
type: 'text' | 'password' | 'email' | 'number'size: 'xs' | 'sm' | 'md' | 'lg'variant: 'default' | 'error' | 'success' (or custom string)label: string | nullplaceholder: stringrequired: booleandisabled: booleanclearable: booleanborderRadius: stringinfo: string | null (helper text)error: string | null (error message)showError: booleanconfig: InputConfig (DRY configuration object)Dynamic Theming: Adapts to your Tailwind theme, supports custom border radius and color variants.
ntv-autocomplete)Advanced searchable dropdown with filtering, grouping, and dynamic theming.
Properties:
data: AutocompleteOption[] | AutocompleteGroup[]placeholder: stringsearchable: booleanclearable: booleanmultiple: booleanmaxSelections: numberminSearchLength: numberdebounceTime: numbernoResultsText: stringloadingText: stringmaxDisplayItems: numberconfig: AutocompleteConfig (DRY configuration object)Dynamic Theming: Fully integrates with your Tailwind theme and supports custom styling.
ntv-card)Flexible card container with advanced styling and dynamic theming.
Properties:
title: stringsubtitle: stringvariant: 'default' | 'elevated' | 'outlined' | 'filled'rounded: 'none' | 'sm' | 'md' | 'lg' | 'xl' | 'full'shadow: 'none' | 'sm' | 'md' | 'lg' | 'xl'backgroundColor: string (custom background)borderColor: string (custom border)gradient: string (gradient background)hoverEffect: booleanclickable: booleanfullWidth: booleanadaptToTheme: booleanconfig: CardConfig (DRY configuration object)Dynamic Theming: Supports custom colors, gradients, and automatically adapts to your theme configuration.
ntv-accordion)Collapsible content component with animations and dynamic theming.
Properties:
variant: 'default' | 'bordered' | 'flush'size: 'sm' | 'md' | 'lg'animated: booleanshowIcons: booleaninitialOpen: booleandisabled: booleangroup: string (for accordion groups)config: AccordionConfig (DRY configuration object)Dynamic Theming: Integrates with your Tailwind theme and supports custom styling patterns.
Note: Uses slot-based content projection with [slot="header"] and [slot="body"] for flexible content structure.
This library features a powerful dynamic theming system that automatically adapts to your Tailwind configuration:
tailwind.config.js theme settingscustomColor propertiesThis library is built with Tailwind CSS and requires it to function properly. The components use Tailwind utility classes for:
Components automatically adapt to your Tailwind theme configuration:
// tailwind.config.js
module.exports = {
theme: {
extend: {
colors: {
// Custom brand colors - components will use these automatically
brand: {
50: '#eff6ff',
500: '#3b82f6',
600: '#2563eb',
700: '#1d4ed8',
900: '#1e3a8a',
},
// Custom semantic colors
success: '#10b981',
warning: '#f59e0b',
danger: '#ef4444',
},
borderRadius: {
'custom': '12px',
},
boxShadow: {
'custom': '0 4px 6px -1px rgba(0, 0, 0, 0.1)',
}
}
}
}
// Use predefined colors
<ntv-button color="blue" variant="primary">Blue Button</ntv-button>
// Use custom hex colors
<ntv-button
color="custom"
customColor="#ff6b35"
variant="primary">
Custom Color
</ntv-button>
// Use config object for complex theming
<ntv-button [config]="{
color: 'custom',
customColor: '#8b5cf6',
variant: 'outline',
rounded: 'full',
shadow: true
}">Themed Button</ntv-button>
// Card with custom styling
<ntv-card [config]="{
variant: 'elevated',
backgroundColor: '#f8fafc',
borderColor: '#e2e8f0',
gradient: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
rounded: 'xl',
shadow: 'lg'
}">Custom Themed Card</ntv-card>
// Input with theme integration
<ntv-input [config]="{
variant: 'success',
size: 'lg',
borderRadius: 'custom'
}">Themed Input</ntv-input>
Components fully support Tailwind's dark mode with modern Angular 20 integration.
// tailwind.config.js
module.exports = {
darkMode: 'selector', // Modern approach (Tailwind 3.4+)
// darkMode: 'class', // Legacy approach
content: [
"./src/**/*.{html,ts}",
"./node_modules/@ntv-scaffolding/component-pantry/**/*.{js,ts,html}"
],
theme: {
extend: {
colors: {
// Custom dark mode colors
dark: {
bg: '#0f172a',
surface: '#1e293b',
text: '#f1f5f9'
}
}
}
}
}
// dark-mode.service.ts
import { Injectable, signal, effect } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import { inject } from '@angular/core';
@Injectable({ providedIn: 'root' })
export class DarkModeService {
private document = inject(DOCUMENT);
// Signal-based state management
isDarkMode = signal(false);
constructor() {
// Auto-detect system preference
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
this.isDarkMode.set(prefersDark);
// Apply dark mode class when signal changes
effect(() => {
if (this.isDarkMode()) {
this.document.documentElement.classList.add('dark');
} else {
this.document.documentElement.classList.remove('dark');
}
});
}
toggle() {
this.isDarkMode.update(current => !current);
}
}
// app.component.ts
import { Component, inject } from '@angular/core';
import { DarkModeService } from './dark-mode.service';
import { Button } from '@ntv-scaffolding/component-pantry';
@Component({
selector: 'app-root',
standalone: true,
imports: [Button],
template: `
<div class="min-h-screen bg-white dark:bg-gray-900 text-gray-900 dark:text-white">
<ntv-button
(click)="darkMode.toggle()"
variant="primary">
{{ darkMode.isDarkMode() ? 'βοΈ Light' : 'π Dark' }} Mode
</ntv-button>
<!-- Components automatically adapt to dark mode -->
<ntv-card title="Dark Mode Card">
<p>This card adapts to your theme preference!</p>
</ntv-card>
</div>
`
})
export class AppComponent {
darkMode = inject(DarkModeService);
}
Problem: Tailwind CSS is not properly configured.
Solution:
npm list tailwindcsstailwind.config.js includes the component library pathProblem: Tailwind is not detecting component library classes.
Solution:
// Add this to your tailwind.config.js content array
"./node_modules/@ntv-scaffolding/component-pantry/**/*.{js,ts,html}"
Problem: PostCSS configuration issues.
Solution:
// postcss.config.js
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}
Problem: Component import errors.
Solution for Standalone Components (Recommended):
// Import individual components
import {
Button,
Input,
Card
} from '@ntv-scaffolding/component-pantry';
@Component({
standalone: true,
imports: [
Button,
Input,
Card
]
})
Solution for NgModule (Legacy):
// Import the module
import { ComponentPantryModule } from '@ntv-scaffolding/component-pantry';
@NgModule({
imports: [ComponentPantryModule]
})
If you encounter issues:
nx test component-pantry
nx build component-pantry
nx storybook component-pantry
git checkout -b feature/amazing-feature)git commit -m 'Add some amazing feature')git push origin feature/amazing-feature)This project is licensed under the MIT License - see the LICENSE file for details.
FAQs
π¨ Modern Angular component library built with Tailwind CSS - featuring Button, Input, Card, Autocomplete, and Accordion components for scalable applications
We found that @ntv-scaffolding/component-pantry demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago.Β It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Company News
Socket won two 2026 Reppy Awards from RepVue, ranking in the top 5% of all sales orgs. AE Alexandra Lister shares what it's like to grow a sales career here.

Security News
NIST will stop enriching most CVEs under a new risk-based model, narrowing the NVD's scope as vulnerability submissions continue to surge.

Company News
/Security News
Socket is an initial recipient of OpenAI's Cybersecurity Grant Program, which commits $10M in API credits to defenders securing open source software.