18 CSS Settings Pages
18 CSS settings pages for SaaS account dashboards, billing admin, and developer API consoles — spanning section-nav layouts, usage meters, invoice tables, roles matrices, two-factor screens, notification preferences, and a delete-account danger zone. Scoped under .csp-NN for no-collision pasting, prefers-reduced-motion guarded, framework-agnostic.
Related17 CSS Dashboard Layouts30 CSS Sidebar Layouts18 CSS Forms13 CSS Tables18 Tailwind CSS Settings Pages
Premium template pickPartner: Cruip
Affiliate linkBuilding the whole admin app, not just this settings page?
You just browsed 18 settings pages. Mosaic by Cruip is a complete Tailwind CSS admin template in HTML, React, Next.js, Vue and Laravel. Its settings area has account, notifications, connected apps, plans and billing & invoices pages, among 90 pages in all. It costs $69.
Mosaic by Cruip. We may earn a commission, at no extra cost to you.
02. Billing and Plan Settings Page (opens in a new tab)
03. Usage and Limits Page with Quota Meters (opens in a new tab)
04. Invoice History Table with Downloads (opens in a new tab)
05. Payment Method Settings Card (opens in a new tab)
06. Team Members Page with Roles (opens in a new tab)
07. Invite Teammates Form with Role Picker (opens in a new tab)
08. Roles and Permissions Matrix (opens in a new tab)
09. API Keys Management Page (opens in a new tab)
10. Two-Factor Authentication Setup (opens in a new tab)
11. Active Sessions and Devices Page (opens in a new tab)
12. Notification Preferences Matrix (opens in a new tab)
13. Connected Apps and Integrations Page (opens in a new tab)
14. Appearance and Theme Settings (opens in a new tab)
15. Data Export Request Page (opens in a new tab)
16. Audit Log Activity Page (opens in a new tab)
17. Webhooks Settings Page (opens in a new tab)
18. Danger Zone Delete Account Section (opens in a new tab)
Frequently asked questions
How does the sticky sidebar section nav highlight the section you're currently reading?
position: sticky with a top offset so it stays in view while the settings content scrolls past it. The active highlight is the part that needs care. Clicking a nav link jumps to a section via its id, and you can style the landing target with :target for a pure-CSS highlight. But :target only updates on click, not as you scroll. For a true scroll-spy that re-highlights while the reader scrolls, add a small IntersectionObserver that toggles an aria-current attribute on the matching link — roughly fifteen lines, no library. Keep the sticky column shorter than the viewport, or position: sticky silently stops sticking because there is no room left to offset into, which is the single most common reason a sticky nav 'doesn't work'.How do the filter chips on the invoice table and audit log filter rows with no JavaScript?
:has() and hides non-matching rows — something like .table:has(#filter-failed:checked) .row:not(.failed) { display: none; }. Because the radios share a name, only one is active at a time, so the filters are mutually exclusive for free. The common bug: people place the radios after the rows and expect a sibling selector to reach backward — it can't. With :has() the radios can live anywhere inside the scoped container, since :has() evaluates from the ancestor downward. But keep the hidden radios as real, focusable inputs — visually hidden, never display: none — so keyboard users can still tab between chips and screen readers announce the active filter.Can the Light / Dark / System theme switch really work with zero JavaScript, and what breaks?
:has(). The panel declares light custom properties by default and overrides them with .panel:has(#dark:checked). The trap is the System option: it has to follow the OS, so you wrap the OS-driven values in @media (prefers-color-scheme: dark) scoped to :has(#system:checked). The bug that bites everyone is the one-way toggle — on a visitor whose OS is already dark, the manual Dark rule and the System rule resolve to identical values, so clicking Dark produces no visible change. The fix is a mirror flip-back: inside @media (prefers-color-scheme: dark) you must also restore the light values for :has(#light:checked), and restore every custom property the theme sets, not just the background colour, or half the palette stays stale.How do I make the roles-and-permissions matrix accessible to keyboard and screen-reader users?
scope="col" and row headers scope="row". Then a checkbox cell is announced as 'Billing, Admin, checked' instead of a bare, contextless checkbox. Every <input> still needs a programmatic name — pair it with a visually hidden <label> or an aria-label that repeats the row and column, because sighted users infer context from position but a screen reader lands on the control with none. Don't rebuild the grid from <div> elements with role attributes; a native table gives you header association and arrow-key cell reading for free, and it survives being pasted into a project that strips your JS.Does the copy-to-clipboard button on the API keys page need JavaScript?
-webkit-text-security: disc, revealed by a :has(:checked) toggle — but reading a value and writing it to the clipboard is a privileged action no CSS selector can perform. Demo 09 uses navigator.clipboard.writeText() inside a click handler, which the browser only honours during a genuine user gesture, so wire it to the button's click event, never a timer or page-load hook. Give the button an aria-label like 'Copy API key' because it is icon-only, and after a successful copy flip that label or an aria-live region to 'Copied' so screen-reader users get the same confirmation the visual checkmark gives everyone else. Never pre-select or auto-copy the key on load — it fails silently outside a user gesture and leaks the secret into focus unexpectedly.How should the Danger Zone delete-account section confirm a destructive action safely?
:has() against a pattern or, more reliably, in a few lines of JS. Keep the confirm control a real <button> with type="button" so it never submits a surrounding form by accident. Give the destructive styling meaning beyond colour — an icon plus the literal word 'Delete' — so it still reads for colour-blind users. When not to use an inline danger zone at all: if the action cascades to other members' data, move it into a modal that restates the blast radius, because an inline button is far too easy to hit while scrolling the page.How is the circular quota ring on the usage page drawn, and can I animate it to a percentage?
conic-gradient background — the accent colour sweeps from zero to the used percentage, a track colour fills the remainder, and a smaller circle (a pseudo-element or a radial-gradient mask) punches the centre so it reads as a ring, not a pie. Drive the sweep from one custom property: background: conic-gradient(var(--accent) calc(var(--pct) * 1%), var(--track) 0). To animate it smoothly you must register that property with @property and declare syntax: "<percentage>", because the browser cannot interpolate an unregistered custom property — without it the ring jumps straight to the final value instead of sweeping. Wrap the transition in @media (prefers-reduced-motion: reduce) so users who ask for less motion get the final state with no animation.Which of these settings pages are pure CSS, and when should I reach for JavaScript instead?
:has(), :checked, and :target — paste them as-is with no script. The ones that touch the outside world need JS: copy-to-clipboard on the API keys page, the live card preview that mirrors typed input in demo 05, paste-and-validate email parsing in the invite flow, and any real scroll-spy on the account nav. A useful rule: if the state lives entirely in the DOM — which chip is active, which row is selected — CSS can hold it; if you must read a value, write to the clipboard, call an API, or react to scroll position, that is JavaScript. And don't push a :has() state machine to do something stateful across reloads — it resets on refresh, so persisting a chosen theme or a saved preference still needs a line of script plus localStorage.Related collections
15 CSS Aspect Ratio Demos
15 hand-coded CSS aspect-ratio demos for video embeds, product galleries, IAB ad slots, native dialogs, and CLS-safe placeholders: 16:9 iframe YouTube embed with click-to-load facade + up-next rail, 21:9 full-screen hero video with min-height/max-height:100svh guardrails + Ken Burns drift, 1:1 Instagram-style square grid with 2×2 feature tile, 4:3 magazine card image cover, 9:16 vertical stories rail (TikTok/Reels/Shorts pattern) with scroll-snap + segment bars, 4:5 apparel product image gallery with radio-driven state + 1:1 thumbnails, 1:1 zoom thumbnail carousel with pointer-tracked --zx/--zy magnifier, prevent-layout-shift placeholder with live PerformanceObserver CLS meter (before/after side-by-side lab), dynamic content fallback with three policies (bend/strict/auto) via :has() toggle, IAB ad banner slots (728×90 leaderboard, 300×250 medium rectangle, 300×600 half-page, 320×50 mobile) with skeletons + container-query mobile swap, responsive modal dialog sized min(92vw, 88svh×16/9, 1080px) with @starting-style animation, responsive OpenStreetMap iframe wrapper with 16:9 → 1:1 container-query narrow swap, media query orientation live HUD + resize:both container-ratio playground, object-fit logo cloud with contain/cover/fill switcher via :has(), and side-by-side padding-top hack (height:0 + padding-top:56.25%) → modern aspect-ratio migration comparison with live ratio picker. 11 truly Pure CSS + 4 with a tiny optional vanilla JS snippet (facade swap, pointer magnifier, CLS meter, native dialog). Every demo is scoped under a unique .car-NN prefix so it drops into any project without CSS collisions, ships prefers-reduced-motion guards, and is framework-agnostic (works as-is in React, Vue, Svelte, Astro, Next.js, Remix, or plain HTML).
6 CSS Bento Grid Layouts
6 production CSS bento grid layouts with 12 hand-coded designs — Apple-style product showcase, SaaS feature value-prop matrix, analytics dashboard overview, creative portfolio, e-commerce category hub, and link-in-bio social hub. Each topic ships 2 sub-variants side-by-side so visitors see both a keynote aesthetic and a paper-doc variant at once. Container queries, CSS Grid, zero dependencies, copy-paste ready.
20 CSS Blog Layouts
20 hand-coded CSS blog and editorial layouts for magazine homepages, news sites, personal archives, newsletter back-issues, recipe and podcast blogs, developer tutorials, and long-form journalism. Covers a magazine homepage with hero plus editor-picks rail, a news homepage with breaking-news ticker, blog archives with sticky year separators, Substack-style issue-numbered archives, recipe card grids with prep-time badges, podcast episode lists with waveforms, long-form articles with scroll-driven reading progress, drop caps and floated pull quotes via first-letter, Medium-style 65ch centred reader layouts, dev tutorials with a sticky code panel beside prose, interview transcripts with alternating speakers, case-study pages with stat counters, video blogs with an episode rail, full-bleed photo essays, news articles with sticky related-stories sidebars, documentation pages with prev/next chapter nav, a standalone blog post card, a scroll-snap category filter bar, an inline newsletter callout that breaks out of the prose column, and a horizontal featured-post rail. 12 are pure CSS with zero JavaScript. Every layout is scoped under a .bl-NN prefix for no-collision pasting, guards prefers-reduced-motion, and ports unchanged to React, Vue, Svelte, Astro, Next.js and Tailwind.

















