A growing collection of reusable, framework-agnostic web components built with modern technologies. This monorepo leverages Turborepo and PNPM Workspaces to efficiently manage multiple web component packages.
This repository contains a collection of web components that can be used in any JavaScript framework or vanilla JavaScript. Currently available:
- @banegasn/m3-badge - Material Design 3 Badge component for counts and status indicators
- @banegasn/m3-button - Material Design 3 Button with 5 variants, 5 sizes, shape morphing, and loading states
- @banegasn/m3-card - Material Design 3 Card with 3 variants (Elevated, Filled, Outlined), media and action slots
- @banegasn/m3-checkbox - Material Design 3 Checkbox with checked, unchecked, and indeterminate states
- @banegasn/m3-chip - Material Design 3 Chip for filters, selections, and input tags
- @banegasn/m3-dialog - Material Design 3 Dialog with expressive open/close animations
- @banegasn/m3-divider - Material Design 3 Divider with entrance animations and vertical support
- @banegasn/m3-fab-menu - Material Design 3 FAB Menu for expressive floating action interactions
- @banegasn/m3-icon-button - Material Design 3 Icon Button with press animations and multiple variants
- @banegasn/m3-list - Material Design 3 List and List Item with staggered entrance animations and multi-line support
- @banegasn/m3-snackbar - Material Design 3 Snackbar with entrance/exit animations and action support
- @banegasn/m3-top-app-bar - Material Design 3 Top App Bar with multiple size variants
- @banegasn/m3-loading-indicator - Material Design 3 Loading Indicator with shape morphing animation
- @banegasn/m3-menu - Material Design 3 Menu with smart positioning and keyboard navigation
- @banegasn/m3-navigation-bar - Material Design 3 Navigation Bar with responsive layouts and badge support
- @banegasn/m3-navigation-rail - Material Design 3 Navigation Rail with collapsible functionality and badges
- @banegasn/m3-progress - Material Design 3 Linear Progress Indicator with determinate and indeterminate modes
- @banegasn/m3-radio-button - Material Design 3 Radio Button for single-option selection from a group
- @banegasn/m3-search-bar - Material Design 3 Search Bar with leading and trailing content slots
- @banegasn/m3-slider - Material Design 3 Slider with continuous and discrete (stepped) modes
- @banegasn/m3-split-button - Material Design 3 Split Button with primary action and dropdown
- @banegasn/m3-switch - Material Design 3 Switch for toggling between on and off states
- @banegasn/m3-tabs - Material Design 3 Tabs with animated indicator and icon support
- @banegasn/m3-text-field - Material Design 3 Text Field with filled and outlined variants
- @banegasn/m3-tooltip - Material Design 3 Tooltip with plain and rich variants
- Publishing Guide - How to publish web component packages
- Design Token Contract - Shared token naming, themes, compatibility, and validation
- Web Components - List of available components
- Component Packages - Individual package documentation
The Angular demo app is automatically deployed to GitHub Pages: https://banegasn.github.io/components/
Every push to the main branch triggers an automatic deployment.
This monorepo is designed for building and distributing web components:
- Framework-agnostic components: Built with Lit, Svelte, and other modern web component technologies
- Universal compatibility: Components work in any JavaScript framework (Angular, React, Vue, etc.) or vanilla JavaScript
- Efficient builds: Turborepo for intelligent build caching and parallelization
- Workspace management: PNPM for fast, disk-efficient dependency management
- Demo applications: Example apps showcasing component usage in different frameworks
.
βββ apps/
β βββ angular-app/ # Angular demo showcasing all web components
βββ packages/
β βββ m3-badge/
β βββ m3-button/
β βββ m3-card/
β βββ m3-checkbox/
β βββ m3-chip/
β βββ m3-dialog/
β βββ m3-divider/
β βββ m3-fab-menu/
β βββ m3-icon-button/
β βββ m3-list/
β βββ m3-loading-indicator/
β βββ m3-menu/
β βββ m3-navigation-bar/
β βββ m3-navigation-rail/
β βββ m3-progress/
β βββ m3-radio-button/
β βββ m3-search-bar/
β βββ m3-slider/
β βββ m3-snackbar/
β βββ m3-split-button/
β βββ m3-switch/
β βββ m3-tabs/
β βββ m3-text-field/
β βββ m3-top-app-bar/
β βββ m3-tooltip/
β βββ svelte-components/
βββ scripts/ # Build, publish, and screenshot utilities
βββ pnpm-workspace.yaml
βββ turbo.json
βββ tsconfig.json
You can use the components directly in any HTML file without installing anything by using the jsDelivr CDN and its ES module features:
<!-- Import directly as a module -->
<script
type="module"
src="https://cdn.jsdelivr.net/npm/@banegasn/m3-button/+esm"
></script>
<!-- Or import multiple components -->
<script type="module">
import 'https://cdn.jsdelivr.net/npm/@banegasn/m3-button/+esm';
import 'https://cdn.jsdelivr.net/npm/@banegasn/m3-card/+esm';
</script>
<!-- Use the components -->
<m3-button variant="filled">Click me</m3-button>- Node.js 24.18.x
- pnpm 11.12.0
Enable the pinned pnpm version with Corepack:
npm install --global corepack@0.35.0
corepack enable
corepack install --global pnpm@11.12.0# Clone the repository
git clone <repository-url>
cd components
# Install dependencies
pnpm install
# Build all packages and apps
pnpm build
# Run development servers
pnpm dev# Build all packages and apps
pnpm build
# Build specific package
pnpm --filter @banegasn/m3-button build
# Build specific app
pnpm --filter angular-app build# Run all dev servers
pnpm dev
# Run specific package in dev mode
cd packages/example-component
pnpm dev
# Run specific app
cd apps/angular-app
pnpm devThe Angular app will be available at http://localhost:4200
# Run linters
pnpm lint
# Type-check every workspace (including existing browser tests)
pnpm typecheck
# Run tests
pnpm test
# Pack, install, and import every public package (run after pnpm build)
pnpm smoke:packages
# Clean all build artifacts
pnpm cleanThe supported local toolchain is Node.js 24.18.x with pnpm 11.12.0. Use the
version pinned in .nvmrc, then run:
corepack enable
pnpm install --frozen-lockfile
pnpm test:browser:install
pnpm lint
pnpm typecheck
pnpm test
pnpm buildpnpm test runs the existing browser suites with Playwright. Workspaces that
do not have tests yet print an explicit temporary status instead of being
silently skipped; adding their behavioral coverage is tracked in issue #12.
Formatting uses the shared Prettier policy:
pnpm formatA demonstration Angular application showcasing how to use the web components in a real-world application.
Features:
- Angular 20 with standalone components
- Live examples of all available web components
- Integration patterns and best practices
- Deployed to GitHub Pages for live preview
Run:
cd apps/angular-app
pnpm devπ‘ Note: More demo apps (React, Vue, vanilla JS) may be added in the future to demonstrate cross-framework compatibility.
The turbo.json file defines the build pipeline:
- build: Builds all packages with dependency awareness
- dev: Runs all development servers
- lint: Runs linters across the monorepo
- test: Runs tests with proper dependencies
- clean: Cleans build artifacts
- Caching: Turborepo caches build outputs for faster rebuilds
- Parallelization: Runs independent tasks in parallel
- Dependency graph: Ensures packages build in the correct order
- Create package directory:
mkdir -p packages/my-web-component/src- Create
package.json:
{
"name": "@banegasn/my-web-component",
"version": "1.0.0",
"type": "module",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"scripts": {
"build": "tsc",
"dev": "tsc --watch"
}
}-
Create your web component using Lit, Svelte, or vanilla JavaScript
-
Install dependencies from root:
pnpm install- Create app directory:
mkdir -p apps/my-demo-app-
Set up your framework (React, Vue, etc.)
-
Add workspace dependencies in
package.json:
{
"dependencies": {
"@banegasn/m3-button": "workspace:*",
"@banegasn/m3-card": "workspace:*",
"@banegasn/m3-navigation-bar": "workspace:*",
"@banegasn/m3-navigation-rail": "workspace:*",
"@banegasn/m3-switch": "workspace:*",
"@banegasn/m3-radio-button": "workspace:*",
"@banegasn/m3-search-bar": "workspace:*",
"@banegasn/m3-fab-menu": "workspace:*",
"@banegasn/m3-loading-indicator": "workspace:*",
"@banegasn/m3-menu": "workspace:*",
"@banegasn/m3-split-button": "workspace:*"
}
}Add test scripts to individual packages:
{
"scripts": {
"test": "vitest"
}
}Run all tests:
pnpm testpnpm buildTurborepo will:
- Build packages in dependency order
- Cache successful builds
- Only rebuild what changed
pnpm build:gh-pagesThis builds all packages and the Angular app optimized for GitHub Pages deployment with the correct base href (/components/).
To publish web component packages to GitHub Packages (or npm):
# Bump version
pnpm version:patch # or version:minor, version:major
# Publish to npm
pnpm publish:npm
# Publish to GitHub Packages
pnpm publish:githubAll web components are published as individual npm packages that can be installed and used in any project.
See PUBLISHING.md for detailed publishing instructions and GitHub Actions setup.
- Framework-agnostic: Design components to work in any framework or vanilla JavaScript
- Use workspace protocol: Reference workspace packages with
workspace:* - Shared configs: Extend root
tsconfig.jsonfor consistency - Custom elements: Follow web component standards and naming conventions (kebab-case)
- Semantic versioning: Version packages independently
- Documentation: Keep README files updated in each package with usage examples
- Accessibility: Ensure components follow WCAG guidelines and support keyboard navigation
pnpm clean
rm -rf node_modules pnpm-lock.yaml
pnpm installrm -rf .turbopnpm install --forceRead CONTRIBUTING.md for repository setup, architecture, quality checks, pull request requirements, semantic-versioning guidance, and the autonomous-agent workflow. All participation is governed by the Code of Conduct. Report vulnerabilities privately by following SECURITY.md.
