CoralCSS
A modern, zero-dependency CSS framework with utility-first classes, headless components, and first-class support for modern CSS features.
Features
- Zero Dependencies - No runtime dependencies, just pure TypeScript
- Utility-First - Comprehensive utility classes like Tailwind but with modern CSS features
- Headless Components - Accessible, unstyled UI components (Dialog, Dropdown, Tabs, etc.)
- Modern CSS - First-class support for anchor positioning, container queries, :has(), scroll-driven animations, view transitions
- Plugin Architecture - Micro-kernel design with everything as plugins
- Multiple Presets - Coral (default), Wind (Tailwind-compatible), Mini (minimal), Full (everything)
- Runtime + Build - Works via CDN or build tools (Vite, PostCSS)
- Dark Mode - Built-in dark mode with class, media, or selector strategies
- TypeScript - Full TypeScript support with strict types
Installation
npm install @coral-css/core
# or
pnpm add @coral-css/core
# or
yarn add @coral-css/coreQuick Start
Build Tool Usage (Vite)
// vite.config.ts
import { defineConfig } from 'vite'
import coral from '@coral-css/core/vite'
export default defineConfig({
plugins: [
coral({
darkMode: 'class',
}),
],
})<!-- Import virtual CSS -->
<link rel="stylesheet" href="virtual:coral.css">
<!-- Use utility classes -->
<div class="flex items-center gap-4 p-4 bg-coral-500 text-white rounded-lg">
Hello, CoralCSS!
</div>CDN Usage
<script src="https://unpkg.com/@coral-css/core/dist/cdn.iife.js"></script>
<script>
// CoralCSS auto-initializes and watches for class changes
const coral = window.CoralCSS.getCoralCDN()
</script>Programmatic Usage
import { createCoral, coralPreset } from '@coral-css/core'
const coral = createCoral()
coralPreset().forEach(plugin => coral.use(plugin))
const css = coral.generate(['flex', 'items-center', 'p-4', 'bg-coral-500'])
console.log(css)Utility Classes
CoralCSS provides thousands of utility classes covering:
Layout
flex,grid,block,inline,hiddenitems-center,justify-between,gap-4container,mx-auto,px-4
Spacing
p-{0-96},m-{0-96},gap-{0-96}px-4,py-2,mt-4,mb-8- Negative values:
-mt-4,-ml-2
Sizing
w-{0-96},h-{0-96},size-{0-96}w-full,w-screen,w-1/2,w-automin-w-0,max-w-lg,min-h-screen
Typography
text-xstotext-9xlfont-sans,font-serif,font-monofont-normal,font-medium,font-boldtracking-tight,leading-relaxed
Colors
bg-{color}-{shade},text-{color}-{shade}border-{color}-{shade},ring-{color}-{shade}- Opacity:
bg-coral-500/50
Borders
rounded-{none|sm|md|lg|xl|full}border-{0|2|4|8},border-{color}ring-{0|1|2|4|8},ring-offset-{0-8}
Effects
shadow-{sm|md|lg|xl|2xl}opacity-{0-100}blur-{sm|md|lg|xl}
Transforms
scale-{0-150},rotate-{0-180}translate-x-{0-96},-translate-y-4origin-center,origin-top-left
Transitions
transition,transition-colors,transition-allduration-{75-1000},delay-{75-1000}ease-in,ease-out,ease-in-out
Variants
Apply styles conditionally:
<!-- Pseudo-classes -->
<button class="bg-coral-500 hover:bg-coral-600 focus:ring-2">
<!-- Responsive -->
<div class="text-sm md:text-base lg:text-lg">
<!-- Dark mode -->
<div class="bg-white dark:bg-slate-900">
<!-- State variants -->
<input class="border focus:border-coral-500 invalid:border-red-500">
<!-- Group/peer variants -->
<div class="group">
<span class="group-hover:text-coral-500">Hover parent to change</span>
</div>Variant Groups (Unique Feature!)
<!-- Instead of repeating variants -->
<div class="hover:bg-coral-500 hover:text-white hover:scale-105">
<!-- Use variant groups -->
<div class="hover:(bg-coral-500 text-white scale-105)">Modern CSS Features
Container Queries
<div class="@container">
<div class="@sm:flex @md:grid @lg:hidden">
Responds to container size
</div>
</div>Anchor Positioning
<button class="anchor-name-[--btn]">Anchor</button>
<div class="position-anchor-[--btn] position-area-bottom">
Positioned relative to anchor
</div>Scroll-Driven Animations
<div class="animation-timeline-scroll animation-range-entry">
Animates as you scroll
</div>Headless Components
Accessible, unstyled components with full keyboard navigation:
import { createDialog, createDropdown, createTabs } from '@coral-css/core/components'
// Dialog
const dialog = createDialog('#my-dialog', {
closeOnBackdrop: true,
trapFocus: true,
})
dialog.open()
// Dropdown
const dropdown = createDropdown('#my-dropdown')
dropdown.element.addEventListener('coral:dropdown:select', (e) => {
console.log('Selected:', e.detail.item)
})
// Auto-initialize all components
import { initComponents } from '@coral-css/core/components'
document.addEventListener('DOMContentLoaded', initComponents)Available Components
Dialog- Modal dialogs with focus trapDropdown- Dropdown menus with keyboard navigationTabs- Tabbed interfaces with ARIAAccordion- Collapsible panelsTooltip- Tooltips with delay and positioningSwitch- Toggle switchesToast- Toast notifications with auto-dismiss
Configuration
import { createCoral, coralPreset, fullPreset } from '@coral-css/core'
const coral = createCoral({
prefix: 'tw-', // Class prefix
darkMode: 'class', // 'class' | 'media' | 'selector' | 'auto'
})
// Use different presets
coralPreset({ darkMode: 'class' }) // Default, includes modern CSS
windPreset({ darkMode: 'media' }) // Tailwind-compatible
miniPreset() // Minimal utilities only
fullPreset() // EverythingBuild Tools
Vite Plugin
import coral from '@coral-css/core/vite'
export default {
plugins: [coral()]
}PostCSS Plugin
// postcss.config.js
module.exports = {
plugins: [
require('@coral-css/core/postcss')({
content: ['./src/**/*.{html,js,jsx,ts,tsx}'],
}),
],
}/* In your CSS */
@coral base;
@coral theme;
@coral utilities;
@coral components;CLI
npx coral src/**/*.html -o dist/styles.css --minifyBrowser Support
CoralCSS supports all modern browsers. Some features like anchor positioning and scroll-driven animations require the latest browser versions.
TypeScript
Full TypeScript support with exported types:
import type {
Coral,
Plugin,
Rule,
Variant,
Theme,
ComponentConfig,
} from '@coral-css/core'License
MIT © CoralCSS
Links
On this page
Contributors
MIT License
Created January 10, 2026
Updated January 14, 2026