30 CSS Badges

30 hand-coded CSS badges for SEO dashboards (E-E-A-T, Core Web Vitals, hreflang, schema, search intent), DevOps CI/CD build pipelines, financial tickers, medical ECG, transit line status, and ⌘K keycap shortcuts — plus typing dots, signal bars, reading time, dice, aurora, vaporwave, risograph, botanical tier, cyberpunk glitch, art deco, brutalist, and holographic collectible. 19 pure CSS + 11 vanilla-JS under 25 lines each — zero dependencies (no Radix, shadcn, MUI, Chakra). Scoped under .bdg-NN for no-collision pasting, prefers-reduced-motion guarded, framework-agnostic.

19 pure CSS11 light JSPublished

Related24 CSS Tags & Chips20 CSS Banners & Alerts21 CSS Tooltips20 CSS Ribbons20 CSS Kbd Keys

Upload Progress — preview
01 / 30CSS + JS

Upload Progress

A static 73% could be a live transfer or stalled. The shimmer moving through the bar means bytes are flowing; when it becomes a slow pulse, the transfer has stalled; when it stops, it's done. Three states, one animation property.

Published

Typing Indicator — preview
02 / 30Pure CSS

Typing Indicator

The three bouncing dots are the convention. Without the animation the badge could mean "typed recently" or "about to type." The motion defines the tense: present continuous, active right now.

Published

Scrabble Tile — preview
03 / 30Pure CSS

Scrabble Tile

One letter, one number. The whole game fits in a square. Hover lifts each tile independently — the kind of small detail that makes a word feel played rather than typed.

Published

Keycap Shortcut — preview
04 / 30CSS + JS

Keycap Shortcut

A key is a physical object. Three stacked box-shadows form the edge — bottom face, outer drop, top highlight. Click any key and feel it go down. Cmd-K and friends, the way they were meant to look.

Published

Transit Line Indicator — preview
05 / 30CSS + JS

Transit Line Indicator

Wayfinding distilled. Bullet, name, live arrival, and a strip showing where you are on the line. Built to be read from across a platform — and the next-arrival time keeps counting down.

Published

Origami Craft Endorsement — preview
06 / 30Pure CSS

Origami Craft Endorsement

Paper folded along six creases, lit from the upper-left. A ribbon hangs beneath. Hover lifts the page to catch the fold angles — the lit facets brighten, the shadowed ones recede.

Published

Hreflang Coverage — preview
07 / 30Pure CSS

Hreflang Coverage

International SEO's most misunderstood tag. Shows the target locale, alternate version count, and — crucially — flags missing reciprocal links. Hreflang must be bidirectional or the entire cluster invalidates.

Published

E-E-A-T Scorecard — preview
08 / 30Pure CSS

E-E-A-T Scorecard

Google's quality evaluator framework — Experience, Expertise, Authoritativeness, Trustworthiness. Composite score and a grade, with four animated bars showing per-dimension strength.

Published

Crawl & Index Status — preview
09 / 30Pure CSS

Crawl & Index Status

Googlebot visits and decides: indexed or not. But there are four states before "indexed," and most pages fail before the first one. This badge shows exactly where in the crawl pipeline a URL sits.

Published

Schema Markup Type — preview
10 / 30Pure CSS

Schema Markup Type

Structured data is a contract between a page and Google's parser. The badge names the @type and lists which SERP features it unlocks — the difference between a plain blue link and a result with stars, FAQs, and how-to steps.

Published

Search Intent Spectrum — preview
11 / 30Pure CSS

Search Intent Spectrum

Plots a keyword on the Informational / Navigational / Commercial / Transactional spectrum. Intent mismatch is one of the top reasons pages don't rank — this badge surfaces the right page type before a word is written.

Published

Core Web Vitals — preview
12 / 30Pure CSS

Core Web Vitals

LCP, INP, CLS — the three real-world page-experience signals Google ranks on. Three SVG arcs draw to their verdict on load. Green / amber / red thresholds match Google's field-data classification.

Published

ECG Heartbeat — preview
13 / 30CSS + JS

ECG Heartbeat

Live BPM with a continuously scrolling waveform. Scroll speed equals beats per minute literally — change the duration and you change the rate. The badge and the data are the same thing.

Published

Build Pipeline — preview
14 / 30CSS + JS

Build Pipeline

CI/CD stage tracker with a spinning arc on the active step. Sequential steps light up — you know roughly how long remains by which step is spinning. Restarts automatically.

Published

Countdown Ring — preview
15 / 30CSS + JS

Countdown Ring

Ring depletes continuously in real time. Color shifts green → amber → red as the deadline approaches. The depletion rate is the data. A static badge cannot know what time it is.

Published

Live Price Ticker — preview
16 / 30CSS + JS

Live Price Ticker

A static price is history; an animated price is now. Green or red flash on each update tells direction without comparison. Sparkline shows the recent walk. The animation IS the signal.

Published

File Extension Badge — preview
17 / 30Pure CSS

File Extension Badge

Two adjacent flex blocks — colored extension + white filename. Color is the identifier; nothing else is needed. Hover lifts the whole card off the surface the way you pick up a real file.

Published

Dice Face — preview
18 / 30CSS + JS

Dice Face

A fair die with six possible states. Click to roll — the pip positions are correct, the animation is physical, the number updates. One honest square doing exactly one honest job.

Published

Signal Bars — preview
19 / 30Pure CSS

Signal Bars

Four rectangles of increasing height — possibly the most iconic data visualization ever designed. Confidence, signal, relevance — whatever the product needs. Hover fills all bars to maximum.

Published

Reading Time Indicator — preview
20 / 30Pure CSS

Reading Time Indicator

Three states — not started, in progress, done. A 2px bar at the bottom fills to 100% on hover so the user can see what completion looks like. Clean type, no decoration.

Published

Aurora Status — preview
21 / 30Pure CSS

Aurora Status

Status pill that breathes. Four pools of color drift behind a frosted lens; their hues rotate continuously through the spectrum. For loading, streaming, thinking — when text alone is not enough.

Published

Vaporwave Chrome — preview
22 / 30Pure CSS

Vaporwave Chrome

Release channel as marquee. Chrome lettering over a synthwave horizon, ticker tape reminding you exactly what kind of trouble you are in. The sun is striped. The grid recedes. The warning never stops scrolling.

Published

Risograph Edition Label — preview
23 / 30Pure CSS

Risograph Edition Label

Two-color riso print laid down by drum and squeegee. Pink and cyan with the deliberate misregistration that gives the process its hand. Hover widens the offset.

Published

Wax Seal Authentication — preview
24 / 30CSS + JS

Wax Seal Authentication

Embossed oxblood wax disc over a written page, anchored by a gold-leaf monogram. Click the seal to press — the disc compresses, holds, releases. Drips peek out from the base.

Published

Conference Lanyard — preview
25 / 30CSS + JS

Conference Lanyard

Physical badge with ambient sway, hanging from its own clip. Click flips it — front holds the role band and name, back holds the QR. Each card swings at a slightly different frequency.

Published

Botanical Membership Tier — preview
26 / 30Pure CSS

Botanical Membership Tier

Membership tier grown as SVG flora — petals, leaves, and a budding center on warm paper. Hover sways the leaves outward and blooms the center. Italiana + Cormorant Garamond carry the names.

Published

Cyberpunk Glitch Notification — preview
27 / 30CSS + JS

Cyberpunk Glitch Notification

Notification counter with perpetual chromatic aberration. Hover triggers a full RGB-split glitch storm; click scrambles the digits hex-style before settling. Scanline drifts top-to-bottom continuously.

Published

Art Deco Medallion — preview
28 / 30Pure CSS

Art Deco Medallion

Conic-gradient brass ring rotating against a slow ray pattern. Crest in Cinzel display type. Sweep of shine on hover, gentle lift on the whole medallion.

Published

Brutalist Status Matrix — preview
29 / 30Pure CSS

Brutalist Status Matrix

Monospaced status grid — operational, degraded, outage, maintenance, deploying, queued. Inverts on hover. Live pulse on healthy systems, blink on outages, scanline on deploys.

Published

Holographic Collectible — preview
30 / 30Pure CSS

Holographic Collectible

Pentagonal collectible badge with a cursor-tracked conic-gradient foil and a tier glyph. The Mythic tier carries its own ambient pulse — visible across the room.

Published

FAQ

Frequently asked questions

What is a CSS badge and when should I use one in production?
A badge is a small visual component that encodes one specific signal — a status, a rank, a count, a live data value, a certification — in a way the eye can parse in under a second. Badges appear across every category of tier-1 product: SaaS dashboards (Vercel deploy status, Linear issue tags, Notion mention pills), fintech interfaces (Coinbase price tickers, Robinhood earnings badges, Stripe payment-status chips), healthcare portals (Epic MyChart appointment badges, Zocdoc verified-doctor seals), SEO tools (Ahrefs Domain Rating, Semrush Authority Score, Screaming Frog crawl status), DevOps dashboards (GitHub Actions build status, Datadog service health, PagerDuty incident severity), and e-commerce (Shopify inventory badges, Amazon Prime eligibility, Etsy artisan seals). This gallery ships 30 hand-coded badge patterns covering the full range — every one is copy-paste ready, scoped under .bdg-NN for no-collision pasting, WCAG 2.2 accessible with proper ARIA semantics, and works without Swiper.js / Slick / Tippy / React-Badge / any framework wrapper. Nineteen are Pure CSS; eleven ship a small vanilla JS handler where behaviour genuinely requires it (cursor tracking for holographic, click-to-press for wax seal / keycap / dice, live-data simulation for price ticker / countdown / build pipeline / ECG / upload, card flip for conference lanyard). Every JS demo is under 25 lines of framework-free vanilla JS.
How do I build accessible status badges that pass WCAG 2.2 audits and enterprise a11y reviews (Section 508, EN 301 549, AODA)?
The 30 badges in this gallery are built to the WCAG 2.1 AA baseline every enterprise SaaS RFP quotes and the new WCAG 2.2 SC 2.4.13 focus-appearance requirement that landed October 2023. Concretely: every status indicator conveys meaning through MORE than colour alone (per WCAG 1.4.1 Use of Colour) — the E-E-A-T scorecard shows numeric scores, the Core Web Vitals badge shows numeric values, the crawl-status badge shows text labels, the transit-line indicator pairs colour with route number and status text. Every interactive badge keeps a visible :focus-visible ring at 2px minimum with 3:1 contrast (WCAG 2.4.13). State changes fire aria-live="polite" announcements (WCAG 4.1.3 Status Messages) — the build pipeline announces stage progression, the countdown ring announces the last 30 seconds, the dice face announces the rolled value, the upload progress announces completion. Continuous animations (upload shimmer, ECG heartbeat, aurora drift, vaporwave motion, cyberpunk glitch) wrap in @media (prefers-reduced-motion:reduce) { animation: none } per WCAG 2.3.3. Icon-only badges (dice, wax seal, holographic) carry aria-label. The <kbd> element semantic is used for keyboard-shortcut badges. This meets US Section 508 refresh (36 CFR Part 1194), UK EN 301 549 for public sector procurement, Canada ACA, Australia DDA + Digital Service Standard, and Ontario AODA Section 14. If your enterprise buyer runs axe-core, Deque WAVE, or Lighthouse Accessibility against the checkout, all 30 badges pass zero-violation.
How do I build a Core Web Vitals / Lighthouse-score badge for a SEO / performance dashboard?
The Core Web Vitals badge (Demo 12) ships the exact trio that PageSpeed Insights, Search Console, Lighthouse CI, WebPageTest, Chrome DevTools, and every enterprise performance-monitoring tool displays: LCP (Largest Contentful Paint), INP (Interaction to Next Paint, which replaced FID in March 2024), and CLS (Cumulative Layout Shift). Each metric shows the numeric value and a pass/needs-improvement/fail chip coloured green/amber/red matching Google's official thresholds (LCP ≤2.5s = good / ≤4s = needs improvement / >4s = poor; INP ≤200ms = good / ≤500ms = needs improvement / >500ms = poor; CLS ≤0.1 = good / ≤0.25 = needs improvement / >0.25 = poor). The badge is pure CSS driven by data-grade="pass|needs-work|fail" attributes on each chip. For real-time integration, connect the numeric values to your Real User Monitoring (RUM) endpoint — the CrUX report for field data, or your own web-vitals library for lab data. Enterprise SEO tools (Ahrefs Site Audit, Semrush Site Audit, Screaming Frog, Sitebulb, Lumar) all display this badge pattern; the visual language is universally understood by SEO managers, developers, and marketing directors alike. INP replacing FID is critical — badges still showing FID look 6+ months out of date.
How do I build a GitHub Actions / GitLab CI / Vercel / Netlify build-pipeline status badge?
The Build Pipeline badge (Demo 14) is the copy-paste UI shell for CI/CD status displays used by GitHub Actions, GitLab CI, CircleCI, Jenkins, Vercel Deploy, Netlify Build, Cloudflare Pages, Buildkite, TeamCity, Bitbucket Pipelines, and every modern CI platform. The pattern is: horizontal chain of stages (Fetch → Build → Test → Deploy), each stage shows a status colour (pending grey / running blue / complete green / failed red / skipped grey), the currently-running stage pulses subtly to signal activity, and completed stages persist their state. The badge ships with a small JS state machine that advances through stages on a timer — for real integration, replace the timer with WebSocket / SSE / polling connected to your CI provider's webhooks. GitHub Actions publishes status webhooks via the Checks API, GitLab CI uses Merge Request pipelines, Vercel/Netlify expose deploy-preview URLs and status endpoints. On failure, the visual stops cascading forward — subsequent stages read as skipped, matching how developers mentally trace failure. For enterprise DevOps dashboards (Datadog CI Visibility, Buildkite Analytics, CircleCI Insights, PagerDuty CI/CD), this badge pattern pairs with a duration readout and a link-to-logs affordance for full workflow visibility. WCAG-safe: state changes announce via aria-live="polite", colours pair with icons, keyboard-accessible link targets.
How do I build a live stock price ticker / Coinbase-style crypto ticker badge for a financial dashboard?
The Live Price Ticker badge (Demo 16) is the copy-paste shell for financial-data displays used by Bloomberg, Yahoo Finance, Google Finance, Robinhood, E-Trade, Fidelity, Charles Schwab, Interactive Brokers, Coinbase, Kraken, Binance, TradingView, Nasdaq.com, NYSE.com, and every trading interface since 1990. The badge shows a ticker symbol, a live price (monospaced for column alignment), a percentage change (with +/− sign), and an up/down arrow (▲/▼). On price updates, the value briefly flashes green (up) or red (down) — a 400ms visual pulse that draws the eye without dominating. The JS handler simulates updates on a timer; for real integration, connect via WebSocket (most exchanges offer wss:// tick streams), Server-Sent Events, or polling (throttled to 4-8 updates per second maximum to avoid visual jitter). Critical accessibility note: the green-up / red-down colour convention is Western — in China, Japan, and Korea, red = up (bullish) and green = down. Localise the palette per user region. For US financial regulation (SEC Rule 611, MiFID II in Europe), price displays must disclose whether data is live (real-time market feed, requires exchange licensing) or delayed (typically 15 minutes for retail apps). Format currency via Intl.NumberFormat for international displays. Fintech ad CPMs in tier-1 markets run 25-45 USD baseline, 40-80 USD on trading / portfolio pages — a hand-coded ticker beats a bloated third-party widget for both Core Web Vitals and enterprise SaaS-buyer trust.
How do I build a keyboard shortcut badge (⌘ K) for a command palette or docs page?
The Keycap Shortcut badge (Demo 04) is the copy-paste pattern for keyboard shortcut displays used by GitHub, Notion, Linear, Superhuman, Vercel, Framer, Cron, Raycast, Arc, and every command-palette-driven modern SaaS. The badge uses the semantic <kbd> HTML element — screen readers announce it as a keyboard shortcut, and it defaults to a monospaced font stack that reads as code / key input. Visual chrome: rectangular cap with rounded corners, hairline top-edge highlight, deep bottom-edge shadow for physical depth, monospace key label inside. On :active (mouse press) OR JS-detected keydown (actual keyboard press of the mapped key), the cap depresses via transform:translateY(1px) and the shadow collapses — physical tactile feedback that teaches users the shortcut works. For real command-palette integration (Cmd+K modal, Cmd+P quick-nav, Slash-menu), wire the JS handler to your palette's keyboard listener; for docs / marketing / help pages, static badges are fine. Critical: check event.target in the keydown handler to avoid triggering while users are typing in inputs / textareas / contenteditable — otherwise every space bar press triggers the visual feedback. Use aria-label="Command K" if the visible key is a symbol (⌘, ⌥, ⇧, ⌃) that some screen readers don't announce correctly. Chain multiple keys with a + separator (⌘ + Shift + P) for modifier shortcuts.
How do I build SEO-tool badges (E-E-A-T, hreflang coverage, schema markup, crawl status, search intent) for a dashboard?
The gallery ships five badges specifically for SEO / content-tool dashboards — the pattern Ahrefs, Semrush, Screaming Frog, Sitebulb, Moz, Surfer, Clearscope, MarketMuse, Frase, ContentKing, Lumar, DeepCrawl, OnCrawl, and every enterprise-tier SEO platform ships. The Hreflang Coverage badge (Demo 07) visualises which locales a page has proper hreflang tags for — green tiles for covered, amber for partial (return tag missing), red for missing. The E-E-A-T Scorecard (Demo 08) shows Google's Experience-Expertise-Authoritativeness-Trustworthiness quality signals as a four-panel scorecard (marketing / editorial visualisation, since E-E-A-T is not directly measurable). The Crawl & Index Status (Demo 09) shows Googlebot's current state (Crawling / Indexed / Not Indexed / Blocked) with a radar-ping pulse for active crawls. The Schema Markup Type (Demo 10) shows which schema.org type (Product / Article / Recipe / LocalBusiness / Event / FAQPage) is applied to a URL with a colour-coded left border. The Search Intent Spectrum (Demo 11) shows where a keyword sits on the Informational-Navigational-Commercial-Transactional axis. All five are Pure CSS with data-attribute-driven state (no JS runtime cost), scoped under .bdg-07 through .bdg-11, and pair naturally with the Core Web Vitals badge (Demo 12) for a complete SEO dashboard. Enterprise SEO tools charge $99-999/mo per user, and their trust signal depends on badge polish — hand-coded badges beat bloated component libraries for perceived professionalism.
How do these CSS badges compare to component libraries like shadcn Badge, MUI Chip, Chakra Tag, Ant Design Tag, Mantine Badge, or Radix Primitives?
shadcn Badge ships as a Radix UI wrapper (10KB + Radix runtime overhead per page). MUI Chip weighs 8KB + Emotion CSS-in-JS runtime (~15KB). Chakra Tag is 4KB but depends on the Chakra runtime (~50KB). Ant Design Tag is 5KB + Ant runtime (~80KB). Mantine Badge is 3KB + Mantine runtime (~40KB). Radix Primitives ship unstyled — you're on your own for the visual layer. Every one of them shares three costs: (1) framework lock-in (React-only, no Vue / Svelte / Astro / vanilla), (2) runtime JavaScript that hurts Core Web Vitals — the badge itself hydrates on mount, delaying Time to Interactive, (3) generic visual language — every badge looks like every other component in that library. The 30 badges in this gallery ship as zero-KB dependencies — 19 Pure CSS, 11 with under 25 lines of vanilla JS. LCP unaffected. FID / INP unaffected. CLS unaffected. Framework-agnostic — drop into React (rename class to className), Vue, Svelte, Astro, Next.js, Remix, SvelteKit, Solid, Qwik, or plain HTML. Every badge is thematically distinct (SEO scorecard doesn't look like a live ticker doesn't look like a wax seal), so a product mixing 3-4 of them reads as designed, not templated. Reserve component libraries for products with 200+ components (Stripe Dashboard, Linear, Notion) — for products with 20-50 UI touchpoints, hand-coded badges are strictly better for bundle size, Core Web Vitals, and design-system uniqueness.
Can I use these badges in React, Next.js, Vue, Nuxt, Svelte, SvelteKit, Astro, Remix, Solid, or plain HTML?
Yes — all 30 demos are vanilla HTML + CSS (+ up to 25 lines of vanilla JS on 11 demos) with zero framework dependencies and zero build-step requirements. Drop the HTML into any framework: React / Next.js (rename class to className, for to htmlFor), Vue / Nuxt (works as-is inside <template>), Svelte / SvelteKit (Svelte accepts class and for natively; the vanilla JS runs in onMount), Astro (drop as a .astro component with the CSS in a <style> block or set is:global; JS goes in a <script> tag), Next.js (drop into any client or server component), Remix (works in any route module), Solid.js (rename event handlers), Qwik (rename event handlers to on:*), Lit (wrap in a shadow DOM), or plain static HTML. Every badge is scoped under .bdg-NN class names so they never collide with your existing styles — you can drop all 30 on one page if you want. Google Fonts (Fraunces, Cinzel, Geist Mono, JetBrains Mono, Cormorant Garamond, VT323, Major Mono Display, Italiana, Bricolage Grotesque) are used by 8 of the aesthetically-driven demos; substitute your own type stack via font-family overrides or self-host the fonts for zero third-party dependency. All 30 demos are MIT licensed and free for commercial use with no attribution required.

Related collections

20 CSS Banners & Alerts preview

20 CSS Banners & Alerts

20 hand-coded CSS banner and alert bars for e-commerce storefronts, SaaS dashboards, marketing sites, and compliance-bound products. Covers GDPR cookie consent with a real preferences panel, promo bars with countdown timers, free-shipping threshold progress, app-install smart banners, maintenance and incident status bars, newsletter signup bars, age verification gates, limited-stock urgency banners, live event announcements, browser upgrade notices, geo and currency switchers, sticky top announcement bars, bottom cookie bars, inline form validation alerts, icon-aligned alert banners, left-border accent alerts, diagonal stripe promos, full-width hero banners, animated gradient border alerts, and a text-wrapping laboratory that shows five strategies for the unbreakable string that breaks more banners than anything else. Every bar is scoped under a .ba-NN prefix for no-collision pasting, guards prefers-reduced-motion, carries the correct aria-live and role semantics, and ports unchanged to React, Vue, Svelte, Astro, Next.js and Tailwind.

25 CSS Blockquotes preview

25 CSS Blockquotes

25 hand-coded CSS blockquote designs for SaaS testimonials, editorial pull quotes, documentation callouts, and developer engineering blogs: large decorative quotation marks with ::before / ::after glyphs, Tailwind CSS blockquote component, pure CSS callout / admonition boxes for Docusaurus / Mintlify / Nextra documentation, responsive center-aligned quote banners, modern minimalist left-border editorial style, animated CSS gradient border, classic left border, brutalist high-contrast, glassmorphism frosted card, glowing neon border, article pull quote with text-wrap, speech bubble chat-style, thick vertical accent rail, customer testimonial cards with avatar and star rating, inline highlighted text, marker highlight underline, floating drop-shadow, aurora gradient background, Twitter / X card style, multi-column newspaper editorial, IDE code-comment style, Markdown-compatible defaults, JavaScript testimonial quote slider, expandable read-more, and one-click copy button. 22 Pure CSS + 3 Light JS (slider, expand, copy). Every design scoped under .bq-NN prefix for no-collision pasting, prefers-reduced-motion guarded per WCAG 2.3.3, WCAG 2.2 AA accessible, framework-agnostic (React, Vue, Svelte, Astro, Next.js, Nuxt, Remix, SvelteKit).

15 CSS Chat Bubbles preview

15 CSS Chat Bubbles

15 hand-coded CSS chat bubbles for messaging apps, AI assistant interfaces, customer support widgets, and testimonial sections. Covers the pure-CSS bubble with a pseudo-element arrow tail, iMessage and WhatsApp Web recreations, a ChatGPT-style AI response bubble, a Tailwind variant, animated typing indicators, avatar-paired bubbles, a live support widget, bordered and comic-book speech bubbles, image attachments, voice messages with a scrubable waveform, a full chat screen built on flexbox, thought bubbles, and a testimonial card built from a speech bubble. Every bubble is scoped under a .cb-NN prefix for no-collision pasting, uses real semantic markup rather than div soup, guards prefers-reduced-motion, and ports unchanged to React, Vue, Svelte, Astro, Next.js and Tailwind.

Search CodeFronts

Loading…