Getting Started

Add Noir CSS to your project in seconds.

CDN

<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/kakuteki/Noir@main/css/noir.css">

Direct Download

Download css/noir.css and include it in your project.

Basic Template

<!DOCTYPE html>
<html lang="en" data-theme="dark">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="css/noir.css">
  <title>My Noir App</title>
</head>
<body>
  <h1 class="heading-1 text-accent">Hello Noir</h1>
</body>
</html>

Theme

Noir defaults to dark theme. Set data-theme="light" on <html> for light mode. Omit the attribute to follow OS preference.

Customization

Override CSS variables to create custom themes. No build step required.

Override Variables

:root {
  --noir-accent: #6366f1;        /* indigo */
  --noir-accent-hover: #818cf8;
  --noir-accent-subtle: rgba(99,102,241,0.15);
  --noir-accent-warm: #f59e0b;   /* amber */
}

Blue Theme Example

:root {
  --noir-accent: #3b82f6;
  --noir-accent-hover: #60a5fa;
  --noir-accent-subtle: rgba(59,130,246,0.15);
  --noir-accent-warm: #8b5cf6;
  --noir-accent-warm-hover: #a78bfa;
}

Modular Imports

Import only the modules you need:

@import "noir/modules/base.css";       /* required */
@import "noir/modules/typography.css";
@import "noir/modules/layout.css";
@import "noir/modules/components.css";
/* skip forms.css, navigation.css, etc. if unneeded */

CSS Variables

All --noir-* variables defined in base.css.

Colors

VariableDark DefaultLight Default
--noir-bg-primary#0a0a0a#f8f8f8
--noir-bg-secondary#141414#ffffff
--noir-bg-tertiary#1e1e1e#f0f0f0
--noir-bg-elevated#262626#ffffff
--noir-text-primary#f0f0f0#1a1a1a
--noir-text-secondary#a0a0a0#555555
--noir-text-muted#888888#767676
--noir-text-inverse#0a0a0a#f0f0f0
--noir-accent#e84545#d63031
--noir-accent-hover#ff5252#e84545
--noir-accent-subtlergba(232,69,69,0.15)rgba(214,48,49,0.1)
--noir-accent-warm#f97316#e67e22
--noir-accent-warm-hover#fb923c#f97316
--noir-border#2a2a2a#e0e0e0
--noir-border-hover#3a3a3a#cccccc
--noir-success#22c55e#22c55e
--noir-warning#eab308#eab308
--noir-error#ef4444#ef4444
--noir-info#3b82f6#3b82f6

Spacing

VariableValue
--noir-space-00
--noir-space-10.25rem
--noir-space-20.5rem
--noir-space-30.75rem
--noir-space-41rem
--noir-space-51.25rem
--noir-space-61.5rem
--noir-space-82rem
--noir-space-102.5rem
--noir-space-123rem
--noir-space-164rem
--noir-space-205rem
--noir-space-246rem

Typography

VariableValue
--noir-font-sans"Inter", "Segoe UI", system-ui, sans-serif
--noir-font-mono"JetBrains Mono", "Fira Code", "Consolas", monospace
--noir-text-xs0.75rem
--noir-text-sm0.875rem
--noir-text-base1rem
--noir-text-lg1.125rem
--noir-text-xl1.25rem
--noir-text-2xl1.5rem
--noir-text-3xl1.875rem
--noir-text-4xl2.25rem
--noir-text-5xl3rem
--noir-leading-tight1.25
--noir-leading-normal1.5
--noir-leading-relaxed1.75
--noir-font-light300
--noir-font-normal400
--noir-font-medium500
--noir-font-semibold600
--noir-font-bold700

Border Radius

VariableValue
--noir-radius-none0
--noir-radius-sm0.25rem
--noir-radius-md0.5rem
--noir-radius-lg0.75rem
--noir-radius-xl1rem
--noir-radius-full9999px

Shadows

VariableValue
--noir-shadow-sm0 1px 2px rgba(0,0,0,0.4)
--noir-shadow-md0 4px 6px rgba(0,0,0,0.4)
--noir-shadow-lg0 10px 15px rgba(0,0,0,0.5)
--noir-shadow-xl0 20px 25px rgba(0,0,0,0.5)
--noir-shadow-glow0 0 20px rgba(232,69,69,0.3)

Transitions

VariableValue
--noir-transition-fast150ms ease
--noir-transition-base250ms ease
--noir-transition-slow400ms ease

Z-Index

VariableValue
--noir-z-tooltip50
--noir-z-dropdown100
--noir-z-sticky200
--noir-z-overlay300
--noir-z-modal400
--noir-z-toast500

Container

Centered container with responsive max-width.

ClassMax Width
container1280px + auto margins + padding
container-sm640px
container-md768px
container-lg1024px
container-xl1280px
container-fluid100%

Display

ClassCSS
blockdisplay: block
inline-blockdisplay: inline-block
inlinedisplay: inline
flexdisplay: flex
inline-flexdisplay: inline-flex
griddisplay: grid
hiddendisplay: none

Visibility

ClassCSS
visiblevisibility: visible
invisiblevisibility: hidden
sr-onlyScreen reader only (visually hidden)

Flexbox

Direction & Wrap

ClassCSS
flex-rowflex-direction: row
flex-colflex-direction: column
flex-row-reverseflex-direction: row-reverse
flex-col-reverseflex-direction: column-reverse
flex-wrapflex-wrap: wrap
flex-nowrapflex-wrap: nowrap
flex-1flex: 1 1 0%
flex-autoflex: 1 1 auto
flex-noneflex: none
growflex-grow: 1
grow-0flex-grow: 0
shrinkflex-shrink: 1
shrink-0flex-shrink: 0

Justify Content

ClassCSS
justify-startjustify-content: flex-start
justify-endjustify-content: flex-end
justify-centerjustify-content: center
justify-betweenjustify-content: space-between
justify-aroundjustify-content: space-around
justify-evenlyjustify-content: space-evenly

Align Items

ClassCSS
items-startalign-items: flex-start
items-endalign-items: flex-end
items-centeralign-items: center
items-baselinealign-items: baseline
items-stretchalign-items: stretch

Align Self

ClassCSS
self-startalign-self: flex-start
self-endalign-self: flex-end
self-centeralign-self: center
self-stretchalign-self: stretch

Order

ClassCSS
order-firstorder: -9999
order-lastorder: 9999
order-noneorder: 0
order-1order: 1
order-2order: 2

Space Between Children

ClassCSS
space-x-2margin-left: 0.5rem (children)
space-x-4margin-left: 1rem
space-x-6margin-left: 1.5rem
space-y-2margin-top: 0.5rem (children)
space-y-4margin-top: 1rem
space-y-6margin-top: 1.5rem

Gap

ClassValue
gap-00
gap-10.25rem
gap-20.5rem
gap-30.75rem
gap-41rem
gap-51.25rem
gap-61.5rem
gap-82rem
gap-102.5rem
gap-123rem

Grid

ClassCSS
grid-cols-1grid-template-columns: repeat(1, minmax(0,1fr))
grid-cols-2repeat(2, ...)
grid-cols-3repeat(3, ...)
grid-cols-4repeat(4, ...)
grid-cols-6repeat(6, ...)
grid-cols-12repeat(12, ...)
col-span-1grid-column: span 1
col-span-2span 2
col-span-3span 3
col-span-4span 4
col-span-6span 6
col-span-full1 / -1
row-span-1grid-row: span 1
row-span-2span 2
row-span-full1 / -1
place-items-centerplace-items: center
place-content-centerplace-content: center

Spacing

Padding

ClassCSS
p-{0-12}padding: var(--noir-space-N)
px-{0-8}padding-inline
py-{0-8}padding-block
pt-{0,2,4,6,8}padding-top
pb-{0,2,4,6,8}padding-bottom

Available values: 0, 1, 2, 3, 4, 5, 6, 8, 10, 12. px/py: 0, 1, 2, 3, 4, 6, 8.

Margin

ClassCSS
m-{0-8}margin: var(--noir-space-N)
m-automargin: auto
mx-{0,2,4}margin-inline
mx-automargin-inline: auto
my-{0,2,4,6,8}margin-block
mt-{0-8}margin-top
mb-{0-8}margin-bottom

Width & Height

ClassCSS
w-fullwidth: 100%
w-screenwidth: 100vw
w-autowidth: auto
w-fitwidth: fit-content
min-w-0min-width: 0
max-w-fullmax-width: 100%
w-1/2width: 50%
w-1/333.33%
w-2/366.67%
w-1/425%
w-3/475%
w-1/520%
w-2/540%
w-3/560%
w-4/580%
h-fullheight: 100%
h-screenheight: 100dvh
h-autoheight: auto
min-h-screenmin-height: 100dvh
min-h-0min-height: 0
max-h-screenmax-height: 100dvh

Aspect Ratio & Object Fit

ClassCSS
aspect-autoaspect-ratio: auto
aspect-squareaspect-ratio: 1/1
aspect-videoaspect-ratio: 16/9
object-containobject-fit: contain
object-coverobject-fit: cover
object-fillobject-fit: fill

Position

ClassCSS
relativeposition: relative
absoluteposition: absolute
fixedposition: fixed
stickyposition: sticky; top: 0
inset-0inset: 0
top-0top: 0
right-0right: 0
bottom-0bottom: 0
left-0left: 0

Overflow, Z-Index & Cursor

Overflow

ClassCSS
overflow-hiddenoverflow: hidden
overflow-autooverflow: auto
overflow-x-autooverflow-x: auto
overflow-y-autooverflow-y: auto

Z-Index

ClassValue
z-00
z-1010
z-2020
z-3030
z-4040
z-5050
z-autoauto
z-dropdown100
z-sticky200
z-overlay300
z-modal400
z-toast500

Cursor

ClassCSS
cursor-pointercursor: pointer
cursor-not-allowedcursor: not-allowed

Transition

ClassCSS
transitionall 250ms ease
transition-fastall 150ms ease
transition-slowall 400ms ease
transition-nonetransition: none

Opacity

ClassValue
opacity-00
opacity-250.25
opacity-500.5
opacity-750.75
opacity-1001

Borders, Radius & Shadows

Border

ClassCSS
border1px solid var(--noir-border)
border-0border: none
border-tborder-top: 1px solid
border-bborder-bottom
border-lborder-left
border-rborder-right
border-accentborder-color: var(--noir-accent)

Border Radius

ClassValue
rounded-none0
rounded-sm0.25rem
rounded0.5rem
rounded-lg0.75rem
rounded-xl1rem
rounded-full9999px

Box Shadow

ClassShadow
shadow-sm0 1px 2px ...
shadow0 4px 6px ...
shadow-lg0 10px 15px ...
shadow-xl0 20px 25px ...
shadow-glow0 0 20px accent glow
shadow-nonenone

Backgrounds & Gradients

ClassValue
bg-primaryvar(--noir-bg-primary)
bg-secondaryvar(--noir-bg-secondary)
bg-tertiaryvar(--noir-bg-tertiary)
bg-elevatedvar(--noir-bg-elevated)
bg-accentvar(--noir-accent)
bg-accent-subtlevar(--noir-accent-subtle)
bg-accent-warmvar(--noir-accent-warm)
bg-transparenttransparent
bg-gradient-accentlinear-gradient(135deg, accent, warm)
bg-gradient-darklinear-gradient(180deg, primary, secondary)
bg-gradient-to-rlinear-gradient(to right, accent, warm)
bg-gradient-to-blinear-gradient(to bottom, primary, transparent)

Responsive Variants

Noir uses mobile-first breakpoints. Prefix classes with sm:, md:, or lg:.

PrefixMin WidthExample
(none)0 (mobile-first default)grid-cols-1
sm:576pxsm:grid-cols-2
md:768pxmd:grid-cols-3
lg:1024pxlg:grid-cols-4

Responsive variants are available for: display, flex direction, grid columns/spans, gap, padding, margin, text alignment, and width.

<!-- 1 column on mobile, 2 on sm, 3 on md, 4 on lg -->
<div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4">
  ...
</div>

Typography

Font Family

ClassCSS
font-sansfont-family: var(--noir-font-sans)
font-monofont-family: var(--noir-font-mono)

Font Size

ClassSize
text-xs0.75rem
text-sm0.875rem
text-base1rem
text-lg1.125rem
text-xl1.25rem
text-2xl1.5rem
text-3xl1.875rem
text-4xl2.25rem
text-5xl3rem

Responsive: md:text-lg, lg:text-2xl, etc.

Font Weight

ClassWeight
font-light300
font-normal400
font-medium500
font-semibold600
font-bold700

Line Height

ClassValue
leading-tight1.25
leading-normal1.5
leading-relaxed1.75

Text Alignment

ClassCSS
text-lefttext-align: left
text-centercenter
text-rightright
text-justifyjustify

Text Color

ClassColor
text-primaryvar(--noir-text-primary)
text-secondaryvar(--noir-text-secondary)
text-mutedvar(--noir-text-muted)
text-inversevar(--noir-text-inverse)
text-accentvar(--noir-accent)
text-accent-warmvar(--noir-accent-warm)
text-successvar(--noir-success)
text-warningvar(--noir-warning)
text-errorvar(--noir-error)
text-infovar(--noir-info)

Decoration & Transform

ClassCSS
underlinetext-decoration: underline
line-throughline-through
no-underlinenone
uppercasetext-transform: uppercase
lowercaselowercase
capitalizecapitalize
normal-casenone

Letter Spacing

ClassValue
tracking-tight-0.025em
tracking-normal0
tracking-wide0.025em
tracking-wider0.05em
tracking-widest0.1em

Text Overflow

ClassEffect
truncateEllipsis, single line
line-clamp-2Clamp to 2 lines
line-clamp-3Clamp to 3 lines
whitespace-nowrapwhite-space: nowrap
break-wordsoverflow-wrap: break-word

Font Style

ClassCSS
italicfont-style: italic
not-italicfont-style: normal

Headings

ClassSizeWeight
heading-13rem (5xl)700 (bold)
heading-22.25rem (4xl)700 (bold)
heading-31.875rem (3xl)600 (semibold)
heading-41.5rem (2xl)600 (semibold)
heading-51.25rem (xl)500 (medium)

Heading 1

Heading 2

Heading 3

Heading 4

Heading 5

Code

ClassUsage
codeInline code (monospace, bg, border, small padding)
code-blockBlock-level code (pre-formatted, scrollable)

Inline: const x = 42;

function hello() { return "Hello, Noir!"; }

Buttons

ClassDescription
btnBase button class (required)
btn-primaryRed accent background, white text
btn-secondaryTransparent, border, outline style
btn-ghostNo border, subtle hover bg
btn-warmOrange accent background
btn-dangerError-red background
btn-smSmall size
btn-lgLarge size
btn-iconSquare icon button
btn-groupInline group, joined border-radius

Preview

Markup

<button class="btn btn-primary">Primary</button>
<button class="btn btn-secondary btn-sm">Small</button>

<div class="btn-group">
  <button class="btn btn-secondary">Left</button>
  <button class="btn btn-secondary">Center</button>
  <button class="btn btn-secondary">Right</button>
</div>

Cards

ClassDescription
cardBase card (bg, border, rounded)
card-hoverLift + glow on hover
card-headerTop section with border-bottom
card-bodyMain content area
card-footerBottom section with border-top
card-imgFull-width image
Card Title

Card body content goes here.

<div class="card card-hover">
  <div class="card-header">Title</div>
  <div class="card-body">Content</div>
  <div class="card-footer">Footer</div>
</div>

Badges

ClassDescription
badgeBase badge
badge-accentRed accent
badge-warmOrange
badge-successGreen
badge-warningYellow
badge-errorRed
badge-infoBlue
badge-outlineBordered, transparent bg
Accent Warm Success Warning Error Info Outline

Alerts

ClassDescription
alertBase alert (left border, padding)
alert-successGreen
alert-warningYellow
alert-errorRed
alert-infoBlue
<div class="alert alert-success" role="alert">Success message.</div>

Progress Bar

ClassDescription
progressTrack container
progress-barFill bar (set width via style)
progress-bar-warmOrange variant
progress-bar-successGreen variant
<div class="progress">
  <div class="progress-bar" style="width: 40%"></div>
</div>

Avatar

ClassSize
avatar2.5rem (default)
avatar-sm2rem
avatar-lg3.5rem
S
M
L

Skeleton Loading

ClassDescription
skeletonBase shimmer animation
skeleton-text1em height text placeholder
skeleton-title1.5em height, 60% width
skeleton-avatar2.5rem circle

Toast / Notification

ClassDescription
toast-containerFixed container (bottom-right)
toast-container-topTop position variant
toastBase toast
toast-successGreen left border
toast-errorRed
toast-warningYellow
toast-infoBlue
toast-closeDismiss button
Success toast.
Error toast.
<div class="toast-container">
  <div class="toast toast-success">
    <span>Saved successfully.</span>
    <button class="toast-close">&times;</button>
  </div>
</div>

Tooltip

CSS-only tooltip using data-tooltip attribute.

Hover me
<span class="tooltip" data-tooltip="Tooltip text">Hover me</span>

Accordion

Uses native <details>/<summary> elements.

ClassDescription
accordionContainer
accordion-itemWrapper (use <details>)
accordion-triggerClickable header (use <summary>)
accordion-contentCollapsible body
Section One
Content for section one.
Section Two
Content for section two.
<div class="accordion">
  <details class="accordion-item" open>
    <summary class="accordion-trigger">Title</summary>
    <div class="accordion-content">Content</div>
  </details>
</div>

Table

ClassDescription
tableBase table styling
table-stripedAlternating row bg
table-borderedFull cell borders
table-compactSmaller padding
NameRole
AliceDeveloper
BobDesigner
CarolPM

Divider

A 1px horizontal line using divider class.

Above

Below

Spinners & Loaders

ClassDescription
spinnerDefault spinner (1.5rem)
spinner-smSmall (1rem)
spinner-lgLarge (2.5rem)
spinner-warmOrange color
spinner-whiteWhite color
loader-dotsThree-dot pulse loader
loader-barIndeterminate progress bar

Forms

Input Classes

ClassDescription
inputBase text input
input-smSmall input
input-lgLarge input
textareaMulti-line input
selectDropdown select
checkboxCheckbox label wrapper
radioRadio label wrapper
toggleToggle/switch wrapper
rangeRange slider
form-groupVertical group (label + input + hint)
form-labelLabel styling
form-hintHelp text below input
input-groupIcon + input wrapper
input-group-iconIcon inside input-group
input-successGreen border (valid)
input-errorRed border (invalid)
form-successGreen helper text
form-errorRed helper text

Preview

Looks good! Required field.
<div class="form-group">
  <label class="form-label">Email</label>
  <input type="email" class="input" placeholder="you@example.com">
  <span class="form-hint">We won't share your email.</span>
</div>

<label class="checkbox"><input type="checkbox"> Accept terms</label>
<label class="toggle"><input type="checkbox"> Dark mode</label>

Utilities

Transform

ClassCSS
rotate-45rotate(45deg)
rotate-90rotate(90deg)
rotate-180rotate(180deg)
-rotate-90rotate(-90deg)
scale-75scale(0.75)
scale-90scale(0.9)
scale-95scale(0.95)
scale-100scale(1)
scale-105scale(1.05)
scale-110scale(1.1)
scale-125scale(1.25)
translate-x-fulltranslateX(100%)
-translate-x-fulltranslateX(-100%)
translate-y-fulltranslateY(100%)
-translate-y-fulltranslateY(-100%)
origin-centertransform-origin: center
origin-toptransform-origin: top

Pointer Events & User Select

ClassCSS
pointer-events-nonepointer-events: none
pointer-events-autopointer-events: auto
select-noneuser-select: none
select-textuser-select: text
select-alluser-select: all

List Style

ClassCSS
list-nonelist-style: none
list-disclist-style: disc
list-decimallist-style: decimal

Max Width

ClassValue
max-w-xs20rem
max-w-sm24rem
max-w-md28rem
max-w-lg32rem
max-w-xl36rem
max-w-2xl42rem
max-w-3xl48rem
max-w-4xl56rem
max-w-prose65ch
max-w-nonenone

Ring (Focus Ring)

ClassCSS
ring0 0 0 3px accent-subtle
ring-accent0 0 0 3px accent-subtle
ring-success0 0 0 3px success-subtle
ring-error0 0 0 3px error-subtle
ring-0none
ring-20 0 0 2px accent-subtle

Backdrop Filter

ClassCSS
backdrop-blur-smblur(4px)
backdrop-blurblur(8px)
backdrop-blur-lgblur(16px)

Negative Margin

ClassCSS
-m-1-0.25rem
-m-2-0.5rem
-mt-1-0.25rem
-mt-2-0.5rem
-mt-4-1rem
-mb-1-0.25rem
-mb-2-0.5rem

State Variants

Prefix utilities with hover:, focus:, active:, group-hover:, or disabled: for stateful styling.

hover: Background

ClassHover Value
hover:bg-primaryvar(--noir-bg-primary)
hover:bg-secondaryvar(--noir-bg-secondary)
hover:bg-tertiaryvar(--noir-bg-tertiary)
hover:bg-elevatedvar(--noir-bg-elevated)
hover:bg-accentvar(--noir-accent)
hover:bg-accent-subtlevar(--noir-accent-subtle)
hover:bg-accent-warmvar(--noir-accent-warm)
hover:bg-transparenttransparent

hover: Text

ClassHover Value
hover:text-primaryvar(--noir-text-primary)
hover:text-secondaryvar(--noir-text-secondary)
hover:text-accentvar(--noir-accent)
hover:text-accent-warmvar(--noir-accent-warm)
hover:text-white#ffffff

hover: Border, Shadow, Opacity

ClassEffect
hover:border-accentborder-color: accent
hover:border-hoverborder-color: border-hover
hover:shadowshadow-md
hover:shadow-lgshadow-lg
hover:shadow-glowshadow-glow
hover:shadow-nonenone
hover:opacity-750.75
hover:opacity-900.9
hover:opacity-1001

hover: Transform & Text

ClassEffect
hover:scale-105scale(1.05)
hover:scale-110scale(1.1)
hover:-translate-y-1translateY(-0.25rem)
hover:-translate-y-2translateY(-0.5rem)
hover:underlineunderline
hover:no-underlinenone

focus:

ClassEffect
focus:ring3px accent ring
focus:ring-accent3px accent ring
focus:ring-22px ring
focus:ring-44px ring
focus:border-accentborder-color: accent
focus:outline-noneoutline: none
focus:outline-accent2px solid accent outline
focus:bg-tertiarybg tertiary
focus:bg-accent-subtlebg accent-subtle

active:

ClassEffect
active:scale-95scale(0.95)
active:scale-100scale(1)
active:bg-accentbg accent
active:bg-tertiarybg tertiary
active:shadow-noneshadow none

group-hover:

Add group class to parent, then use group-hover:* on children.

ClassEffect
group-hover:text-primarycolor: text-primary
group-hover:text-accentcolor: accent
group-hover:opacity-100opacity: 1
group-hover:visiblevisibility: visible
group-hover:scale-105scale(1.05)

disabled:

ClassEffect
disabled:opacity-50opacity: 0.5
disabled:cursor-not-allowedcursor: not-allowed
disabled:pointer-events-nonepointer-events: none

Animations

Animation Classes

ClassEffect
animate-fade-inFade in (0 to 1 opacity)
animate-fade-outFade out
animate-slide-upSlide up + fade in
animate-slide-downSlide down + fade in
animate-slide-leftSlide from right
animate-slide-rightSlide from left
animate-pulsePulsing opacity (infinite)
animate-spin360deg rotation (infinite)
animate-bounceBouncing (infinite)
animate-pingPing / ripple (infinite)
animate-noneanimation: none

Duration & Delay

ClassValue
animate-duration-fast150ms
animate-duration-base250ms
animate-duration-slow400ms
animate-delay-100100ms
animate-delay-200200ms
animate-delay-300300ms
animate-delay-500500ms
animate-infiniteinfinite iteration
animate-oncesingle iteration

Preview

Pulse
Bounce

Reduced Motion

When prefers-reduced-motion: reduce is set, all animations and transitions are reduced to near-zero duration automatically.

Accessibility

Noir is built with WCAG 2.1 AA guidelines in mind.

Screen Reader

ClassUsage
sr-onlyVisually hide element but keep accessible to screen readers

Focus Management

All interactive elements receive a visible :focus-visible outline (2px solid accent, 2px offset). Use focus:ring and focus:outline-accent for custom focus rings.

ARIA Patterns

ComponentARIA Guidance
AlertsAdd role="alert" for important messages
ModalUses native <dialog> with built-in focus trap. Add aria-labelledby
DropdownAdd role="menu" to menu, role="menuitem" to items, aria-haspopup and aria-expanded to trigger
TabsUse role="tablist", role="tab", aria-selected
BreadcrumbWrap in <nav aria-label="Breadcrumb">
ToastUse role="status" or role="alert" with aria-live
AccordionNative <details>/<summary> provides built-in accessibility
PaginationAdd aria-current="page" to active link

Reduced Motion

All animations respect prefers-reduced-motion: reduce. Animation durations are set to near-zero automatically.

Color Contrast

Both dark and light themes are designed with sufficient contrast ratios. Primary text on primary background meets WCAG AA. Use semantic colors (success, error, warning, info) for meaningful status indication, not just color alone.

Keyboard Navigation

All interactive components (buttons, inputs, links, tabs, modals, dropdowns) are keyboard accessible. The native <dialog> element provides focus trapping. Use tabindex to manage custom focus order when needed.