Zero dependencies · Pure CSS core · Works everywhere
React · Next.js · Vue · Angular · Vanilla HTML · CDN · SSR
| Feature | Detail |
|---|---|
| 🎨 500+ Loaders | Spinners, Dots, Bars, Shapes, Glow, Tech, Nature, Creative, Robotic, Science & Technology |
| 📦 Zero Dependencies | Pure CSS core — no bloat, no lock-in |
| ⚡ Plug & Play | One CSS file. No build step needed for vanilla HTML |
| 🌳 Tree-Shakable | Import only the React components you need |
| ♿ Accessible | ARIA roles, aria-live, and screen reader text built-in |
| 🎛️ CSS Variables | Color, size, speed — all customizable via --ul-* variables |
| 🌐 Universal Builds | ESM · CJS · UMD (CDN) |
| 🖥️ SSR Safe | No window/document errors in Next.js / Node.js |
| 🔷 Web Components | <ul-loader> custom element works in any framework |
# npm
npm install loaderx-arun
# yarn
yarn add loaderx-arun
# pnpm
pnpm add loaderx-arun<!-- Stylesheet only — all 500+ loaders -->
<link rel="stylesheet" href="https://unpkg.com/loaderx-arun/dist/style.css" />
<!-- UMD bundle (Web Components + utilities) -->
<script src="https://unpkg.com/loaderx-arun/dist/loaderx-arun.umd.js"></script><!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://unpkg.com/loaderx-arun/dist/style.css" />
</head>
<body>
<!-- Spinner -->
<div class="ul-loader ul-spinner" role="status" aria-live="polite">
<span class="ul-sr-only">Loading…</span>
</div>
<!-- Dots -->
<div class="ul-loader ul-dots" role="status" aria-live="polite">
<span class="ul-dots__dot"></span>
<span class="ul-sr-only">Loading…</span>
</div>
<!-- Neon Ring (glow effect) -->
<div class="ul-loader ul-neon-ring" role="status" aria-live="polite">
<span class="ul-sr-only">Loading…</span>
</div>
<!-- Custom color & size via CSS variables -->
<div class="ul-loader ul-spinner"
style="--ul-color:#ef4444; --ul-size:48px; --ul-speed:0.6s;"
role="status" aria-live="polite">
<span class="ul-sr-only">Loading…</span>
</div>
</body>
</html>npm install loaderx-arunimport { Loader, Spinner, Dots, Ring, Bars, Pulse, Progress } from 'loaderx-arun/react';
import 'loaderx-arun/style.css';
export default function App() {
return (
<div>
{/* Basic usage */}
<Spinner />
<Dots />
<Ring />
{/* With props */}
<Spinner color="#ef4444" size="lg" speed="0.5s" />
<Loader type="neon-ring" color="#8b5cf6" size="xl" />
<Loader type="galaxy" color="#06b6d4" />
{/* Progress bar */}
<Progress color="#10b981" />
{/* Custom aria label */}
<Loader type="dots" label="Fetching your data…" />
</div>
);
}npm install loaderx-arun<template>
<div>
<ul-loader type="spinner" color="#3b82f6"></ul-loader>
<ul-loader type="neon-ring" color="#8b5cf6" size="lg"></ul-loader>
<ul-loader type="dots-typing" color="#10b981"></ul-loader>
<ul-loader type="equalizer" color="#f59e0b" size="xl"></ul-loader>
</div>
</template>
<script setup>
import 'loaderx-arun/web-components'; // registers <ul-loader>
</script>Vue 3 Vite config — tell Vue to skip custom elements:
// vite.config.ts
import vue from '@vitejs/plugin-vue';
export default {
plugins: [
vue({
template: {
compilerOptions: {
isCustomElement: (tag) => tag.startsWith('ul-')
}
}
})
]
};npm install loaderx-arunStep 1 — Add CSS to angular.json:
"styles": [
"node_modules/loaderx-arun/dist/style.css"
]Step 2 — Use in any component:
import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import 'loaderx-arun/web-components';
@Component({
selector: 'app-loading',
standalone: true,
schemas: [CUSTOM_ELEMENTS_SCHEMA],
template: `
<ul-loader type="spinner" color="#6366f1"></ul-loader>
<ul-loader type="bars" color="#ef4444" size="lg"></ul-loader>
<ul-loader type="radar" color="#10b981"></ul-loader>
`,
})
export class LoadingComponent {}<!-- Register once in your entry -->
<script type="module">
import 'loaderx-arun/web-components';
</script>
<!-- Use anywhere -->
<ul-loader type="spinner"></ul-loader>
<ul-loader type="dots" color="#10b981" size="lg"></ul-loader>
<ul-loader type="ring-neon" color="#8b5cf6" speed="0.8s"></ul-loader>
<ul-loader type="galaxy" color="#06b6d4" size="xl"></ul-loader>| Variable | Default | Description |
|---|---|---|
--ul-color |
#3b82f6 |
Primary loader color |
--ul-secondary-color |
rgba(59,130,246,0.2) |
Track / secondary color |
--ul-size |
40px |
Width & height |
--ul-speed |
1s |
Animation duration |
--ul-border-width |
3px |
Border thickness |
--ul-dot-size |
calc(size/4) |
Dot diameter |
/* styles.css or :root block */
:root {
--ul-color: #8b5cf6; /* purple theme */
--ul-size: 48px;
--ul-speed: 0.75s;
}<div class="ul-loader ul-spinner"
style="--ul-color:#ef4444; --ul-size:32px; --ul-speed:0.5s;">
</div>| Prop | Type | Default | Description |
|---|---|---|---|
type |
LoaderType |
'spinner' |
Loader variant |
color |
string |
'#3b82f6' |
Primary color |
size |
'sm' | 'md' | 'lg' | 'xl' | string |
'md' |
Loader size |
speed |
string |
'1s' |
Animation speed |
label |
string |
'Loading…' |
Screen reader text |
className |
string |
— | Extra CSS class |
| Key | Value |
|---|---|
sm |
24px |
md |
40px (default) |
lg |
56px |
xl |
80px |
| Category | Count | Examples |
|---|---|---|
| 🌀 Spinners & Rings | 33 | spinner, ring-neon, gyro, cyclone, dual-ring-pulse |
| ⚫ Dots & Particles | 24 | dots-typing, fireflies, constellation, dots-clock |
| 📊 Bars & Lines | 24 | equalizer, waveform, spectrum, led-bar, stretching |
| 🔷 Shapes & Geometry | 27 | cube-3d, hexagon, morph-shape, yin-yang, target |
| ✨ Glow & Neon | 25 | neon-ring, plasma, holographic, aurora, reactor |
| 💻 Tech & UI | 22 | radar, dna, glitch, matrix, biometric, qr-scan |
| 🌿 Nature | 19 | fire-flame, snowflake, tornado, petal-spin, meteor-shower |
| 🎨 Creative & Fun | 28 | pacman, jelly, confetti, heart-beat, ripple-send |
| 🤖 Robotic | 96 | robo-arm-1, servo-turn-1, android-eye-1, bot-face-1, gear-train-1 |
| 🧪 Science | 97 | quantum-spin-1, molecule-bond-1, cosmic-orbit-1, particle-beam-1 |
| ⚙️ Technology | 97 | neural-synapse-1, processor-core-1, cyber-shield-1, binary-matrix-1 |
<!-- Spinners -->
<div class="ul-loader ul-spinner"></div>
<div class="ul-loader ul-ring-neon"></div>
<div class="ul-loader ul-gyro"></div>
<div class="ul-loader ul-cyclone"></div>
<!-- Dots -->
<div class="ul-loader ul-dots-typing">
<span class="ul-d"></span><span class="ul-d"></span><span class="ul-d"></span>
</div>
<div class="ul-loader ul-equalizer">
<span class="ul-d"></span><span class="ul-d"></span>
<span class="ul-d"></span><span class="ul-d"></span>
<span class="ul-d"></span><span class="ul-d"></span>
</div>
<!-- Glow -->
<div class="ul-loader ul-plasma"></div>
<div class="ul-loader ul-holographic"></div>
<div class="ul-loader ul-aurora"></div>
<!-- Tech -->
<div class="ul-loader ul-radar"></div>
<div class="ul-loader ul-glitch"></div>
<!-- Nature -->
<div class="ul-loader ul-fire-flame"></div>
<div class="ul-loader ul-tornado">
<span class="ul-d"></span><span class="ul-d"></span>
<span class="ul-d"></span><span class="ul-d"></span>
<span class="ul-d"></span>
</div>
<!-- Creative -->
<div class="ul-loader ul-pacman"></div>
<div class="ul-loader ul-jelly"></div>
<div class="ul-loader ul-heart-beat"></div>Every loader ships with proper ARIA support out of the box:
<div class="ul-loader ul-spinner"
role="status"
aria-live="polite"
aria-label="Loading content">
<span class="ul-sr-only">Loading…</span>
</div>role="status"— marks it as a live regionaria-live="polite"— screen readers announce without interrupting.ul-sr-only— visually hidden text for screen readers
In React, the label prop customizes the hidden text:
<Spinner label="Uploading your file, please wait…" />| Browser | Minimum Version |
|---|---|
| Chrome | 80+ |
| Firefox | 75+ |
| Safari | 13.1+ |
| Edge | 80+ |
| iOS Safari | 13.4+ |
| Android Chrome | 80+ |
All loaders use standard CSS animations and custom properties. No JavaScript is required for CSS-only usage.
loaderx-arun → Core types & utilities (ESM/CJS)
loaderx-arun/react → React wrapper components
loaderx-arun/web-components → <ul-loader> custom element
loaderx-arun/style.css → Full bundled CSS (500+ loaders)
# Clone & install
git clone https://github.com/arun/loaderx-arun.git
cd loaderx-arun
npm install
# Build everything (JS + CSS + UMD)
npm run build
# CSS only (fast rebuild for CSS changes)
npm run build:css
# Type check
npm run typecheck
# Preview demo (http://localhost:4242)
npx http-server . -p 4242
# → open http://localhost:4242/examples/vanilla/index.html
# Clean dist folder
npm run clean
### Adding a New Loader
1. Add CSS to the appropriate file in `src/core/styles/` (or `extra.css`):
```css
.ul-my-loader {
width: var(--ul-size);
height: var(--ul-size);
/* your animation */
}- Add the name to
LOADER_TYPESinsrc/core/index.ts - Run
npm run build:cssto regeneratedist/style.css - Add an entry to the
LOADERSarray inexamples/vanilla/index.html
# 1. Build everything
npm run build
# 2. Preview what will be published
npm pack --dry-run
# 3. Login (first time only)
npm login
# 4. Publish
npm publishPre-publish checklist:
- Version bumped in
package.json -
npm run buildsucceeds - Demo page shows all loaders correctly
- TypeScript types exist in
dist/ -
npm pack --dry-runshows onlydist/andREADME.md
Contributions are welcome! To add new loaders:
- Fork the repository
- Create a CSS class following the
ul-prefix convention - Use CSS variables (
--ul-color,--ul-size,--ul-speed) — no hardcoded values - Add to
LOADER_TYPES, rebuild, and update the demo - Open a Pull Request with a screenshot 🎉
MIT © 2024 Arun