Component classes. Production-ready polish.
This page is the full njX UI library
preview: themed components, layout primitives, utilities,
interactive patterns, and motion helpers in one place.
Instead of starting with a long wall of sections,
this intro gives a clear entry point into what the
library is for and where to start exploring.
<button class="btn
btn-primary">Launch</button>
<div class="card glass">...</div>
<html data-theme="ocean">
The idea: ship a consistent UI layer with real component classes, theme tokens, and expressive states, without adding JS dependencies or a custom build toolchain.
Landing pages, dashboards, docs, admin panels, SaaS interfaces, internal tools, and fast prototypes where you want stronger UI control than classless mode while keeping the system lightweight.
_base.css. Change here — updates everywhere.
The entire UI reacts
to a single attribute.
Set data-theme on <html> and every component, shadow, and gradient updates instantly. No JS required.
<html data-theme="dark"> <html data-theme="dark">
/* Via JavaScript */
document.documentElement.setAttribute('data-theme', 'purple');
/* With localStorage persistence */
function setTheme(name) {
document.documentElement.setAttribute('data-theme', name);
localStorage.setItem('theme', name);
}
const saved = localStorage.getItem('theme');
if (saved) setTheme(saved);
function applyTheme(theme) {
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('theme', theme);
}
function toggleDarkLight() {
const t = document.documentElement.dataset.theme;
applyTheme(t === 'light' ? 'dark' : 'light');
}
const saved = localStorage.getItem('theme');
if (saved) applyTheme(saved);
/* 2. HTML — toggle variant */
<button onclick="toggleDarkLight()">...</button>
/* 3. HTML — segmented variant */
<div>
<button onclick="applyTheme('dark')">Dark</button>
<button onclick="applyTheme('light')">Light</button>
</div>
/* 4. CSS active states — no extra JS needed */
html:not([data-theme="light"]) .dark-btn { background: var(--color-primary); }
html[data-theme="light"] .light-btn { background: var(--color-primary); }
<div style="color: var(--color-primary)">Primary</div>
<div style="color: var(--color-accent)">Accent</div>
<div style="color: var(--color-success)">Success</div>
<div style="color: var(--color-error)">Error</div>
<div style="color: var(--color-warning)">Warning</div>
/* Page background and text */
<body style="background: var(--сolor-dark); color: var(--color-light)">
background: var(--color-primary-100); /* lightest */
color: var(--color-primary-500); /* base */
background: var(--color-primary-900); /* darkest */
/* Hover darker than base */
.btn-primary:hover {
background: var(--color-primary-600);
}
/* Light accent background */
background: var(--color-primary-100);
border: 1px solid var(--color-primary-300);
background: var(--color-neutral-50); /* near white */
color: var(--color-neutral-500); /* grey */
background: var(--color-neutral-900); /* near black */
/* Practical examples */
border: 1px solid var(--color-neutral-300);
color: var(--color-neutral-600); /* muted */
background: var(--color-neutral-100); /* zebra */
background: var(--color-accent-100); /* light tint */
border: 1px solid var(--color-accent-300);
background: var(--color-success-100);
background: var(--color-error-100);
border: 1px solid var(--color-error-300);
--radius-none 0px --radius-sm 6px --radius-md 12px --radius-lg 20px --radius-xl 30px --radius-2xl 40px --radius-full 9999px border-radius: var(--radius-md); /* 12px — card */
border-radius: var(--radius-lg); /* 20px — modal */
border-radius: var(--radius-full); /* pill / avatar */
--shadow-sm Subtle lift --shadow-md Card hover --shadow-lg Modal · Dropdown --shadow-primary Primary glow --shadow-accent Accent glow --shadow-glow White halo box-shadow: var(--shadow-md); /* card hover */
box-shadow: var(--shadow-lg); /* modal */
box-shadow: var(--shadow-primary); /* primary glow */
box-shadow: var(--shadow-glow); /* white glow */
transition: all var(--ease); /* 0.30s — hover */
transition: all var(--ease-slow); /* 0.50s — entrance */
z-index: var(--z-10); /* dropdowns */
z-index: var(--z-50); /* tooltips */
z-index: var(--z-100); /* topbar */
z-index: var(--z-modal); /* modals */
Components using var(--fs-*), var(--space-*)
respond to viewport changes automatically. */
/* Override for a specific component: */
@media (max-width: 768px) {
.hero-title { font-size: var(--fs-f-4xl); }
}
gap: var(--space-2); /* 8px */
padding: var(--space-4); /* 16px */
margin: var(--space-6); /* 24px */
gap: var(--space-8); /* 32px */
padding: var(--space-12); /* 48px */
margin-bottom: var(--space-16); /* 64px */
/* Combining sides */
padding: var(--space-6) var(--space-4); /* 24px 16px */
_grid.css.
Gap utilities (.gap-2, .gap-4…) are in _utils.css.
.row + .col-*/* 12-column flex grid — col-1 to col-12 */ <div class="row"> <div class="col-6">50%</div> <div class="col-6">50%</div> </div> <div class="row"> <div class="col-8">Main</div> <div class="col-4">Sidebar</div> </div>
.grid-col-1 … .grid-col-6.grid-col-2.grid-col-3.grid-col-4.grid-col-5.grid-col-6/* Fixed columns: grid-col-1 to grid-col-6 */ <div class="grid-col-2 gap-4">…</div> <div class="grid-col-3 gap-4">…</div> <div class="grid-col-4 gap-4">…</div> <div class="grid-col-6 gap-4">…</div> /* Collapses on mobile (1 col), on tablet 4/5/6 → 2 cols */
.grid-auto-*.grid-auto-xs — minmax(100px, 1fr).grid-auto-sm — minmax(160px, 1fr).grid-auto-md — minmax(220px, 1fr).grid-auto-lg — minmax(300px, 1fr)/* Auto-fit: fills as many cols as fit, wraps automatically */ <div class="grid-auto-xs gap-2">…</div> /* 100px min */ <div class="grid-auto-sm gap-3">…</div> /* 160px min */ <div class="grid-auto-md gap-4">…</div> /* 220px min */ <div class="grid-auto-lg gap-4">…</div> /* 300px min */ <div class="grid-auto-xl gap-6">…</div> /* 400px min */
.grid-sidebar-l — 260px | 1fr.grid-sidebar-r — 1fr | 260px.grid-thirds — 1fr | 2fr | 1fr/* Layout presets — stack to 1 col on mobile */ <div class="grid-sidebar-l gap-4"> <aside>Sidebar (260px)</aside> <main>Content</main> </div> <div class="grid-thirds gap-4"> <div>Left (1fr)</div> <div>Main (2fr)</div> <div>Right (1fr)</div> </div>
_typography.css. Add .fluid for vw-size.
<h2 class="title-xl">Title XL</h2>
<h3 class="title-lg">Title LG</h3>
<h4 class="title-md">Title MD</h4>
<h5 class="title-sm">Title SM</h5>
<h6 class="title-xs">Title XS</h6>
/* .fluid — responsive clamp() size */
<h1 class="title-hero fluid">Fluid Hero</h1>
<h2 class="title-xl fluid text-accent">Fluid Accent</h2>
<p class="text-body">Body — default reading size</p>
<p class="text-sm">Small text</p>
<p class="text-xs">Extra small</p>
<span class="text-caption">CAPTION LABEL</span>
<span class="text-label">UI Label</span>
/* Mix text size + color */
<p class="text-lead text-muted">Muted lead</p>
<p class="text-sm text-primary">Small primary</p>
<span class="text-accent">Accent</span>
<span class="text-success">Success</span>
<span class="text-error">Error</span>
<span class="text-warning">Warning</span>
<span class="text-muted">Muted</span>
<span class="text-white">White</span>
/* Combine with any heading or text class */
<h2 class="title-lg text-primary">Colored heading</h2>
<p class="text-sm text-muted">Small muted</p>
<span class="text-caption text-accent">ACCENT LABEL</span>
.tip with a variant modifier. Icon slot via .tip-icon, title via .tip-title.
.tip--info for general information and neutral
notes.
.tip--success to confirm an action or show
a completed state.
.tip--warning to flag something that requires
attention before proceeding.
.tip--danger for destructive or critical
error messages.
.tip--neutral for side notes or supplementary
context.
<div class="tip tip--info">
<svg class="tip-icon">...</svg>
<div>
<div class="tip-title">Info</div>
<div class="tip-body">Message text.</div>
</div>
</div>
/* Without icon */
<div class="tip tip--warning">
<div class="tip-title">Warning</div>
<div class="tip-body">Cannot be undone.</div>
</div>
/* All variants */
.tip--info /* primary color */
.tip--success /* green */
.tip--warning /* yellow */
.tip--danger /* red */
.tip--neutral /* muted */
--font-* --font-inter --font-poppins --font-montserrat --font-outfit --font-jakarta --font-dm-sans --font-nunito --font-space --font-manrope --font-figtree --font-sora --font-roboto --font-roboto-mono --font-jetbrains --font-fira-code --font-sans: var(--font-inter);
--font-heading: var(--font-poppins);
--font-mono: var(--font-roboto-mono);
/* Usage */
font-family: var(--font-sans);
font-family: var(--font-heading);
font-family: var(--font-mono);
--fs-xs12pxCaption · Label · Helper --fs-sm14pxSmall text · Button · Badge --fs-base16pxBody paragraph — default size --fs-lg18pxLarge body · Lead text --fs-xl20pxSubheading --fs-2xl24pxSection title --fs-3xl30pxH3 heading --fs-4xl36pxH2 --fs-5xl48pxH1 --fs-6xl60pxDisplay --fs-hero96pxHero font-size: var(--fs-base); /* 16px */
font-size: var(--fs-2xl); /* 24px */
font-size: var(--fs-5xl); /* 48px */
font-size: var(--fs-hero); /* 96px */
clamp(min · vw · max) --fs-f-xs10 → 12pxCaption · Label --fs-f-sm12 → 14pxSmall helper text --fs-f-base14 → 16pxBody — fluid default --fs-f-lg16 → 20pxLarge body --fs-f-xl18 → 24pxSubheading --fs-f-2xl20 → 30pxSection title --fs-f-3xl24 → 36pxH3 --fs-f-4xl28 → 48pxH2 --fs-f-hero60 → 120pxHero font-size: var(--fs-f-xl); /* clamp(18px,2vw,24px) */
font-size: var(--fs-f-hero); /* clamp(60px,10vw,120px) */
--lh-tight0.9 Display headline tight leading impact
--lh-snug1.2 Compact heading or UI label text stays close together
--lh-normal1.5 Standard body copy reads comfortably at this line height
--lh-relaxed1.8 Long-form articles and documentation with open spacing
line-height: var(--lh-snug); /* 1.2 — headings */
line-height: var(--lh-normal); /* 1.5 — body */
line-height: var(--lh-relaxed); /* 1.8 — articles */
_utils.css
(former _util.css removed). Click a class — it copies to clipboard.
_skeleton.css. Base: .skeleton +
size/shape modifiers. Three animations: shimmer, pulse, wave.<span class="skeleton skeleton-lg skeleton-full"></span>
<span class="skeleton skeleton-md skeleton-3/4"></span>
<span class="skeleton skeleton-md skeleton-full"></span>
<span class="skeleton skeleton-md skeleton-2/3"></span>
<span class="skeleton skeleton-sm skeleton-1/2"></span>
</div>
<span class="skeleton skeleton-circle" style="width:48px;height:48px"></span>
<div class="skeleton-user-info">
<span class="skeleton skeleton-md skeleton-2/3"></span>
<span class="skeleton skeleton-sm skeleton-1/2"></span>
</div>
</div>
<span class="skeleton skeleton-card-img"></span>
<div class="skeleton-card-body">
<span class="skeleton skeleton-lg skeleton-3/4"></span>
<span class="skeleton skeleton-md skeleton-full"></span>
<span class="skeleton skeleton-md skeleton-2/3"></span>
<span class="skeleton skeleton-xl skeleton-1/3"></span>
</div>
</div>
<div class="skeleton-list-item">
<span class="skeleton skeleton-circle" style="width:40px;height:40px"></span>
<div class="skeleton-list-item-info">
<span class="skeleton skeleton-md skeleton-1/2"></span>
<span class="skeleton skeleton-sm skeleton-3/4"></span>
</div>
<span class="skeleton skeleton-sm" style="width:52px"></span>
</div>
</div>
<div class="skeleton-table-row">
<span class="skeleton skeleton-circle" style="width:32px;height:32px"></span>
<span class="skeleton skeleton-sm skeleton-1/4"></span>
<span class="skeleton skeleton-sm skeleton-2/3"></span>
<span class="skeleton skeleton-sm skeleton-1/3"></span>
<span class="skeleton skeleton-sm skeleton-pill" style="width:60px"></span>
</div>
</div>
<span class="skeleton skeleton-xl skeleton-pill" style="width:130px"></span>
<span class="skeleton skeleton-xl skeleton-rounded" style="width:110px"></span>
<span class="skeleton skeleton-circle" style="width:48px;height:48px"></span>
<span class="skeleton skeleton-xl skeleton-pill" style="width:110px"></span>
<span class="skeleton skeleton-xl skeleton-pill skeleton-soft" style="width:110px"></span>
<span class="skeleton skeleton-xl skeleton-rounded skeleton-soft" style="width:100px"></span>
<span class="skeleton skeleton-circle skeleton-soft" style="width:40px;height:40px"></span>
<div class="skeleton-wave skeleton-group">
<span class="skeleton skeleton-lg skeleton-full"></span>
<span class="skeleton skeleton-md skeleton-3/4"></span>
<span class="skeleton skeleton-md skeleton-full"></span>
<span class="skeleton skeleton-md skeleton-1/2"></span>
</div>
<div class="skeleton-form-row">
<span class="skeleton skeleton-form-label"></span>
<span class="skeleton skeleton-form-input"></span>
</div>
<!-- submit / cancel / delete row -->
<div style="display:flex;gap:10px;align-items:center">
<span class="skeleton skeleton-xl skeleton-pill" style="width:110px"></span>
<span class="skeleton skeleton-xl skeleton-pill skeleton-soft" style="width:90px"></span>
<span class="skeleton skeleton-xl skeleton-pill skeleton-soft" style="width:90px;margin-left:auto"></span>
</div>
</div>
<div class="skeleton-stat">
<span class="skeleton skeleton-stat-icon"></span>
<span class="skeleton skeleton-stat-value"></span>
<span class="skeleton skeleton-stat-label"></span>
</div>
</div>
<span class="skeleton skeleton-gallery-item"></span>
<span class="skeleton skeleton-gallery-item"></span>
<!-- repeat per image -->
</div>
<span class="skeleton skeleton-detail-img"></span>
<div class="skeleton-detail-info">
<span class="skeleton skeleton-lg skeleton-3/4"></span>
<span class="skeleton skeleton-md skeleton-full"></span>
<span class="skeleton skeleton-xl skeleton-1/3"></span>
</div>
</div>
_animations.css. Three categories: Loop (always-on), Hover-triggered (CSS :hover), Scroll-triggered (IntersectionObserver via njx.js). Combine with .anim-fast, .anim-slow, .anim-delay-* modifiers.
<div class="animate-fade-in">Fade in</div>
<div class="animate-fade-in-up">From below</div>
<div class="animate-fade-in-down">From above</div>
<div class="animate-fade-in-left">From left</div>
<div class="animate-fade-in-right">From right</div>
<!-- Combine with delay + speed -->
<div class="animate-fade-in-up anim-delay-3 anim-slow">...</div>
<div class="animate-float">Gentle levitation</div>
<div class="animate-float-big">Wide arc float</div>
<div class="animate-bounce">Bouncing loop</div>
<!-- One-shot entrance -->
<div class="animate-bounce-in">Bounce in</div>
<div class="animate-scale-in">Scale from 0</div>
:hover. No JS needed. <div class="animate-spin-y">3D flip Y</div>
<div class="animate-spin-x">3D flip X</div>
<div class="animate-spin-ccw">Counter-clockwise</div>
<div class="animate-spin-bounce">Spin + bounce</div>
<div class="animate-spin-wobble">Wobble</div>
<div class="animate-spin-180">Half turn</div>
<div class="animate-spin-swing">Pendulum</div>
<div class="animate-spin-rock">Rock</div>
<div class="animate-spin-tilt">Tilt 45°</div>
<div class="animate-spin-yoyo">Yoyo</div>
<!-- Loop -->
<svg class="animate-spin">...</svg>
<div class="animate-spin-slow"></div>
<div class="animate-spin-fade"></div>
<div class="animate-shake">Horizontal shake</div>
<div class="animate-shake-y">Vertical shake</div>
<div class="animate-buzz">Buzz / jitter</div>
<div class="animate-tada">Celebration!</div>
<div class="animate-rubber">Stretch</div>
<!-- JS replay -->
el.classList.remove("animate-shake");
void el.offsetWidth;
el.classList.add("animate-shake");
<div class="animate-pulse"></div>
<div class="animate-scale-big"></div>
<!-- Border glow -->
<div class="animate-border-pulse"></div>
<!-- Skeleton shimmer -->
<div class="animate-shimmer" style="height:16px;border-radius:4px"></div>
<h2 class="animate-neon-accent" style="color:var(--color-accent)">Accent</h2>
<h2 class="animate-neon-success" style="color:var(--color-success)">Success</h2>
<h2 class="animate-neon-error" style="color:var(--color-error)">Error</h2>
<h2 class="animate-neon-warning" style="color:var(--color-warning)">Warning</h2>
<h2 class="animate-rainbow-primary">Primary</h2>
<h2 class="animate-rainbow-accent">Accent</h2>
<h2 class="animate-rainbow-success">Success</h2>
<h2 class="animate-rainbow-error">Error</h2>
<h2 class="animate-rainbow-warning">Warning</h2>
<h2 class="animate-breathe-primary" style="color:var(--color-primary)">Primary</h2>
<h2 class="animate-breathe-accent" style="color:var(--color-accent)">Accent</h2>
<h2 class="animate-breathe-success" style="color:var(--color-success)">Success</h2>
<h2 class="animate-breathe-error" style="color:var(--color-error)">Error</h2>
<h2 class="animate-breathe-warning" style="color:var(--color-warning)">Warning</h2>
primary theme color
accent color
expanding ring
static white glow
static primary glow
<div class="animate-glow">Primary glow</div>
<div class="animate-glow-accent">Accent glow</div>
<!-- Expanding border ring -->
<div class="animate-border-pulse"></div>
<!-- Static shadow utilities -->
<div class="shadow-neon">White neon</div>
<div class="shadow-neon-primary">Theme glow</div>
<div class="animate-border-pulse"></div>
<div class="animate-border-pulse-primary"></div>
<div class="animate-border-pulse-accent"></div>
<div class="animate-border-pulse-success"></div>
<div class="animate-border-pulse-error"></div>
<div class="animate-border-pulse-warning"></div>
<div class="animate-spin anim-fast"></div>
<div class="animate-spin anim-slow"></div>
<!-- Staggered entrance -->
<div class="animate-fade-in-up anim-delay-1">Item 1</div>
<div class="animate-fade-in-up anim-delay-3">Item 2</div>
<div class="animate-fade-in-up anim-delay-5">Item 3</div>
<!-- Pause / remove -->
<div class="animate-float anim-paused"></div>
<div class="animate-float anim-none"></div>
njx.js. <div class="scroll-fade-down">From above</div>
<div class="scroll-fade-left">From right</div>
<div class="scroll-fade-right">From left</div>
<div class="scroll-zoom-out">Scales 1.2 → 1</div>
<div class="scroll-flip-left">rotateY from left</div>
<div class="scroll-flip-right">rotateY from right</div>
<div class="scroll-rotate-in">Rotates into view</div>
<!-- Blur to sharp -->
<div class="scroll-blur-in">Unblurs into view</div>
<!-- Springy entrance -->
<div class="scroll-bounce-in">Bounces in</div>
<!-- Drops from above -->
<div class="scroll-drop-in">Drops in</div>
<div class="scroll-stagger" style="display:flex;gap:10px">
<div>Card 1</div>
<div>Card 2</div>
<div>Card 3</div>
</div>
_gradients.css. Ready-made gradients for background
and text.
<div class="gradient-primary">...</div>
<div class="gradient-primary-light">...</div>
<div class="gradient-accent">...</div>
<div class="gradient-success">...</div>
<div class="gradient-blue-purple">...</div>
<div class="gradient-ocean">...</div>
<div class="gradient-sunset">...</div>
<div class="gradient-nature">...</div>
<div class="gradient-gold">...</div>
<div class="gradient-cosmic">...</div>
<div class="gradient-dark-midnight">...</div>
<div class="gradient-dark-void">...</div>
<div class="gradient-dark-blue">...</div>
<div class="gradient-dark-purple">...</div>
.text-gradient-primary
.text-gradient-accent
.text-gradient-blue-purple
.text-gradient-sunset
.text-gradient-ocean
.text-gradient-gold
.text-gradient-cosmic
.text-gradient-rainbow
<h1 class="text-gradient-primary">Primary</h1>
<h1 class="text-gradient-accent">Accent</h1>
<h1 class="text-gradient-blue-purple">Blue Purple</h1>
<h1 class="text-gradient-sunset">Sunset</h1>
<h1 class="text-gradient-ocean">Ocean</h1>
<h1 class="text-gradient-gold">Gold</h1>
<h1 class="text-gradient-cosmic">Cosmic</h1>
<h1 class="text-gradient-rainbow">Rainbow</h1>
<div class="border-gradient-primary">...</div>
<div class="border-gradient-accent">...</div>
<div class="border-gradient-rainbow">...</div>
<div class="border-gradient-gold">...</div>
<div class="gradient-animated">Vivid</div>
<div class="gradient-animated-subtle">Subtle</div>
/* position:relative is required */
<div class="gradient-overlay-dark" style="position:relative">
<div style="position:relative;z-index:1">Over photo</div>
</div>
<div class="gradient-overlay-primary" style="position:relative">...</div>
<div class="gradient-conic">...</div>
<div class="gradient-conic-warm">...</div>
<div class="gradient-conic-cool">...</div>
<div class="gradient-conic-pie">...</div>
<div class="gradient-mesh">...</div>
<div class="gradient-mesh-warm">...</div>
<div class="gradient-mesh-cool">...</div>
<div class="gradient-shimmer" style="height:20px;border-radius:4px"></div>
<div class="gradient-shimmer" style="height:80px;border-radius:8px"></div>
<div class="gradient-horizontal"
style="--gradient-from:#f9063f;--gradient-to:#667eea">...</div>
<div class="gradient-vertical">...</div>
<div class="gradient-diagonal">...</div>
<div class="gradient-radial">...</div>
_hovers.css. Hover your mouse over elements.
<div class="card hover-scale-sm">...</div> /* scale(1.02) */
<div class="card hover-scale">...</div> /* scale(1.04) */
<div class="card hover-scale-lg">...</div> /* scale(1.07) */
<div class="card hover-scale-xl">...</div> /* scale(1.12) */
<div class="card hover-lift-sm">...</div> /* -2px */
<div class="card hover-lift">...</div> /* -4px */
<div class="card hover-lift-lg">...</div> /* -8px */
<div class="card hover-lift-xl">...</div> /* -14px */
<div class="card hover-glow">...</div>
<div class="card hover-glow-accent">...</div>
<div class="card hover-glow-success">...</div>
<div class="card hover-glow-error">...</div>
<div class="card hover-glow-white">...</div>
<div class="card hover-glow-intense">...</div>
<div class="card hover-bright">...</div> /* ×1.15 */
<div class="card hover-bright-strong">...</div> /* ×1.3 */
<div class="card hover-dim">...</div> /* ×0.8 */
<div class="card hover-grayscale">...</div> /* grayscale */
<div class="card hover-opacity-sm">...</div> /* 0.85 */
<div class="card hover-opacity">...</div> /* 0.7 */
<div class="card hover-opacity-lg">...</div> /* 0.5 */
<div class="card hover-fade">...</div> /* 0.3 */
<div class="card hover-border">...</div> /* primary */
<div class="card hover-border-accent">...</div>
<div class="card hover-border-success">...</div>
<div class="card hover-border-glow">...</div> /* + glow */
<div class="card hover-rotate">...</div> /* 3deg */
<div class="card hover-rotate-neg">...</div> /* -3deg */
<div class="card hover-rotate-180">...</div> /* 180deg */
<div class="card hover-rotate-360">...</div> /* 360deg */
<div class="card hover-card">...</div>
<div class="card hover-card-glow">...</div>
<div class="card hover-mega">...</div>
/* Combine */
<div class="card hover-scale hover-glow">...</div>
<button class="btn btn-primary hover-btn">Button</button>
<button class="btn btn-primary hover-btn-press">Press</button>
<button class="btn btn-primary hover-btn-glow">Glow</button>
/* hover-shimmer requires overflow:hidden */
<button class="btn btn-outline hover-shimmer" style="position:relative;overflow:hidden">Shimmer</button>
<div class="card hover-pulse">...</div>
/* hover-shimmer: overflow:hidden needed */
<div class="card hover-shimmer" style="position:relative;overflow:hidden">...</div>
<div class="card hover-backdrop-blur">...</div>
<div class="card hover-gradient">...</div>
<a class="hover-underline-animated">About</a>
/* underline expands from center */
<a class="hover-underline-center">Contact</a>
/* strikethrough line on hover */
<a class="hover-strikethrough">Old price</a>
/* text color shift */
<a class="hover-primary">Link</a>
<a class="hover-accent">Link</a>
<div class="hover-fill">Primary</div>
<div class="hover-fill hover-fill-accent">Accent</div>
/* instant bg fill */
<div class="hover-primary-bg">...</div>
<div class="hover-accent-bg">...</div>
<div class="card hover-tilt">...</div>
<!-- tilt right -->
<div class="card hover-tilt hover-tilt-r">...</div>
<a class="hover-border-draw" href="#">Nav link</a>
<div class="card hover-border-draw">...</div>
<button class="btn btn-ghost hover-border-draw">...</button>
<div class="hover-zoom">
<img src="photo.jpg">
</div>
<div class="hover-zoom-sm"><img></div> /* ×1.05 */
<div class="hover-zoom-lg"><img></div> /* ×1.15 */
<div class="hover-zoom-out"><img></div> /* ×0.95 */
<img class="hover-grayscale" src="..."> /* gray→color */
<img class="hover-sepia" src="...">
<img class="hover-invert" src="...">
<img class="hover-bright-strong" src="...">
<img class="hover-blur" src="...">
data-tip attribute — works on any element.
No JS, no wrappers.
<button data-tip="Tooltip on top">Top</button>
<button data-tip="Tooltip on bottom" data-tip-pos="bottom">Bottom</button>
<button data-tip="Tooltip on left" data-tip-pos="left">Left</button>
<button data-tip="Tooltip on right" data-tip-pos="right">Right</button>
<button data-tip="Default bubble">Default</button>
<button data-tip="Primary" data-tip-color="primary">...</button>
<button data-tip="Success!" data-tip-color="success">...</button>
<button data-tip="Caution" data-tip-color="warning">...</button>
<button data-tip="Danger!" data-tip-color="danger">...</button>
<span data-tip="Plain text tooltip">Hover me</span>
<span class="tag tag-primary" data-tip=".tag-primary">tag</span>
<img data-tip="Image tooltip" src="..." />
<div data-tip="var(--color-primary)"
data-tip-color="primary"></div>
_buttons.css. Base: .btn + variant.
<button class="btn btn-primary">Primary</button>
<button class="btn btn-accent">Accent</button>
<button class="btn btn-success">Success</button>
<button class="btn btn-error">Error</button>
<button class="btn btn-warning">Warning</button>
<button class="btn btn-outline-accent">Accent</button>
<button class="btn btn-outline-success">Success</button>
<button class="btn btn-outline-error">Error</button>
<button class="btn btn-outline-warning">Warning</button>
<button class="btn btn-outline-white">White</button>
<button class="btn btn-ghost-primary">Primary</button>
<button class="btn btn-ghost-accent">Accent</button>
<button class="btn btn-ghost-success">Success</button>
<button class="btn btn-ghost-error">Error</button>
<button class="btn btn-ghost-warning">Warning</button>
<button class="btn btn-soft-primary">Primary</button>
<button class="btn btn-soft-accent">Accent</button>
<button class="btn btn-soft-success">Success</button>
<button class="btn btn-soft-error">Delete</button>
<button class="btn btn-soft-warning">Warning</button>
<button class="btn btn-soft-info">Info</button>
<a class="link-btn link-btn-accent">Accent</a>
<a class="link-btn link-btn-success">Success</a>
<a class="link-btn link-btn-error">Error</a>
<a class="link-btn link-btn-warning">Warning</a>
<a class="link-btn link-btn-dark">Dark</a>
<a class="link-btn link-btn-light">Light</a>
<a class="link-btn link-btn-outline-accent">Accent</a>
<a class="link-btn link-btn-outline-success">Success</a>
<a class="link-btn link-btn-outline-error">Error</a>
<a class="link-btn link-btn-outline-warning">Warning</a>
<a class="link-btn link-btn-outline-dark">Dark</a>
<a class="link-btn link-btn-outline-light">Light</a>
<a class="link-btn link-btn-ghost-accent">Accent</a>
<a class="link-btn link-btn-ghost-success">Success</a>
<a class="link-btn link-btn-ghost-error">Error</a>
<a class="link-btn link-btn-ghost-warning">Warning</a>
<a class="link-btn link-btn-ghost-dark">Dark</a>
<a class="link-btn link-btn-ghost-light">Light</a>
<a class="link-btn link-btn-primary link-btn-sm">Small</a>
<!-- With arrow -->
<a class="link-btn link-arrow">With arrow</a>
<a class="link-btn link-btn-primary link-arrow">Filled + arrow</a>
<button class="btn btn-primary btn-xs">XS</button>
<button class="btn btn-primary btn-sm">SM</button>
<button class="btn btn-primary">MD (default)</button>
<button class="btn btn-primary btn-lg">LG</button>
<button class="btn btn-primary btn-xl">XL</button>
<button class="btn btn-glow-primary">Glow Primary</button>
<button class="btn btn-glow-accent">Glow Accent</button>
<button class="btn btn-gradient btn-gradient-primary-accent">Primary Accent</button>
<button class="btn btn-gradient btn-gradient-primary-success">Primary Success</button>
<button class="btn btn-gradient btn-gradient-accent-warning">Accent Warning</button>
<button class="btn btn-outline-gradient btn-outline-gradient-primary">Primary</button>
<button class="btn btn-outline-gradient btn-outline-gradient-accent">Accent</button>
<button class="btn btn-outline-gradient btn-outline-gradient-error">Error</button>
<!-- Two-colour shimmer -->
<button class="btn btn-outline-gradient btn-outline-gradient-fire">Fire</button>
<button class="btn btn-outline-gradient btn-outline-gradient-ocean">Ocean</button>
<button class="btn btn-outline-gradient btn-outline-gradient-nature">Nature</button>
<button class="btn btn-gradient-hover btn-gradient-hover-primary">Primary</button>
<button class="btn btn-gradient-hover btn-gradient-hover-fire">Fire</button>
<button class="btn btn-gradient-hover btn-gradient-hover-ocean">Ocean</button>
<button class="btn btn-gradient-hover btn-gradient-hover-nature">Nature</button>
<button class="btn btn-shine btn-shine-primary">Primary</button>
<button class="btn btn-shine btn-shine-fire">Fire</button>
<button class="btn btn-shine btn-shine-ocean">Ocean</button>
<button class="btn btn-shine btn-shine-nature">Nature</button>
<button class="btn btn-aura btn-aura-sunset">Sunset</button>
<button class="btn btn-aura btn-aura-aurora">Aurora</button>
<button class="btn btn-aura btn-aura-cosmic">Cosmic</button>
<button class="btn btn-aura btn-aura-candy">Candy</button>
<button class="btn btn-aura btn-aura-gold">Gold</button>
<button class="btn btn-aura btn-aura-ice">Ice</button>
<button class="btn btn-rainbow-pastel">Pastel</button>
<button class="btn btn-animated-fire">Fire</button>
<button class="btn btn-animated-ocean">Ocean</button>
<button class="btn btn-animated-aurora">Aurora</button>
<button class="btn btn-animated-candy">Candy</button>
<button class="btn btn-glow-hover">Rainbow</button>
<button class="btn btn-glow-hover btn-glow-hover-fire">Fire</button>
<button class="btn btn-glow-hover btn-glow-hover-ocean">Ocean</button>
<button class="btn btn-glow-hover btn-glow-hover-aurora">Aurora</button>
<button class="btn btn-glow-hover btn-glow-hover-sunset">Sunset</button>
<button class="btn btn-glow-hover btn-glow-hover-gold">Gold</button>
<button class="btn btn-primary btn-icon btn-xs"><svg>...</svg></button>
<button class="btn btn-primary btn-icon btn-sm"><svg>...</svg></button>
<button class="btn btn-primary btn-icon"><svg>...</svg></button>
/* .btn-square — removes pill radius */
<button class="btn btn-ghost btn-icon btn-square"><svg>...</svg></button>
/* Icon + Label */
<button class="btn btn-success">
<svg>...</svg> Download
</button>
<div class="btn-group">
<button class="btn btn-primary btn-sm">Left</button>
<button class="btn btn-primary btn-sm">Center</button>
<button class="btn btn-primary btn-sm">Right</button>
</div>
<button class="btn btn-primary btn-loading">Loading</button>
<button class="btn btn-accent btn-loading btn-sm">Loading</button>
/* Disabled */
<button class="btn btn-primary" disabled>Disabled</button>
<button class="btn btn-error is-disabled">is-disabled</button>
<button class="btn btn-glass">Glass</button>
<!-- Neon: glowing border + text-shadow -->
<button class="btn btn-neon">Neon</button>
<button class="btn btn-neon btn-lg">Neon Large</button>
<!-- Glow: solid + shadow pulse -->
<button class="btn btn-glow-primary">Glow Primary</button>
<button class="btn btn-3d">Primary 3D</button>
<button class="btn btn-3d-success">Success 3D</button>
<button class="btn btn-3d-error">Danger 3D</button>
<button class="btn btn-3d btn-lg">Large 3D</button>
<span class="btn-badge-wrap">
<button class="btn btn-primary btn-sm">Inbox</button>
<span class="btn-count">5</span>
</span>
<!-- Dot only (no number) -->
<span class="btn-badge-wrap">
<button class="btn btn-ghost btn-icon">...</button>
<span class="btn-dot"></span>
</span>
_cards.css.<div class="card">Basic card</div>
<div class="card-glass">Glassmorphism</div>
<div class="card-dark">Dark</div>
<div class="card-bordered">With border</div>
<div class="card-bordered-primary">Primary border</div>
<div class="card-glow">Glow effect</div>
<div class="card-gradient">Gradient</div>
card-bg-*card-bg-primary card-bg-accent card-bg-success card-bg-error card-bg-warning card-bg-dark card-bg-light <div class="card-bg-primary">…</div> <div class="card-bg-accent">…</div> <div class="card-bg-success">…</div> <div class="card-bg-error">…</div> <div class="card-bg-warning">…</div> <div class="card-bg-dark">…</div> <div class="card-bg-light">…</div>
<img class="card-media-img" src="photo.jpg">
<div class="card-media-body">
<div class="card-media-label">Category</div>
<div class="card-media-title">Title</div>
<div class="card-media-text">Text</div>
</div>
</div>
<div class="card-cover-bg" style="background-image:url(photo.jpg)"></div>
<div class="card-cover-body">
<div class="card-cover-label">Category</div>
<div class="card-cover-title">Title</div>
</div>
</div>
<div class="card-gradient-sunset">...</div>
<div class="card-gradient-ocean">...</div>
<div class="card-gradient-emerald">...</div>
<div class="card-gradient-fire">...</div>
<div class="card-shadow-md">...</div>
<div class="card-shadow-lg">...</div>
<div class="card-shadow-primary">...</div>
<div class="card-shadow-accent">...</div>
<div class="card-h-img">🚀</div>
<div class="card-h-body">
<div class="card-h-title">Title</div>
<div class="card-h-text">Text</div>
</div>
</div>
<div class="card-stat-icon">📦</div>
<div class="card-stat-value">12,480</div>
<div class="card-stat-label">Total orders</div>
<div class="card-stat-trend up">▲ 14.2%</div>
</div>
card-gradient-hover-*card-gradient-hover-primary card-gradient-hover-accent card-gradient-hover-success card-gradient-hover-fire card-gradient-hover-ocean card-gradient-hover-sunset card-gradient-hover-aurora card-gradient-hover-error /* gradient appears smoothly on hover */ <div class="card-gradient-hover card-gradient-hover-primary">…</div> <div class="card-gradient-hover card-gradient-hover-accent">…</div> <div class="card-gradient-hover card-gradient-hover-fire">…</div> <div class="card-gradient-hover card-gradient-hover-ocean">…</div> <div class="card-gradient-hover card-gradient-hover-sunset">…</div> <div class="card-gradient-hover card-gradient-hover-aurora">…</div>
card-shine-*card-shine-primary card-shine-accent card-shine-fire card-shine-ocean card-shine-sunset card-shine-aurora card-shine-cosmic /* gradient bg + shine sweep on hover */ <div class="card-shine card-shine-primary">…</div> <div class="card-shine card-shine-fire">…</div> <div class="card-shine card-shine-ocean">…</div> <div class="card-shine card-shine-sunset">…</div> <div class="card-shine card-shine-aurora">…</div> <div class="card-shine card-shine-cosmic">…</div>
card-outline-gradient-*card-outline-gradient-primary card-outline-gradient-accent card-outline-gradient-fire card-outline-gradient-ocean card-outline-gradient-sunset card-outline-gradient-aurora card-outline-gradient-cosmic /* animated gradient border, transparent bg */ <div class="card-outline-gradient card-outline-gradient-primary">…</div> <div class="card-outline-gradient card-outline-gradient-fire">…</div> <div class="card-outline-gradient card-outline-gradient-ocean">…</div> <div class="card-outline-gradient card-outline-gradient-sunset">…</div> <div class="card-outline-gradient card-outline-gradient-aurora">…</div> <div class="card-outline-gradient card-outline-gradient-cosmic">…</div>
card-aura-*card-aura-primary card-aura-sunset card-aura-aurora card-aura-cosmic card-aura-gold card-aura-ocean /* hover triggers glowing aura behind the card */ <div class="card-aura card-aura-primary">…</div> <div class="card-aura card-aura-sunset">…</div> <div class="card-aura card-aura-aurora">…</div> <div class="card-aura card-aura-cosmic">…</div> <div class="card-aura card-aura-gold">…</div> <div class="card-aura card-aura-ocean">…</div>
Card content. Description text.
<div class="card-header">
<div class="card-header-title">Title</div>
</div>
<div class="card-content">
<p>Card content</p>
</div>
<div class="card-footer">
<a class="card-footer-item">Save</a>
<a class="card-footer-item text-error">Delete</a>
</div>
</div>
_tags.css. Tags, badges, dots.<span class="tag">default</span>
<span class="tag tag-primary">primary</span>
<span class="tag tag-accent">accent</span>
<span class="tag tag-success">success</span>
<span class="tag tag-error">error</span>
<span class="tag tag-warning">warning</span>
<span class="tag tag-white">white</span>
<span class="tag">default</span>
<span class="tag tag-primary">primary</span>
<span class="tag tag-accent">accent</span>
<span class="tag tag-success">success</span>
<span class="tag tag-error">error</span>
/* filled variants */
<span class="tag tag-filled-primary">filled-primary</span>
<span class="tag tag-filled-success">filled-success</span>
<span class="tag tag-filled-dark">filled-dark</span>
<span class="badge">5</span>
<span class="badge badge-primary">99</span>
<span class="badge badge-success">OK</span>
<span class="badge badge-error">!</span>
/* Dots (status indicators) */
<span class="dot dot-online"></span>
<span class="dot dot-offline"></span>
<span class="dot dot-primary"></span>
.inp, .field, .inp-success,
.inp-error, .float-field, .inp-wrap. All via CSS variables.
<input class="inp inp-sm" type="text" placeholder="Small">
<input class="inp" type="text" placeholder="Default">
<input class="inp inp-lg" type="text" placeholder="Large">
<div class="field">
<div class="field-label">Email</div>
<input class="inp inp-success" type="text">
<div class="field-success-msg">✓ Valid</div>
</div>
<div class="field">
<input class="inp inp-error">
<div class="field-error-msg">✕ Error</div>
</div>
<input class="inp" disabled>
<div class="inp-wrap">
<span class="inp-icon-left">🔍</span>
<input class="inp" type="text" placeholder="Search...">
</div>
/* right icon — add .inp-suffix to input */
<div class="inp-wrap">
<span class="inp-icon-left">🔒</span>
<input class="inp inp-suffix" type="password">
<span class="inp-icon-right">👁</span>
</div>
<div class="float-field">
<input class="inp" type="text" placeholder=" " id="f1">
<label class="float-label" for="f1">Username</label>
</div>
<input class="inp inp-glass" type="text" placeholder="Glass input">
<select class="inp inp-glass inp-select">
<option>Choose option</option>
</select>
<textarea class="inp inp-glass inp-area"></textarea>
<label class="check"><input type="checkbox" checked> Primary</label>
<label class="check is-success"><input type="checkbox" checked> Success</label>
<label class="check is-error"><input type="checkbox"> Error</label>
/* Toggle: toggle-track + toggle-label are required */
<label class="toggle">
<input type="checkbox" checked>
<span class="toggle-track"></span>
<span class="toggle-label">Toggle ON</span>
</label>
<div class="form-card is-primary">
<div class="form-card-title">🔐 Sign In</div>
<div class="field">
<div class="field-label">Email</div>
<div class="inp-wrap">
<span class="inp-icon-left">✉️</span>
<input class="inp inp-primary" type="email">
</div>
</div>
<button class="btn btn-primary">Login</button>
</div>
<div style="display:flex;border-radius:12px;overflow:hidden;border:2px solid var(--lib-comp-brd)">
<input type="text" class="inp" style="flex:1;border:none;border-radius:0">
<button class="btn btn-primary" style="border-radius:0">🔍 Find</button>
</div>
/* with prefix */
<div style="display:flex;border-radius:12px;overflow:hidden;border:2px solid var(--lib-comp-brd)">
<span style="padding:0 16px;display:flex;align-items:center;color:var(--color-primary);font-weight:700">https://</span>
<input type="url" class="inp" style="flex:1;border:none;border-radius:0">
</div>
<label class="check">
<input type="checkbox" checked>
<span>💻 Development</span>
</label>
/* Radio */
<label class="check">
<input type="radio" name="plan" checked>
<span>💳 Bank card</span>
</label>
/* Toggle */
<label class="toggle">
<input type="checkbox" checked>
<span class="toggle-track"></span>
<span class="toggle-label">Notifications</span>
</label>
_notifications.css.<progress class="progress is-primary" value="70" max="100"></progress>
<progress class="progress is-success is-large" value="90" max="100"></progress>
/* progress-bar custom: with animation */
<div class="progress-bar">
<div class="progress-bar-fill" style="width:65%"></div>
</div>
<div class="progress-bar">
<div class="progress-bar-fill is-gradient is-animated" style="width:80%"></div>
</div>
_table.css.| Name | Role | Status | |
|---|---|---|---|
| Alex | [email protected] | Admin | Active |
| Maria | [email protected] | User | Pending |
| Ivan | [email protected] | Editor | Banned |
| Olga | [email protected] | User | Active |
<div class="table-container">
<table class="table is-striped is-hoverable">
<thead><tr>
<th>Name</th><th>Email</th><th>Status</th>
</tr></thead>
<tbody>
<tr><td>Alex</td><td>...</td></tr>
<tr class="is-selected">...</tr> /* selected row */
</tbody>
</table>
</div>
_breadcrumb.css.<nav class="breadcrumb">
<li><a href="#">Home</a></li>
<li><a href="#">Category</a></li>
<li class="is-active"><span>Page</span></li>
</nav>
<nav class="breadcrumb has-arrow-separator">...</nav> /* arrows */
_breadcrumb.css.<a class="pagination-prev">← Back</a>
<span class="pagination-item">1</span>
<span class="pagination-item is-current">2</span>
<span class="pagination-ellipsis">…</span>
<a class="pagination-next">Forward →</a>
_breadcrumb.css. Color variants: is-primary is-success is-warning is-danger.
<div class="panel-heading">Title</div>
<a class="panel-block is-active">...</a>
</div>
<a class="is-active">All</a>
<a>Public</a>
</div>
<div class="panel-search">
<input type="text" placeholder="Search…">
</div>
<!-- badge -->
<span class="panel-block-badge">Admin</span>
<!-- footer -->
<div class="panel-footer">...</div>
<input type="checkbox" checked> Dark mode
<span class="panel-block-meta">enabled</span>
</label>
<span class="panel-icon">💬</span> Messages
<span class="panel-block-badge">12</span>
</a>
<span class="panel-avatar">AJ</span>
Alice Johnson
<span class="panel-block-meta">32 commits</span>
</a>
_links.css. Inline links, color variants, animated
underline and block link cards. Link buttons — see
Buttons ↗.
<a class="link link-primary">Primary</a>
<a class="link link-muted">Muted</a>
<a class="link link-success">Success</a>
<a class="link link-danger">Danger</a>
<a class="link link-slide">Slide on hover</a>
<a class="link link-plain">No underline</a>
<a class="link link-arrow link-primary">View all</a>
<a class="link link-external">GitHub</a>
<a class="link link-external link-muted">Docs</a>
<div class="link-card-icon">📄</div>
<div class="link-card-body">
<div class="link-card-title">Documentation</div>
<div class="link-card-desc">Full API reference</div>
</div>
<span class="link-card-arrow">→</span>
</a>
<a href="#" class="is-active">Dashboard</a>
<a href="#">Profile</a>
<a href="#">Settings</a>
</div>
_sections.css. Containers and wrappers for layouts.
<div class="container"> /* max-width: 1280px */
Content
</div>
<div class="container-sm"> /* max-width: 640px */
Content
</div>
<div class="container-fluid"> /* 100% width */
Content
</div>
<section class="section"> /* padding: 64px 0 */
<div class="container">...</div>
</section>
<section class="section section-sm"> /* padding: 32px 0 */
<div class="container">...</div>
</section>
<section class="section section-lg"> /* padding: 96px 0 */
<div class="container">...</div>
</section>
<div class="container">...</div>
</section>
<div class="list-items-row">...</div>
<li><a href="#" aria-label="GitHub"><svg ...></a></li>
<li><a href="#" aria-label="Twitter"><svg ...></a></li>
</ul>
<li><a href="#"><svg> GitHub</a></li>
</ul>
<li><a data-net="github">...</a></li>
<li><a data-net="twitter">...</a></li>
</ul>
<img class="agent" src="...">
_tab.css. Variants: underline (default),
.tab-nav-pills, .tab-nav-boxed, .tab-nav-card. Modifiers:
.is-full, .tab-nav-sm, .tab-nav-lg.
JS: tabSwitch(btn).
<link> tag — no build step required.
_links.css, new collapse
variants, improved tab system.
<div class="tab-nav">
<button class="tab-btn is-active" onclick="tabSwitch(this)">Tab 1</button>
<button class="tab-btn" onclick="tabSwitch(this)">Tab 2</button>
</div>
<div class="tab-content">
<div class="tab-panel is-active">Content 1</div>
<div class="tab-panel">Content 2</div>
</div>
</div>
<button class="tab-btn is-active" onclick="tabSwitch(this)">Daily</button>
<button class="tab-btn" onclick="tabSwitch(this)">Weekly</button>
<button class="tab-btn" onclick="tabSwitch(this)">Monthly</button>
</div>
<div class="tab-wrap">...</div> .tab-nav { display: flex; } function tabSwitch(btn) { ... } <div class="tab-content tab-content-bordered">...</div>
<!DOCTYPE html><html data-theme="dark">... @import "_base.css"; @import "_buttons.css"; document.addEventListener('DOMContentLoaded', init); <button class="tab-btn is-active" onclick="tabSwitch(this)">index.html</button>
<button class="tab-btn" onclick="tabSwitch(this)">style.css</button>
</div>
<div class="tab-nav is-full">
<button class="tab-btn is-active" onclick="tabSwitch(this)">
Inbox <span class="tab-badge">4</span>
</button>
</div>
<div class="tab-nav">...</div>
<div class="tab-nav tab-nav-lg">...</div>
_collapse.css. Supports native <details>
and JS class .is-open. Variants: .collapse-plus .collapse-ghost .collapse-primary. Wrappers: .accordion .accordion-flush.
What is njX?
data-theme on the <html> element.No build step required?
<link> tag. No npm, no webpack, no
PostCSS config. Works in any environment.Can I customise the theme?
--color-primary and other CSS variables in your own
:root block. All components update automatically.
<summary class="collapse-header">
Title <span class="collapse-icon"></span>
</summary>
<div class="collapse-body">Content goes here.</div>
</details>
.is-open to the .collapse element to expand it.
Remove to collapse. Use any event — click, hover, programmatic..is-open to the wrapper div in HTML. No JS
needed at load time.<div class="collapse-header" onclick="collapseToggle(this)">
Title <span class="collapse-icon"></span>
</div>
<div class="collapse-body">Content</div>
</div>
<script>
function collapseToggle(header) {
header.closest('.collapse').classList.toggle('is-open');
}
</script>
Plus/minus icon
.collapse-plus — shows a + that morphs into — when open.
Ghost (no border)
.collapse-ghost — transparent background and border. Great
inside cards or sidebars.Primary accent
.collapse-primary — tinted border and header that matches
your theme's primary color.<details class="collapse collapse-plus">...</details>
<!-- Ghost (transparent) -->
<details class="collapse collapse-ghost">...</details>
<!-- Primary accent -->
<details class="collapse collapse-primary">...</details>
Section A
.accordion wrapper adds 6px gap
between items.Section B (open)
Section C
<details class="collapse">
<summary class="collapse-header">Section A <span class="collapse-icon"></span></summary>
<div class="collapse-body">Content A</div>
</details>
<details class="collapse">
<summary class="collapse-header">Section B <span class="collapse-icon"></span></summary>
<div class="collapse-body">Content B</div>
</details>
</div>
Feature overview
.accordion-flush wrapper removes individual borders and
joins all items into one bordered block with dividers between them.Installation
<link> tag — that's it. No npm, no build tools. Works
offline too.Browser support
color-mix() which requires Chrome
111+, Firefox 113+, Safari 16.2+.Customisation
:root or any parent element. Scoped
theming is fully supported.<details class="collapse">
<summary class="collapse-header">Item 1 <span class="collapse-icon"></span></summary>
<div class="collapse-body">Content</div>
</details>
<details class="collapse">
<summary class="collapse-header">Item 2 <span class="collapse-icon"></span></summary>
<div class="collapse-body">Content</div>
</details>
</div>
_dropdown.css. Native <details> or JS
dropdownToggle(). Positions: .dropdown-right .dropdown-top .dropdown-center. Variants: .dropdown-primary .dropdown-dark.
Menu
Actions
<summary class="dropdown-trigger btn btn-ghost btn-sm">
Menu <span class="dropdown-arrow"></span>
</summary>
<div class="dropdown-menu">
<div class="dropdown-label">Section</div>
<a class="dropdown-item">Item</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item is-danger">Delete</a>
</div>
</details>
Left (default)
Center
Right
<details class="dropdown dropdown-center">... <!-- center -->
<details class="dropdown dropdown-right">... <!-- right -->
<details class="dropdown dropdown-top">... <!-- upward -->
Primary
Dark menu
<details class="dropdown dropdown-primary">...</details>
<!-- Dark — always dark menu -->
<details class="dropdown dropdown-dark">...</details>
<button onclick="dropdownToggle(this.parentElement)">
Menu <span class="dropdown-arrow"></span>
</button>
<div class="dropdown-menu">...</div>
</div>
_popups.css. Variant is set on .lib-modal-box — the overlay is automatically colored via :has(). Close
— Escape or click the overlay.
<div class="lib-modal-overlay" id="my-modal">
<div class="lib-modal-box is-success">
<button class="lib-modal-close">✕</button>
<div class="lib-modal-icon-wrap">✅</div>
<div class="lib-modal-title">Success!</div>
<div class="lib-modal-text">Description.</div>
<div class="lib-modal-actions">
<button class="btn btn-success btn-sm">Great!</button>
</div>
</div>
</div>
<div class="lib-modal-box is-sm">...</div>
<!-- Large: max-width 620px -->
<div class="lib-modal-box is-lg">...</div>
<!-- Combine size + color -->
<div class="lib-modal-box is-sm is-primary">...</div>
<button class="btn btn-error btn-sm">Delete permanently</button>
<button class="btn btn-warning btn-sm">Archive instead</button>
<button class="btn btn-ghost btn-sm">Cancel</button>
</div>
<div class="lib-modal-box is-primary">
<div class="lib-modal-icon-wrap">📝</div>
<div class="lib-modal-title">Send a message</div>
<!-- form fields -->
<input type="text" placeholder="Your name" />
<textarea placeholder="Your message..."></textarea>
<div class="lib-modal-divider"></div>
<div class="lib-modal-actions">
<button class="btn btn-primary btn-sm">Send</button>
<button class="btn btn-ghost btn-sm">Cancel</button>
</div>
</div>
<button onclick="openModal('my-modal')">Open</button>
<!-- Modal (place anywhere in body) -->
<div id="my-modal" class="lib-modal-overlay"
onclick="if(event.target===this)closeModal(this)">
<div class="lib-modal-box is-primary">
<button class="lib-modal-close">✕</button>
<div class="lib-modal-icon-wrap">🔷</div>
<div class="lib-modal-title">Title here</div>
<div class="lib-modal-text">Description text.</div>
<div class="lib-modal-divider"></div>
<div class="lib-modal-actions">
<button class="btn btn-primary btn-sm">Confirm</button>
<button class="btn btn-ghost btn-sm">Cancel</button>
</div>
</div>
</div>
<div id="modal-1" class="lib-modal-overlay" onclick="if(event.target===this)closeModal(this)">
<div class="lib-modal-box is-success">
<button class="lib-modal-close">✕</button>
<div class="lib-modal-icon-wrap">✅</div>
<div class="lib-modal-title">Success!</div>
<div class="lib-modal-text">Description of the action or result.</div>
<div class="lib-modal-actions">
<button class="btn btn-success btn-sm">Confirm</button>
<button class="btn btn-ghost btn-sm">Cancel</button>
</div>
</div>
</div>
<!-- Size: is-sm (340px) · is-lg (620px) -->
<div class="lib-modal-box is-sm">...</div>
<div class="lib-modal-box is-lg">...</div>
<!-- Stacked actions -->
<div class="lib-modal-box is-column">
<div class="lib-modal-actions">
<button class="btn btn-primary btn-sm">Option A</button>
<button class="btn btn-ghost btn-sm">Option B</button>
</div>
</div>
<!-- Form inside -->
<div class="lib-modal-box">
<div class="lib-modal-title">Edit profile</div>
<form style="display:flex;flex-direction:column;gap:12px;margin-top:16px">
<input class="inp" type="text" placeholder="Name">
<input class="inp" type="email" placeholder="Email">
<div class="lib-modal-actions">
<button class="btn btn-primary btn-sm">Save</button>
<button class="btn btn-ghost btn-sm">Cancel</button>
</div>
</form>
</div>
sidebarOpen(id) / sidebarClose(id) / sidebarToggle(id).
<button class="btn btn-primary" onclick="sidebarOpen('my-sidebar')">Open</button>
<!-- Backdrop -->
<div class="sidebar-backdrop" id="my-sidebar-backdrop" onclick="sidebarClose('my-sidebar')"></div>
<aside class="sidebar" id="my-sidebar">
<div class="sidebar-header">...</div>
<div class="sidebar-body">...</div>
</aside>
...
</aside>
<div class="sidebar-layout">
<aside class="sidebar sidebar-push" id="push-sidebar">...</aside>
<div class="sidebar-content">...</div>
</div>
<div class="sidebar-header">...</div>
<div class="sidebar-body">...</div>
</aside>
<div class="sidebar-content"><!-- page --></div>
<aside class="sidebar sidebar-push sidebar-right" id="right-panel">...</aside>
</div>
<aside class="sidebar sidebar-push sidebar-mini is-open" id="mini-rail">
<!-- wrap text in <span class="sidebar-link-text"> -->
</aside>
<div class="sidebar-content">...</div>
</div>
sidebarExpandToggle('mini-rail') // expand / collapse
...
</aside>
<div class="sidebar-backdrop" id="my-float-backdrop"></div>
sidebarOpen('id') sidebarClose('id') sidebarToggle('id') sidebarExpandToggle('id') sidebarClose('my-sidebar') // close overlay
sidebarToggle('my-sidebar') // toggle open/close
sidebarExpandToggle('mini-rail') // expand/collapse mini
_notifications.css.
njxFireToast("success", "Deployed!", "Your changes are live ✓");
njxFireToast("error", "Error 500", "Server failed to respond");
njxFireToast("warning", "Low storage", "Only 120MB remaining");
njxFireToast("info", "New update", "v1.0.7 is available");
Click any icon to trigger a toast
<div class="njx-notif-item unread" onclick="njxReadNotif(this)">...</div>
</div>
<button class="njx-notif-inline-close" onclick="njxDismissAlert(this)">×</button>
</div>
<div class="njx-msg-dot"></div>
</div>
<div class="notification is-success">
<button class="delete is-small" onclick="this.closest('.notification').style.display='none'"></button>
Completed successfully
</div>
<div class="message-header">Header <button class="delete is-small"></button></div>
<div class="message-body">Message text</div>
</div>
<div class="loader"></div>
<div class="loader loader-accent"></div>
<div class="loader loader-success"></div>
<div class="loader loader-lg"></div>
<div class="loader loader-xl"></div>
JS — sequential prev/next, dots sync, autoplay support.
<div class="scroll-carousel-wrap">
<div class="scroll-carousel">
<div style="min-width:260px">Card 1</div>
<div style="min-width:260px">Card 2</div>
</div>
</div>
<div style="height:170px">Slide 1</div>
<div style="height:170px">Slide 2</div>
<div style="height:170px">Slide 3</div>
</div>
<div class="peek-carousel">
<div style="height:160px">Card 1</div>
<div style="height:160px">Card 2</div>
</div>
</div>
<div style="height:180px">Row 1</div>
<div style="height:180px">Row 2</div>
<div style="height:180px">Row 3</div>
</div>
<div style="position:relative">
<div class="js-carousel">
<div class="js-carousel-track">...</div>
</div>
<button class="js-carousel-btn js-prev">‹</button>
<button class="js-carousel-btn js-next">›</button>
</div>
<div class="js-dots">...</div>
</div>
<div class="js-carousel">
<div class="js-carousel-track">...</div>
<button class="js-carousel-btn js-prev"></button>
<button class="js-carousel-btn js-next"></button>
</div>
<div class="js-dots">...</div>
</div>
<div class="hero-slider-track">
<div class="hero-slider-slide">
<div class="hero-slider-body">
<div class="hero-slider-label">Label</div>
<div class="hero-slider-title">Title</div>
<div class="hero-slider-desc">Desc</div>
</div>
</div>
</div>
<div class="hero-slider-nav">
<button class="hero-slider-btn">‹</button>
<button class="hero-slider-btn">›</button>
</div>
<div class="hero-slider-dots"></div>
<div class="hero-slider-progress"></div>
</div>
<div class="testi-track">
<div class="testi-slide">
<div class="testi-stars">★★★★★</div>
<div class="testi-quote">Text...</div>
<div class="testi-user">...</div>
</div>
</div>
</div>
<div class="testi-controls">
<div class="testi-nav">
<button class="testi-btn">‹</button>
<button class="testi-btn">›</button>
</div>
<div class="testi-counter">1 / 3</div>
</div>
<div class="autoplay-strip">
<div class="autoplay-strip-item">⚡ Buttons</div>
<div class="autoplay-strip-item">🎨 Themes</div>
/* ...duplicate same set for loop... */
</div>
</div>
.scroll-carousel-wrap — fade edges.scroll-carousel — scrollable track.js-carousel-wrap — outer containerdata-autoplay="ms" — autoplay.js-carousel — viewport (overflow:hidden).js-carousel-track — sliding track.js-carousel-btn — arrow button.js-prev / .js-next — direction.js-dots — dot container.js-dot — single dot.is-active — active dot state.carousel-item-sm — 160px.carousel-item-md — 260px.carousel-item-lg — 360px.carousel-item-xl — 480px<div class="scroll-carousel-wrap">
<div class="scroll-carousel">...</div>
</div>
/* 2. JS: arrows outside overflow:hidden */
<div class="js-carousel-wrap">
<div style="position:relative">
<div class="js-carousel">...</div>
<button class="js-carousel-btn js-prev">‹</button>
<button class="js-carousel-btn js-next">›</button>
</div>
<div class="js-dots">...</div>
</div>
/* 3. Autoplay */
<div class="js-carousel-wrap" data-autoplay="3000">...</div>
_social.css. Flexible social icon links — 6 variants with hover effects, brand colors, pills, glass and more.<li><a href="#" aria-label="GitHub">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="Twitter">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="Instagram">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="YouTube">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="Telegram">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="Discord">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="LinkedIn">
<svg ...><path d=.../></svg>
</a></li>
</ul>
<li><a href="#" aria-label="GitHub">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="Telegram">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="Discord">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="Instagram">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="YouTube">
<svg ...><path d=.../></svg>
</a></li>
</ul>
<li><a href="#" aria-label="GitHub">
<svg ...><path d=.../></svg>
GitHub
</a></li>
<li><a href="#" aria-label="Twitter">
<svg ...><path d=.../></svg>
Twitter
</a></li>
<li><a href="#" aria-label="Telegram">
<svg ...><path d=.../></svg>
Telegram
</a></li>
<li><a href="#" aria-label="Discord">
<svg ...><path d=.../></svg>
Discord
</a></li>
<li><a href="#" aria-label="LinkedIn">
<svg ...><path d=.../></svg>
LinkedIn
</a></li>
</ul>
<li><a href="#" aria-label="GitHub" data-net="github">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="Twitter" data-net="twitter">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="Instagram" data-net="instagram">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="YouTube" data-net="youtube">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="Discord" data-net="discord">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="Telegram" data-net="telegram">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="LinkedIn" data-net="linkedin">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="TikTok" data-net="tiktok">
<svg ...><path d=.../></svg>
</a></li>
</ul>
<li><a href="#" aria-label="GitHub">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="Twitter">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="Instagram">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="Discord">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="Telegram">
<svg ...><path d=.../></svg>
</a></li>
</ul>
<li><a href="#" aria-label="GitHub">
<svg ...><path d=.../></svg>
GitHub
</a></li>
<li><a href="#" aria-label="Telegram">
<svg ...><path d=.../></svg>
Telegram
</a></li>
<li><a href="#" aria-label="Discord">
<svg ...><path d=.../></svg>
Discord
</a></li>
<li><a href="#" aria-label="LinkedIn">
<svg ...><path d=.../></svg>
LinkedIn
</a></li>
<li><a href="#" aria-label="YouTube">
<svg ...><path d=.../></svg>
YouTube
</a></li>
</ul>
<li><a href="#" aria-label="GitHub">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="Twitter">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="Discord">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="Telegram">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="Instagram">
<svg ...><path d=.../></svg>
</a></li>
<li><a href="#" aria-label="YouTube">
<svg ...><path d=.../></svg>
</a></li>
</ul>